diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..a014d30878e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,23 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Issue Description**: + +**What did you expect to happen**: + +**What happened instead**: + +**Why is this bad/What are the consequences**: + +**Steps to reproduce the problem**: + +**When did the problem start happening**: + +**Extra information**: + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..2f58d4e9ebb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,10 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +Please place all features requests here: https://nanotrasen.se/forum/60-suggestions/ diff --git a/README.md b/README.md index 2f4e16270c3..93bb70efc80 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,8 @@ The SQL backend for the library and stats tracking requires a MySQL server. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/paradise_schema.sql or /SQL/paradise_schema_prefix.sql, depending on if you want table prefixes. -More detailed setup instructions are located on /tg/station's wiki: http://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database +More detailed setup instructions are located on our wiki: +https://nanotrasen.se/wiki/index.php/Setting_up_the_Database --- diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index ed4fb787b8d..1e4692b7e3b 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -269,6 +269,7 @@ CREATE TABLE `player` ( `fuid` bigint(20) NULL DEFAULT NULL, `fupdate` smallint(4) NULL DEFAULT '0', `afk_watch` tinyint(1) NOT NULL DEFAULT '0', + `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index b0f7bbc5c82..aa5d5895e56 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -268,6 +268,7 @@ CREATE TABLE `SS13_player` ( `fuid` bigint(20) NULL DEFAULT NULL, `fupdate` smallint(4) NULL DEFAULT '0', `afk_watch` tinyint(1) NOT NULL DEFAULT '0', + `parallax` tinyint(1) DEFAULT '8', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/SQL/updates/8-9.sql b/SQL/updates/8-9.sql new file mode 100644 index 00000000000..d7f0fd19ab3 --- /dev/null +++ b/SQL/updates/8-9.sql @@ -0,0 +1,4 @@ +#Updating the SQL from version 8 to version 9. -affectedarc07 +#Adding new column to contain the parallax value. +ALTER TABLE `player` + ADD `parallax` tinyint(1) DEFAULT '8' AFTER `fupdate`; diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 447889d17a1..aeaebe6d843 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -27867,11 +27867,6 @@ /obj/effect/decal/warning_stripes/northwest, /turf/simulated/floor/plasteel, /area/atmos) -"bat" = ( -/obj/machinery/pipedispenser, -/obj/effect/decal/warning_stripes/east, -/turf/simulated/floor/plasteel, -/area/atmos) "bau" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; @@ -28742,11 +28737,6 @@ /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plasteel, /area/atmos) -"bbU" = ( -/obj/machinery/pipedispenser/disposal, -/obj/effect/decal/warning_stripes/east, -/turf/simulated/floor/plasteel, -/area/atmos) "bbV" = ( /obj/structure/cable{ d1 = 1; @@ -31407,6 +31397,7 @@ id_tag = "s_docking_airlock"; req_access_txt = "48" }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/mining) "bgZ" = ( @@ -31431,6 +31422,7 @@ name = "mining shuttle bay"; width = 7 }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/mining) "bha" = ( @@ -34038,6 +34030,7 @@ name = "Mining Dock Airlock"; req_access_txt = "48" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "blH" = ( @@ -38843,6 +38836,7 @@ name = "Labor Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -38864,6 +38858,7 @@ name = "Labor Camp Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel, /area/security/prisonershuttle) "btT" = ( @@ -41958,6 +41953,7 @@ name = "fore bay 1"; width = 9 }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "bzg" = ( @@ -142582,9 +142578,9 @@ aUd aVM aXq aYI -bat -bbU -bat +bhp +bhp +bhp beO aXn bhk diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 8bf89da81b2..6dd1a34d1cc 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -11722,6 +11722,7 @@ name = "Labor Camp Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -14760,6 +14761,7 @@ id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -14769,6 +14771,7 @@ id_tag = "laborcamp_home"; name = "Labor Camp Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -15638,6 +15641,7 @@ pixel_y = -25; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -17546,6 +17550,7 @@ name = "mining shuttle bay"; width = 7 }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/plating, /area/shuttle/mining) "aEJ" = ( @@ -17554,6 +17559,7 @@ req_access = null; req_access_txt = "0" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/quartermaster/miningdock{ name = "\improper Mining Office" @@ -17568,6 +17574,7 @@ name = "Mining Dock"; req_access_txt = "48" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock{ name = "\improper Mining Office" @@ -17814,6 +17821,7 @@ id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "aFe" = ( @@ -17821,6 +17829,7 @@ id_tag = "laborcamp_home"; name = "Labor Camp Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -61905,7 +61914,6 @@ name = "Station Intercom (General)"; pixel_y = 28 }, -/obj/machinery/pipedispenser/disposal, /obj/effect/decal/warning_stripes/southeast, /turf/simulated/floor/plasteel, /area/atmos) @@ -62855,7 +62863,6 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "cdq" = ( -/obj/machinery/pipedispenser, /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plasteel, /area/atmos) diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm new file mode 100644 index 00000000000..8fdc459c863 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -0,0 +1,770 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/simulated/wall/mineral/titanium, +/area/shuttle/freegolem) +"ac" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ad" = ( +/obj/structure/closet/crate/golemgear, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ae" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/reagent_containers/spray/cleaner, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"af" = ( +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ag" = ( +/obj/structure/reagent_dispensers/watertank/high, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ah" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ai" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "burst_l" + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aj" = ( +/obj/machinery/light/small, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"ak" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"al" = ( +/obj/structure/table/wood, +/obj/item/disk/design_disk/golem_shell, +/obj/item/areaeditor/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"am" = ( +/obj/machinery/vending/hydronutrients, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"an" = ( +/obj/machinery/vending/hydroseeds, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ao" = ( +/obj/machinery/light{ + dir = 1; + on = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ap" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aq" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc2"; + dir = 2 + }, +/area/shuttle/freegolem) +"ar" = ( +/obj/effect/mob_spawn/human/golem/adamantine, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"as" = ( +/obj/machinery/vending/coffee/free, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"at" = ( +/obj/machinery/mineral/equipment_vendor/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"au" = ( +/obj/machinery/door/airlock/shuttle, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"av" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/freegolem) +"aw" = ( +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ax" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ay" = ( +/obj/machinery/mineral/ore_redemption/golem, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"az" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc1"; + dir = 2 + }, +/area/shuttle/freegolem) +"aA" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/golem_ship) +"aB" = ( +/obj/structure/window/full/shuttle{ + icon_state = "16" + }, +/obj/structure/grille, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aC" = ( +/obj/structure/statue/gold/rd{ + name = "statue of the Liberator" + }, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aD" = ( +/obj/structure/computerframe, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/freegolem) +"aF" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 30 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aG" = ( +/obj/machinery/door/airlock/shuttle, +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + area_type = /area/ruin/powered/golem_ship; + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem_lavaland"; + name = "Lavaland Surface"; + turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface; + width = 16 + }, +/obj/docking_port/mobile{ + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem"; + name = "Free Golem Ship"; + width = 16 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aH" = ( +/obj/structure/window/full/shuttle{ + icon_state = "15" + }, +/obj/structure/grille, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"aI" = ( +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = 0 + }, +/obj/structure/table/wood, +/obj/item/bedsheet/rd/royal_cape{ + layer = 3; + pixel_x = 5; + pixel_y = 9 + }, +/obj/item/book/manual/research_and_development{ + name = "Sacred Text of the Liberator"; + pixel_x = -4; + pixel_y = 3 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aJ" = ( +/obj/machinery/light, +/obj/structure/chair/comfy/purp{ + icon_state = "comfychair"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aK" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/freegolem) +"aL" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aM" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall11"; + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/freegolem) +"aN" = ( +/obj/item/resonator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aO" = ( +/obj/machinery/autolathe, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aP" = ( +/obj/machinery/computer/shuttle/golem_ship/recall, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/powered/golem_ship) +"aQ" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aR" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc4" + }, +/area/shuttle/freegolem) +"aS" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/freegolem) +"aT" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aU" = ( +/obj/structure/table/wood, +/obj/item/resonator, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aV" = ( +/obj/machinery/vending/snack/free, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aW" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/brute, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aX" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire, +/obj/item/storage/firstaid/fire, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"aY" = ( +/obj/structure/table/wood, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"ba" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"bb" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"bc" = ( +/obj/structure/ore_box, +/turf/simulated/shuttle/plating, +/area/shuttle/freegolem) +"be" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor5" + }, +/area/shuttle/freegolem) +"bf" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swallc3"; + dir = 2 + }, +/area/shuttle/freegolem) +"bh" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/freegolem) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aq +aB +aH +bf +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +av +aC +aI +av +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aq +aE +au +aR +aD +aJ +ab +au +aE +bf +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +av +am +ap +ax +ap +ap +ax +ap +as +av +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +av +an +ap +ap +ap +ap +ap +ap +aV +av +aa +aa +aa +"} +(6,1,1) = {" +aq +aE +aE +aK +ao +ap +ap +ap +ap +ap +ap +aT +bh +aE +aE +bf +"} +(7,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(8,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(9,1,1) = {" +av +ad +aj +av +ao +ap +ap +ap +ap +ap +ap +aT +av +ba +bc +av +"} +(10,1,1) = {" +av +ad +af +av +ap +ap +ar +aU +aU +ar +ap +ap +av +af +bc +av +"} +(11,1,1) = {" +av +ad +af +av +ap +ap +ar +aU +aU +ar +ap +ap +av +af +bc +av +"} +(12,1,1) = {" +av +ad +aj +av +ao +ap +ap +ap +ap +ap +ap +aT +av +ba +bc +av +"} +(13,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(14,1,1) = {" +av +ad +af +aw +ap +ap +ap +ap +ap +ap +ap +ap +aw +af +bc +av +"} +(15,1,1) = {" +av +ae +af +av +ap +ap +ap +ap +ap +ap +ap +aW +av +af +ae +av +"} +(16,1,1) = {" +ac +af +aj +av +ao +ap +ap +ap +ap +ap +ap +aX +av +ba +af +ac +"} +(17,1,1) = {" +ac +af +af +av +ap +ap +ap +ap +ap +aN +ap +aY +av +af +af +ac +"} +(18,1,1) = {" +av +ag +ak +av +at +ap +ay +ap +ap +aO +aQ +al +av +bb +bb +av +"} +(19,1,1) = {" +av +ah +ah +av +ah +ah +aS +aF +be +aS +ah +ah +av +ah +ah +av +"} +(20,1,1) = {" +az +ai +ai +aM +ai +ai +aM +aG +aL +aM +ai +ai +aM +ai +ai +aR +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aA +aA +aA +aP +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 421f2e62b53..279afa9713d 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -1611,15 +1611,6 @@ pixel_x = 1; pixel_y = -1 }, -/obj/item/radio/headset/syndicate/alt{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt{ - pixel_x = 3; - pixel_y = -3 - }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel/dark, /area/ruin/unpowered/syndicate_lava_base/cargo) @@ -3538,6 +3529,10 @@ /obj/machinery/alarm/syndicate{ pixel_y = 24 }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, /turf/simulated/floor/plasteel/grimy, /area/ruin/unpowered/syndicate_lava_base/dormitories) "hN" = ( @@ -3563,6 +3558,10 @@ /obj/machinery/alarm/syndicate{ pixel_y = 24 }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, /turf/simulated/floor/plasteel/grimy, /area/ruin/unpowered/syndicate_lava_base/dormitories) "hR" = ( @@ -4480,6 +4479,10 @@ /obj/structure/table/wood, /obj/item/ammo_box/magazine/m10mm, /obj/item/ammo_box/magazine/sniper_rounds, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, /turf/simulated/floor/plasteel/grimy, /area/ruin/unpowered/syndicate_lava_base/dormitories) "jB" = ( @@ -6068,6 +6071,13 @@ /obj/structure/sign/fire, /turf/simulated/wall/mineral/plastitanium/coated, /area/ruin/unpowered/syndicate_lava_base/engineering) +"ng" = ( +/obj/structure/table, +/obj/machinery/photocopier/faxmachine/longrange/syndie{ + department = "Syndicate Bioweapon Research Outpost" + }, +/turf/simulated/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) "nh" = ( /obj/machinery/telecomms/relay/preset/ruskie{ use_power = 0 @@ -7337,7 +7347,7 @@ ab ab ab mp -mP +ng nk nI oi diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index bd37f2193e5..fea93c6a89e 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2225,6 +2225,7 @@ icon_state = "1-2"; pixel_y = 0 }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/security/prisonershuttle) "aeG" = ( @@ -7421,8 +7422,11 @@ /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "amZ" = ( +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c50, +/obj/machinery/light/spot, /obj/structure/chair/comfy/shuttle{ - dir = 8 + dir = 1 }, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) @@ -10422,12 +10426,10 @@ /area/shuttle/trade/sol) "arW" = ( /obj/structure/chair/comfy/shuttle{ - dir = 1 + dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/siberia) +/turf/simulated/shuttle/floor, +/area/shuttle/trade/sol) "arX" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -10446,14 +10448,15 @@ /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) "arZ" = ( -/obj/item/stack/spacecash/c200, -/obj/item/stack/spacecash/c50, -/obj/machinery/light/spot, -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/machinery/atm{ + pixel_x = 0; + pixel_y = 32 }, -/turf/simulated/shuttle/floor4/vox, -/area/shuttle/vox) +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/trade/sol) "asa" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -11638,9 +11641,11 @@ /area/shuttle/siberia) "atL" = ( /obj/structure/chair/comfy/shuttle{ - dir = 4 + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/turf/simulated/shuttle/floor, /area/shuttle/siberia) "atM" = ( /obj/effect/spawner/window/reinforced, @@ -12154,6 +12159,7 @@ name = "Labor Camp Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/security/prisonershuttle) "auz" = ( @@ -12162,6 +12168,7 @@ name = "Labor Shuttle Airlock"; req_access_txt = "2" }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -12785,19 +12792,17 @@ /turf/simulated/floor/plasteel, /area/security/permabrig) "avp" = ( -/obj/machinery/flasher{ - id = "gulagshuttleflasher"; - pixel_x = 25 - }, -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" +/obj/item/radio/intercom{ + broadcasting = 0; + listening = 1; + name = "station intercom (General)"; + pixel_y = 25 }, /obj/structure/chair/comfy/shuttle{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor, -/area/shuttle/siberia) +/area/shuttle/pod_3) "avq" = ( /turf/simulated/floor/plating, /area/maintenance/fsmaint) @@ -12840,19 +12845,18 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_3) "avu" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_x = 0; + pixel_y = 32 }, -/obj/structure/window/reinforced, +/obj/machinery/light, /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) +/turf/simulated/shuttle/floor, +/area/shuttle/pod_3) "avv" = ( /obj/machinery/door/airlock/external{ name = "Labor Shuttle Airlock"; @@ -13172,7 +13176,16 @@ }, /turf/simulated/floor/plasteel, /area/security/lobby) -"avU" = ( +"avV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/plasteel, +/area/security/lobby) +"avW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ name = "Internal Affairs Office"; @@ -13192,34 +13205,6 @@ dir = 2 }, /area/lawoffice) -"avV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/simulated/floor/plasteel, -/area/security/lobby) -"avW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Secure Gate"; - name = "Security Blast Door"; - opacity = 0 - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "BrigEast"; - name = "Brig East Entrance"; - req_access_txt = "63" - }, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "darkredcorners" - }, -/area/security/prison/cell_block/A) "avX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -13287,11 +13272,12 @@ name = "Brig East Entrance"; req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 8; + dir = 1; icon_state = "darkredcorners" }, /area/security/prison/cell_block/A) @@ -13714,13 +13700,31 @@ }, /area/security/permabrig) "awP" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Secure Gate"; + name = "Security Blast Door"; + opacity = 0 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/door/airlock/security/glass{ + id_tag = "BrigEast"; + name = "Brig East Entrance"; + req_access_txt = "63" }, -/area/shuttle/syndicate_sit) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "darkredcorners" + }, +/area/security/prison/cell_block/A) "awQ" = ( /obj/structure/cable{ d1 = 2; @@ -13954,31 +13958,30 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate_sit) "axm" = ( +/obj/machinery/flasher{ + id = "gulagshuttleflasher"; + pixel_x = 25 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, /obj/structure/chair/comfy/shuttle{ - dir = 4 + dir = 8 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) +/turf/simulated/shuttle/floor, +/area/shuttle/siberia) "axn" = ( /obj/structure/lattice, /obj/item/stack/cable_coil, /turf/space, /area/space/nearstation) "axo" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 - }, /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_elite) +/turf/simulated/shuttle/floor, +/area/shuttle/siberia) "axp" = ( /obj/structure/bookcase, /obj/item/book/manual/sop_engineering, @@ -14330,14 +14333,6 @@ icon_state = "darkredcorners" }, /area/security/prison/cell_block/A) -"axN" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_elite) "axO" = ( /obj/structure/cable{ d1 = 1; @@ -14534,6 +14529,7 @@ name = "fore bay 1"; width = 9 }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/siberia) "ayi" = ( @@ -15207,11 +15203,6 @@ icon_state = "tube1"; dir = 8 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/syndicate_sit) -"azf" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 }, @@ -15219,17 +15210,33 @@ icon_state = "floor4" }, /area/shuttle/syndicate_elite) +"azf" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_sit) "azg" = ( /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_elite) "azh" = ( -/obj/structure/chair/comfy/shuttle, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, -/area/shuttle/syndicate_sit) +/area/shuttle/syndicate_elite) "azi" = ( /obj/machinery/door/window/brigdoor{ dir = 2; @@ -15809,16 +15816,13 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aAh" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/area/shuttle/pod_3) +/area/shuttle/syndicate_elite) "aAi" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/ert, /turf/simulated/shuttle/floor{ @@ -16421,30 +16425,13 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aBk" = ( -/obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; - name = "station intercom (General)"; - pixel_y = 25 - }, /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_3) -"aBl" = ( -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_x = 0; - pixel_y = 32 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/obj/machinery/light, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_3) +/area/shuttle/syndicate_sit) "aBm" = ( /obj/item/stack/rods, /turf/space, @@ -16570,14 +16557,16 @@ /turf/simulated/floor/plating, /area/security/prisonershuttle) "aBC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plasteel{ - icon_state = "floorgrime" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f6"; + icon_state = "swall_f6"; + dir = 2 }, -/area/maintenance/fsmaint) +/area/shuttle/pod_3) "aBD" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/shuttle/floor{ @@ -17323,22 +17312,21 @@ /turf/simulated/floor/plating, /area/maintenance/abandonedbar) "aCX" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_3) -"aCY" = ( /obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, /area/shuttle/syndicate_elite) +"aCY" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_sit) "aCZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ @@ -17768,17 +17756,14 @@ /turf/simulated/wall, /area/crew_quarters/mrchangs) "aDO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Magistrate's Office"; - req_access_txt = "74" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ - tag = "icon-cult"; - icon_state = "cult"; - dir = 2 + icon_state = "floorgrime" }, -/area/magistrateoffice) +/area/maintenance/fsmaint) "aDP" = ( /turf/simulated/wall, /area/civilian/barber) @@ -18992,26 +18977,6 @@ /obj/item/twohanded/required/kirbyplants, /turf/simulated/floor/wood, /area/crew_quarters/courtroom) -"aGv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Magistrate's Office"; - req_access_txt = "74" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-cult"; - icon_state = "cult"; - dir = 2 - }, -/area/magistrateoffice) "aGw" = ( /obj/structure/disposalpipe/junction{ dir = 1; @@ -19677,16 +19642,16 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aHV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Detective"; - req_access = null; - req_access_txt = "4" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/floor/plasteel{ - icon_state = "grimy" +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 }, -/area/security/detectives_office) +/area/shuttle/pod_3) "aHW" = ( /obj/structure/cable{ d1 = 1; @@ -20059,15 +20024,17 @@ }, /area/maintenance/fpmaint2) "aIM" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Magistrate's Office"; + req_access_txt = "74" }, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/wood{ - tag = "icon-wood-broken3"; - icon_state = "wood-broken3" +/turf/simulated/floor/plasteel{ + tag = "icon-cult"; + icon_state = "cult"; + dir = 2 }, -/area/maintenance/fpmaint2) +/area/magistrateoffice) "aIN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -20729,26 +20696,6 @@ }, /turf/simulated/floor/plasteel, /area/hallway/primary/fore) -"aKp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - density = 0; - dir = 4; - icon_state = "open"; - id_tag = "courtroomshutters"; - layer = 3.21; - name = "Courtroom Privacy Shutters"; - opacity = 0 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/courtroom) "aKq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -20809,20 +20756,25 @@ }, /area/lawoffice) "aKx" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Magistrate's Office"; + req_access_txt = "74" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/turf/simulated/floor/plasteel{ + tag = "icon-cult"; + icon_state = "cult"; + dir = 2 }, -/turf/simulated/floor/plating, -/area/maintenance/fsmaint) +/area/magistrateoffice) "aKy" = ( /obj/item/twohanded/required/kirbyplants, /turf/simulated/floor/plasteel{ @@ -21131,17 +21083,16 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aLh" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Detective"; + req_access = null; + req_access_txt = "4" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/turf/simulated/floor/plasteel{ + icon_state = "grimy" }, -/obj/machinery/atmospherics/pipe/simple/visible/purple, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/area/security/detectives_office) "aLi" = ( /obj/structure/cable{ d1 = 2; @@ -21213,22 +21164,11 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/wood{ + tag = "icon-wood-broken3"; + icon_state = "wood-broken3" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/visible/purple{ - dir = 4 - }, -/turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aLo" = ( /obj/structure/cable{ @@ -22066,33 +22006,6 @@ }, /turf/simulated/floor/carpet, /area/crew_quarters/courtroom) -"aNe" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" - }, -/obj/machinery/door/poddoor/shutters{ - density = 0; - dir = 4; - icon_state = "open"; - id_tag = "courtroomshutters"; - layer = 3.21; - name = "Courtroom Privacy Shutters"; - opacity = 0 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/courtroom) "aNf" = ( /obj/machinery/access_button{ command = "cycle_interior"; @@ -22451,13 +22364,25 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aNS" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "courtroomshutters"; + layer = 3.21; + name = "Courtroom Privacy Shutters"; + opacity = 0 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/courtroom) "aNT" = ( /obj/machinery/status_display{ layer = 4; @@ -22555,21 +22480,6 @@ icon_state = "barber" }, /area/civilian/barber) -"aOa" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/fsmaint2) "aOb" = ( /obj/machinery/prize_counter, /obj/machinery/light{ @@ -22879,21 +22789,44 @@ /turf/simulated/floor/plating, /area/maintenance/electrical) "aON" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_1) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/visible/purple, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint2) "aOO" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "63" }, -/area/shuttle/pod_1) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "courtroomshutters"; + layer = 3.21; + name = "Courtroom Privacy Shutters"; + opacity = 0 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/courtroom) "aOP" = ( /obj/machinery/light/small{ dir = 8 @@ -22978,11 +22911,14 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plating, /area/maintenance/fsmaint) @@ -22991,6 +22927,9 @@ /turf/simulated/wall, /area/maintenance/fpmaint2) "aPd" = ( +/obj/machinery/light_switch{ + pixel_y = 27 + }, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "yellowcorner" @@ -23045,9 +22984,23 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible/purple{ + dir = 4 + }, /turf/simulated/floor/plating, -/area/maintenance/fsmaint) +/area/maintenance/fpmaint2) "aPi" = ( /turf/simulated/floor/plating, /area/maintenance/fpmaint) @@ -23346,13 +23299,17 @@ /turf/simulated/wall, /area/maintenance/electrical) "aPP" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_2) +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) "aPQ" = ( /obj/effect/decal/warning_stripes/north, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -23401,16 +23358,15 @@ }, /area/hallway/secondary/entry) "aPU" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/area/shuttle/pod_2) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint) "aPV" = ( /obj/structure/chair/comfy/shuttle{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor, /area/shuttle/trade/sol) @@ -24119,23 +24075,13 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint) "aRm" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_1) "aRn" = ( /obj/structure/cable{ d1 = 4; @@ -24287,21 +24233,13 @@ }, /area/hallway/primary/starboard/west) "aRz" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/shuttle/pod_1) "aRA" = ( /obj/structure/cable{ d1 = 1; @@ -24520,16 +24458,13 @@ /turf/simulated/floor/plating, /area/hallway/secondary/entry) "aRV" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_2) "aRW" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -24550,19 +24485,13 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aRY" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/shuttle/pod_2) "aRZ" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -25178,12 +25107,19 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aTs" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, /obj/machinery/door/airlock/maintenance{ - name = "Chapel Maintenance"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/maintenance/fsmaint2) "aTt" = ( @@ -25985,10 +25921,8 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/fpmaint2) +/area/maintenance/fpmaint) "aVc" = ( /turf/simulated/wall, /area/security/checkpoint2) @@ -26453,24 +26387,10 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/area/maintenance/fpmaint2) "aVM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, @@ -27582,19 +27502,6 @@ /obj/machinery/lapvend, /turf/simulated/floor/plasteel, /area/storage/primary) -"aXT" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/tranquillite{ - name = "Mime's Office"; - req_access_txt = "46" - }, -/turf/simulated/floor/plasteel{ - icon_state = "tranquillite"; - dir = 4; - icon_regular_floor = "yellowsiding"; - icon_plating = "plating" - }, -/area/mimeoffice) "aXU" = ( /obj/item/flag/mime, /obj/machinery/power/apc{ @@ -27915,6 +27822,9 @@ /obj/item/storage/fancy/cigarettes, /obj/item/lighter/zippo, /obj/item/pen/multi, +/obj/item/enginepicker{ + layer = 3.1 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutralfull" @@ -29452,14 +29362,6 @@ dir = 2 }, /area/crew_quarters/dorms) -"bbx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/bananium{ - name = "Clown's Office"; - req_access_txt = "46" - }, -/turf/simulated/floor/wood, -/area/clownoffice) "bby" = ( /obj/machinery/camera{ c_tag = "Medbay Morgue"; @@ -30007,14 +29909,23 @@ /turf/simulated/floor/carpet/black, /area/chapel/office) "bcv" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/machinery/door/airlock/maintenance{ - name = "Library Maintenance"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/area/maintenance/fpmaint) "bcw" = ( /obj/machinery/alarm{ pixel_y = 25 @@ -30138,15 +30049,11 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bcK" = ( -/obj/machinery/atm{ - pixel_x = 0; - pixel_y = 32 - }, /obj/structure/chair/comfy/shuttle{ - dir = 8 + dir = 1 }, /turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) +/area/shuttle/escape) "bcL" = ( /obj/machinery/computer/communications, /turf/simulated/shuttle/floor, @@ -31136,15 +31043,27 @@ }, /area/hallway/primary/central/north) "bew" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass{ - name = "Chapel Office"; - req_access_txt = "22" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 }, -/area/chapel/office) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint) "bex" = ( /obj/machinery/requests_console{ department = "Arrival Shuttle"; @@ -31174,12 +31093,6 @@ /obj/machinery/computer/station_alert, /turf/simulated/shuttle/floor, /area/shuttle/escape) -"beB" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) "beC" = ( /turf/simulated/shuttle/floor, /area/shuttle/escape) @@ -31443,14 +31356,18 @@ }, /area/crew_quarters/dorms) "bfa" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/tranquillite{ + name = "Mime's Office"; + req_access_txt = "46" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/turf/simulated/floor/plasteel{ + icon_state = "tranquillite"; + dir = 4; + icon_regular_floor = "yellowsiding"; + icon_plating = "plating" + }, +/area/mimeoffice) "bfb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; @@ -31506,8 +31423,16 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/maintenance/fpmaint) +/area/maintenance/fpmaint2) "bfg" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable, @@ -32202,39 +32127,23 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "bgo" = ( -/obj/machinery/flasher{ - id = "soltraderflash"; - pixel_y = -28 +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = -28 }, /obj/structure/chair/comfy/shuttle{ - dir = 8 + dir = 1 }, /turf/simulated/shuttle/floor, -/area/shuttle/trade/sol) +/area/shuttle/escape) "bgp" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; +/obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bgq" = ( /obj/machinery/power/apc{ dir = 1; @@ -33208,56 +33117,21 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "bil" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/chair/comfy/shuttle{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/mob/living/simple_animal/pig, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bim" = ( /obj/machinery/light/spot, /turf/simulated/shuttle/floor, /area/shuttle/escape) "bin" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/chair/comfy/shuttle{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) +/turf/simulated/shuttle/floor, +/area/shuttle/escape) "bio" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/structure/cable{ @@ -33805,33 +33679,39 @@ }, /area/hydroponics) "bje" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/bananium{ + name = "Clown's Office"; + req_access_txt = "46" }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/turf/simulated/floor/wood, +/area/clownoffice) "bjf" = ( /obj/structure/reagent_dispensers/beerkeg, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bjg" = ( -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = -28 +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Maintenance"; + req_access_txt = "12" }, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bjh" = ( -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/turf/simulated/shuttle/floor, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint2) "bji" = ( /obj/item/radio/beacon, /turf/simulated/floor/plasteel, @@ -34950,10 +34830,16 @@ /turf/simulated/floor/carpet, /area/crew_quarters/bar) "blu" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 +/obj/machinery/status_display{ + pixel_y = 30 }, -/turf/simulated/shuttle/floor, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/chair/comfy/shuttle, +/turf/simulated/shuttle/floor4, /area/shuttle/escape) "blv" = ( /obj/machinery/status_display{ @@ -35005,7 +34891,9 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/turf/simulated/shuttle/floor, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, /area/shuttle/escape) "blB" = ( /obj/structure/sign/securearea{ @@ -35021,9 +34909,11 @@ /area/hallway/secondary/entry) "blC" = ( /obj/structure/chair/comfy/shuttle{ - dir = 4 + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" }, -/turf/simulated/shuttle/floor4, /area/shuttle/escape) "blD" = ( /obj/structure/grille, @@ -35773,15 +35663,9 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/central/nw) "bmX" = ( -/obj/machinery/status_display{ - pixel_y = 30 +/obj/structure/chair/comfy/shuttle{ + dir = 4 }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor4, /area/shuttle/escape) "bmY" = ( @@ -35814,6 +35698,9 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bnc" = ( +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 + }, /obj/structure/chair/comfy/shuttle{ dir = 8 }, @@ -37078,9 +36965,8 @@ /turf/simulated/floor/plasteel, /area/assembly/chargebay) "bpE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/freezer{ - req_access_txt = "28" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ d1 = 1; @@ -37088,12 +36974,11 @@ icon_state = "1-2"; tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "showroomfloor" - }, -/area/crew_quarters/kitchen) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bpF" = ( /obj/machinery/alarm{ dir = 1; @@ -37365,18 +37250,14 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bqj" = ( -/obj/machinery/door/airlock{ - name = "Port Emergency Storage"; - req_access_txt = "0" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_access_txt = "12" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/storage/emergency2) +/area/maintenance/fsmaint2) "bqk" = ( /obj/structure/chair/wood/wings{ tag = "icon-wooden_chair_wings (WEST)"; @@ -38799,6 +38680,16 @@ }, /area/maintenance/asmaint2) "btt" = ( +/obj/item/radio/intercom{ + dir = 8; + name = "station intercom (General)"; + pixel_x = -28 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, /obj/structure/chair/comfy/shuttle{ dir = 4 }, @@ -38807,17 +38698,21 @@ }, /area/shuttle/escape) "btu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = 28 }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 }, -/area/shuttle/transport) +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/escape) "btv" = ( /turf/simulated/shuttle/floor, /turf/simulated/shuttle/wall/interior{ @@ -38857,6 +38752,11 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "btz" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, /obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) @@ -38883,11 +38783,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "btD" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, /obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor, /area/shuttle/transport) @@ -39959,20 +39854,15 @@ }, /area/crew_quarters/kitchen) "bvN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Chapel Office"; + req_access_txt = "22" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/turf/simulated/floor/plasteel{ + icon_state = "dark" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/area/chapel/office) "bvO" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -40239,17 +40129,14 @@ }, /area/hallway/secondary/exit) "bwl" = ( +/obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "28" +/obj/machinery/door/airlock{ + name = "Bar Office"; + req_access_txt = "25" }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" - }, -/area/crew_quarters/kitchen) +/turf/simulated/floor/wood, +/area/crew_quarters/bar) "bwm" = ( /turf/simulated/floor/plasteel{ dir = 10; @@ -40445,18 +40332,13 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "bwI" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" - }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, +/turf/simulated/shuttle/floor, /area/shuttle/transport) "bwJ" = ( +/obj/machinery/light/spot, /obj/structure/chair/comfy/shuttle{ dir = 1 }, @@ -40642,14 +40524,21 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bwX" = ( -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = -28 +/obj/machinery/door/airlock/maintenance{ + name = "Bar Maintenance"; + req_access_txt = "12" }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/turf/simulated/shuttle/floor4, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bwY" = ( /obj/machinery/power/apc{ dir = 4; @@ -41435,16 +41324,14 @@ }, /area/hallway/primary/central/ne) "bys" = ( -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" - }, -/area/shuttle/escape) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/fpmaint) "byt" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge"; @@ -42683,12 +42570,20 @@ }, /area/shuttle/specops) "bAS" = ( -/obj/machinery/light/spot, -/obj/structure/chair/comfy/shuttle{ +/obj/machinery/recharger/wallcharger{ + pixel_x = 4; + pixel_y = 32 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; dir = 1 }, -/turf/simulated/shuttle/floor, -/area/shuttle/transport) +/obj/structure/chair/comfy/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/specops) "bAT" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -43143,8 +43038,11 @@ /turf/simulated/floor/plating, /area/shuttle/escape) "bBT" = ( +/obj/structure/closet/walllocker/emerglocker{ + pixel_x = -28 + }, /obj/structure/chair/comfy/shuttle{ - dir = 1 + dir = 4 }, /turf/simulated/shuttle/floor4, /area/shuttle/escape) @@ -43194,10 +43092,9 @@ }, /area/shuttle/escape) "bBZ" = ( -/obj/machinery/camera{ - c_tag = "CentComm Special Ops. Shuttle"; - dir = 2; - network = list("ERT","CentComm") +/obj/machinery/recharger/wallcharger{ + pixel_x = 4; + pixel_y = 32 }, /obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ @@ -43239,9 +43136,10 @@ /turf/unsimulated/floor, /area/shuttle/specops) "bCe" = ( -/obj/machinery/recharger/wallcharger{ - pixel_x = 4; - pixel_y = 32 +/obj/machinery/camera{ + c_tag = "CentComm Special Ops. Shuttle"; + dir = 2; + network = list("ERT","CentComm") }, /obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ @@ -43336,10 +43234,8 @@ /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/maintenance/port) +/area/maintenance/fpmaint) "bCr" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, @@ -43994,16 +43890,11 @@ }, /area/shuttle/escape) "bDG" = ( -/obj/machinery/recharger/wallcharger{ - pixel_x = 4; - pixel_y = 32 - }, /obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; + tag = "icon-tube1 (WEST)"; icon_state = "tube1"; - dir = 1 + dir = 8 }, -/obj/structure/chair/comfy/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -44488,10 +44379,8 @@ }, /area/shuttle/specops) "bEL" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -44979,22 +44868,29 @@ /turf/simulated/floor/wood, /area/bridge/meeting_room) "bFJ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 6 }, -/turf/simulated/floor/plating, -/area/maintenance/port) +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/area/hydroponics) "bFK" = ( /obj/machinery/computer/communications, /turf/simulated/floor/wood, @@ -45586,10 +45482,8 @@ /obj/structure/chair/comfy/shuttle{ dir = 1 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/specops) +/turf/simulated/shuttle/floor4, +/area/shuttle/escape) "bGK" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor{ @@ -48009,18 +47903,29 @@ /turf/simulated/floor/plasteel, /area/assembly/chargebay) "bLn" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/mob/living/simple_animal/pig, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" }, -/area/medical/research{ - name = "Research Division" - }) +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/area/hydroponics) "bLo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -48400,26 +48305,28 @@ /turf/simulated/floor/plasteel, /area/assembly/robotics) "bLU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access"; - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" }, -/turf/simulated/floor/plating, -/area/maintenance/port) +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/area/hydroponics) "bLV" = ( /obj/item/storage/firstaid/o2{ pixel_x = 5; @@ -48700,20 +48607,6 @@ icon_state = "brown" }, /area/quartermaster/office) -"bMz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay"; - req_access_txt = "31" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/storage) "bMA" = ( /obj/machinery/mineral/ore_redemption, /turf/simulated/floor/plasteel, @@ -48746,13 +48639,22 @@ /turf/simulated/wall, /area/hallway/primary/central/sw) "bMF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Delivery Office"; - req_access_txt = "50" +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/freezer{ + req_access_txt = "28" }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "showroomfloor" + }, +/area/crew_quarters/kitchen) "bMG" = ( /turf/simulated/wall/r_wall, /area/crew_quarters/heads) @@ -49604,25 +49506,18 @@ /turf/simulated/floor/plasteel, /area/quartermaster/office) "bNP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Delivery Office"; - req_access_txt = "50" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/port) "bNQ" = ( /obj/machinery/light{ icon_state = "tube1"; @@ -49897,24 +49792,13 @@ }, /area/quartermaster/office) "bOn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay"; - req_access_txt = "31" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/storage) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/port) "bOo" = ( /obj/effect/landmark{ name = "blobstart" @@ -50563,25 +50447,18 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bPr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/machinery/door/airlock{ + name = "Port Emergency Storage"; + req_access_txt = "0" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) +/turf/simulated/floor/plating, +/area/storage/emergency2) "bPs" = ( /obj/machinery/status_display, /turf/simulated/wall/r_wall, @@ -50604,25 +50481,17 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bPv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 }, -/turf/simulated/floor/plasteel{ - tag = "icon-whiteblue (WEST)"; - icon_state = "whiteblue"; - dir = 8 - }, -/area/medical/reception) +/area/shuttle/transport) "bPw" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -50634,25 +50503,20 @@ /turf/simulated/floor/plating, /area/maintenance/disposal) "bPx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyerPort"; - name = "Medbay Entrance"; - req_access_txt = "5" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whiteblue"; - tag = "icon-whitehall (WEST)" - }, -/area/medical/reception) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/fsmaint2) "bPy" = ( /obj/structure/table, /obj/item/assembly/prox_sensor{ @@ -50840,23 +50704,17 @@ }, /area/shuttle/administration) "bPM" = ( -/obj/item/radio/intercom{ - dir = 8; - name = "station intercom (General)"; - pixel_x = -28 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen"; + req_access_txt = "28" }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (WEST)"; - icon_state = "tube1"; - dir = 8 +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "cafeteria"; + tag = "icon-cafeteria (NORTHEAST)" }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" - }, -/area/shuttle/escape) +/area/crew_quarters/kitchen) "bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -50932,22 +50790,17 @@ /turf/simulated/floor/plating, /area/quartermaster/storage) "bPU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay Emergency Entrance"; - req_access_txt = "5" +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 }, -/obj/effect/decal/warning_stripes/northeast, -/turf/simulated/floor/plasteel, -/area/hallway/primary/central/se) +/area/shuttle/transport) "bPV" = ( /obj/effect/landmark/start{ name = "Cargo Technician" @@ -52056,21 +51909,22 @@ }, /area/shuttle/administration) "bRH" = ( -/obj/structure/closet/walllocker/emerglocker{ - pixel_x = 28 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/light/spot{ - tag = "icon-tube1 (EAST)"; - icon_state = "tube1"; +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor3" - }, -/area/shuttle/escape) +/turf/simulated/floor/plating, +/area/maintenance/port) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -52545,36 +52399,39 @@ /turf/simulated/floor/plating, /area/medical/chemistry) "bSz" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medical Supplies"; - req_access_txt = "5" +/obj/machinery/door/airlock/research{ + name = "Research Division Access"; + req_access_txt = "47" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ - tag = "icon-whitebluefull"; - icon_state = "whitebluefull" + icon_state = "white" }, -/area/medical/biostorage) +/area/medical/research{ + name = "Research Division" + }) "bSA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medical Supplies"; - req_access_txt = "5" +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access"; + req_access_txt = "12" }, -/turf/simulated/floor/plasteel{ - tag = "icon-whitebluefull"; - icon_state = "whitebluefull" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/medical/biostorage) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/port) "bSB" = ( /obj/machinery/atmospherics/unary/cryo_cell, /turf/simulated/floor/plasteel{ @@ -54149,19 +54006,39 @@ /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) "bVk" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/area/shuttle/constructionsite) +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "bVl" = ( -/obj/machinery/light, -/turf/simulated/shuttle/floor{ - icon_state = "floor2" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" }, -/area/shuttle/constructionsite) +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/storage) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -54423,20 +54300,13 @@ }, /area/toxins/lab) "bVH" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Delivery Office"; + req_access_txt = "50" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "bVI" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -55132,34 +55002,24 @@ }, /area/shuttle/administration) "bWO" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + req_access_txt = "31" }, -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "Blast door control"; - pixel_x = -5; - pixel_y = 35; - req_access = list(101); - req_access_txt = "0" +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "Shutter control"; - pixel_x = 5; - pixel_y = 35; - req_access = list(101); - req_access_txt = "0" - }, -/obj/structure/chair/comfy/shuttle{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/area/shuttle/administration) +/turf/simulated/floor/plasteel, +/area/quartermaster/storage) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -55366,19 +55226,20 @@ /turf/simulated/floor/plasteel, /area/quartermaster/office) "bXi" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Office"; - req_access_txt = "50" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0; + tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/quartermaster/office) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "bXj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9; @@ -56135,17 +55996,26 @@ }, /area/shuttle/administration) "bYu" = ( -/obj/item/radio/intercom{ - broadcasting = 0; - listening = 1; - name = "station intercom (General)"; - pixel_y = 25 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" }, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_4) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel{ + tag = "icon-whiteblue (WEST)"; + icon_state = "whiteblue"; + dir = 8 + }, +/area/medical/reception) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -56417,9 +56287,6 @@ /area/server) "bYV" = ( /obj/structure/table, -/obj/machinery/photocopier/faxmachine{ - department = "Head of Personnel's Office" - }, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 @@ -56432,6 +56299,9 @@ pixel_y = 16; req_access_txt = "57" }, +/obj/machinery/photocopier/faxmachine/longrange{ + department = "Head of Personnel's Office" + }, /turf/simulated/floor/plasteel, /area/crew_quarters/heads) "bYW" = ( @@ -57142,31 +57012,25 @@ /area/medical/genetics_cloning) "bZR" = ( /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Genetics Cloning"; - req_access_txt = "0"; - req_one_access_txt = "5;9" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" }, +/obj/effect/mapping_helpers/airlock/unres, /turf/simulated/floor/plasteel{ - icon_state = "freezerfloor" + icon_state = "white" }, -/area/medical/genetics_cloning) +/area/medical/reception) "bZS" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1; @@ -57192,7 +57056,7 @@ name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; - req_access_txt = "47" + req_access_txt = "30" }, /obj/item/folder/white{ pixel_x = 4 @@ -57208,7 +57072,7 @@ normaldoorcontrol = 1; pixel_x = -4; pixel_y = -4; - req_access_txt = "20" + req_access_txt = "30" }, /turf/simulated/floor/plasteel{ dir = 2; @@ -57429,18 +57293,26 @@ /turf/simulated/wall, /area/quartermaster/miningdock) "can" = ( -/obj/machinery/status_display{ +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ density = 0; - layer = 4; - pixel_x = 0; - pixel_y = 32 + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/obj/machinery/light, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyerPort"; + name = "Medbay Entrance"; + req_access_txt = "5" }, -/turf/simulated/shuttle/floor, -/area/shuttle/pod_4) +/obj/effect/mapping_helpers/airlock/unres, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whiteblue"; + tag = "icon-whitehall (WEST)" + }, +/area/medical/reception) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58153,32 +58025,24 @@ }, /area/crew_quarters/hor) "cbr" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 - }, /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; - name = "Medbay Emergency Entrance"; + name = "Medical Supplies"; req_access_txt = "5" }, -/obj/effect/decal/warning_stripes/southeast, -/turf/simulated/floor/plasteel, -/area/hallway/primary/central/se) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-whitebluefull"; + icon_state = "whitebluefull" + }, +/area/medical/biostorage) "cbs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58245,26 +58109,31 @@ }, /area/shuttle/administration) "cby" = ( -/obj/machinery/light/spot{ - tag = "icon-tube1 (EAST)"; - icon_state = "tube1"; +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medical Supplies"; + req_access_txt = "5" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-whitebluefull"; + icon_state = "whitebluefull" + }, +/area/medical/biostorage) +"cbz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Office"; + req_access_txt = "50" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/chair/comfy/shuttle{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"cbz" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) +/turf/simulated/floor/plasteel, +/area/quartermaster/office) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -58498,16 +58367,25 @@ /area/medical/genetics_cloning) "cbY" = ( /obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 + }, /obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Genetics Cloning"; - req_access_txt = "0"; - req_one_access_txt = "5;9" + id_tag = "MedbayFoyer"; + name = "Medbay Emergency Entrance"; + req_access_txt = "5" }, -/turf/simulated/floor/plasteel{ - icon_state = "freezerfloor" +/obj/effect/decal/warning_stripes/northeast, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 }, -/area/medical/genetics_cloning) +/turf/simulated/floor/plasteel, +/area/hallway/primary/central/se) "cbZ" = ( /obj/structure/cable{ d1 = 4; @@ -59518,11 +59396,36 @@ }, /area/shuttle/administration) "cdq" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "CloningDoor"; + name = "Genetics Cloning"; + req_access_txt = "0"; + req_one_access_txt = "5;9" }, -/turf/simulated/shuttle/floor, -/area/shuttle/mining) +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/medical/genetics_cloning) "cdr" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/admin{ name = "NTV Argos shuttle navigation computer" @@ -60300,17 +60203,36 @@ }, /area/crew_quarters/hor) "ceT" = ( -/obj/structure/window/plasmareinforced{ - color = "#FF0000"; - dir = 8 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" }, -/obj/structure/chair/comfy/shuttle{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/area/shuttle/administration) +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay Emergency Entrance"; + req_access_txt = "5" + }, +/obj/effect/decal/warning_stripes/southeast, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/hallway/primary/central/se) "ceU" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, @@ -61271,8 +61193,13 @@ }, /area/shuttle/administration) "cgA" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, /obj/structure/chair/comfy/shuttle{ - dir = 1 + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -61631,11 +61558,21 @@ /turf/simulated/wall, /area/medical/paramedic) "chi" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "CloningDoor"; + name = "Genetics Cloning"; + req_access_txt = "0"; + req_one_access_txt = "5;9" }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "freezerfloor" + }, +/area/medical/genetics_cloning) "chj" = ( /obj/structure/cable{ d1 = 4; @@ -62278,30 +62215,22 @@ }, /area/shuttle/administration) "cil" = ( -/obj/structure/shuttle/engine/propulsion/burst{ +/obj/structure/chair/comfy/shuttle{ dir = 8 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f6"; - icon_state = "swall_f6"; - dir = 2 +/turf/simulated/shuttle/floor{ + icon_state = "floor4" }, -/area/shuttle/pod_4) +/area/shuttle/administration) "cim" = ( /turf/simulated/shuttle/floor, /area/shuttle/mining) "cin" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/structure/chair/comfy/shuttle{ + dir = 1 }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_4) +/turf/simulated/shuttle/floor, +/area/shuttle/mining) "cio" = ( /obj/machinery/door/window/brigdoor/westleft{ color = "#d70000"; @@ -63093,31 +63022,11 @@ }, /area/medical/ward) "cjA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/holosign/surgery{ - id = "surgery1" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/surgery1) +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cjB" = ( /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, @@ -63155,31 +63064,20 @@ }, /area/medical/ward) "cjD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; + d1 = 1; + d2 = 2; + icon_state = "1-2"; tag = "" }, -/obj/machinery/holosign/surgery{ - id = "surgery2" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/surgery2) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/apmaint) "cjE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -63516,12 +63414,32 @@ icon_state = "floor4" }, /area/shuttle/administration) +"ckh" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "cki" = ( /obj/machinery/light/small{ dir = 8 }, /turf/simulated/shuttle/floor, /area/shuttle/mining) +"ckj" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "ckk" = ( /obj/machinery/door/airlock/shuttle{ id_tag = "s_docking_airlock"; @@ -63544,6 +63462,7 @@ name = "mining shuttle bay"; width = 7 }, +/obj/structure/fans/tiny, /turf/simulated/shuttle/floor, /area/shuttle/mining) "ckl" = ( @@ -63552,6 +63471,7 @@ name = "Mining Dock Airlock"; req_access_txt = "48" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/quartermaster/miningdock) "ckm" = ( @@ -63560,6 +63480,7 @@ name = "Mining Dock Airlock"; req_access_txt = "48" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plasteel, /area/quartermaster/miningdock) "ckn" = ( @@ -63809,20 +63730,21 @@ /turf/simulated/floor/plasteel, /area/quartermaster/qm) "ckI" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/disposalpipe/segment, /obj/structure/cable{ d1 = 1; d2 = 2; - icon_state = "1-2"; - tag = "" + icon_state = "1-2" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + id_tag = "blueshieldofficedoor"; + name = "Blueshield's Office"; + req_access_txt = "67" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/apmaint) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/wood, +/area/blueshield) "ckJ" = ( /obj/structure/sink{ pixel_y = 30 @@ -63857,29 +63779,6 @@ icon_state = "1-2" }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - id_tag = "blueshieldofficedoor"; - name = "Blueshield's Office"; - req_access_txt = "67" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/wood, -/area/blueshield) -"ckO" = ( -/obj/structure/disposalpipe/segment, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "cautioncorner" - }, -/area/hallway/primary/aft) -"ckP" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ id_tag = "ntrepofficedoor"; name = "NT Representative's Office"; @@ -63889,6 +63788,21 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/wood, /area/ntrep) +"ckO" = ( +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "cautioncorner" + }, +/area/hallway/primary/aft) +"ckP" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26" + }, +/obj/structure/disposalpipe/segment, +/turf/simulated/floor/plasteel, +/area/janitor) "ckQ" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -63909,13 +63823,19 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "ckT" = ( -/obj/machinery/door/airlock{ - name = "Custodial Closet"; - req_access_txt = "26" +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/structure/disposalpipe/segment, -/turf/simulated/floor/plasteel, -/area/janitor) +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) "ckU" = ( /obj/machinery/body_scanconsole, /obj/machinery/camera{ @@ -64002,7 +63922,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/asmaint) +/area/maintenance/asmaint2) "clb" = ( /obj/structure/table/glass, /obj/machinery/computer/med_data/laptop, @@ -64773,35 +64693,11 @@ }, /area/medical/medbreak) "cmt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/medical/glass{ - id_tag = ""; - name = "Staff Room"; - req_access_txt = "5"; - req_one_access_txt = "0" - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "cafeteria"; - tag = "icon-cafeteria (NORTHEAST)" - }, -/area/medical/medbay2) +/turf/simulated/floor/plating, +/area/maintenance/asmaint) "cmu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -65219,7 +65115,7 @@ /turf/simulated/wall, /area/toxins/test_area) "cnl" = ( -/obj/structure/closet/wardrobe/miner/lavaland, +/obj/structure/closet/wardrobe/miner, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "brown" @@ -66492,12 +66388,18 @@ /turf/simulated/wall, /area/maintenance/genetics) "cpk" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, /obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" + req_access_txt = "12" }, /turf/simulated/floor/plating, -/area/maintenance/genetics) +/area/maintenance/asmaint) "cpl" = ( /obj/structure/cable, /obj/structure/table, @@ -67211,6 +67113,32 @@ icon_state = "whitepurple" }, /area/toxins/mixing) +"cqo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, +/obj/machinery/holosign/surgery{ + id = "surgery1" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/surgery1) "cqp" = ( /obj/machinery/camera{ c_tag = "Research Toxins Launch Room"; @@ -67369,6 +67297,17 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/aft) "cqw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -67376,11 +67315,13 @@ pixel_x = 0; tag = "" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/holosign/surgery{ + id = "surgery2" }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/surgery2) "cqx" = ( /obj/machinery/doppler_array{ dir = 4 @@ -71437,17 +71378,34 @@ /area/maintenance/asmaint) "cxj" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Research"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = ""; + name = "Staff Room"; + req_access_txt = "5"; + req_one_access_txt = "0" }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "cafeteria"; + tag = "icon-cafeteria (NORTHEAST)" }, -/area/toxins/xenobiology) +/area/medical/medbay2) "cxk" = ( /obj/structure/cable{ icon_state = "0-4"; @@ -72095,28 +72053,6 @@ }, /turf/simulated/floor/plasteel, /area/storage/tech) -"cyu" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) "cyv" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'HIGH VOLTAGE'"; @@ -72250,23 +72186,11 @@ /area/construction) "cyE" = ( /obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + name = "Medbay Maintenance"; + req_access_txt = "5" }, /turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/area/maintenance/genetics) "cyF" = ( /obj/structure/cable{ d1 = 4; @@ -72394,18 +72318,18 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cyT" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0; - tag = "" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Research"; + req_access_txt = "47" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "white" }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/area/toxins/xenobiology) "cyU" = ( /obj/item/twohanded/required/kirbyplants, /obj/structure/extinguisher_cabinet{ @@ -72689,6 +72613,9 @@ /turf/simulated/floor/plating, /area/storage/tech) "czx" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -72696,10 +72623,8 @@ pixel_x = 0; tag = "" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage"; - req_access_txt = "23" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -72708,7 +72633,7 @@ dir = 4 }, /turf/simulated/floor/plating, -/area/storage/tech) +/area/maintenance/asmaint) "czy" = ( /obj/structure/cable{ d1 = 4; @@ -73391,24 +73316,24 @@ /turf/simulated/floor/plating, /area/maintenance/apmaint) "cAG" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; tag = "" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Research"; - req_access_txt = "47" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "white" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/toxins/xenobiology) +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cAH" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -73839,22 +73764,18 @@ /turf/simulated/floor/plating, /area/medical/psych) "cBx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Psych Office"; - req_access_txt = "64" - }, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0 + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0; + tag = "" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/wood, -/area/medical/psych) +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "cBy" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 1; @@ -74450,14 +74371,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/apmaint) -"cCF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Alternate Construction Area"; - req_access_txt = "12" - }, -/turf/simulated/floor/plating, -/area/maintenance/apmaint) "cCG" = ( /obj/structure/cable{ d1 = 2; @@ -74482,16 +74395,22 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; + pixel_x = 0; tag = "" }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Alternate Construction Area"; - req_access_txt = "12" +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_access_txt = "23" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plating, -/area/maintenance/consarea) +/area/storage/tech) "cCJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -74822,6 +74741,10 @@ /obj/machinery/light_switch{ pixel_y = 27 }, +/obj/machinery/alarm{ + frequency = 1439; + pixel_y = 23 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "yellowcorner" @@ -74933,20 +74856,24 @@ /turf/simulated/floor/plating, /area/toxins/misc_lab) "cDv" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; tag = "" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Research"; + req_access_txt = "47" }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/apmaint) +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/toxins/xenobiology) "cDw" = ( /turf/simulated/floor/plasteel{ icon_state = "white" @@ -75799,14 +75726,9 @@ /turf/simulated/wall/r_wall, /area/engine/mechanic_workshop) "cFe" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ + name = "Alternate Construction Area"; req_access_txt = "12" }, /turf/simulated/floor/plating, @@ -76330,25 +76252,20 @@ }, /area/toxins/misc_lab) "cFT" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0; + tag = "" + }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Mechanic Workshop"; - req_access_txt = "70"; - req_one_access_txt = "0" +/obj/machinery/door/airlock/maintenance{ + name = "Alternate Construction Area"; + req_access_txt = "12" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/engine/mechanic_workshop) +/turf/simulated/floor/plating, +/area/maintenance/consarea) "cFU" = ( /obj/structure/window/reinforced, /obj/structure/table/reinforced, @@ -76830,9 +76747,22 @@ /turf/simulated/wall/r_wall, /area/atmos/control) "cGL" = ( -/obj/machinery/door/airlock/maintenance, -/turf/simulated/floor/plating, -/area/maintenance/genetics) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Psych Office"; + req_access_txt = "64" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/wood, +/area/medical/psych) "cGM" = ( /obj/structure/cable{ d1 = 2; @@ -77331,16 +77261,14 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, -/area/maintenance/aft) +/area/maintenance/apmaint) "cHF" = ( /obj/structure/cable{ d1 = 1; @@ -77479,23 +77407,20 @@ /turf/simulated/wall, /area/engine/break_room) "cHR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering"; - req_access_txt = "32"; - req_one_access_txt = "0" +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plating, +/area/maintenance/apmaint) "cHS" = ( /obj/structure/table, /obj/item/book/manual/supermatter_engine, @@ -78704,18 +78629,25 @@ }, /area/engine/mechanic_workshop) "cJY" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/machinery/door/airlock/engineering/glass{ + name = "Mechanic Workshop"; + req_access_txt = "70"; + req_one_access_txt = "0" }, -/turf/simulated/floor/plating, -/area/maintenance/aft) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/engine/mechanic_workshop) "cJZ" = ( /turf/simulated/wall, /area/hallway/primary/aft) @@ -79921,6 +79853,13 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "cMq" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" }, @@ -80981,16 +80920,18 @@ }, /area/assembly/assembly_line) "cOs" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; + pixel_y = 0; tag = "" }, -/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plating, /area/maintenance/aft) "cOt" = ( @@ -81776,12 +81717,6 @@ }, /turf/simulated/floor/plasteel, /area/atmos) -"cPR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel, -/area/atmos) "cPS" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; @@ -81893,14 +81828,6 @@ /obj/effect/decal/warning_stripes/northeast, /turf/simulated/floor/plasteel, /area/engine/engineering) -"cQd" = ( -/obj/machinery/alarm{ - frequency = 1439; - pixel_y = 23 - }, -/obj/machinery/pipedispenser, -/turf/simulated/floor/plasteel, -/area/atmos) "cQe" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4; @@ -82310,10 +82237,6 @@ }, /turf/simulated/floor/plasteel, /area/engine/equipmentstorage) -"cQQ" = ( -/obj/machinery/pipedispenser/disposal, -/turf/simulated/floor/plasteel, -/area/atmos) "cQR" = ( /obj/machinery/firealarm{ dir = 1; @@ -83137,10 +83060,6 @@ "cSd" = ( /turf/simulated/floor/plasteel, /area/atmos) -"cSe" = ( -/obj/structure/closet/wardrobe/atmospherics_yellow, -/turf/simulated/floor/plasteel, -/area/atmos) "cSf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -84049,22 +83968,23 @@ /turf/simulated/floor/plating/airless, /area/space/nearstation) "cTG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Engineering Shuttle"; - req_access_txt = "0"; - req_one_access_txt = "10;24" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering"; + req_access_txt = "32"; + req_one_access_txt = "0" }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/engi_shuttle) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/engine/break_room) "cTH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, @@ -86495,7 +86415,6 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/suit_storage_unit/atmos, /turf/simulated/floor/plasteel, /area/atmos) "cXP" = ( @@ -88255,7 +88174,7 @@ req_access_txt = "12" }, /turf/simulated/floor/plating, -/area/maintenance/asmaint2) +/area/maintenance/aft) "dbi" = ( /obj/structure/closet/crate, /obj/item/clothing/under/color/lightpurple, @@ -88309,17 +88228,18 @@ /turf/simulated/floor/plasteel, /area/escapepodbay) "dbp" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" }, +/obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, -/area/maintenance/asmaint) +/area/maintenance/aft) "dbq" = ( /obj/structure/cable{ d1 = 1; @@ -88788,12 +88708,6 @@ /area/maintenance/asmaint) "dci" = ( /obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, /turf/simulated/floor/plating, /area/maintenance/genetics) "dcj" = ( @@ -89130,6 +89044,7 @@ req_access_txt = "0"; req_one_access_txt = "10;24" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/maintenance/engi_shuttle) "dcV" = ( @@ -89631,6 +89546,23 @@ /obj/structure/lattice/catwalk, /turf/space, /area/solar/starboard) +"ddW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Engineering Shuttle"; + req_access_txt = "0"; + req_one_access_txt = "10;24" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/engi_shuttle) "ddX" = ( /obj/machinery/access_button{ command = "cycle_exterior"; @@ -89807,6 +89739,28 @@ oxygen = 0 }, /area/atmos) +"deo" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) +"dep" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + tag = "" + }, +/turf/simulated/floor/plating, +/area/maintenance/genetics) "deq" = ( /obj/machinery/computer/guestpass, /turf/simulated/wall, @@ -90199,18 +90153,15 @@ /turf/simulated/floor/plating, /area/storage/secure) "dff" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, +/obj/machinery/door/airlock/maintenance, /obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/port) +/area/maintenance/asmaint2) "dfg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -90683,6 +90634,7 @@ name = "engineering dock"; width = 7 }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/shuttle/constructionsite) "dga" = ( @@ -90709,6 +90661,18 @@ dir = 6 }, /area/maintenance/storage) +"dge" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Biohazard Disposals"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plating, +/area/maintenance/asmaint) +"dgf" = ( +/obj/machinery/door/airlock/maintenance, +/turf/simulated/floor/plating, +/area/maintenance/asmaint2) "dgg" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ level = 2 @@ -90855,6 +90819,17 @@ /obj/machinery/light/small, /turf/simulated/floor/plating, /area/maintenance/asmaint2) +"dgC" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f6"; + icon_state = "swall_f6"; + dir = 2 + }, +/area/shuttle/pod_4) "dgD" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; @@ -91043,6 +91018,16 @@ /obj/item/caution, /turf/simulated/floor/plating, /area/maintenance/asmaint) +"dhb" = ( +/obj/machinery/flasher{ + id = "soltraderflash"; + pixel_y = -28 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/trade/sol) "dhc" = ( /obj/structure/lattice, /obj/structure/lattice, @@ -91466,30 +91451,16 @@ }, /area/crew_quarters/toilet) "dhT" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar Office"; - req_access_txt = "25" +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/turf/simulated/floor/wood, -/area/crew_quarters/bar) -"dhU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Bar Maintenance"; - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, -/area/maintenance/fsmaint2) +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_4) "dhV" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -91498,6 +91469,12 @@ icon_state = "showroomfloor" }, /area/crew_quarters/kitchen) +"dhW" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor2" + }, +/area/shuttle/constructionsite) "dhX" = ( /obj/machinery/computer/atmos_alert, /turf/simulated/shuttle/floor{ @@ -91541,16 +91518,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/asmaint2) -"die" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dif" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall2"; @@ -91755,6 +91722,12 @@ icon_state = "blue" }, /area/hallway/primary/central/north) +"diy" = ( +/obj/structure/chair/comfy/shuttle, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_sit) "diz" = ( /obj/machinery/light/small, /obj/machinery/camera/motion{ @@ -92914,14 +92887,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/wall, /area/maintenance/asmaint2) -"dkG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Biohazard Disposals"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/maintenance/asmaint) "dkH" = ( /obj/machinery/light/small{ dir = 4; @@ -93297,20 +93262,15 @@ name = "\improper AI Satellite Service" }) "dle" = ( -/obj/machinery/the_singularitygen{ - anchored = 1 - }, /obj/effect/decal/warning_stripes/west, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"dlf" = ( /obj/item/wrench, /turf/simulated/floor/plating/airless, /area/space/nearstation) +"dlf" = ( +/obj/item/radio/beacon/engine/tesling, +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "dlg" = ( -/obj/machinery/the_singularitygen/tesla{ - anchored = 1 - }, /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating/airless, /area/space/nearstation) @@ -93582,10 +93542,6 @@ /area/aisat/maintenance{ name = "\improper AI Satellite Service" }) -"dlL" = ( -/obj/machinery/door/airlock/maintenance, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dlM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small, @@ -95203,6 +95159,18 @@ /obj/machinery/teleport/hub, /turf/simulated/floor/plating, /area/turret_protected/aisat_interior) +"doI" = ( +/obj/item/radio/intercom{ + broadcasting = 0; + listening = 1; + name = "station intercom (General)"; + pixel_y = 25 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/pod_4) "doK" = ( /obj/machinery/light, /turf/simulated/floor/plating, @@ -95221,6 +95189,19 @@ }, /turf/simulated/shuttle/floor, /area/shuttle/pod_4) +"doM" = ( +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_x = 0; + pixel_y = 32 + }, +/obj/machinery/light, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor, +/area/shuttle/pod_4) "doN" = ( /obj/machinery/computer/station_alert, /obj/machinery/alarm{ @@ -96133,20 +96114,6 @@ "dsw" = ( /turf/simulated/floor/mech_bay_recharge_floor, /area/shuttle/escape) -"dsx" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/asmaint2) "dsy" = ( /obj/machinery/light/small{ dir = 4 @@ -96328,19 +96295,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, -/obj/structure/table, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/machinery/alarm{ - dir = 4; - icon_state = "alarm0"; - pixel_x = -22 - }, -/obj/item/pipe_painter, -/obj/item/pipe_painter, +/obj/structure/closet/wardrobe/atmospherics_yellow, /turf/simulated/floor/plasteel, /area/atmos) "dtk" = ( @@ -96529,6 +96484,35 @@ /area/toxins/launch{ name = "Toxins Launch Room" }) +"jnJ" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "kOE" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 @@ -96536,21 +96520,26 @@ /obj/structure/lattice, /turf/space, /area/space/nearstation) +"lLC" = ( +/obj/machinery/alarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -22 + }, +/turf/simulated/floor/plasteel, +/area/atmos) +"mMw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor4/vox, +/area/shuttle/vox) "nMi" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, /turf/space, /area/space/nearstation) -"opK" = ( -/obj/effect/landmark/start{ - name = "Shaft Miner" - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "brown" - }, -/area/quartermaster/miningdock) "oZV" = ( /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; @@ -96621,6 +96610,14 @@ icon_state = "floor4" }, /area/shuttle/administration) +"sUK" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/syndicate_sit) "uxy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 @@ -96650,6 +96647,34 @@ /obj/structure/lattice, /turf/space, /area/space/nearstation) +"vUm" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor2" + }, +/area/shuttle/constructionsite) +"wOS" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/pipe_painter, +/obj/item/pipe_painter, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/simulated/floor/plasteel, +/area/atmos) +"wVD" = ( +/obj/effect/landmark/start{ + name = "Shaft Miner" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "brown" + }, +/area/quartermaster/miningdock) "xAw" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 8 @@ -103736,7 +103761,7 @@ arh arh arh arh -aPV +arW arh apr aaa @@ -103990,9 +104015,9 @@ aaa apr arh aqk -aPV -aPV -aPV +arW +arW +arW dhe arh apr @@ -104504,9 +104529,9 @@ aaa apr arh aql -bcK -beB -bgo +arZ +aPV +dhb aql arh apr @@ -105295,9 +105320,9 @@ aaa aaa aaa aaa -btu +bPv bvi -bwI +bPU aaa aaa aaa @@ -105551,11 +105576,11 @@ aab aaa aaa aaa -btu +bPv btv bvj bwE -bwI +bPU aaa bAQ bCa @@ -106044,7 +106069,7 @@ aaa aJP aLa aLa -aON +aRm aOP aMs aVf @@ -106073,7 +106098,7 @@ brO aaa bAR bCc -bEL +bDG bEK bAR aLd @@ -106323,9 +106348,9 @@ aSf boP aSd brQ -btz +btD bvj -bwJ +bwI brQ bjQ bAR @@ -106558,7 +106583,7 @@ aaa aJQ aLa aLa -aOO +aRz aOR aQa aMd @@ -106580,15 +106605,15 @@ blE boL aSd brO -btz +btD bvj -bwJ +bwI brO aLd bAR -bBZ +bCe bCb -bGJ +bEL bAR aSd aaa @@ -106837,15 +106862,15 @@ bmS boL aSd brO -btD +btz bvj -bAS +bwJ brO aSd ahb bCb bCb -bGJ +bEL bAR aSd aSd @@ -107072,7 +107097,7 @@ aaa aJR aLe aLe -aPP +aRV aOP aMs aPJ @@ -107094,15 +107119,15 @@ aSf bsd aSd brO -btz +btD bvj -bwJ +bwI brO aSd ahb bCb bCb -bGJ +bEL bAR aSd bGm @@ -107351,15 +107376,15 @@ aSf bsh aSd brR -btz +btD bvj -bwJ +bwI brR aSd bAR -bCe +bBZ bCb -bGJ +bEL bAR aSd bGl @@ -107586,7 +107611,7 @@ aaa aJT aLe aLe -aPU +aRY aOR aQa aPQ @@ -107608,15 +107633,15 @@ brc bsh aSd brO -btz +btD bvj -bwJ +bwI brO aMs bAR -bDG +bAS bCb -bGJ +bEL bAR aSd bKp @@ -107829,11 +107854,11 @@ aaa awq axj awM -axo -azf -azf +aze +aAh +aAh aCT -aCY +aCX afy aFf aFe @@ -107865,9 +107890,9 @@ blE bsh aSd brO -btD +btz bvj -bAS +bwJ brO aMs bAT @@ -108142,7 +108167,7 @@ bRA bRA bWJ bPI -bWO +jnJ cbx cbx bPI @@ -108343,11 +108368,11 @@ aaa aws axj awN -axN -axN -axN +azh +azh +azh aBD -aCY +aCX aEe aFf aFg @@ -108359,7 +108384,7 @@ aII aII aHS aLg -aNS +aVL aQw aRe aSd @@ -108662,7 +108687,7 @@ cds bPI cgz cio -ceT +ckj bPI bYv aaa @@ -108919,7 +108944,7 @@ aaa bPI bRA bRA -cgA +ckh bPI aaa aaa @@ -109174,8 +109199,8 @@ aaa aaa aaa bPI -cby -cbz +cgA +cil bPI bYv aaa @@ -109669,7 +109694,7 @@ bqr bBr bqr bqr -bFJ +bRH bCf bCf bCf @@ -110925,7 +110950,7 @@ aHh aIx aIx aJU -aLh +aON aLl aGn aOV @@ -111473,7 +111498,7 @@ bIe bJu bnK bCh -bLU +bSA bCf bCf bCf @@ -111697,7 +111722,7 @@ aLk aGn aGn aPc -aLn +aPh aGn aGn aGn @@ -112217,7 +112242,7 @@ aGn aGn aGn aRu -aRY +bff aSF aTz aVh @@ -113000,7 +113025,7 @@ beP bgz bse bvd -dff +bNP dfg dfh dgU @@ -113479,12 +113504,12 @@ aaa awv axl ayk -avu +azf aEf -axm -axm -aze -azh +aBk +aBk +aCY +diy aFk aFi aGn @@ -113492,7 +113517,7 @@ aGn aGn aGn aHn -aIM +aLn aGn aKe aLq @@ -113994,11 +114019,11 @@ awx axl ayk azi -awP -awP -awP +sUK +sUK +sUK ayk -azh +diy aex aFi aGn @@ -114018,7 +114043,7 @@ aGn aPc aGn aSK -aVb +bjh aWl aYi bag @@ -116070,7 +116095,7 @@ aPi aPi aHS aMA -aRm +bcv aMA aKb aNx @@ -116116,7 +116141,7 @@ ceZ cgB cim cki -cdq +cin cnh ceZ aab @@ -116129,11 +116154,11 @@ csu csu cCE cAF -cFe +cHE cGf cGf cGf -cJY +cMq cJn cLi cNA @@ -116352,7 +116377,7 @@ bwY bsk bnD bBf -bCq +bOn bJy bKG bxb @@ -116371,9 +116396,9 @@ aaa aaa ceY cgC -cdq +cin cim -cdq +cin cni coN aab @@ -116392,7 +116417,7 @@ cFW cIJ cEY cLm -cMq +dbh cNB cNB cPu @@ -116630,7 +116655,7 @@ ceZ cgD cim cim -cdq +cin cnj ceZ aab @@ -116855,7 +116880,7 @@ beK bgh bmf bkr -bCq +bOn bCs bCs bCs @@ -117883,7 +117908,7 @@ beN bgA blO bph -bqj +bPr brz bsD bui @@ -118157,8 +118182,8 @@ bFq bFm bxb bKB -bMz -bOn +bVl +bWO bKB bxb bxb @@ -118172,7 +118197,7 @@ cam cgH cit ckn -opK +wVD cnm cam cgQ @@ -118351,7 +118376,7 @@ atK auw avv awz -atL +axo aym azk aAk @@ -118604,7 +118629,7 @@ aaa aaa aaa asT -arW +atL aux avy awz @@ -118865,7 +118890,7 @@ atJ auu avx awy -avp +axm awz azk aAk @@ -119164,7 +119189,7 @@ aSz aSz aSz aSz -bfa +bys biE bmx bpj @@ -119184,7 +119209,7 @@ bDU bNs bHc byC -bNP +bVk bMx bSM bUn @@ -119211,7 +119236,7 @@ cvo cvo cvo cvo -cCF +cFe cvo cEY cEP @@ -119472,7 +119497,7 @@ cwF cwF cEY cEO -cFT +cJY cGH cEY cEY @@ -119704,7 +119729,7 @@ bzJ bQe bDX bDX -bXi +cbz bzJ bYK bYM @@ -119988,7 +120013,7 @@ cvo cEQ cGb cGM -cHE +cOs cIP cIP cKJ @@ -120011,9 +120036,9 @@ cZu cZu dcM dfY -bVk -bVk -bVk +vUm +vUm +vUm dfY aaa aaa @@ -120213,7 +120238,7 @@ bzE bzE bzE bNX -bMF +bVH bBn bBn bBn @@ -120270,7 +120295,7 @@ dcU dfZ dgv dgv -bVl +dhW dfY aaa aaa @@ -120526,7 +120551,7 @@ dcM dfd dfY dgv -bVk +vUm dgv dfY aaa @@ -121267,7 +121292,7 @@ cvo cvo cvo cvo -cCI +cFT cvo cvo cEQ @@ -121285,7 +121310,7 @@ cKb cKb cRI cSj -cTG +ddW cUY cZC dar @@ -121767,7 +121792,7 @@ caw bTz cfq ciy -ckI +cjD cly cly cly @@ -121783,7 +121808,7 @@ cti cly cAH cly -cDv +cHR cFg cGm cnA @@ -122248,7 +122273,7 @@ aXZ bmu aPi aPi -bff +bCq bgS bmV bkv @@ -122733,7 +122758,7 @@ aoe aMO aod aod -avU +avW aod aod aoe @@ -122795,7 +122820,7 @@ bMG cdV cfu ciL -ckN +ckI ccK cmK com @@ -122997,14 +123022,14 @@ aIo aIl aIl aDe -aDO +aIM aIl aIl aHA aHA -aKp +aNS aHA -aNe +aOO aHA aHA aEl @@ -124035,7 +124060,7 @@ aLV aJF aOA aPD -aRV +aVb aTw aVE aYa @@ -124337,7 +124362,7 @@ bTJ ces cgi cji -ckP +ckN clL cmM coo @@ -124541,7 +124566,7 @@ aCi aCf aCn aFr -aGv +aKx aHG aHG aKv @@ -125065,7 +125090,7 @@ aSN aPH aEj aMA -aVL +bew aMA aMA aMA @@ -125120,7 +125145,7 @@ cgW cvx cvx cvx -czx +cCI cvx cvx cvx @@ -125134,7 +125159,7 @@ cJk cHG cHG cNS -cOs +dbp cPl cRR cQE @@ -126074,8 +126099,8 @@ aoq arq asZ aAx -avW awc +awP aAx azI aAP @@ -126088,7 +126113,7 @@ aFw aJh aKy aEj -aKx +aPb awl awl awl @@ -126141,7 +126166,7 @@ chc chc chc chc -cqw +cpk cJZ csD ctX @@ -126413,7 +126438,7 @@ cFj cGN cHU cLM -cHR +cTG cLM cHQ cHQ @@ -126598,7 +126623,7 @@ aHE axe aFz aFz -aHV +aLh aFz axe awl @@ -127421,7 +127446,7 @@ bSi ceF cgj cjl -ckT +ckP clQ cnr cor @@ -128449,13 +128474,13 @@ bSi ccn cgI cjn -cla +ckT clS cPd cos cPd cqY -chi +cmt csL csL cvI @@ -128996,7 +129021,7 @@ cSd cOF cTk dfF -dtn +wOS dcq dcq dcq @@ -129023,9 +129048,9 @@ dfR dcq dcq dcq -cil +dgC doL -cin +dhT dcq aaa aaa @@ -129173,7 +129198,7 @@ aJp aJp aJp aNW -aPb +aPP aQm aSm aTE @@ -129223,7 +129248,7 @@ cjo chf cdW ceb -chi +cmt csL cqZ crX @@ -129253,8 +129278,8 @@ cSd cSd cWT cXQ -dtn -dtn +cSd +lLC cXO dbK dct @@ -129281,7 +129306,7 @@ dcq aaa dcq dou -bYu +doI dou dcq aaa @@ -129538,7 +129563,7 @@ dcq aaa dcq dou -can +doM dou dcq aaa @@ -129762,7 +129787,7 @@ cGK cDi cSd cSd -cPR +cPT cQS cEr cTq @@ -130016,10 +130041,10 @@ cJc cJN csK cZS -cQd -cQQ -cSe -cPT +dtn +dtn +dtn +dtn cFG cVJ cWO @@ -130242,8 +130267,8 @@ bPc chh bQV bSu -bPU -cbr +cbY +ceT bSu bQV chf @@ -130256,7 +130281,7 @@ csL cqD csL chf -chi +cmt chf chf chf @@ -131242,7 +131267,7 @@ aUS bjc baJ beH -dhT +bwl bft aYd bnQ @@ -132052,7 +132077,7 @@ caA cfE cfE cfE -cjA +cqo cCW cCW chu @@ -132527,7 +132552,7 @@ aOI bjl bbc bfn -dhU +bwX djk dkN boM @@ -132553,7 +132578,7 @@ bHO bHO bHO bHO -bPv +bYu bSR bZJ cbO @@ -132810,7 +132835,7 @@ bLA bLA bLA bLA -bPr +bZR bYe bZK cbQ @@ -133067,7 +133092,7 @@ bLB bNr bPm bNz -bPx +can crA bZJ cuv @@ -133294,7 +133319,7 @@ aZC bbu bdj bfr -aOa +bpE bjo bbd bdT @@ -133337,7 +133362,7 @@ caA cfH cfH cfH -cjD +cqw cDf cDf cnz @@ -133542,7 +133567,7 @@ aSP aSP aSP aSP -aPh +aPU aQH aSQ aVs @@ -133566,7 +133591,7 @@ bpN bog bpN bog -bwl +bPM bdT bdT bAk @@ -134045,7 +134070,7 @@ awF awF avq aya -aBC +aDO aqc atG aaa @@ -134330,7 +134355,7 @@ bdL bfE biY boQ -bpE +bMF bqB brY btI @@ -134833,7 +134858,7 @@ aPm aVv aXf aXf -bbx +bje aKn aKm aVU @@ -135099,7 +135124,7 @@ bbC aGY beb djw -bgp +bFJ boX bpH bqH @@ -135356,7 +135381,7 @@ bbh aGY beb dju -bil +bLn bjv dnD bmy @@ -135380,7 +135405,7 @@ bLS bTU bQB bRb -bSz +cbr bJR bZN cbU @@ -135602,7 +135627,7 @@ aPm aPm aSZ aLA -aXT +bfa aIh aLA aLA @@ -135613,7 +135638,7 @@ bbh aGY beb djx -bin +bLU bjv dnE bmy @@ -135637,7 +135662,7 @@ bMY bOV bQE bOV -bSA +cby cuo bZP cbW @@ -135659,7 +135684,7 @@ cwX cpS czZ cAt -cBx +cGL cCS cEh cmy @@ -135843,9 +135868,9 @@ atG auA axg axh -aAh +aBC avt -aCX +aHV atG aaa aFK @@ -135870,7 +135895,7 @@ bbI aGY beb bfH -bin +bLU bjx bfH bmy @@ -136101,7 +136126,7 @@ axf dgk axh auq -aBk +avp auq atG aab @@ -136127,7 +136152,7 @@ bbV aGY beb bfJ -bin +bLU bjy bkY bmy @@ -136153,8 +136178,8 @@ bLK bLK bLK bTZ -bZR -cbY +cdq +chi bTZ bWd chr @@ -136166,7 +136191,7 @@ chz chr ckC ckC -cmt +cxj ckC ciY cwZ @@ -136358,7 +136383,7 @@ azT azT axh auq -aBl +avu auq aaa aaa @@ -137492,7 +137517,7 @@ cps diq djm cps -dkG +dge dla dlr dlN @@ -138224,7 +138249,7 @@ ckL cga cga cga -cpk +cyE cxb cxJ cAb @@ -138254,7 +138279,7 @@ cJt cJG chf chf -dbp +deo chf cBN chf @@ -138940,7 +138965,7 @@ aGY aGX aGX aGX -aRz +aTs aMz aOF aOG @@ -138961,7 +138986,7 @@ bfR bfR bfR bfR -bvN +bPx byQ bAW bCN @@ -139026,7 +139051,7 @@ cOm cOm daJ dbq -dci +dep cac cac cac @@ -139529,16 +139554,16 @@ ciY ciY ciY ciY -cGL +dci ciY cIb ciY ciY -cGL +dci ciY ciY ciY -cGL +dci cep cep aaa @@ -140235,7 +140260,7 @@ aGX aGX aWA aYY -bcv +bqj bfU bhx bij @@ -141607,7 +141632,7 @@ aaa aaa bGH cuQ -dlL +dgf cuQ bGH aaa @@ -142338,7 +142363,7 @@ bLR cvG bIi cxN -cyu +czx cBR cBR cDq @@ -142826,11 +142851,11 @@ bHQ bJq bJq bKT -bLn +bSz bNn bPi bRT -bLn +bSz bUP bVF bWl @@ -142851,10 +142876,10 @@ csH cny cvH cwt -cxj +cyT cyC cAi -cAG +cDv cBA cCU cEm @@ -142885,14 +142910,14 @@ aab aab aab bGH -die +dff dhR bGH bGH bGH bGH cuQ -dlL +dgf cuQ bGH bGH @@ -143066,7 +143091,7 @@ bcu ber bga bis -bew +bvN bcD bld blw @@ -143366,7 +143391,7 @@ bIi bIi bIi cxN -cyE +cAG cAP cAP cDu @@ -143871,11 +143896,11 @@ chS cjQ bYj cmx -dsx +cla dsz cpT dsz -dsx +cla ctH cAS cAS @@ -144348,7 +144373,7 @@ aYA baA baz baz -bew +bvN bgg bgg baz @@ -144690,7 +144715,7 @@ cuQ aaa cuQ cuQ -dlL +dgf cuQ bGG bKl @@ -144857,7 +144882,7 @@ aMz aQI aGY aSi -aTs +bjg aUX aUX aZF @@ -144908,7 +144933,7 @@ cgs bGG cuQ cxS -cyT +cBx cAP cCh cDw @@ -145659,7 +145684,7 @@ bPq bPq bPq bUS -bVH +bXi bWv bYn caS @@ -146434,7 +146459,7 @@ big big big big -dbh +cjA aYS aaa dbP @@ -146740,7 +146765,7 @@ bGH bGG dgy bGG -dbh +cjA dia cuQ djQ @@ -148016,7 +148041,7 @@ aab bGH bGG bGG -dbh +cjA bGG dcJ ddJ @@ -148281,7 +148306,7 @@ cuQ dfc bGG bGG -dbh +cjA bGG bGG bGH @@ -150268,15 +150293,15 @@ aaa aaa aaa bjC -blC -bwX +bmX +bBT bDz bjC beC -bPM -btt -btt btt +blA +blA +blA bzq beC bjC @@ -150525,7 +150550,7 @@ aaa aYD bic bjG -bmX +blu bDz bDz bjC @@ -150784,13 +150809,13 @@ bik bjC bmY bDz -bBT +bGJ bjC beC -bnc -bnc -bnc -bnc +blC +blC +blC +blC beC beC bBV @@ -151036,12 +151061,12 @@ aaa aYD baW beA -bjg -blu +bgo +bil bjC bmY bDz -bBT +bGJ bjC beC blD @@ -151292,7 +151317,7 @@ aaa aYD baW bcJ -bje +bcK beC beC bjC @@ -151301,10 +151326,10 @@ bmQ bnb bqo beC -btt -btt -btt -btt +blA +blA +blA +blA beC bAP bBX @@ -151548,7 +151573,7 @@ aaa aaa aYU baX -bje +bcK beC beC beC @@ -151806,19 +151831,19 @@ aaa aYH baY bcL -bje +bcK beC bim bjC -bnc -bnc -bnc -bnc +blC +blC +blC +blC beC -bnc -bnc -bnc -bnc +blC +blC +blC +blC beC bAP bBX @@ -152064,8 +152089,8 @@ aaa aYH baY beD -bjh -blA +bgp +bin bjJ blD bnb @@ -152324,15 +152349,15 @@ aYU baY beC bjC -btt -btt -btt -btt +blA +blA +blA +blA beC -btt -btt -btt -btt +blA +blA +blA +blA beC beC bBY @@ -152838,15 +152863,15 @@ aaa aaa aaa bjC +blC bnc -bys -bnc -bnc -bnc -bRH -bnc -bnc -bnc +blC +blC +blC +btu +blC +blC +blC beC beC bBS @@ -153045,7 +153070,7 @@ aha ahZ aha aha -arZ +amZ agZ aaa aaa @@ -153803,8 +153828,8 @@ aaa aaa agc agZ -amZ -amZ +mMw +mMw agZ ail agw diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index e619a998d41..fcdcead448f 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -12228,6 +12228,12 @@ "FL" = ( /turf/simulated/wall/r_wall, /area/adminconstruction) +"Ga" = ( +/obj/machinery/computer/shuttle/ert, +/turf/unsimulated/floor{ + icon_state = "dark" + }, +/area/centcom/specops) "GP" = ( /turf/unsimulated/floor{ icon_state = "gcircuit" @@ -31699,7 +31705,7 @@ pb uj uj uj -uj +Ga sX we we diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index 7e8d296ba7d..26d46280ae3 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -353,104 +353,10 @@ }, /turf/simulated/floor/plating, /area/tcommsat/powercontrol) -"aI" = ( -/turf/simulated/mineral/random, -/area/mine/dangerous/explored/golem) -"aJ" = ( -/turf/simulated/floor/plating/asteroid/airless, -/area/mine/dangerous/explored/golem) -"aK" = ( -/turf/simulated/mineral/random/high_chance, -/area/mine/dangerous/explored/golem) -"aL" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 - }, -/area/shuttle/freegolem) -"aM" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall12"; - icon_state = "swall12"; - dir = 2 - }, -/area/shuttle/freegolem) -"aN" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aO" = ( -/turf/simulated/shuttle/wall{ - dir = 2; - icon_state = "swall8"; - tag = "icon-swall12" - }, -/area/shuttle/freegolem) -"aP" = ( -/turf/simulated/shuttle/wall{ - icon_state = "swall3"; - dir = 2 - }, -/area/shuttle/freegolem) -"aQ" = ( -/obj/structure/closet/crate/golemgear, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aR" = ( -/obj/item/storage/toolbox/mechanical, -/obj/item/reagent_containers/spray/cleaner, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aS" = ( -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "aT" = ( /obj/structure/lattice, /turf/space, /area/space/nearstation) -"aU" = ( -/obj/structure/reagent_dispensers/watertank/high, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aV" = ( -/obj/structure/shuttle/engine/heater{ - icon_state = "heater"; - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"aW" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4; - icon_state = "burst_l" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"aX" = ( -/obj/machinery/light/small, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"aY" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall13"; - icon_state = "swall13"; - dir = 2 - }, -/area/shuttle/freegolem) -"aZ" = ( -/obj/machinery/door/airlock/shuttle, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) "ba" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s6"; @@ -479,24 +385,6 @@ dir = 2 }, /area/space/nearstation) -"be" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall14"; - icon_state = "swall14"; - dir = 2 - }, -/area/shuttle/freegolem) -"bf" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) -"bg" = ( -/obj/machinery/door/airlock/shuttle, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bh" = ( -/turf/simulated/wall/mineral/titanium/interior, -/area/shuttle/freegolem) "bi" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall7"; @@ -536,33 +424,12 @@ dir = 2 }, /area/space/nearstation) -"bn" = ( -/obj/machinery/vending/hydroseeds, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bo" = ( -/obj/machinery/vending/hydronutrients, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "bp" = ( /obj/machinery/door/unpowered/shuttle, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, /area/space/nearstation) -"bq" = ( -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"br" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) "bs" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -573,13 +440,6 @@ dir = 2 }, /area/space/nearstation) -"bt" = ( -/obj/machinery/light{ - dir = 1; - on = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "bu" = ( /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -590,18 +450,6 @@ dir = 2 }, /area/space/nearstation) -"bv" = ( -/obj/machinery/light{ - dir = 1; - on = 1 - }, -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bw" = ( -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "bx" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s5"; @@ -623,171 +471,6 @@ dir = 2 }, /area/space/nearstation) -"bA" = ( -/obj/machinery/vending/coffee/free, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bB" = ( -/turf/simulated/shuttle/wall{ - tag = "icon-swall14"; - icon_state = "swall4"; - dir = 2 - }, -/area/shuttle/freegolem) -"bC" = ( -/turf/simulated/shuttle/wall{ - dir = 2; - icon_state = "swallc1"; - tag = "icon-swall12" - }, -/area/shuttle/freegolem) -"bD" = ( -/obj/structure/window/full/shuttle{ - icon_state = "16" - }, -/obj/structure/grille, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"bE" = ( -/obj/structure/statue/gold/rd{ - name = "statue of the Liberator" - }, -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) -"bF" = ( -/obj/machinery/mineral/equipment_vendor/golem, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bG" = ( -/obj/item/resonator, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bH" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bI" = ( -/obj/item/gun/energy/kinetic_accelerator, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bJ" = ( -/obj/structure/window/full/shuttle{ - icon_state = "15" - }, -/obj/structure/grille, -/turf/simulated/shuttle/plating, -/area/shuttle/freegolem) -"bK" = ( -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = 0 - }, -/obj/structure/table/wood, -/obj/item/bedsheet/rd/royal_cape{ - layer = 3; - pixel_x = 5; - pixel_y = 9 - }, -/obj/item/book/manual/research_and_development{ - name = "Sacred Text of the Liberator"; - pixel_x = -4; - pixel_y = 3 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor5" - }, -/area/shuttle/freegolem) -"bL" = ( -/obj/machinery/mineral/ore_redemption/golem, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bM" = ( -/obj/machinery/computer/shuttle/golem_ship, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bN" = ( -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/freegolem) -"bO" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bP" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 30 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bQ" = ( -/turf/simulated/shuttle/wall{ - icon_state = "swallc4" - }, -/area/shuttle/freegolem) -"bR" = ( -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/obj/structure/fans/tiny, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 8; - height = 20; - id = "freegolem"; - name = "Free Golem Ship"; - roundstart_move = "freegolem_transit"; - width = 16 - }, -/obj/docking_port/stationary{ - dir = 8; - dwidth = 8; - height = 20; - id = "freegolem_z3"; - name = "Small Asteroid"; - width = 16 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bS" = ( -/obj/machinery/light, -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bT" = ( -/obj/machinery/light/small, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bU" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/shuttle{ - id_tag = "s_docking_airlock"; - locked = 1 - }, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"bV" = ( -/obj/item/resonator/upgraded, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "bW" = ( /obj/structure/lattice, /obj/structure/grille, @@ -1397,10 +1080,6 @@ }, /turf/simulated/floor/plasteel, /area/tcommsat/computer) -"dr" = ( -/obj/machinery/autolathe, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "ds" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -1814,15 +1493,6 @@ }, /turf/simulated/floor/plating, /area/tcommsat/chamber) -"ej" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"ek" = ( -/obj/machinery/computer/arcade/battle, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "el" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -1876,10 +1546,6 @@ /obj/structure/lattice, /turf/space, /area/turret_protected/tcomsat) -"eq" = ( -/obj/machinery/computer/arcade/orion_trail, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "er" = ( /obj/structure/window/reinforced{ dir = 4 @@ -1957,10 +1623,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"ex" = ( -/obj/machinery/light, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "ey" = ( /obj/structure/cable{ d1 = 4; @@ -2004,11 +1666,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"eA" = ( -/obj/machinery/light, -/obj/effect/landmark/free_golem_spawn, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "eB" = ( /turf/simulated/floor/bluegrid{ icon_state = "dark"; @@ -2103,10 +1760,6 @@ /obj/structure/lattice, /turf/space, /area/turret_protected/tcomsat) -"eI" = ( -/obj/machinery/vending/snack/free, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "eJ" = ( /obj/structure/cable{ d1 = 1; @@ -2188,13 +1841,6 @@ }, /turf/simulated/floor/plating/airless, /area/space/nearstation) -"eQ" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/brute, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "eR" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2464,12 +2110,6 @@ }, /turf/simulated/floor/plating/airless, /area/space/nearstation) -"fp" = ( -/obj/structure/table/wood, -/obj/item/storage/firstaid/adv, -/obj/item/storage/firstaid/adv, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "fq" = ( /obj/structure/grille, /obj/structure/cable{ @@ -2578,15 +2218,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"fy" = ( -/obj/structure/table/wood, -/obj/structure/table/wood, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/fire, -/obj/item/storage/firstaid/fire, -/obj/machinery/light, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) "fz" = ( /obj/machinery/telecomms/processor/preset_four, /turf/simulated/floor/plasteel{ @@ -2862,18 +2493,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"fY" = ( -/obj/structure/table/wood, -/obj/item/areaeditor/golem, -/obj/item/disk/design_disk/golem_shell, -/turf/simulated/floor/mineral/titanium/purple, -/area/shuttle/freegolem) -"fZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "ga" = ( /obj/machinery/telecomms/server/presets/command, /turf/simulated/floor/plasteel{ @@ -2898,10 +2517,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"gc" = ( -/obj/machinery/chem_master, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gd" = ( /obj/machinery/camera{ c_tag = "Telecomms Server Room South"; @@ -2923,10 +2538,6 @@ temperature = 80 }, /area/tcommsat/chamber) -"ge" = ( -/obj/structure/ore_box, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gf" = ( /obj/structure/cable{ d1 = 1; @@ -2970,10 +2581,6 @@ "gj" = ( /turf/simulated/wall/r_wall, /area/turret_protected/tcomfoyer) -"gk" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/simulated/floor/plating, -/area/shuttle/freegolem) "gr" = ( /obj/structure/window/reinforced, /obj/machinery/light{ @@ -16115,10 +15722,10 @@ aa aa aa aa -aL -bD -bJ -bN +aa +aa +aa +aa aa aa aa @@ -16372,10 +15979,10 @@ aa aa aa aa -aM -bE -bK -aM +aa +aa +aa +aa aa aa aa @@ -16626,16 +16233,16 @@ aa aa aa aa -aL -aP -br -aY -bM -bS -be -br -aP -bN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -16883,16 +16490,16 @@ aa aa aa aa -aM -bo -bq -aZ -bq -bq -bg -bq -eq -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17140,16 +16747,16 @@ aa aa aa aa -aM -bn -bq -aZ -bq -bq -bg -bq -ek -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17394,22 +17001,22 @@ aa aa aa aa -aL -aP -aP -aY -bt -bq -bh -bq -bq -bh -bq -ex -be -aP -aP -bN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17651,22 +17258,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bh -bq -bq -bh -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -17908,22 +17515,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bh -bO -bq -bh -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18165,22 +17772,22 @@ aa aa aa aa -aM -aQ -aX -bh -bv -bG -bh -bq -bq -bh -bG -eA -bh -fZ -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18422,22 +18029,22 @@ aa aa aa aa -aM -aQ -aS -bh -bw -bG -bh -bq -bq -bh -bG -bw -bh -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18679,22 +18286,22 @@ aa aa aa aa -aM -aQ -aS -bh -bh -bg -bh -bg -bg -bh -bg -bh -bh -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -18936,22 +18543,22 @@ aa aa aa aa -aM -aQ -aX -bh -bA -bq -bH -bq -bq -bH -bq -eI -bh -fZ -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19193,22 +18800,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bq -bq -bq -bq -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19450,22 +19057,22 @@ aa aa aa aa -aM -aQ -aS -bg -bq -bq -bq -bq -bq -bq -bq -bq -bg -aS -ge -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19707,22 +19314,22 @@ aa aa aa aa -aM -aR -aS -bh -bq -bq -bq -bq -bq -bq -bq -eQ -bh -aS -aR -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -19964,22 +19571,22 @@ aa aa aa aa -aN -aS -aX -bh -bt -bq -bq -bq -bq -bq -bq -fy -bh -fZ -aS -aN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20221,22 +19828,22 @@ aa aa aa aa -aN -aS -aS -bh -bq -bq -bI -bq -bq -bV -bq -fp -bh -aS -aS -aN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20478,22 +20085,22 @@ aa aa aa aa -aM -aU -bf -bh -bF -bq -bL -bq -bq -dr -ej -fY -bh -gc -gk -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20733,24 +20340,24 @@ aa aa aa aa -aI -aI -aM -aV -aV -bB -aV -aV -bB -bP -bT -bB -aV -aV -bB -aV -aV -aM +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -20990,25 +20597,25 @@ aa aa aa aa -aI -aI -aO -aW -aW -aO -aW -aW -bC -bR -bU -bQ -aW -aW -aO -aW -aW -aO -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21247,25 +20854,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aJ -aJ -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21504,25 +21111,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aJ -aJ -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -21761,25 +21368,25 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22016,27 +21623,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22273,27 +21880,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22530,26 +22137,26 @@ aa aa aa aa -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -22787,26 +22394,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23044,28 +22651,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23301,28 +22908,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23558,28 +23165,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -23815,28 +23422,28 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24072,26 +23679,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24329,26 +23936,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aK -aI -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24588,27 +24195,27 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aJ -aJ -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -24846,26 +24453,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI aa aa -aI -aI -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -25103,26 +24710,26 @@ aa aa aa aa -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI aa aa aa aa -aI -aI -aI -aI -aI -aI +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 1d4f0c698ea..bd20066c0a4 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -2571,6 +2571,7 @@ req_access_txt = "0"; req_one_access_txt = "10;24" }, +/obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/engiestation) "gs" = ( @@ -4862,6 +4863,17 @@ }, /turf/simulated/floor/plating/airless, /area/constructionsite/engineering) +"zH" = ( +/obj/docking_port/stationary{ + dir = 8; + dwidth = 8; + height = 20; + id = "freegolem_z4"; + name = "Near Construction Site"; + width = 16 + }, +/turf/space, +/area/space) (1,1,1) = {" aa @@ -43872,7 +43884,7 @@ aa aa aa aa -aa +zH aa aa aa diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index e51ec171e34..f47b299a8d7 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -53932,7 +53932,7 @@ aa aa aa aa -wr +aa aa aa aa @@ -54188,7 +54188,7 @@ aa aa aa aa -aa +wr aa aa aa diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index d81ea35e1e9..c542d714ca6 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -231,6 +231,12 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) var/turf/T = loc level = T.intact ? 2 : 1 add_fingerprint(usr) + if(!SSair.initialized) //If there's no atmos subsystem, we can't really initialize pipenets + SSair.machinery_to_construct.Add(src) + return + initialize_atmos_network() + +/obj/machinery/atmospherics/proc/initialize_atmos_network() atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 99bcf54272c..2f296960622 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -129,3 +129,6 @@ #define ATMOS_ALARM_NONE 0 #define ATMOS_ALARM_WARNING 1 #define ATMOS_ALARM_DANGER 2 + +//LAVALAND +#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9b72483001c..e29e5be1c56 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -57,6 +57,89 @@ #define MAX_STACK_AMOUNT_GLASS 50 #define MAX_STACK_AMOUNT_RODS 60 +//Colors +#define COLOR_RED "#FF0000" +#define COLOR_GREEN "#00FF00" +#define COLOR_BLUE "#0000FF" +#define COLOR_CYAN "#00FFFF" +#define COLOR_PINK "#FF00FF" +#define COLOR_YELLOW "#FFFF00" +#define COLOR_ORANGE "#FF9900" +#define COLOR_WHITE "#FFFFFF" +#define COLOR_GRAY "#808080" +#define COLOR_BLACK "#000000" +#define COLOR_NAVY_BLUE "#000080" +#define COLOR_LIGHT_GREEN "#008000" +#define COLOR_DARK_GRAY "#404040" +#define COLOR_MAROON "#800000" +#define COLOR_PURPLE "#800080" +#define COLOR_VIOLET "#9933ff" +#define COLOR_OLIVE "#808000" +#define COLOR_BROWN_ORANGE "#824b28" +#define COLOR_DARK_ORANGE "#b95a00" +#define COLOR_GRAY40 "#666666" +#define COLOR_GRAY20 "#333333" +#define COLOR_GRAY15 "#151515" +#define COLOR_SEDONA "#cc6600" +#define COLOR_DARK_BROWN "#917448" +#define COLOR_DEEP_SKY_BLUE "#00e1ff" +#define COLOR_LIME "#00ff00" +#define COLOR_TEAL "#33cccc" +#define COLOR_PALE_PINK "#bf89ba" +#define COLOR_YELLOW_GRAY "#c9a344" +#define COLOR_PALE_YELLOW "#c1bb7a" +#define COLOR_WARM_YELLOW "#b3863c" +#define COLOR_RED_GRAY "#aa5f61" +#define COLOR_BROWN "#b19664" +#define COLOR_GREEN_GRAY "#8daf6a" +#define COLOR_DARK_GREEN_GRAY "#54654c" +#define COLOR_BLUE_GRAY "#6a97b0" +#define COLOR_DARK_BLUE_GRAY "#3e4855" +#define COLOR_SUN "#ec8b2f" +#define COLOR_PURPLE_GRAY "#a2819e" +#define COLOR_BLUE_LIGHT "#33ccff" +#define COLOR_RED_LIGHT "#ff3333" +#define COLOR_BEIGE "#ceb689" +#define COLOR_BABY_BLUE "#89cff0" +#define COLOR_PALE_GREEN_GRAY "#aed18b" +#define COLOR_PALE_RED_GRAY "#cc9090" +#define COLOR_PALE_PURPLE_GRAY "#bda2ba" +#define COLOR_PALE_BLUE_GRAY "#8bbbd5" +#define COLOR_LUMINOL "#66ffff" +#define COLOR_SILVER "#c0c0c0" +#define COLOR_GRAY80 "#cccccc" +#define COLOR_OFF_WHITE "#eeeeee" +#define COLOR_GOLD "#6d6133" +#define COLOR_NT_RED "#9d2300" +#define COLOR_BOTTLE_GREEN "#1f6b4f" +#define COLOR_PALE_BTL_GREEN "#57967f" +#define COLOR_GUNMETAL "#545c68" +#define COLOR_WALL_GUNMETAL "#353a42" +#define COLOR_STEEL "#a8b0b2" +#define COLOR_MUZZLE_FLASH "#ffffb2" +#define COLOR_CHESTNUT "#996633" +#define COLOR_BEASTY_BROWN "#663300" +#define COLOR_WHEAT "#ffff99" +#define COLOR_CYAN_BLUE "#3366cc" +#define COLOR_LIGHT_CYAN "#66ccff" +#define COLOR_PAKISTAN_GREEN "#006600" +#define COLOR_HULL "#436b8e" +#define COLOR_AMBER "#ffbf00" +#define COLOR_COMMAND_BLUE "#46698c" +#define COLOR_SKY_BLUE "#5ca1cc" +#define COLOR_PALE_ORANGE "#b88a3b" +#define COLOR_CIVIE_GREEN "#b7f27d" +#define COLOR_TITANIUM "#d1e6e3" +#define COLOR_DARK_GUNMETAL "#4c535b" +#define COLOR_BRONZE "#8c7853" +#define COLOR_BRASS "#b99d71" +#define COLOR_INDIGO "#4b0082" +#define COLOR_ALUMINIUM "#bbbbbb" +#define COLOR_CRYSTAL "#00c8a5" +#define COLOR_ASTEROID_ROCK "#735555" +#define COLOR_NULLGLASS "#ff6088" +#define COLOR_DIAMOND "#d8d4ea" + //FONTS: // Used by Paper and PhotoCopier (and PaperBin once a year). // Used by PDA's Notekeeper. @@ -132,7 +215,12 @@ for(type in view(range, dview_mob)) #define END_FOR_DVIEW dview_mob.loc = null +//Turf locational stuff #define get_turf(A) (get_step(A, 0)) +#define NORTH_OF_TURF(T) locate(T.x, T.y + 1, T.z) +#define EAST_OF_TURF(T) locate(T.x + 1, T.y, T.z) +#define SOUTH_OF_TURF(T) locate(T.x, T.y - 1, T.z) +#define WEST_OF_TURF(T) locate(T.x - 1, T.y, T.z) #define MIN_SUPPLIED_LAW_NUMBER 15 #define MAX_SUPPLIED_LAW_NUMBER 50 @@ -315,7 +403,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 8 +#define SQL_VERSION 9 // Vending machine stuff #define CAT_NORMAL 1 @@ -397,4 +485,15 @@ #define DICE_NOT_RIGGED 1 #define DICE_BASICALLY_RIGGED 2 -#define DICE_TOTALLY_RIGGED 3 \ No newline at end of file +#define DICE_TOTALLY_RIGGED 3 + +// Parallax +#define PARALLAX_DELAY_DEFAULT world.tick_lag +#define PARALLAX_DELAY_MED 1 +#define PARALLAX_DELAY_LOW 2 +#define PARALLAX_LOOP_TIME 25 + +// Engine types +#define ENGTYPE_SING "Singularity" +#define ENGTYPE_SM "Supermatter" +#define ENGTYPE_TESLA "Tesla" \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 284b0e4d745..608fcfcce20 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -187,6 +187,7 @@ #define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer)) #define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian)) #define isnymph(A) (istype((A), /mob/living/simple_animal/diona)) +#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) #define issilicon(A) (istype((A), /mob/living/silicon)) #define isAI(A) (istype((A), /mob/living/silicon/ai)) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 9582fddccfe..a28d68a392b 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -63,3 +63,12 @@ #define EXP_TYPE_WHITELIST "Whitelist" #define EXP_DEPT_TYPE_LIST list(EXP_TYPE_SERVICE, EXP_TYPE_MEDICAL, EXP_TYPE_ENGINEERING, EXP_TYPE_SCIENCE, EXP_TYPE_SECURITY, EXP_TYPE_COMMAND, EXP_TYPE_SILICON, EXP_TYPE_SPECIAL) + +// Defines just for parallax because its levels make storing it in the regular prefs a pain in the ass +// These dont need to be bitflags because there isnt going to be more than one at a time of these active +// But its gonna piss off my OCD if it isnt bitflags, so deal with it, -affected +#define PARALLAX_DISABLE 1 +#define PARALLAX_LOW 2 +#define PARALLAX_MED 4 +#define PARALLAX_HIGH 8 +#define PARALLAX_INSANE 16 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index e5d5bb723c1..f451a34a8b7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -26,7 +26,7 @@ //#define STATUS_EFFECT_WISH_GRANTERS_GIFT /datum/status_effect/wish_granters_gift //If you're currently resurrecting with the Wish Granter -//#define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken +#define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken ///////////// // DEBUFFS // @@ -52,7 +52,7 @@ #define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes -//#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage +#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage #define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage @@ -74,6 +74,6 @@ //#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark -//#define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target +#define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target -//#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module \ No newline at end of file +#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module \ No newline at end of file diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 27b69284a3d..3bb6b742a04 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -19,6 +19,12 @@ return A return 0 +/proc/get_location_name(atom/X, format_text = FALSE) + var/area/A = isarea(X) ? X : get_area(X) + if(!A) + return null + return format_text ? format_text(A.name) : A.name + /proc/get_areas_in_range(dist=0, atom/center=usr) if(!dist) var/turf/T = get_turf(center) @@ -429,6 +435,17 @@ /proc/GetBluePart(const/hexa) return hex2num(copytext(hexa, 6, 8)) +/proc/lavaland_equipment_pressure_check(turf/T) + . = FALSE + if(!istype(T)) + return + var/datum/gas_mixture/environment = T.return_air() + if(!istype(environment)) + return + var/pressure = environment.return_pressure() + if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE) + . = TRUE + /proc/GetHexColors(const/hexa) return list( GetRedPart(hexa), diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 11c86940b75..acf202f0eee 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -153,29 +153,33 @@ /turf/simulated/wall/diagonal_smooth(adjacencies) adjacencies = reverse_ndir(..()) if(adjacencies) - var/list/U = list() + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) + var/list/U = list(underlay_appearance) if(fixed_underlay) if(fixed_underlay["space"]) - U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else - U += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) + underlay_appearance.icon = fixed_underlay["icon"] + underlay_appearance.icon_state = fixed_underlay["icon_state"] else - var/turf/T = get_step(src, turn(adjacencies, 180)) - if(T && (T.density || T.smooth)) + var/turned_adjacency = turn(adjacencies, 180) + var/turf/T = get_step(src, turned_adjacency) + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) T = get_step(src, turn(adjacencies, 135)) - if(T && (T.density || T.smooth)) + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) T = get_step(src, turn(adjacencies, 225)) - - if(istype(T, /turf/space) && !istype(T, /turf/space/transit)) - U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) - else if(T && !T.density && !T.smooth) - U += T - else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) - U += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) - else - U += DEFAULT_UNDERLAY_IMAGE + //if all else fails, ask our own turf + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + underlay_appearance.icon = DEFAULT_UNDERLAY_ICON + underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE underlays = U + // Drop posters which were previously placed on this wall. + for(var/obj/structure/sign/poster/P in src) + P.roll_and_drop(src) + /proc/cardinal_smooth(atom/A, adjacencies) //NW CORNER var/nw = "1-i" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 04d63e0e862..08af11a128c 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -545,6 +545,43 @@ proc/checkhtml(var/t) text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) return text +/proc/convert_pencode_arg(text, tag, arg) + arg = sanitize_simple(html_encode(arg), list("''"="","\""="", "?"="")) + // https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#rule-4---css-escape-and-strictly-validate-before-inserting-untrusted-data-into-html-style-property-values + var/list/style_attacks = list("javascript:", "expression", "byond:", "file:") + + for(var/style_attack in style_attacks) + if(findtext(arg, style_attack)) + // Do not attempt to render dangerous things + return text + + if(tag == "class") + return "" + + if(tag == "style") + return "" + + if(tag == "img") + var/list/img_props = splittext(arg, ";") + if(img_props.len == 3) + return "" + if(img_props.len == 2) + return "" + return "" + + return text + +/proc/admin_pencode_to_html() + var/text = pencode_to_html(arglist(args)) + var/regex/R = new(@"\[(.*?) (.*?)\]", "ge") + text = R.Replace(text, /proc/convert_pencode_arg) + + text = replacetext(text, "\[/class\]", "") + text = replacetext(text, "\[/style\]", "") + text = replacetext(text, "\[/img\]", "") + + return text + /proc/html_to_pencode(text) text = replacetext(text, "
", "\n") text = replacetext(text, "
", "\[center\]") diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 5ff132a7ee6..d9d21c60e1e 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -47,4 +47,6 @@ GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mob GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects -GLOBAL_LIST_EMPTY(explosive_walls) \ No newline at end of file +GLOBAL_LIST_EMPTY(explosive_walls) + +GLOBAL_LIST_EMPTY(engine_beacon_list) \ No newline at end of file diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index f933105e13b..f4cdd766cb9 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -88,4 +88,6 @@ var/copier_items_printed_logged = FALSE GLOBAL_VAR(map_name) // Self explanatory -var/global/datum/datacore/data_core = null // Station datacore, manifest, etc \ No newline at end of file +var/global/datum/datacore/data_core = null // Station datacore, manifest, etc + +GLOBAL_VAR_INIT(panic_bunker_enabled, 0) // Is the panic bunker enabled \ No newline at end of file diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 22921f5228d..ca8f32f2599 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -209,11 +209,13 @@ /atom/proc/AIMiddleClick() return -/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. - if(!src.lights) - Topic(src, list("src" = UID(), "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!) +/obj/machinery/door/airlock/AIMiddleClick() // Toggles door safety. + if(safe) + Topic(src, list("src" = UID(), "command"="safeties", "activate" = "1"), 1) // 1 meaning no window (consistency!) + to_chat(usr, "The door safeties have been overridden.") else - Topic(src, list("src" = UID(), "command"="lights", "activate" = "0"), 1) + Topic(src, list("src" = UID(), "command"="safeties", "activate" = "0"), 1) + to_chat(usr, "The door safeties have been reset.") return /obj/machinery/ai_slipper/AICtrlClick() //Turns liquid dispenser on or off diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index e3d423130e5..58e82733abe 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -107,14 +107,20 @@ #define ui_healthdoll "EAST-1:28,CENTER-1:15" #define ui_health "EAST-1:28,CENTER:17" #define ui_internal "EAST-1:28,CENTER+1:19" - //borgs + +//borgs #define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. + +//aliens #define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. - +//constructs #define ui_construct_pull "EAST-1:28,SOUTH+1:10" //above the zone_sel icon #define ui_construct_health "EAST,CENTER:15" //same height as humans, hugging the right border +//slimes +#define ui_slime_health "EAST,CENTER:15" //same as borgs, constructs and humans + //Pop-up inventory #define ui_shoes "WEST+1:8,SOUTH:5" diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 15ed4429965..b70c98908f5 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -2,6 +2,25 @@ var/datum/action/linked_action screen_loc = null +/obj/screen/movable/action_button/MouseDrop(over_object) + if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle))) + if(locked) + to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") + closeToolTip(usr) + return + var/obj/screen/movable/action_button/B = over_object + var/list/actions = usr.actions + actions.Swap(actions.Find(linked_action), actions.Find(B.linked_action)) + moved = FALSE + B.moved = FALSE + closeToolTip(usr) + usr.update_action_buttons() + else if(istype(over_object, /obj/screen/movable/action_button/hide_toggle)) + closeToolTip(usr) + else + closeToolTip(usr) + return ..() + /obj/screen/movable/action_button/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) @@ -29,6 +48,13 @@ icon_state = "bg_default" var/hidden = 0 +/obj/screen/movable/action_button/hide_toggle/MouseDrop(over_object) + if(istype(over_object, /obj/screen/movable/action_button)) + closeToolTip(usr) + else + closeToolTip(usr) + return ..() + /obj/screen/movable/action_button/hide_toggle/Click(location,control,params) var/list/modifiers = params2list(params) if(modifiers["shift"]) @@ -83,9 +109,9 @@ var/image/img = image(icon, src, hidden ? "show" : "hide") overlays += img -/obj/screen/movable/action_button/MouseEntered(location,control,params) - openToolTip(usr,src,params,title = name,content = desc) - +/obj/screen/movable/action_button/MouseEntered(location, control, params) + if(!QDELETED(src)) + openToolTip(usr, src, params, title = name, content = desc) /obj/screen/movable/action_button/MouseExited() closeToolTip(usr) diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 0b1a6d1c6c4..dc98d887279 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -256,4 +256,10 @@ //Add multicamera camera using = new /obj/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam - static_inventory += using \ No newline at end of file + static_inventory += using + +//Intent + using = new /obj/screen/act_intent/robot/AI() + using.icon_state = mymob.a_intent + static_inventory += using + action_intent = using \ No newline at end of file diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 4e92395f4cc..600c1105e8e 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -59,3 +59,8 @@ using = new /obj/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport static_inventory += using + +/datum/hud/ghost/show_hud() + mymob.client.screen = list() + mymob.client.screen += static_inventory + ..() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 0063feae9cf..e93b3b121e6 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -99,6 +99,7 @@ /datum/hud/proc/show_hud(version = 0) if(!ismob(mymob)) return FALSE + if(!mymob.client) return FALSE @@ -172,6 +173,7 @@ mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() + update_parallax_pref(mymob) plane_masters_update() /datum/hud/proc/plane_masters_update() diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm new file mode 100644 index 00000000000..e60200b967a --- /dev/null +++ b/code/_onclick/hud/parallax.dm @@ -0,0 +1,319 @@ +/client + var/list/parallax_layers + var/list/parallax_layers_cached + var/static/list/parallax_static_layers_tail = newlist(/obj/screen/parallax_pmaster, /obj/screen/parallax_space_whitifier) + var/atom/movable/movingmob + var/turf/previous_turf + var/dont_animate_parallax //world.time of when we can state animate()ing parallax again + var/last_parallax_shift //world.time of last update + var/parallax_throttle = 0 //ds between updates + var/parallax_movedir = 0 + var/parallax_layers_max = 3 + var/parallax_animate_timer + +/datum/hud/proc/create_parallax() + var/client/C = mymob.client + if(!apply_parallax_pref()) + return + + if(!length(C.parallax_layers_cached)) + C.parallax_layers_cached = list() + C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view) + C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) + + C.parallax_layers = C.parallax_layers_cached.Copy() + + if(length(C.parallax_layers) > C.parallax_layers_max) + C.parallax_layers.len = C.parallax_layers_max + + C.screen |= (C.parallax_layers + C.parallax_static_layers_tail) + +/datum/hud/proc/remove_parallax() + var/client/C = mymob.client + C.screen -= (C.parallax_layers_cached + C.parallax_static_layers_tail) + C.parallax_layers = null + +/datum/hud/proc/apply_parallax_pref() + var/client/C = mymob.client + if(C.prefs) + var/pref = C.prefs.parallax + if (isnull(pref)) + pref = PARALLAX_HIGH + switch(C.prefs.parallax) + if (PARALLAX_INSANE) + C.parallax_throttle = FALSE + C.parallax_layers_max = 4 + return TRUE + + if (PARALLAX_MED) + C.parallax_throttle = PARALLAX_DELAY_MED + C.parallax_layers_max = 2 + return TRUE + + if (PARALLAX_LOW) + C.parallax_throttle = PARALLAX_DELAY_LOW + C.parallax_layers_max = 1 + return TRUE + + if (PARALLAX_DISABLE) + return FALSE + + C.parallax_throttle = PARALLAX_DELAY_DEFAULT + C.parallax_layers_max = 3 + return TRUE + +/datum/hud/proc/update_parallax_pref() + remove_parallax() + create_parallax() + update_parallax() + +// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation) +// Well, it would if our shuttle code had dynamic areas +/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups) + . = FALSE + var/client/C = mymob.client + if(new_parallax_movedir == C.parallax_movedir) + return + var/animatedir = new_parallax_movedir + if(new_parallax_movedir == FALSE) + var/animate_time = 0 + for(var/thing in C.parallax_layers) + var/obj/screen/parallax_layer/L = thing + L.icon_state = initial(L.icon_state) + L.update_o(C.view) + var/T = PARALLAX_LOOP_TIME / L.speed + if(T > animate_time) + animate_time = T + C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME) + animatedir = C.parallax_movedir + + var/matrix/newtransform + switch(animatedir) + if(NORTH) + newtransform = matrix(1, 0, 0, 0, 1, 480) + if(SOUTH) + newtransform = matrix(1, 0, 0, 0, 1,-480) + if(EAST) + newtransform = matrix(1, 0, 480, 0, 1, 0) + if(WEST) + newtransform = matrix(1, 0,-480, 0, 1, 0) + + var/shortesttimer + for(var/thing in C.parallax_layers) + var/obj/screen/parallax_layer/L = thing + + var/T = PARALLAX_LOOP_TIME / L.speed + if(isnull(shortesttimer)) + shortesttimer = T + if(T < shortesttimer) + shortesttimer = T + L.transform = newtransform + animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW) + if(new_parallax_movedir) + L.transform = newtransform + animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter + + C.parallax_movedir = new_parallax_movedir + if(C.parallax_animate_timer) + deltimer(C.parallax_animate_timer) + var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform) + if(skip_windups) + CB.Invoke() + else + C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE) + +/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform) + C.parallax_animate_timer = FALSE + for(var/thing in C.parallax_layers) + var/obj/screen/parallax_layer/L = thing + if(!new_parallax_movedir) + animate(L) + continue + + var/newstate = initial(L.icon_state) + if(animatedir) + if(animatedir == NORTH || animatedir == SOUTH) + newstate += "_vertical" + else + newstate += "_horizontal" + + var/T = PARALLAX_LOOP_TIME / L.speed + + if(newstate in icon_states(L.icon)) + L.icon_state = newstate + L.update_o(C.view) + + L.transform = newtransform + + animate(L, transform = matrix(), time = T, loop = -1, flags = ANIMATION_END_NOW) + +/datum/hud/proc/update_parallax() + var/client/C = mymob.client + var/turf/posobj = get_turf(C.eye) + if(!posobj) + return + var/area/areaobj = posobj.loc + + // Update the movement direction of the parallax if necessary (for shuttles) + var/area/shuttle/SA = areaobj + if(!SA || !SA.moving) + set_parallax_movedir(0) + else + set_parallax_movedir(SA.parallax_movedir) + + var/force + if(!C.previous_turf || (C.previous_turf.z != posobj.z)) + C.previous_turf = posobj + force = TRUE + + if(!force && world.time < C.last_parallax_shift+C.parallax_throttle) + return + + //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels. + var/offset_x = posobj.x - C.previous_turf.x + var/offset_y = posobj.y - C.previous_turf.y + + if(!offset_x && !offset_y && !force) + return + + var/last_delay = world.time - C.last_parallax_shift + last_delay = min(last_delay, C.parallax_throttle) + C.previous_turf = posobj + C.last_parallax_shift = world.time + + for(var/thing in C.parallax_layers) + var/obj/screen/parallax_layer/L = thing + L.update_status(mymob) + if(L.view_sized != C.view) + L.update_o(C.view) + + var/change_x + var/change_y + + if(L.absolute) + L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed + L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed + else + change_x = offset_x * L.speed + L.offset_x -= change_x + change_y = offset_y * L.speed + L.offset_y -= change_y + + if(L.offset_x > 240) + L.offset_x -= 480 + if(L.offset_x < -240) + L.offset_x += 480 + if(L.offset_y > 240) + L.offset_y -= 480 + if(L.offset_y < -240) + L.offset_y += 480 + + if(!(areaobj.parallax_movedir && areaobj.moving) && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1)) + L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed) + animate(L, transform=matrix(), time = last_delay) + + L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]" + +/atom/movable/proc/update_parallax_contents() + if(length(client_mobs_in_contents)) + for(var/thing in client_mobs_in_contents) + var/mob/M = thing + if(M && M.client && M.hud_used && length(M.client.parallax_layers)) + M.hud_used.update_parallax() + +/obj/screen/parallax_layer + icon = 'icons/effects/parallax.dmi' + var/speed = 1 + var/offset_x = 0 + var/offset_y = 0 + var/view_sized + var/absolute = FALSE + blend_mode = BLEND_ADD + plane = PLANE_SPACE_PARALLAX + screen_loc = "CENTER-7,CENTER-7" + mouse_opacity = 0 + + +/obj/screen/parallax_layer/New(view) + ..() + if(!view) + view = world.view + update_o(view) + +/obj/screen/parallax_layer/proc/update_o(view) + if(!view) + view = world.view + var/list/new_overlays = list() + var/count = Ceiling(view/(480/world.icon_size))+1 + for(var/x in -count to count) + for(var/y in -count to count) + if(x == 0 && y == 0) + continue + var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state) + texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480) + new_overlays += texture_overlay + + overlays = new_overlays + view_sized = view + +/obj/screen/parallax_layer/proc/update_status(mob/M) + return + +/obj/screen/parallax_layer/layer_1 + icon_state = "layer1" + speed = 0.6 + layer = 1 + +/obj/screen/parallax_layer/layer_2 + icon_state = "layer2" + speed = 1 + layer = 2 + +/obj/screen/parallax_layer/layer_3 + icon_state = "layer3" + speed = 1.4 + layer = 3 + +/obj/screen/parallax_layer/planet + icon_state = "planet" + blend_mode = BLEND_OVERLAY + absolute = TRUE //Status of seperation + speed = 3 + layer = 30 + +/obj/screen/parallax_layer/planet/update_status(mob/M) + var/turf/T = get_turf(M) + if(is_station_level(T.z)) + invisibility = 0 + else + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/parallax_layer/planet/update_o() + return //Shit wont move + +/obj/screen/parallax_pmaster + appearance_flags = PLANE_MASTER + plane = PLANE_SPACE_PARALLAX + blend_mode = BLEND_MULTIPLY + mouse_opacity = FALSE + screen_loc = "CENTER-7,CENTER-7" + +/obj/screen/parallax_space_whitifier + appearance_flags = PLANE_MASTER + plane = PLANE_SPACE + color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 1, 1, 1, + 0, 0, 0, 0 + ) + screen_loc = "CENTER-7,CENTER-7" + + +#undef LOOP_NONE +#undef LOOP_NORMAL +#undef LOOP_REVERSE +#undef LOOP_TIME \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 91c8d6250b4..8bc65fcf691 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -95,6 +95,9 @@ icon = 'icons/mob/screen_robot.dmi' screen_loc = ui_borg_intents +/obj/screen/act_intent/robot/AI + screen_loc = "EAST-1:32,SOUTH:70" + /obj/screen/mov_intent name = "run/walk toggle" icon_state = "running" @@ -453,6 +456,12 @@ /obj/screen/healths/corgi icon = 'icons/mob/screen_corgi.dmi' +/obj/screen/healths/slime + icon = 'icons/mob/screen_slime.dmi' + icon_state = "slime_health0" + screen_loc = ui_slime_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /obj/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm new file mode 100644 index 00000000000..9f5621b75ee --- /dev/null +++ b/code/_onclick/hud/slime.dm @@ -0,0 +1,18 @@ +/mob/living/carbon/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) + +/mob/living/simple_animal/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) + +/datum/hud/slime/New(mob/owner) + ..() + mymob.healths = new /obj/screen/healths/slime() + infodisplay += mymob.healths + + mymob.pullin = new /obj/screen/pull() + mymob.pullin.icon = 'icons/mob/screen_slime.dmi' + mymob.pullin.update_icon(mymob) + mymob.pullin.screen_loc = ui_construct_pull + hotkeybuttons += mymob.pullin diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 797384b8336..5f0c94ecee6 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -17,6 +17,7 @@ else following = null forceMove(get_turf(A)) + update_parallax_contents() /mob/dead/observer/ClickOn(var/atom/A, var/params) if(client.click_intercept) @@ -58,6 +59,14 @@ /atom/proc/attack_ghost(mob/user as mob) return +// health + cyborg analyzer for ghosts +/mob/living/attack_ghost(mob/dead/observer/user) + if(user.client && user.health_scan) + if(issilicon(src) || ismachine(src)) + robot_healthscan(user, src) + else if(ishuman(src)) + healthscan(user, src, 1, TRUE) + // --------------------------------------- // And here are some good things for free: // Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 5792aff1725..baa0adc07ec 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -79,9 +79,8 @@ var/auto_cryo_ssd_mins = 0 var/ssd_warning = 0 - - var/prob_free_golems = 75 //chance for free golems spawners to appear roundstart - var/unrestricted_free_golems = FALSE //if true, free golems can appear on all roundtypes + + var/list_afk_minimum = 5 // How long people have to be AFK before it's listed on the "List AFK players" verb var/traitor_objectives_amount = 2 var/shadowling_max_age = 0 @@ -310,12 +309,6 @@ if("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 - if("prob_free_golems") - config.prob_free_golems = text2num(value) - - if("unrestricted_free_golems") - config.unrestricted_free_golems = TRUE - if("shadowling_max_age") config.shadowling_max_age = text2num(value) @@ -331,6 +324,9 @@ if("ssd_warning") config.ssd_warning = 1 + if("list_afk_minimum") + config.list_afk_minimum = text2num(value) + if("ipintel_email") if(value != "ch@nge.me") config.ipintel_email = value diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 79de45c3248..fe48494f321 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -30,6 +30,7 @@ SUBSYSTEM_DEF(air) var/list/networks = list() var/list/atmos_machinery = list() var/list/pipe_init_dirs_cache = list() + var/list/machinery_to_construct = list() @@ -67,9 +68,10 @@ SUBSYSTEM_DEF(air) setup_allturfs() setup_atmos_machinery(GLOB.machines) setup_pipenets(GLOB.machines) + for(var/obj/machinery/atmospherics/A in machinery_to_construct) + A.initialize_atmos_network() return ..() - /datum/controller/subsystem/air/fire(resumed = 0) var/timer = TICK_USAGE_REAL diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index b45ef833b9f..ec53c4b4d6b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -20,7 +20,7 @@ SUBSYSTEM_DEF(mapping) var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max) for(var/i = 1, i <= num_extra_space, i++) - var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED) + var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED, traits = list(REACHABLE)) seedRuins(list(zlev), rand(0, 3), /area/space, space_ruins_templates) // Setup the Z-level linkage diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm new file mode 100644 index 00000000000..039b6d2b008 --- /dev/null +++ b/code/controllers/subsystem/parallax.dm @@ -0,0 +1,44 @@ +SUBSYSTEM_DEF(parallax) + name = "Parallax" + wait = 2 + flags = SS_POST_FIRE_TIMING | SS_BACKGROUND + priority = FIRE_PRIORITY_PARALLAX + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + var/list/currentrun + var/planet_x_offset = 128 + var/planet_y_offset = 128 + +/datum/controller/subsystem/parallax/Initialize(timeofday) + . = ..() + planet_y_offset = rand(100, 160) + planet_x_offset = rand(100, 160) + +/datum/controller/subsystem/parallax/fire(resumed = 0) + if(!resumed) + src.currentrun = GLOB.clients.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(length(currentrun)) + var/client/C = currentrun[currentrun.len] + currentrun.len-- + if(!C || !C.eye) + if(MC_TICK_CHECK) + return + continue + var/atom/movable/A = C.eye + if(!istype(A)) + continue + for (A; isloc(A.loc) && !isturf(A.loc); A = A.loc); + + if(A != C.movingmob) + if(C.movingmob != null) + C.movingmob.client_mobs_in_contents -= C.mob + UNSETEMPTY(C.movingmob.client_mobs_in_contents) + LAZYINITLIST(A.client_mobs_in_contents) + A.client_mobs_in_contents += C.mob + C.movingmob = A + if(MC_TICK_CHECK) + return + currentrun = null diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 32f7faf4abb..d8bae77840c 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -8,7 +8,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets name = "Mentor Tickets" ticket_system_name = "Mentor Tickets" ticket_name = "Mentor Ticket" - span_text = "" + span_class = "mentorhelp" close_rights = R_MENTOR | R_ADMIN /datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg) @@ -17,5 +17,5 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets /datum/controller/subsystem/tickets/mentor_tickets/Initialize() close_messages = list("- [ticket_name] Closed -", "Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.", - "[span_text]Your [ticket_name] has now been closed.") + "Your [ticket_name] has now been closed.") return ..() diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index cf9aed29e83..1b1735b34c1 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(tickets) name = "Admin Tickets" - var/span_text = "" + var/span_class = "adminticket" var/ticket_system_name = "Admin Tickets" var/ticket_name = "Admin Ticket" var/close_rights = R_ADMIN @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/Initialize() close_messages = list("- [ticket_name] Rejected! -", "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", - "[span_text]Your [ticket_name] has now been closed.") + "Your [ticket_name] has now been closed.") LAZYINITLIST(allTickets) return ..() @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(tickets) var/report for(var/num in stales) report += "[num], " - message_staff("[span_text]Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.") + message_staff("Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.") /datum/controller/subsystem/tickets/stat_entry() ..("Tickets: [LAZYLEN(allTickets)]") @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(tickets) var/datum/ticket/existingTicket = checkForOpenTicket(C) if(existingTicket) existingTicket.setCooldownPeriod() - to_chat(C.mob, "[span_text]Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + to_chat(C.mob, "Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") return if(!title) @@ -93,7 +93,7 @@ SUBSYSTEM_DEF(tickets) T.mobControlled = C.mob //Inform the user that they have opened a ticket - to_chat(C, "[span_text]You have opened [ticket_name] number #[(getTicketCounter() - 1)]! Please be patient and we will help you soon!") + to_chat(C, "You have opened [ticket_name] number #[(getTicketCounter() - 1)]! Please be patient and we will help you soon!") //Set ticket state with key N to open /datum/controller/subsystem/tickets/proc/openTicket(N) @@ -138,8 +138,10 @@ SUBSYSTEM_DEF(tickets) var/datum/ticket/T = allTickets[N] return T.clientName -/datum/controller/subsystem/tickets/proc/assignStaffToTicket(client/C, var/N) +/datum/controller/subsystem/tickets/proc/assignStaffToTicket(client/C, N) var/datum/ticket/T = allTickets[N] + if(T.staffAssigned != null && T.staffAssigned != C && alert("Ticket is already assigned to [T.staffAssigned.ckey]. Are you sure you want to take it?","Take ticket","No","Yes") != "Yes") + return FALSE T.assignStaff(C) return TRUE @@ -158,7 +160,7 @@ SUBSYSTEM_DEF(tickets) var/ticketState // State of the ticket, open, closed, resolved etc var/timeUntilStale // When the ticket goes stale var/ticketCooldown // Cooldown before allowing the user to open another ticket. - var/staffAssigned // Staff member who has assigned themselves to this ticket + var/client/staffAssigned // Staff member who has assigned themselves to this ticket /datum/ticket/New(tit, cont, num) title = tit @@ -367,15 +369,15 @@ UI STUFF if(href_list["resolve"]) var/indexNum = text2num(href_list["resolve"]) if(resolveTicket(indexNum)) - message_staff("[span_text][usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") - to_chat_safe(returnClient(indexNum), "[span_text]Your [ticket_name] has now been resolved.") + message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") + to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.") showUI(usr) if(href_list["detailresolve"]) var/indexNum = text2num(href_list["detailresolve"]) if(resolveTicket(indexNum)) - message_staff("[span_text][usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") - to_chat_safe(returnClient(indexNum), "[span_text]Your [ticket_name] has now been resolved.") + message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]") + to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.") showDetailUI(usr, indexNum) if(href_list["detailclose"]) @@ -386,7 +388,7 @@ UI STUFF if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes") return if(closeTicket(indexNum)) - message_staff("[span_text][usr.client] / ([usr]) closed [ticket_name] number [indexNum]") + message_staff("[usr.client] / ([usr]) closed [ticket_name] number [indexNum]") to_chat_safe(returnClient(indexNum), close_messages) showDetailUI(usr, indexNum) @@ -394,7 +396,7 @@ UI STUFF if(href_list["detailreopen"]) var/indexNum = text2num(href_list["detailreopen"]) if(openTicket(indexNum)) - message_staff("[span_text][usr.client] / ([usr]) re-opened [ticket_name] number [indexNum]") + message_staff("[usr.client] / ([usr]) re-opened [ticket_name] number [indexNum]") showDetailUI(usr, indexNum) if(href_list["assignstaff"]) @@ -404,8 +406,8 @@ UI STUFF /datum/controller/subsystem/tickets/proc/takeTicket(var/index) if(assignStaffToTicket(usr.client, index)) - if(span_text == "") - message_staff("[span_text][usr.client] / ([usr]) has taken [ticket_name] number [index]") + if(span_class == "mentorhelp") + message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]") else message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]", TRUE) - to_chat_safe(returnClient(index), "[span_text]Your [ticket_name] is being handled by [usr.client].") + to_chat_safe(returnClient(index), "Your [ticket_name] is being handled by [usr.client].") diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm new file mode 100644 index 00000000000..ef9a2923cc6 --- /dev/null +++ b/code/datums/components/paintable.dm @@ -0,0 +1,31 @@ +/datum/component/spraycan_paintable + var/current_paint + +/datum/component/spraycan_paintable/Initialize() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/Repaint) + +/datum/component/spraycan_paintable/Destroy() + RemoveCurrentCoat() + return ..() + +/datum/component/spraycan_paintable/proc/RemoveCurrentCoat() + var/atom/A = parent + A.remove_atom_colour(FIXED_COLOUR_PRIORITY, current_paint) + +/datum/component/spraycan_paintable/proc/Repaint(datum/source, obj/item/toy/crayon/spraycan/spraycan, mob/living/user) + if(!istype(spraycan) || user.a_intent == INTENT_HARM) + return + . = COMPONENT_NO_AFTERATTACK + if(spraycan.capped) + to_chat(user, "Take the cap off first!") + return + if(spraycan.uses < 2) + to_chat(user, "There is not enough paint in the can!") + return + RemoveCurrentCoat() + var/colour = spraycan.colour + current_paint = colour + var/atom/A = parent + A.add_atom_colour(colour, FIXED_COLOUR_PRIORITY) + playsound(spraycan, 'sound/effects/spray.ogg', 5, 1, 5) + to_chat(user, "You spray [spraycan] on [A], painting it.") diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm new file mode 100644 index 00000000000..a1f538e4dd7 --- /dev/null +++ b/code/datums/components/waddling.dm @@ -0,0 +1,15 @@ +/datum/component/waddling + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + +/datum/component/waddling/Initialize() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) + +/datum/component/waddling/proc/Waddle() + var/mob/living/L = parent + if(L.incapacitated() || L.lying) + return + animate(L, pixel_z = 4, time = 0) + animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) + animate(pixel_z = 0, transform = matrix(), time = 0) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index adb3167d8e4..e8339f81945 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1269,7 +1269,12 @@ return src.debug_variables(DAT) - return + if(href_list["copyoutfit"]) + if(!check_rights(R_EVENT)) + return + var/mob/living/carbon/human/H = locateUID(href_list["copyoutfit"]) + if(istype(H)) + H.copy_outfit() /client/proc/view_var_Topic_list(href, href_list, hsrc) if(href_list["VarsList"]) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index d52a0a02256..30d1084ba0e 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -30,11 +30,11 @@ Bonus if(prob(SYMPTOM_ACTIVATION_PROB)) var/mob/living/carbon/M = A.affected_mob to_chat(M, "[pick("You feel cold.", "You start shivering.")]") - if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT) Chill(M, A) return /datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A) var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2)) - M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) - return 1 \ No newline at end of file + M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1) + return 1 diff --git a/code/datums/helper_datums/input.dm b/code/datums/helper_datums/input.dm index aa73b1e387f..4c3dc6a1cf4 100644 --- a/code/datums/helper_datums/input.dm +++ b/code/datums/helper_datums/input.dm @@ -100,15 +100,20 @@ height = 400 immediate_submit = TRUE +/datum/async_input/ranked/New() + ..() + popup.add_script("rankedInput.js", 'html/browser/rankedInput.js') + popup.add_head_content("Drag and drop or use the buttons to reorder") + /datum/async_input/ranked/render_choices() var/dat = "
" - dat += "" + dat += "
" for(var/i = 1, i <= choices.len, i++) var/choice = choices[i] dat += "" dat += "" dat += "" - dat += "" + dat += "" dat += "" dat += "
[button("+", i != 1 ? "upvote=[i]" : "", , i == 1)][button("-", i != choices.len ? "downvote=[i]" : "", , i == choices.len)][i]. [choice][i]. [choice]
" dat += "
" @@ -131,6 +136,15 @@ show() return + if(href_list["cut"] && href_list["insert"]) + var/cut = text2num(href_list["cut"]) + var/insert = text2num(href_list["insert"]) + var/choice = choices[cut] + choices.Cut(cut, cut + 1) + choices.Insert(insert, choice) + show() + return + ..() /datum/async_input/autocomplete diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 184f1155da2..6622e263789 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -22,11 +22,15 @@ var/pda = null var/internals_slot = null //ID of slot containing a gas tank var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format - var/list/implants = null - var/list/cybernetic_implants = null + var/box // Internals box. Will be inserted at the start of backpack_contents + var/list/implants = list() + var/list/cybernetic_implants = list() + var/list/accessories = list() var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns + var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters + /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc return @@ -82,12 +86,24 @@ if(pda) equip_item(H, pda, slot_wear_pda) + if(uniform) + for(var/path in accessories) + var/obj/item/clothing/accessory/A = new path() + var/obj/item/clothing/under/U = uniform + U.attach_accessory(A, H) + if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) equip_item(H, l_pocket, slot_l_store) if(r_pocket) equip_item(H, r_pocket, slot_r_store) + if(box) + if(!backpack_contents) + backpack_contents = list() + backpack_contents.Insert(1, box) + backpack_contents[box] = 1 + for(var/path in backpack_contents) var/number = backpack_contents[path] for(var/i in 1 to number) @@ -159,3 +175,95 @@ types += chameleon_extras listclearnulls(types) return types + +/datum/outfit/proc/save_to_file(mob/admin) + var/stored_data = get_json_data() + var/json = json_encode(stored_data) + // Kinda annoying but as far as I can tell you need to make actual file. + var/f = file("data/TempOutfitUpload") + fdel(f) + WRITE_FILE(f, json) + admin << ftp(f, "[name].json") + +/datum/outfit/proc/load_from(list/outfit_data) + // This could probably use more strict validation. + name = outfit_data["name"] + uniform = text2path(outfit_data["uniform"]) + suit = text2path(outfit_data["suit"]) + back = text2path(outfit_data["back"]) + belt = text2path(outfit_data["belt"]) + gloves = text2path(outfit_data["gloves"]) + shoes = text2path(outfit_data["shoes"]) + head = text2path(outfit_data["head"]) + mask = text2path(outfit_data["mask"]) + l_ear = text2path(outfit_data["l_ear"]) + r_ear = text2path(outfit_data["r_ear"]) + glasses = text2path(outfit_data["glasses"]) + id = text2path(outfit_data["id"]) + pda = text2path(outfit_data["pda"]) + l_pocket = text2path(outfit_data["l_pocket"]) + r_pocket = text2path(outfit_data["r_pocket"]) + suit_store = text2path(outfit_data["suit_store"]) + r_hand = text2path(outfit_data["r_hand"]) + l_hand = text2path(outfit_data["l_hand"]) + internals_slot = text2path(outfit_data["internals_slot"]) + + var/list/backpack = outfit_data["backpack_contents"] + backpack_contents = list() + for(var/item in backpack) + var/itype = text2path(item) + if(itype) + backpack_contents[itype] = backpack[item] + box = text2path(outfit_data["box"]) + + var/list/impl = outfit_data["implants"] + implants = list() + for(var/I in impl) + var/imptype = text2path(I) + if(imptype) + implants += imptype + + var/list/cybernetic_impl = outfit_data["cybernetic_implants"] + cybernetic_implants = list() + for(var/I in cybernetic_impl) + var/cybtype = text2path(I) + if(cybtype) + cybernetic_implants += cybtype + + var/list/accessories = outfit_data["accessories"] + accessories = list() + for(var/A in accessories) + var/accessorytype = text2path(A) + if(accessorytype) + accessories += accessorytype + + return TRUE + +/datum/outfit/proc/get_json_data() + . = list() + .["outfit_type"] = type + .["name"] = name + .["uniform"] = uniform + .["suit"] = suit + .["back"] = back + .["belt"] = belt + .["gloves"] = gloves + .["shoes"] = shoes + .["head"] = head + .["mask"] = mask + .["l_ear"] = l_ear + .["r_ear"] = r_ear + .["glasses"] = glasses + .["id"] = id + .["pda"] = pda + .["l_pocket"] = l_pocket + .["r_pocket"] = r_pocket + .["suit_store"] = suit_store + .["r_hand"] = r_hand + .["l_hand"] = l_hand + .["internals_slot"] = internals_slot + .["backpack_contents"] = backpack_contents + .["box"] = box + .["implants"] = implants + .["cybernetic_implants"] = cybernetic_implants + .["accessories"] = accessories diff --git a/code/datums/outfits/vv_outfit.dm b/code/datums/outfits/vv_outfit.dm new file mode 100644 index 00000000000..7a07b087ae8 --- /dev/null +++ b/code/datums/outfits/vv_outfit.dm @@ -0,0 +1,190 @@ +// This outfit preserves varedits made on the items +// Created from admin helpers. +/datum/outfit/varedit + var/list/vv_values + var/list/stored_access + var/update_id_name = FALSE //If the name of the human is same as the name on the id they're wearing we'll update provided id when equipping + +/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly) + H.delete_equipment() //Applying VV to wrong objects is not reccomended. + . = ..() + +/datum/outfit/varedit/proc/set_equipment_by_slot(slot, item_path) + switch(slot) + if(slot_w_uniform) + uniform = item_path + if(slot_back) + back = item_path + if(slot_wear_suit) + suit = item_path + if(slot_belt) + belt = item_path + if(slot_gloves) + gloves = item_path + if(slot_shoes) + shoes = item_path + if(slot_head) + head = item_path + if(slot_wear_mask) + mask = item_path + if(slot_l_ear) + l_ear = item_path + if(slot_r_ear) + r_ear = item_path + if(slot_glasses) + glasses = item_path + if(slot_wear_id) + id = item_path + if(slot_wear_pda) + pda = item_path + if(slot_s_store) + suit_store = item_path + if(slot_l_store) + l_pocket = item_path + if(slot_r_store) + r_pocket = item_path + + +/proc/collect_vv(obj/item/I) + //Temporary/Internal stuff, do not copy these. + var/static/list/ignored_vars = list("vars","x","y","z","plane","layer","override","animate_movement","pixel_step_size","screen_loc","fingerprintslast","tip_timer") + + if(istype(I)) + var/list/vedits = list() + for(var/varname in I.vars) + if(!I.can_vv_get(varname)) + continue + if(varname in ignored_vars) + continue + var/vval = I.vars[varname] + //Does it even work ? + if(vval == initial(I.vars[varname])) + continue + //Only text/numbers and icons variables to make it less weirdness prone. + if(!istext(vval) && !isnum(vval) && !isicon(vval)) + continue + vedits[varname] = I.vars[varname] + return vedits + +/mob/living/carbon/human/proc/copy_outfit() + var/datum/outfit/varedit/O = new + + //Copy equipment + var/list/result = list() + var/list/slots_to_check = list(slot_w_uniform, slot_back, slot_wear_suit, slot_belt, slot_gloves, slot_shoes, slot_head, slot_wear_mask, slot_l_ear, slot_r_ear, slot_glasses, slot_wear_id, slot_wear_pda, slot_s_store, slot_l_store, slot_r_store) + for(var/s in slots_to_check) + var/obj/item/I = get_item_by_slot(s) + var/vedits = collect_vv(I) + if(vedits) + result["[s]"] = vedits + if(istype(I)) + O.set_equipment_by_slot(s, I.type) + + //Copy access + O.stored_access = list() + var/obj/item/id_slot = get_item_by_slot(slot_wear_id) + if(id_slot) + O.stored_access |= id_slot.GetAccess() + var/obj/item/card/id/ID = id_slot.GetID() + if(ID && ID.registered_name == real_name) + O.update_id_name = TRUE + + //Copy hands + if(l_hand || r_hand) //Not in the mood to let outfits transfer amputees + var/obj/item/left_hand = l_hand + var/obj/item/right_hand = r_hand + if(istype(left_hand)) + O.l_hand = left_hand.type + var/vedits = collect_vv(left_hand) + if(vedits) + result["LHAND"] = vedits + if(istype(right_hand)) + O.r_hand = right_hand.type + var/vedits = collect_vv(left_hand) + if(vedits) + result["RHAND"] = vedits + O.vv_values = result + + //Copy backpack contents if exist. + var/obj/item/backpack = get_item_by_slot(slot_back) + if(istype(backpack) && LAZYLEN(backpack.contents) > 0) + var/list/typecounts = list() + for(var/obj/item/I in backpack) + if(typecounts[I.type]) + typecounts[I.type] += 1 + else + typecounts[I.type] = 1 + O.backpack_contents = typecounts + //TODO : Copy varedits from backpack stuff too. + + //Copy implants + O.implants = list() + for(var/obj/item/implant/I in contents) + if(istype(I)) + O.implants |= I.type + + // Copy cybernetic implants + O.cybernetic_implants = list() + for(var/obj/item/organ/internal/CI in contents) + if(istype(CI)) + O.cybernetic_implants |= CI.type + + // Copy accessories + var/obj/item/clothing/under/uniform_slot = get_item_by_slot(slot_w_uniform) + if(uniform_slot) + O.accessories = list() + for(var/obj/item/clothing/accessory/A in uniform_slot.accessories) + if(istype(A)) + O.accessories |= A + + //Copy to outfit cache + var/outfit_name = stripped_input(usr, "Enter the outfit name") + O.name = outfit_name + GLOB.custom_outfits += O + to_chat(usr, "Outfit registered, use select equipment to equip it.") + +/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + //Apply VV + for(var/slot in vv_values) + var/list/edits = vv_values[slot] + var/obj/item/I + switch(slot) + if("LHAND") + I = H.l_hand + if("RHAND") + I = H.r_hand + else + I = H.get_item_by_slot(text2num(slot)) + for(var/vname in edits) + I.vv_edit_var(vname,edits[vname]) + //Apply access + var/obj/item/id_slot = H.get_item_by_slot(slot_wear_id) + if(id_slot) + var/obj/item/card/id/card = id_slot.GetID() + if(istype(card)) + card.access |= stored_access + if(update_id_name) + card.registered_name = H.real_name + card.update_label() + +/datum/outfit/varedit/get_json_data() + . = .. () + .["stored_access"] = stored_access + .["update_id_name"] = update_id_name + var/list/stripped_vv = list() + for(var/slot in vv_values) + var/list/vedits = vv_values[slot] + var/list/stripped_edits = list() + for(var/edit in vedits) + if(istext(vedits[edit]) || isnum(vedits[edit]) || isnull(vedits[edit])) + stripped_edits[edit] = vedits[edit] + if(stripped_edits.len) + stripped_vv[slot] = stripped_edits + .["vv_values"] = stripped_vv + +/datum/outfit/varedit/load_from(list/outfit_data) + . = ..() + stored_access = outfit_data["stored_access"] + vv_values = outfit_data["vv_values"] + update_id_name = outfit_data["update_id_name"] \ No newline at end of file diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index d98a23a80c2..67e5438656e 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -46,6 +46,15 @@ datum/map_template/ruin/lavaland/ash_walker cost = 20 allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/free_golem + name = "Free Golem Ship" + id = "golem-ship" + description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ + Seem very intent on research and individual liberty, and also geology based naming?" + cost = 20 + suffix = "lavaland_surface_golem_ship.dmm" + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/animal_hospital name = "Animal Hospital" id = "animal-hospital" diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index 7b880f00e42..f536041e807 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -36,7 +36,7 @@ return var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.flags |= NODROP //curses! + magichead.flags |= NODROP | DROPDEL //curses! magichead.flags_inv = null //so you can still see their face magichead.voicechange = 1 //NEEEEIIGHH target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 387cc70f992..fb336192b38 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -40,6 +40,132 @@ playsound(owner, 'sound/weapons/bite.ogg', 50, 1) owner.adjustBruteLoss(3) +/datum/status_effect/blooddrunk + id = "blooddrunk" + duration = 10 + tick_interval = 0 + alert_type = /obj/screen/alert/status_effect/blooddrunk + var/last_health = 0 + var/last_bruteloss = 0 + var/last_fireloss = 0 + var/last_toxloss = 0 + var/last_oxyloss = 0 + var/last_cloneloss = 0 + var/last_staminaloss = 0 + +/obj/screen/alert/status_effect/blooddrunk + name = "Blood-Drunk" + desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect + icon_state = "blooddrunk" + +/datum/status_effect/blooddrunk/on_apply() + . = ..() + if(.) + owner.maxHealth *= 10 + owner.bruteloss *= 10 + owner.fireloss *= 10 + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + for(var/X in H.bodyparts) + var/obj/item/organ/external/BP = X + BP.max_damage *= 10 + BP.min_broken_damage *= 10 + BP.brute_dam *= 10 + BP.burn_dam *= 10 + owner.toxloss *= 10 + owner.oxyloss *= 10 + owner.cloneloss *= 10 + owner.staminaloss *= 10 + owner.updatehealth() + last_health = owner.health + last_bruteloss = owner.getBruteLoss() + last_fireloss = owner.getFireLoss() + last_toxloss = owner.getToxLoss() + last_oxyloss = owner.getOxyLoss() + last_cloneloss = owner.getCloneLoss() + last_staminaloss = owner.getStaminaLoss() + add_attack_logs(owner, owner, "gained blood-drunk stun immunity") + var/status = CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN + owner.status_flags &= ~status + owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1) + +/datum/status_effect/blooddrunk/tick() //multiply the effect of healing by 10 + if(owner.health > last_health) + var/needs_health_update = FALSE + var/new_bruteloss = owner.getBruteLoss() + if(new_bruteloss < last_bruteloss) + var/heal_amount = (new_bruteloss - last_bruteloss) * 10 + owner.adjustBruteLoss(heal_amount, updating_health = FALSE) + new_bruteloss = owner.getBruteLoss() + needs_health_update = TRUE + last_bruteloss = new_bruteloss + + var/new_fireloss = owner.getFireLoss() + if(new_fireloss < last_fireloss) + var/heal_amount = (new_fireloss - last_fireloss) * 10 + owner.adjustFireLoss(heal_amount, updating_health = FALSE) + new_fireloss = owner.getFireLoss() + needs_health_update = TRUE + last_fireloss = new_fireloss + + var/new_toxloss = owner.getToxLoss() + if(new_toxloss < last_toxloss) + var/heal_amount = (new_toxloss - last_toxloss) * 10 + owner.adjustToxLoss(heal_amount, updating_health = FALSE) + new_toxloss = owner.getToxLoss() + needs_health_update = TRUE + last_toxloss = new_toxloss + + var/new_oxyloss = owner.getOxyLoss() + if(new_oxyloss < last_oxyloss) + var/heal_amount = (new_oxyloss - last_oxyloss) * 10 + owner.adjustOxyLoss(heal_amount, updating_health = FALSE) + new_oxyloss = owner.getOxyLoss() + needs_health_update = TRUE + last_oxyloss = new_oxyloss + + var/new_cloneloss = owner.getCloneLoss() + if(new_cloneloss < last_cloneloss) + var/heal_amount = (new_cloneloss - last_cloneloss) * 10 + owner.adjustCloneLoss(heal_amount, updating_health = FALSE) + new_cloneloss = owner.getCloneLoss() + needs_health_update = TRUE + last_cloneloss = new_cloneloss + + var/new_staminaloss = owner.getStaminaLoss() + if(new_staminaloss < last_staminaloss) + var/heal_amount = (new_staminaloss - last_staminaloss) * 10 + owner.adjustStaminaLoss(heal_amount, updating_health = FALSE) + new_staminaloss = owner.getStaminaLoss() + needs_health_update = TRUE + last_staminaloss = new_staminaloss + + if(needs_health_update) + owner.updatehealth() + owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1) + last_health = owner.health + +/datum/status_effect/blooddrunk/on_remove() + tick() + owner.maxHealth *= 0.1 + owner.bruteloss *= 0.1 + owner.fireloss *= 0.1 + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + for(var/X in H.bodyparts) + var/obj/item/organ/external/BP = X + BP.brute_dam *= 0.1 + BP.burn_dam *= 0.1 + BP.max_damage /= 10 + BP.min_broken_damage /= 10 + owner.toxloss *= 0.1 + owner.oxyloss *= 0.1 + owner.cloneloss *= 0.1 + owner.staminaloss *= 0.1 + owner.updatehealth() + add_attack_logs(owner, owner, "lost blood-drunk stun immunity") + owner.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN + /datum/status_effect/exercised id = "Exercised" duration = 1200 diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 6e809b32606..3ce68f85250 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -9,6 +9,39 @@ if(owner.reagents) owner.reagents.del_reagent("holywater") //can't be deconverted +/datum/status_effect/crusher_mark + id = "crusher_mark" + duration = 300 //if you leave for 30 seconds you lose the mark, deal with it + status_type = STATUS_EFFECT_REPLACE + alert_type = null + var/mutable_appearance/marked_underlay + var/obj/item/twohanded/kinetic_crusher/hammer_synced + +/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced) + . = ..() + if(.) + hammer_synced = new_hammer_synced + +/datum/status_effect/crusher_mark/on_apply() + if(owner.mob_size >= MOB_SIZE_LARGE) + marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + marked_underlay.pixel_x = -owner.pixel_x + marked_underlay.pixel_y = -owner.pixel_y + owner.underlays += marked_underlay + return TRUE + return FALSE + +/datum/status_effect/crusher_mark/Destroy() + hammer_synced = null + if(owner) + owner.underlays -= marked_underlay + QDEL_NULL(marked_underlay) + return ..() + +/datum/status_effect/crusher_mark/be_replaced() + owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. + ..() + /datum/status_effect/saw_bleed id = "saw_bleed" duration = -1 //removed under specific conditions diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index eaa14c4d0b0..8f5023e4a74 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -1,5 +1,43 @@ //entirely neutral or internal status effects go here +/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers + id = "crusher_damage" + duration = -1 + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + var/total_damage = 0 + +/datum/status_effect/syphon_mark + id = "syphon_mark" + duration = 50 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + on_remove_on_mob_delete = TRUE + var/obj/item/borg/upgrade/modkit/bounty/reward_target + +/datum/status_effect/syphon_mark/on_creation(mob/living/new_owner, obj/item/borg/upgrade/modkit/bounty/new_reward_target) + . = ..() + if(.) + reward_target = new_reward_target + +/datum/status_effect/syphon_mark/on_apply() + if(owner.stat == DEAD) + return FALSE + return ..() + +/datum/status_effect/syphon_mark/proc/get_kill() + if(!QDELETED(reward_target)) + reward_target.get_kill(owner) + +/datum/status_effect/syphon_mark/tick() + if(owner.stat == DEAD) + get_kill() + qdel(src) + +/datum/status_effect/syphon_mark/on_remove() + get_kill() + . = ..() + /datum/status_effect/high_five id = "high_five" duration = 40 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index df9e3f8f0ef..f0ba75d5e10 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -207,6 +207,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 10 job = list("Mime") +/datum/uplink_item/jobspecific/pressure_mod + name = "Kinetic Accelerator Pressure Mod" + desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity." + reference = "KPM" + item = /obj/item/borg/upgrade/modkit/indoors + cost = 5 //you need two for full damage, so total of 10 for maximum damage + job = list("Shaft Miner") + //Chef /datum/uplink_item/jobspecific/specialsauce name = "Chef Excellence's Special Sauce" @@ -1107,10 +1115,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 /datum/uplink_item/stealthy_tools/thermal - name = "Thermal Imaging Glasses" - desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." + name = "Thermal Chameleon Glasses" + desc = "These glasses are thermals with Syndicate chameleon technology built into them. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks." reference = "THIG" - item = /obj/item/clothing/glasses/thermal/syndi + item = /obj/item/clothing/glasses/chameleon/thermal cost = 6 /datum/uplink_item/stealthy_tools/traitor_belt diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index d5b4faef17c..d6a531950c5 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -100,9 +100,11 @@ var/list/ghostteleportlocs = list() requires_power = FALSE valid_territory = FALSE dynamic_lighting = DYNAMIC_LIGHTING_FORCED + parallax_movedir = NORTH /area/shuttle/arrival name = "\improper Arrival Shuttle" + parallax_movedir = EAST /area/shuttle/arrival/pre_game icon_state = "shuttle2" @@ -136,12 +138,14 @@ var/list/ghostteleportlocs = list() music = "music/escape.ogg" icon_state = "shuttle" nad_allowed = TRUE + parallax_movedir = EAST /area/shuttle/pod_4 name = "\improper Escape Pod Four" music = "music/escape.ogg" icon_state = "shuttle" nad_allowed = TRUE + parallax_movedir = EAST /area/shuttle/escape_pod1 name = "\improper Escape Pod One" @@ -207,6 +211,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/transport icon_state = "shuttle" name = "\improper Transport Shuttle" + parallax_movedir = EAST /area/shuttle/transport1 icon_state = "shuttle" @@ -247,6 +252,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/specops name = "\improper Special Ops Shuttle" icon_state = "shuttlered" + parallax_movedir = EAST /area/shuttle/specops/centcom name = "\improper Special Ops Shuttle" @@ -260,6 +266,7 @@ var/list/ghostteleportlocs = list() name = "\improper Syndicate Elite Shuttle" icon_state = "shuttlered" nad_allowed = TRUE + parallax_movedir = SOUTH /area/shuttle/syndicate_elite/mothership name = "\improper Syndicate Elite Shuttle" @@ -273,6 +280,7 @@ var/list/ghostteleportlocs = list() name = "\improper Syndicate SIT Shuttle" icon_state = "shuttlered" nad_allowed = TRUE + parallax_movedir = SOUTH /area/shuttle/assault_pod name = "Steel Rain" @@ -281,6 +289,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/administration name = "\improper Nanotrasen Vessel" icon_state = "shuttlered" + parallax_movedir = EAST /area/shuttle/administration/centcom name = "\improper Nanotrasen Vessel Centcom" @@ -380,6 +389,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/salvage/abandoned_ship name = "\improper Abandoned Ship" icon_state = "yellow" + parallax_movedir = WEST /area/shuttle/salvage/clown_asteroid name = "\improper Clown Asteroid" @@ -412,6 +422,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/trade/sol name = "Sol Freighter" + parallax_movedir = EAST /area/shuttle/freegolem name = "Free Golem Ship" @@ -1859,6 +1870,7 @@ var/list/ghostteleportlocs = list() /area/shuttle/constructionsite name = "\improper Construction Site Shuttle" icon_state = "yellow" + parallax_movedir = EAST /area/shuttle/constructionsite/station name = "\improper Construction Site Shuttle" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2e7448ec5c8..26dc6ddbf56 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -67,6 +67,9 @@ var/can_get_auto_cryod = TRUE var/hide_attacklogs = FALSE // For areas such as thunderdome, lavaland syndiebase, etc which generate a lot of spammy attacklogs. Reduces log priority. + var/parallax_movedir = 0 + var/moving = FALSE + /area/Initialize(mapload) GLOB.all_areas += src icon_state = "" diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index 84df75d01b1..d72c6cc0406 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -16,7 +16,7 @@ icon_state = "dk_yellow" /area/ruin/powered/golem_ship - name = "Free Golem Ship" + name = "Free Golem Landing" icon_state = "dk_yellow" /area/ruin/powered/greed diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 1a23dc71070..0a22c19770b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -26,7 +26,7 @@ var/inertia_move_delay = 5 var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move - + var/list/client_mobs_in_contents var/area/areaMaster /atom/movable/New() @@ -215,6 +215,8 @@ if(!inertia_moving) inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) + if(length(client_mobs_in_contents)) + update_parallax_contents() return TRUE // Previously known as HasEntered() diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 0f8e52a90b2..df61106c4ab 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -14,7 +14,6 @@ var/list/blob_nodes = list() required_enemies = 1 recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") - free_golems_disabled = TRUE var/declared = 0 var/burst = 0 diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index e7751ffcd8a..d6d4a91cf19 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -25,7 +25,8 @@ if(blob_nodes.len) var/list/nodes = list() for(var/i = 1; i <= blob_nodes.len; i++) - nodes["Blob Node #[i]"] = blob_nodes[i] + var/obj/structure/blob/node/B = blob_nodes[i] + nodes["Blob Node #[i] ([get_location_name(B)])"] = B var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes var/obj/structure/blob/node/chosen_node = nodes[node_name] if(chosen_node) diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headslug.dm similarity index 88% rename from code/game/gamemodes/changeling/powers/headcrab.dm rename to code/game/gamemodes/changeling/powers/headslug.dm index b39a2bba0d5..f29ec02db54 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headslug.dm @@ -1,4 +1,4 @@ -/datum/action/changeling/headcrab +/datum/action/changeling/headslug name = "Last Resort" desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals." helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." @@ -7,12 +7,12 @@ dna_cost = 1 req_human = 1 -/datum/action/changeling/headcrab/try_to_sting(mob/user, mob/target) +/datum/action/changeling/headslug/try_to_sting(mob/user, mob/target) if(alert("Are you sure you wish to do this? This action cannot be undone.",,"Yes","No")=="No") return ..() -/datum/action/changeling/headcrab/sting_action(mob/user) +/datum/action/changeling/headslug/sting_action(mob/user) var/datum/mind/M = user.mind var/list/organs = user.get_organs_zone("head", 1) @@ -33,7 +33,7 @@ S.Weaken(3) var/new_location = user.drop_location() spawn(5) // So it's not killed in explosion - var/mob/living/simple_animal/hostile/headcrab/crab = new(new_location) + var/mob/living/simple_animal/hostile/headslug/crab = new(new_location) for(var/obj/item/organ/internal/I in organs) I.loc = crab crab.origin = M diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 90ab53dfde2..9442c319dcb 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -29,7 +29,7 @@ var/global/list/all_cults = list() return 1 /proc/is_sacrifice_target(datum/mind/mind) - if(istype(SSticker.mode.name, "cult")) + if(SSticker.mode.name == "cult") var/datum/game_mode/cult/cult_mode = SSticker.mode if(mind == cult_mode.sacrifice_target) return 1 @@ -43,7 +43,6 @@ var/global/list/all_cults = list() required_players = 30 required_enemies = 3 recommended_enemies = 4 - free_golems_disabled = TRUE var/datum/mind/sacrifice_target = null var/finished = 0 diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index da4e190cb7f..c31ebaf9b84 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -163,6 +163,16 @@ possible_sac_targets += player.mind return possible_sac_targets +// Handles the updating of sacrifice objectives after the sacrifice target goes to cryo and ghosts +/datum/game_mode/cult/proc/update_sac_objective(previous_target, previous_role) + for(var/datum/mind/cult_mind in cult) + if(cult_mind) + var/updated_memory = cult_mind.memory + updated_memory = replacetext("[cult_mind.memory]", "[previous_target]", "[sacrifice_target]") + updated_memory = replacetext("[updated_memory]", "[previous_role]", "[sacrifice_target.assigned_role]") + cult_mind.memory = updated_memory + + /datum/game_mode/cult/proc/pick_objective() var/list/possible_objectives = list() diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 3658a57fb98..179425d320d 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -1,4 +1,5 @@ /obj/item/paper/talisman + icon = 'icons/obj/paper.dmi' icon_state = "paper_talisman" var/cultist_name = "talisman" var/cultist_desc = "A basic talisman. It serves no purpose." @@ -7,6 +8,9 @@ var/uses = 1 var/health_cost = 0 //The amount of health taken from the user when invoking the talisman +/obj/item/paper/talisman/update_icon()//overriding this so the update_icon doesn't turn them into normal looking paper + SEND_SIGNAL(src, COMSIG_OBJ_UPDATE_ICON) + /obj/item/paper/talisman/examine(mob/user) if(iscultist(user) || user.stat == DEAD) to_chat(user, "Name: [cultist_name]") @@ -49,6 +53,7 @@ //Supply Talisman: Has a few unique effects. Granted only to starter cultists. /obj/item/paper/talisman/supply cultist_name = "Supply Talisman" + icon_state = "supply" cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on." invocation = null uses = 3 @@ -117,6 +122,7 @@ //Rite of Translocation: Same as rune /obj/item/paper/talisman/teleport cultist_name = "Talisman of Teleportation" + icon_state = "teleport" cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword." invocation = "Sas'so c'arta forbici!" health_cost = 5 @@ -159,6 +165,7 @@ /obj/item/paper/talisman/summon_tome cultist_name = "Talisman of Tome Summoning" + icon_state = "tome" cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of a cult." invocation = "N'ath reth sh'yro eth d'raggathnor!" health_cost = 1 @@ -173,6 +180,7 @@ /obj/item/paper/talisman/true_sight cultist_name = "Talisman of Veiling" + icon_state = "veil" cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes." invocation = "Kla'atu barada nikt'o!" health_cost = 1 @@ -197,6 +205,7 @@ //Rite of False Truths: Same as rune /obj/item/paper/talisman/make_runes_fake cultist_name = "Talisman of Disguising" + icon_state = "disguising" cultist_desc = "A talisman that will make nearby runes appear fake." invocation = "By'o nar'nar!" @@ -212,6 +221,7 @@ //Rite of Disruption: Weaker than rune /obj/item/paper/talisman/emp cultist_name = "Talisman of Electromagnetic Pulse" + icon_state = "emp" cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse." invocation = "Ta'gh fara'qha fel d'amar det!" health_cost = 5 @@ -226,6 +236,7 @@ //Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time /obj/item/paper/talisman/stun cultist_name = "Talisman of Stunning" + icon_state = "stunning" cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly." invocation = "Dream sign:Evil sealing talisman!" health_cost = 10 @@ -271,6 +282,7 @@ //Rite of Arming: Equips cultist armor on the user, where available /obj/item/paper/talisman/armor cultist_name = "Talisman of Arming" + icon_state = "arming" cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to." invocation = "N'ath reth sh'yro eth draggathnor!" @@ -298,6 +310,7 @@ //Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations /obj/item/paper/talisman/horror cultist_name = "Talisman of Horrors" + icon_state = "horror" cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations." invocation = "Lo'Nab Na'Dm!" @@ -313,6 +326,7 @@ //Talisman of Fabrication: Creates a construct shell out of 25 metal sheets. /obj/item/paper/talisman/construction cultist_name = "Talisman of Construction" + icon_state = "construction" cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal" invocation = "Ethra p'ni dedol!" uses = 25 @@ -357,6 +371,7 @@ //Talisman of Shackling: Applies special cuffs directly from the talisman /obj/item/paper/talisman/shackle cultist_name = "Talisman of Shackling" + icon_state = "shackling" cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings." invocation = "In'totum Lig'abis!" uses = 4 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index e344c2b2029..aa366415f31 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -27,7 +27,6 @@ var/recommended_enemies = 0 var/newscaster_announcements = null var/ert_disabled = 0 - var/free_golems_disabled = FALSE var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 20 @@ -81,7 +80,6 @@ // feedback_set_details("revision","[revdata.revision]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") generate_station_goals() - check_free_golems() start_state = new /datum/station_state() start_state.count() return 1 @@ -513,12 +511,6 @@ proc/display_roundstart_logout_report() var/datum/station_goal/G = V G.print_result() -/datum/game_mode/proc/check_free_golems() //check config and gamemode for free golems setting and run the prob to check if the round will have free golems spawned or not - if((config.unrestricted_free_golems || !free_golems_disabled) && prob(config.prob_free_golems)) - for(var/obj/effect/landmark/free_golem_spawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - new /obj/effect/mob_spawn/human/golem/adamantine(L.loc) - /datum/game_mode/proc/update_eventmisc_icons_added(datum/mind/mob_mind) var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC] antaghud.join_hud(mob_mind.current) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index fc6ebcc1549..2d7c9cff015 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -12,7 +12,6 @@ proc/issyndicate(mob/living/M as mob) required_players = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining required_enemies = 5 recommended_enemies = 5 - free_golems_disabled = TRUE var/const/agents_possible = 5 //If we ever need more syndicate agents. diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 5fc01686200..d696543cbdf 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -297,23 +297,23 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha to_chat(owner, "They've got no blood left to give.") break if(H.stat < DEAD) - if(!issmall(H) || H.ckey) + if(H.ckey || H.player_ghosted) //Requires ckey regardless if monkey or humanoid, or the body has been ghosted before it died blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0 bloodusable += blood / 2 else - if(!issmall(H) || H.ckey) + if(H.ckey || H.player_ghosted) blood = min(5, H.blood_volume) // The dead only give 5 blood bloodtotal += blood if(old_bloodtotal != bloodtotal) - if(!issmall(H) || H.ckey) // not small OR has a ckey, monkeys with ckeys can be sucked, humanized monkeys can be sucked monkeys without ckeys cannot be sucked + if(H.ckey || H.player_ghosted) // Requires ckey regardless if monkey or human, and has not ghosted, otherwise no power to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].") check_vampire_upgrade() H.blood_volume = max(H.blood_volume - 25, 0) if(ishuman(owner)) var/mob/living/carbon/human/V = owner - if(issmall(H) && !H.ckey) - to_chat(V, "Feeding on [H] reduces your hunger, but you get no usable blood from it.") + if(!H.ckey && !H.player_ghosted)//Only runs if there is no ckey and the body has not being ghosted while alive + to_chat(V, "Feeding on [H] reduces your thirst, but you get no usable blood from them.") V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5) else V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) @@ -402,7 +402,14 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(T.density) return - vamp_burn(1) + if(bloodusable >= 10) //burn through your blood to tank the light for a little while + to_chat(owner, "The starlight saps your strength!") + bloodusable -= 10 + vamp_burn(10) + else //You're in trouble, get out of the sun NOW + to_chat(owner, "Your body is turning to ash, get out of the light now!") + owner.adjustCloneLoss(10) //I'm melting! + vamp_burn(85) /datum/vampire/proc/handle_vampire() if(owner.hud_used) @@ -419,7 +426,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha if(istype(owner.loc, /turf/space)) check_sun() if(istype(owner.loc.loc, /area/chapel) && !get_ability(/datum/vampire_passive/full)) - vamp_burn(0) + vamp_burn(7) nullified = max(0, nullified - 1) /datum/vampire/proc/handle_vampire_cloak() @@ -442,8 +449,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha else owner.alpha = round((255 * 0.80)) -/datum/vampire/proc/vamp_burn(severe_burn) - var/burn_chance = severe_burn ? 35 : 8 +/datum/vampire/proc/vamp_burn(burn_chance) if(prob(burn_chance) && owner.health >= 50) switch(owner.health) if(75 to 100) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 6f96d4c22e2..a97db45ca31 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -863,7 +863,7 @@ if(istype(user, /mob/living/carbon/human)) to_chat(user, "HOR-SIE HAS RISEN") var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead - magichead.flags |= NODROP //curses! + magichead.flags |= NODROP | DROPDEL //curses! magichead.flags_inv = null //so you can still see their face magichead.voicechange = 1 //NEEEEIIGHH if(!user.unEquip(user.wear_mask)) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index e1f9ac2725d..131afd84fff 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -7,8 +7,8 @@ required_players = 20 required_enemies = 1 recommended_enemies = 1 - free_golems_disabled = TRUE - var/use_huds = 0 + var/use_huds = 1 + var/finished = 0 var/but_wait_theres_more = 0 @@ -158,22 +158,30 @@ wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic return 1 +// Checks if the game should end due to all wizards and apprentices being dead, or MMI'd/Borged /datum/game_mode/wizard/check_finished() var/wizards_alive = 0 var/traitors_alive = 0 + + // Wizards for(var/datum/mind/wizard in wizards) if(!istype(wizard.current,/mob/living/carbon)) continue if(wizard.current.stat==DEAD) continue + if(istype(wizard.current, /obj/item/mmi)) // wizard is in an MMI, don't count them as alive + continue wizards_alive++ + // Apprentices - classified as "traitors" if(!wizards_alive) for(var/datum/mind/traitor in traitors) if(!istype(traitor.current,/mob/living/carbon)) continue if(traitor.current.stat==DEAD) continue + if(istype(traitor.current, /obj/item/mmi)) // apprentice is in an MMI, don't count them as alive + continue traitors_alive++ if(wizards_alive || traitors_alive || but_wait_theres_more) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 394fe3d0908..a31f694f7fc 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -601,28 +601,29 @@ proc/get_all_job_icons() //For all existing HUD icons return GLOB.joblist + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation - var/obj/item/card/id/I + var/assignmentName = "Unknown" + var/rankName = "Unknown" if(istype(src, /obj/item/pda)) var/obj/item/pda/P = src - I = P.id + assignmentName = P.ownjob + rankName = P.ownrank else if(istype(src, /obj/item/card/id)) - I = src + var/obj/item/card/id/I = src + assignmentName = I.assignment + rankName = I.rank + - if(I) - var/job_icons = get_all_job_icons() - var/centcom = get_all_centcom_jobs() + var/job_icons = get_all_job_icons() + var/centcom = get_all_centcom_jobs() - if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job - return "Centcom" - if(I.rank in centcom) - return "Centcom" - - if(I.assignment in job_icons) //Check if the job has a hud icon - return I.assignment - if(I.rank in job_icons) - return I.rank - - else - return + if(assignmentName in centcom) //Return with the NT logo if it is a Centcom job + return "Centcom" + if(rankName in centcom) + return "Centcom" + if(assignmentName in job_icons) //Check if the job has a hud icon + return assignmentName + if(rankName in job_icons) + return rankName + return "Unknown" //Return unknown if none of the above apply diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index eebe4f2e9e4..9def19d2970 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -146,7 +146,7 @@ var/backpack = /obj/item/storage/backpack var/satchel = /obj/item/storage/backpack/satchel_norm var/dufflebag = /obj/item/storage/backpack/duffel - var/box = /obj/item/storage/box/survival + box = /obj/item/storage/box/survival var/tmp/list/gear_leftovers = list() @@ -168,12 +168,8 @@ else back = backpack //Department backpack - if(box) - var/spawnbox = box - if(H.dna.species.speciesbox) - spawnbox = H.dna.species.speciesbox - backpack_contents.Insert(1, spawnbox) // Box always takes a first slot in backpack - backpack_contents[spawnbox] = 1 + if(box && H.dna.species.speciesbox) + box = H.dna.species.speciesbox if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len)) for(var/gear in H.client.prefs.gear) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 22c2d47e3b9..aac1c291355 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -175,23 +175,24 @@ name = "Shaft Miner" jobtype = /datum/job/mining - uniform = /obj/item/clothing/under/rank/miner/lavaland - gloves = /obj/item/clothing/gloves/color/black - shoes = /obj/item/clothing/shoes/workboots/mining l_ear = /obj/item/radio/headset/headset_cargo/mining - id = /obj/item/card/id/supply + shoes = /obj/item/clothing/shoes/workboots/mining + gloves = /obj/item/clothing/gloves/color/black + uniform = /obj/item/clothing/under/rank/miner/lavaland l_pocket = /obj/item/reagent_containers/hypospray/autoinjector/survival - r_pocket = /obj/item/flashlight/seclite + r_pocket = /obj/item/storage/bag/ore + id = /obj/item/card/id/supply pda = /obj/item/pda/shaftminer backpack_contents = list( - /obj/item/storage/bag/ore=1,\ + /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1,\ /obj/item/mining_voucher=1,\ /obj/item/stack/marker_beacon/ten=1 ) - + backpack = /obj/item/storage/backpack/explorer - satchel = /obj/item/storage/backpack/explorer + satchel = /obj/item/storage/backpack/satchel/explorer + box = /obj/item/storage/box/survival_mining /datum/outfit/job/mining/equipped name = "Shaft Miner" @@ -210,9 +211,6 @@ /obj/item/stack/marker_beacon/ten=1 ) - backpack = /obj/item/storage/backpack/explorer - satchel = /obj/item/storage/backpack/explorer - /datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index d85a89606ea..0d4455399b0 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -8,6 +8,7 @@ idle_power_usage = 5 active_power_usage = 60 power_channel = EQUIP + pass_flags = PASSTABLE var/obj/item/stock_parts/cell/charging = null var/chargelevel = -1 diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 604ac3f02f3..d3edc588e2d 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -460,6 +460,12 @@ desc = "Here's your chance, do your dance at the Space Jam." w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets +/obj/item/beach_ball/holoball/baseball + icon_state = "baseball" + name = "baseball" + item_state = "baseball" + desc = "Take me out to the ball game." + /obj/structure/holohoop name = "basketball hoop" desc = "Boom, Shakalaka!" diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index d404db8ae0a..a34a49ca051 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -334,9 +334,6 @@ /obj/item/circuitboard/white_ship name = "circuit Board (White Ship)" build_path = /obj/machinery/computer/shuttle/white_ship -/obj/item/circuitboard/golem_ship - name = "circuit Board (Golem Ship)" - build_path = /obj/machinery/computer/shuttle/golem_ship /obj/item/circuitboard/shuttle/syndicate name = "circuit board (Syndicate Shuttle)" build_path = /obj/machinery/computer/shuttle/syndicate @@ -346,7 +343,9 @@ /obj/item/circuitboard/shuttle/syndicate/drop_pod name = "circuit board (Syndicate Drop Pod)" build_path = /obj/machinery/computer/shuttle/syndicate/drop_pod - +/obj/item/circuitboard/shuttle/golem_ship + name = "circuit Board (Golem Ship)" + build_path = /obj/machinery/computer/shuttle/golem_ship /obj/item/circuitboard/HolodeckControl name = "Circuit board (Holodeck Control)" diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 9e91e254950..8cb3301e40c 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -330,6 +330,14 @@ to destroy them and players will be able to make replacements. name = "circuit board (Freezer)" to_chat(user, "You set the board to cooling.") +/obj/item/circuitboard/recharger + name = "circuit board (Recharger)" + build_path = /obj/machinery/recharger + board_type = "machine" + origin_tech = "powerstorage=3;materials=2" + frame_desc = "Requires 1 Capacitor" + req_components = list(/obj/item/stock_parts/capacitor = 1) + /obj/item/circuitboard/snow_machine name = "circuit board (snow machine)" build_path = /obj/machinery/snow_machine @@ -591,6 +599,16 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/console_screen = 1) +/obj/item/circuitboard/reagentgrinder + name = "circuit board (All-In-One Grinder)" + build_path = /obj/machinery/reagentgrinder/empty + board_type = "machine" + origin_tech = "materials=2;engineering=2;biotech=2" + frame_desc = "Requires 2 Manipulators and 1 Matter Bin." + req_components = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/matter_bin = 1) + //Almost the same recipe as destructive analyzer to give people choices. /obj/item/circuitboard/experimentor name = "circuit board (E.X.P.E.R.I-MENTOR)" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 17965c12f4c..f9d708a6200 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -371,6 +371,8 @@ for(var/datum/mind/H in SSticker.mode.cult) if(H.current) to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...
") + H.current << 'sound/ambience/alarm4.ogg' + cult_mode.update_sac_objective(occupant.mind, occupant.mind.assigned_role) else cult_mode.bypass_phase() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index cf580edd5ea..b8c0f3d02f4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -181,12 +181,6 @@ About the new airlock wires panel: /obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) ..(user) -/obj/machinery/door/airlock/autoclose() - autoclose_timer = 0 - if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) - close() - return - /obj/machinery/door/airlock/proc/isElectrified() if(electrified_until != 0) return 1 @@ -311,6 +305,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/update_icon(state=0, override=0) if(operating && !override) return + check_unres() icon_state = density ? "closed" : "open" switch(state) if(0) @@ -333,7 +328,6 @@ About the new airlock wires panel: var/image/sparks_overlay var/image/note_overlay var/notetype = note_type() - switch(state) if(AIRLOCK_CLOSED) frame_overlay = get_airlock_overlay("closed", icon) @@ -621,6 +615,31 @@ About the new airlock wires panel: if(user) attack_ai(user) +/obj/machinery/door/airlock/proc/check_unres() //unrestricted sides. This overlay indicates which directions the player can access even without an ID + if(hasPower() && unres_sides) + if(unres_sides & NORTH) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n") //layer=src.layer+1 + I.pixel_y = 32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & SOUTH) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s") //layer=src.layer+1 + I.pixel_y = -32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & EAST) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e") //layer=src.layer+1 + I.pixel_x = 32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + if(unres_sides & WEST) + var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w") //layer=src.layer+1 + I.pixel_x = -32 + set_light(l_range = 1, l_power = 1, l_color = "#00FF00") + add_overlay(I) + else + set_light(0) + /obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0) if(isElectrified() && density && istype(mover, /obj/item)) var/obj/item/I = mover @@ -1078,6 +1097,10 @@ About the new airlock wires panel: playsound(loc, doorOpen, 30, 1) if(closeOther != null && istype(closeOther, /obj/machinery/door/airlock/) && !closeOther.density) closeOther.close() + + if(autoclose) + autoclose_in(normalspeed ? auto_close_time : auto_close_time_dangerous) + if(!density) return TRUE operating = TRUE @@ -1092,10 +1115,6 @@ About the new airlock wires panel: layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) operating = FALSE - - // The `addtimer` system has the advantage of being cancelable - if(autoclose) - autoclose_timer = addtimer(CALLBACK(src, .proc/autoclose), normalspeed ? auto_close_time : auto_close_time_dangerous, TIMER_UNIQUE | TIMER_STOPPABLE) return TRUE /obj/machinery/door/airlock/close(forced=0, override = 0) @@ -1112,7 +1131,8 @@ About the new airlock wires panel: for(var/turf/turf in locs) for(var/atom/movable/M in turf) if(M.density && M != src) //something is blocking the door - addtimer(CALLBACK(src, .proc/autoclose), 60) + autoclose_in(60) + return use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(forced) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index df63da64f2b..01d90795a87 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -11,6 +11,8 @@ var/list/conf_access = null var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics + var/unres_sides = 0 + var/unres_direction = null /obj/item/airlock_electronics/attack_self(mob/user) if(!ishuman(user) && !isrobot(user)) @@ -23,14 +25,22 @@ return var/t1 = text("Access control
\n") + t1 += "
" + t1 += " Unrestricted Access Settings
" + var/list/Directions = list("North","South",,"East",,,,"West") + for(var/direction in cardinal) + if (unres_direction && unres_direction == direction) + t1 += "[Directions[direction]]
" + else + t1 += "[Directions[direction]]
" + + t1 += "
" t1 += "Access requirement is set to " t1 += one_access ? "ONE
" : "ALL
" t1 += conf_access == null ? "All
" : "All
" - t1 += "
" - var/list/accesses = get_all_accesses() for(var/acc in accesses) var/aname = get_access_desc(acc) @@ -64,6 +74,14 @@ if(href_list["access"]) toggle_access(href_list["access"]) + + if(href_list["unres_direction"]) + unres_direction = text2num(href_list["unres_direction"]) + if (unres_sides == unres_direction) + unres_sides = 0 + unres_direction = null + else + unres_sides = unres_direction attack_self(usr) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0dd301d5542..65854bb1412 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -14,21 +14,20 @@ var/visible = 1 var/operating = FALSE var/autoclose = 0 - var/autoclose_timer var/safe = TRUE //whether the door detects things and mobs in its way and reopen or crushes them. var/locked = FALSE //whether the door is bolted or not. var/glass = FALSE var/welded = FALSE var/normalspeed = 1 var/auto_close_time = 150 - var/auto_close_time_dangerous = 5 + var/auto_close_time_dangerous = 15 var/assemblytype //the type of door frame to drop during deconstruction var/datum/effect_system/spark_spread/spark_system var/damage_deflection = 10 var/real_explosion_block //ignore this, just use explosion_block var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors var/emergency = FALSE - + var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access //Multi-tile doors var/width = 1 @@ -55,6 +54,10 @@ ..() update_dir() +/obj/machinery/door/power_change() + ..() + update_icon() + /obj/machinery/door/proc/update_dir() if(width > 1) if(dir in list(EAST, WEST)) @@ -73,9 +76,6 @@ air_update_turf(1) update_freelook_sight() GLOB.airlocks -= src - if(autoclose_timer) - deltimer(autoclose_timer) - autoclose_timer = 0 QDEL_NULL(spark_system) return ..() @@ -175,10 +175,15 @@ /obj/machinery/door/allowed(mob/M) if(emergency) return TRUE + if(unrestricted_side(M)) + return TRUE if(!requiresID()) return FALSE // Intentional. machinery/door/requiresID() always == 1. airlocks, however, == 0 if ID scan is disabled. Yes, this var is poorly named. return ..() +/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) + return get_dir(src, M) & unres_sides + /obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) return @@ -273,11 +278,8 @@ operating = FALSE air_update_turf(1) update_freelook_sight() - - // The `addtimer` system has the advantage of being cancelable if(autoclose) - autoclose_timer = addtimer(CALLBACK(src, .proc/autoclose), normalspeed ? auto_close_time : auto_close_time_dangerous, TIMER_UNIQUE | TIMER_STOPPABLE) - + autoclose_in(normalspeed ? auto_close_time : auto_close_time_dangerous) return TRUE /obj/machinery/door/proc/close() @@ -286,18 +288,15 @@ if(operating || welded) return if(safe) - for(var/atom/movable/M in get_turf(src)) - if(M.density && M != src) //something is blocking the door - if(autoclose) - addtimer(CALLBACK(src, .proc/autoclose), 60) - return + for(var/turf/turf in locs) + for(var/atom/movable/M in turf) + if(M.density && M != src) //something is blocking the door + if(autoclose) + autoclose_in(60) + return operating = TRUE - if(autoclose_timer) - deltimer(autoclose_timer) - autoclose_timer = 0 - do_animate("closing") layer = closingLayer sleep(5) @@ -345,10 +344,12 @@ return !(stat & NOPOWER) /obj/machinery/door/proc/autoclose() - autoclose_timer = 0 if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) close() +/obj/machinery/door/proc/autoclose_in(wait) + addtimer(CALLBACK(src, .proc/autoclose), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE) + /obj/machinery/door/proc/update_freelook_sight() if(!glass && cameranet) cameranet.updateVisibility(src, 0) diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 5209003fc59..b1a6f96e2eb 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -76,6 +76,21 @@ name = "Airlock Controller" tag_secure = 1 +/obj/machinery/embedded_controller/radio/airlock/airlock_controller/Initialize(mapload, given_id_tag, given_frequency, given_tag_exterior_door, given_tag_interior_door, given_tag_airpump, given_tag_chamber_sensor) + if(given_id_tag) + id_tag = given_id_tag + if(given_frequency) + set_frequency(given_frequency) + if(given_tag_exterior_door) + tag_exterior_door = given_tag_exterior_door + if(given_tag_interior_door) + tag_interior_door = given_tag_interior_door + if(given_tag_airpump) + tag_airpump = given_tag_airpump + if(given_tag_chamber_sensor) + tag_chamber_sensor = given_tag_chamber_sensor + ..() + /obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -129,7 +144,6 @@ name = "Access Controller" tag_secure = 1 - /obj/machinery/embedded_controller/radio/airlock/access_controller/update_icon() if(on && program) if(program.memory["processing"]) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2bc9196740e..f8305e0fb7d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -553,9 +553,7 @@ Class Procs: threatcount += 2 if(check_records || check_arrest) - var/perpname = perp.name - if(id) - perpname = id.registered_name + var/perpname = perp.get_visible_name(TRUE) var/datum/data/record/R = find_security_record("name", perpname) if(check_records && !R) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 8bc5976d638..de14dce7d5b 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -160,8 +160,8 @@ var/obj/item/stack/cable_coil/C = W to_chat(user, "You start adding cables to \the [src]...") playsound(get_turf(src), C.usesound, 50, 1) - if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 3) && (build == 2)) - C.use(3) + if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 2) && (build == 2)) + C.use(2) to_chat(user, "You've added cables to \the [src].") build++ update_icon() @@ -169,7 +169,7 @@ if(istype(W, /obj/item/wirecutters)) to_chat(user, "You begin to remove the wiring from \the [src].") if(do_after(user, 10 * W.toolspeed, target = src) && (build == 3)) - new /obj/item/stack/cable_coil(loc,3) + new /obj/item/stack/cable_coil(loc,2) playsound(get_turf(src), W.usesound, 50, 1) to_chat(user, "You've removed the cables from \the [src].") build-- @@ -179,8 +179,8 @@ var/obj/item/stack/rods/R = W to_chat(user, "You begin to complete \the [src]...") playsound(get_turf(src), R.usesound, 50, 1) - if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 3) && (build == 3)) - R.use(3) + if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 2) && (build == 3)) + R.use(2) to_chat(user, "You've added the grille to \the [src].") build++ update_icon() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index b8f2d153d9f..797eee044ad 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -6,7 +6,8 @@ anchored = 1 use_power = IDLE_POWER_USE idle_power_usage = 4 - active_power_usage = 250 + active_power_usage = 200 + pass_flags = PASSTABLE var/obj/item/charging = null var/using_power = FALSE var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/rcs, /obj/item/bodyanalyzer) @@ -14,6 +15,18 @@ var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" + var/recharge_coeff = 1 + +/obj/machinery/recharger/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/recharger(null) + component_parts += new /obj/item/stock_parts/capacitor(null) + RefreshParts() + +/obj/machinery/recharger/RefreshParts() + for(var/obj/item/stock_parts/capacitor/C in component_parts) + recharge_coeff = C.rating /obj/machinery/recharger/attackby(obj/item/G, mob/user, params) if(iswrench(G)) @@ -54,8 +67,16 @@ else to_chat(user, "[src] isn't connected to anything!") return 1 - else - return ..() + + if(anchored && !charging) + if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G)) + return + + if(panel_open && istype(G, /obj/item/crowbar)) + default_deconstruction_crowbar(G) + return + + return ..() /obj/machinery/recharger/attack_hand(mob/user) if(issilicon(user)) @@ -87,10 +108,11 @@ if(istype(charging, /obj/item/gun/energy)) var/obj/item/gun/energy/E = charging if(E.power_supply.charge < E.power_supply.maxcharge) - E.power_supply.give(E.power_supply.chargerate) + E.power_supply.give(E.power_supply.chargerate * recharge_coeff) use_power(250) using_power = TRUE + if(istype(charging, /obj/item/melee/baton)) var/obj/item/melee/baton/B = charging if(B.bcell) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index bc2af073fc6..3630beb1f6c 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -201,6 +201,9 @@ return FALSE if(!Adjacent(user)) return FALSE + if(!allowed(user)) + to_chat(user, "Access denied!") + return FALSE return TRUE /obj/machinery/syndicatebomb/proc/activate() @@ -273,6 +276,7 @@ /obj/machinery/syndicatebomb/self_destruct name = "self destruct device" desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age." + req_access = list(access_syndicate) payload = /obj/item/bombcore/large can_unanchor = FALSE var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE // If set, this bomb will also cause explosive walls in the same group to explode diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 04e78e937aa..cf7937474c8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1132,7 +1132,6 @@ product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" icon_state = "wallmed" icon_deny = "wallmed-deny" - req_access = list(access_medical) density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1) contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1) @@ -1143,7 +1142,6 @@ desc = "Wall-mounted Medical Equipment dispenser." icon_state = "wallmed" icon_deny = "wallmed-deny" - req_access = list(access_medical) density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/syringe/charcoal = 3, /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment = 3, /obj/item/healthanalyzer = 3) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 5b4a8143bef..8cce6cdcdfc 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -171,10 +171,8 @@ /obj/mecha/working/ripley/proc/update_pressure() var/turf/T = get_turf(loc) - var/datum/gas_mixture/environment = T.return_air() - var/pressure = environment.return_pressure() - if(pressure < 20) + if(lavaland_equipment_pressure_check(T)) step_in = 3 for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) drill.equip_cooldown = initial(drill.equip_cooldown)/2 diff --git a/code/game/objects/effects/mapping_helpers.dm b/code/game/objects/effects/mapping_helpers.dm index 909e63a98ba..44a16c5ae5f 100644 --- a/code/game/objects/effects/mapping_helpers.dm +++ b/code/game/objects/effects/mapping_helpers.dm @@ -67,6 +67,23 @@ /obj/effect/mapping_helpers/no_lava icon_state = "no_lava" +/obj/effect/mapping_helpers/airlock + layer = DOOR_HELPER_LAYER + +/obj/effect/mapping_helpers/airlock/unres + name = "airlock unresctricted side helper" + icon_state = "airlock_unres_helper" + +/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload) + if(!mapload) + log_world("### MAP WARNING, [src] spawned outside of mapload!") + return + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc + if(airlock) + airlock.unres_sides ^= dir + else + log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]") + ..() /obj/effect/mapping_helpers/no_lava/New() var/turf/T = get_turf(src) T.flags |= NO_LAVA_GEN diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 76e28f013a1..a9ef27c4e01 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -141,7 +141,7 @@ new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0) var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) - chainsaw.flags |= NODROP + chainsaw.flags |= NODROP | DROPDEL victim.drop_l_hand() victim.drop_r_hand() victim.put_in_hands(chainsaw) diff --git a/code/game/objects/effects/spawners/airlock_spawner.dm b/code/game/objects/effects/spawners/airlock_spawner.dm new file mode 100644 index 00000000000..496f02c61d1 --- /dev/null +++ b/code/game/objects/effects/spawners/airlock_spawner.dm @@ -0,0 +1,345 @@ +/* +Spawners for mappers. Just plonk one down of the desired size and it will place the machinery for you. The red arrow things indicate where the chamber is. +This spawner places pipe leading up to the interior door, you will need to finish it off yourself with a connector, canister, and pipe connecting the two. It also assumes you already put in wall and floor. +*/ + +#define HALF_X round((tiles_in_x_direction - 1) * 0.5) //These are required so that the airlock can be in the middle of the chamber wall +#define HALF_Y round((tiles_in_y_direction - 1) * 0.5) +#define CHAMBER_LONG 1 +#define CHAMBER_SQUARE 2 +#define CHAMBER_BIGGER 3 +#define DOOR_NORMAL_PLACEMENT 1 +#define DOOR_FLIPPED_PLACEMENT 2 + +#define AIRPUMP_TAG "[id_to_link]_pump" +#define SENSOR_TAG "[id_to_link]_sensor" +#define OUTER_DOOR_TAG "[id_to_link]_outer" +#define INNER_DOOR_TAG "[id_to_link]_inner" + +/obj/effect/spawner/airlock + name = "1 by 1 airlock spawner (interior north, exterior south)" + desc = "If you can see this, there's probably a missing airlock here. Better tell an admin and report this on the github." + icon = 'icons/obj/airlock_spawner.dmi' + icon_state = "1x1_N_to_S" + layer = SPLASHSCREEN_PLANE //So we absolutely always appear above everything else. We delete ourself after spawning so this is fine + var/interior_direction = NORTH //This is also the direction the spawner will send the pipe + var/exterior_direction = SOUTH + var/opposite_interior_direction //We're checking these often enough for them to merit their own vars + var/interior_direction_cw + var/interior_direction_ccw + var/north_or_south_interior //Used a bit everywhere for locational stuff + var/north_or_south_exterior //Likewise + var/tiles_in_x_direction = 1 + var/tiles_in_y_direction = 1 + var/id_to_link + var/radio_frequency = 1379 + var/required_access = list(access_external_airlocks) + var/door_name = "external access" + var/door_type = /obj/machinery/door/airlock/external/glass + var/one_door_interior //For square airlocks, if you set this then a) only one door will spawn, and b) you can choose if the door should go opposite to how it normally goes. Please use the define + var/one_door_exterior //See above + +/obj/effect/spawner/airlock/Initialize() + ..() + forceMove(locate(x + 1, y + 1, z)) //Needs to move because our icon_state implies we are one turf to the northeast, when we're not + opposite_interior_direction = turn(interior_direction, 180) //Do it this way (instead of setting it directly) to avoid code mishaps + interior_direction_cw = turn(interior_direction, 90) + interior_direction_ccw = turn(interior_direction, 270) + if(interior_direction == NORTH || interior_direction == SOUTH) + north_or_south_interior = TRUE + if(exterior_direction == NORTH || exterior_direction == SOUTH) + north_or_south_exterior = TRUE + id_to_link = "[UID()]" //We want unique IDs, this will give us a unique ID + var/turf/turf_interior = get_airlock_location(interior_direction) + var/turf/turf_exterior = get_airlock_location(exterior_direction) + handle_door_creation(turf_interior, TRUE, one_door_interior) + handle_door_creation(turf_exterior, FALSE, one_door_exterior) + handle_pipes_creation(turf_interior) + handle_control_placement() + qdel(src) + +/obj/effect/spawner/airlock/proc/get_airlock_location(desired_direction) //Finds a turf to place an airlock and returns it, this turf will be in the middle of the relevant wall + var/turf/T + switch(desired_direction) + if(NORTH) + T = locate(x + HALF_X, y + tiles_in_y_direction, z) + if(SOUTH) + T = locate(x + HALF_X, y - 1, z) + if(EAST) + T = locate(x + tiles_in_x_direction, y + HALF_Y, z) + if(WEST) + T = locate(x - 1, y + HALF_Y, z) + return T + +/obj/effect/spawner/airlock/proc/handle_door_creation(turf/T, is_this_an_interior_airlock, one_door_only) //Creates a door (or two) and also creates a button + var/obj/machinery/door/airlock/A + if(one_door_only != DOOR_FLIPPED_PLACEMENT) + A = new door_type(T) + handle_door_stuff(A, is_this_an_interior_airlock) + var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction) + if(one_door_only == DOOR_NORMAL_PLACEMENT) //We only need one door, we are done + return + if(!(tiles_in_x_direction % 2) && (is_this_an_interior_airlock && north_or_south_interior || !is_this_an_interior_airlock && north_or_south_exterior)) //Handle extra airlock for aesthetics + A = new door_type(get_step(T, EAST)) + handle_door_stuff(A, is_this_an_interior_airlock) + if(one_door_only == DOOR_FLIPPED_PLACEMENT) + the_button.forceMove(get_step(the_button, EAST)) + else if(!(tiles_in_y_direction % 2) && (is_this_an_interior_airlock && !north_or_south_interior || !is_this_an_interior_airlock && !north_or_south_exterior)) //Handle extra airlock for aesthetics + A = new door_type(get_step(T, NORTH)) + handle_door_stuff(A, is_this_an_interior_airlock) + if(one_door_only == DOOR_FLIPPED_PLACEMENT) + the_button.forceMove(get_step(the_button, NORTH)) + +/obj/effect/spawner/airlock/proc/handle_door_stuff(obj/machinery/door/airlock/A, is_this_an_interior_airlock) //This sets up the door vars correctly and then locks it before first use + A.set_frequency(radio_frequency) + A.id_tag = is_this_an_interior_airlock ? INNER_DOOR_TAG : OUTER_DOOR_TAG + A.req_access = required_access + A.name = door_name + A.lock() + +/obj/effect/spawner/airlock/proc/spawn_button(turf/T, some_direction) + var/obj/machinery/access_button/the_button = new(T) + the_button.master_tag = id_to_link + the_button.set_frequency(radio_frequency) + switch(some_direction) + if(NORTH) + the_button.pixel_x -= 25 + the_button.pixel_y = 7 + if(EAST) + the_button.pixel_x = 7 + the_button.pixel_y = -25 + if(SOUTH) + the_button.pixel_x -= 25 + the_button.pixel_y -= 7 + if(WEST) + the_button.pixel_x -= 7 + the_button.pixel_y -= 25 + the_button.req_access = required_access + return the_button + +/obj/effect/spawner/airlock/proc/handle_control_placement() //Stick the sensor and controller on the same bit of wall, this will ONLY be unsuitable if airlocks are on both the south and west turfs + var/turf/T = get_turf(src) + var/obj/machinery/airlock_sensor/AS = new(T) + var/obj/machinery/embedded_controller/radio/airlock/airlock_controller/AC = new(T, id_to_link, radio_frequency, OUTER_DOOR_TAG, INNER_DOOR_TAG, AIRPUMP_TAG, SENSOR_TAG) + AC.req_access = required_access + AS.id_tag = SENSOR_TAG + AS.set_frequency(radio_frequency) + if(interior_direction != WEST && exterior_direction != WEST) //If west wall is free, place stuff there + AC.pixel_x -= 25 + AC.pixel_y += 9 + AS.pixel_x -= 25 + AS.pixel_y -= 9 + else if(interior_direction != SOUTH && exterior_direction != SOUTH) //If south wall is free, place stuff there + AC.pixel_x += 9 + AC.pixel_y -= 25 + AS.pixel_x -= 9 + AS.pixel_y -= 25 + else //Send them over to the other side of the chamber + T = locate(x + tiles_in_x_direction - 1, y + tiles_in_y_direction - 1, z) + AC.forceMove(T) + AS.forceMove(T) + AC.pixel_x += 25 + AC.pixel_y += 9 + AS.pixel_x += 25 + AS.pixel_y -= 9 + +/obj/effect/spawner/airlock/proc/handle_pipes_creation(turf/T) //This places all required piping down, then properly initializes it. T is the turf that the interior airlock occupies + var/turf/below_T = get_step(T, opposite_interior_direction) + + var/two_way_pipe = interior_direction | opposite_interior_direction + var/chamber_shape //This determines the layout of the chamber and therefore how many vents should be present + if(tiles_in_x_direction == 2 && tiles_in_y_direction == 2) + chamber_shape = CHAMBER_SQUARE + else if(tiles_in_x_direction > 1 && tiles_in_y_direction > 1) + chamber_shape = CHAMBER_BIGGER + else + chamber_shape = CHAMBER_LONG + pipe_creation_helper(/obj/machinery/atmospherics/pipe/simple/visible, T, interior_direction, two_way_pipe) + switch(chamber_shape) + if(CHAMBER_LONG) //Easy enough, place a single vent + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + below_T, + interior_direction) + if(CHAMBER_SQUARE) //We need a T-manifold and two vents for this + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible, + below_T, + north_or_south_interior ? WEST : SOUTH, + NORTH | EAST | (north_or_south_interior ? SOUTH : WEST)) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(below_T, opposite_interior_direction), + interior_direction) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + north_or_south_interior ? EAST_OF_TURF(below_T) : NORTH_OF_TURF(below_T), + turn(interior_direction, interior_direction == SOUTH || interior_direction == EAST ? -90 : 90)) + if(CHAMBER_BIGGER) //We need a central column of manifolds and a vent either side of each manifold + var/depth = north_or_south_interior ? tiles_in_y_direction : tiles_in_x_direction + var/turf/put_thing_here = below_T + for(var/i in 1 to depth) + if(i != depth)//We're placing more pipe later, so we need a 4-way manifold + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold4w/visible, put_thing_here, interior_direction, NORTH | EAST | SOUTH | WEST) + else //We stop here, so place a T-manifold down + pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible, + put_thing_here, + opposite_interior_direction, + interior_direction_cw | interior_direction | interior_direction_ccw) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(put_thing_here, interior_direction_cw), + interior_direction_ccw) + pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume, + get_step(put_thing_here, interior_direction_ccw), + interior_direction_cw) + put_thing_here = get_step(put_thing_here, opposite_interior_direction) //Now move the turf we're generating stuff from 1 forward + +/obj/effect/spawner/airlock/proc/pipe_creation_helper(path, location, direction, initialization_directions) //Create some kind of atmospherics machinery and initialize it properly + var/obj/machinery/atmospherics/A = new path(location) + A.dir = direction + A.on_construction(A.dir, initialization_directions ? initialization_directions : A.dir) + if(istype(A, /obj/machinery/atmospherics/unary/vent_pump/high_volume)) + var/obj/machinery/atmospherics/unary/vent_pump/high_volume/created_pump = A + created_pump.id_tag = AIRPUMP_TAG + created_pump.set_frequency(radio_frequency) + + +//Premade airlocks for mappers, probably won't need all of these but whatever +/obj/effect/spawner/airlock/s_to_n + name = "1 by 1 airlock spawner (interior south, exterior north)" + icon_state = "1x1_S_to_N" + interior_direction = SOUTH + exterior_direction = NORTH +/obj/effect/spawner/airlock/e_to_w + name = "1 by 1 airlock spawner (interior east, exterior west)" + icon_state = "1x1_E_to_W" + interior_direction = EAST + exterior_direction = WEST +/obj/effect/spawner/airlock/w_to_e + name = "1 by 1 airlock spawner (interior west, exterior east)" + icon_state = "1x1_W_to_E" + interior_direction = WEST + exterior_direction = EAST + +/obj/effect/spawner/airlock/long //Long and thin + name = "long airlock spawner (interior north, exterior south)" + icon_state = "1x2_N_to_S" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/s_to_n/long + name = "long airlock spawner (interior south, exterior north)" + icon_state = "1x2_S_to_N" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/e_to_w/long + name = "long airlock spawner (interior east, exterior west)" + icon_state = "1x2_E_to_W" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/w_to_e/long + name = "long airlock spawner (interior west, exterior east)" + icon_state = "1x2_W_to_E" + tiles_in_x_direction = 2 + +/obj/effect/spawner/airlock/long/square //Square + name = "square airlock spawner (interior north, exterior south)" + icon_state = "2x2_N_to_S" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/s_to_n/long/square + name = "square airlock spawner (interior south, exterior north)" + icon_state = "2x2_S_to_N" + tiles_in_x_direction = 2 +/obj/effect/spawner/airlock/e_to_w/long/square + name = "square airlock spawner (interior east, exterior west)" + icon_state = "2x2_E_to_W" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/w_to_e/long/square + name = "square airlock spawner (interior west, exterior east)" + icon_state = "2x2_W_to_E" + tiles_in_y_direction = 2 +/obj/effect/spawner/airlock/long/square/e_to_s + name = "square airlock spawner (interior east, exterior south)" + icon_state = "2x2_E_to_S" + interior_direction = EAST + exterior_direction = SOUTH + +/obj/effect/spawner/airlock/long/square/wide + name = "rectangular airlock spawner (interior north, exterior south)" + icon_state = "3x2_N_to_S" + tiles_in_x_direction = 3 +/obj/effect/spawner/airlock/s_to_n/long/square/wide + name = "rectangular airlock spawner (interior south, exterior north)" + icon_state = "3x2_S_to_N" + tiles_in_x_direction = 3 +/obj/effect/spawner/airlock/e_to_w/long/square/wide + name = "rectangular airlock spawner (interior east, exterior west)" + icon_state = "3x2_E_to_W" + tiles_in_y_direction = 3 +/obj/effect/spawner/airlock/w_to_e/long/square/wide + name = "rectangular airlock spawner (interior west, exterior east)" + icon_state = "3x2_W_to_E" + tiles_in_y_direction = 3 + +/obj/effect/spawner/airlock/long/square/three + name = "3 by 3 square airlock spawner (interior north, exterior south)" + icon_state = "3x3_N_to_S" + interior_direction = NORTH + exterior_direction = SOUTH + tiles_in_x_direction = 3 + tiles_in_y_direction = 3 + +/obj/effect/spawner/airlock/e_to_w/arrivals + required_access = null + +/obj/effect/spawner/airlock/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/e_to_w/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/s_to_n/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/long/engineer + required_access = list(access_engine) + door_name = "engineering external access" +/obj/effect/spawner/airlock/long/square/engine + required_access = list(access_engine) + door_name = "engine external access" + icon_state = "2x2_N_to_S_leftdoors" + door_type = /obj/machinery/door/airlock/external + one_door_interior = DOOR_NORMAL_PLACEMENT + one_door_exterior = DOOR_NORMAL_PLACEMENT +/obj/effect/spawner/airlock/long/square/engine/reversed + icon_state = "2x2_N_to_S_rightdoors" + one_door_interior = DOOR_FLIPPED_PLACEMENT + one_door_exterior = DOOR_FLIPPED_PLACEMENT + +/obj/effect/spawner/airlock/w_to_e/long/square/wide/mining + door_name = "mining external access" + required_access = list(access_mining) +/obj/effect/spawner/airlock/long/square/wide/mining + door_name = "mining external access" + required_access = list(access_mining) + +/obj/effect/spawner/airlock/e_to_w/minisat + door_name = "minisat external access" + required_access = list(access_minisat) +/obj/effect/spawner/airlock/long/square/e_to_s/telecoms + door_name = "telecoms external access" + required_access = list(access_tcomsat, access_external_airlocks) + door_type = /obj/machinery/door/airlock/external + +/obj/effect/spawner/airlock/long/square/three/syndicate + name = "3 by 3 square airlock spawner (interior west, exterior north)" + icon_state = "3x3_W_to_N" + interior_direction = WEST + exterior_direction = NORTH + door_name = "ship external access" + req_access = list(access_syndicate) + door_type = /obj/machinery/door/airlock/external + +#undef HALF_X +#undef HALF_Y +#undef CHAMBER_LONG +#undef CHAMBER_SQUARE +#undef CHAMBER_BIGGER +#undef DOOR_NORMAL_PLACEMENT +#undef DOOR_FLIPPED_PLACEMENT +#undef AIRPUMP_TAG +#undef SENSOR_TAG +#undef OUTER_DOOR_TAG +#undef INNER_DOOR_TAG diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8fd1c061c32..7f1683ba415 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -140,6 +140,20 @@ ..() animate(src, alpha = 0, time = duration) +/obj/effect/temp_visual/fire + icon = 'icons/goonstation/effects/fire.dmi' + icon_state = "3" + light_range = LIGHT_RANGE_FIRE + light_color = LIGHT_COLOR_FIRE + duration = 10 + layer = MASSIVE_OBJ_LAYER + alpha = 250 + blend_mode = BLEND_ADD + +/obj/effect/temp_visual/fire/New(loc) + color = heat2color(FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + ..() + /obj/effect/temp_visual/revenant name = "spooky lights" icon_state = "purplesparkles" @@ -289,4 +303,33 @@ /obj/effect/temp_visual/dir_setting/firing_effect/magic icon_state = "shieldsparkles" - duration = 3 \ No newline at end of file + duration = 3 + +/obj/effect/temp_visual/impact_effect + icon_state = "impact_bullet" + duration = 5 + +/obj/effect/temp_visual/impact_effect/Initialize(mapload, x, y) + pixel_x = x + pixel_y = y + return ..() + +/obj/effect/temp_visual/impact_effect/red_laser + icon_state = "impact_laser" + duration = 4 + +/obj/effect/temp_visual/impact_effect/blue_laser + icon_state = "impact_laser_blue" + duration = 4 + +/obj/effect/temp_visual/impact_effect/green_laser + icon_state = "impact_laser_green" + duration = 4 + +/obj/effect/temp_visual/impact_effect/purple_laser + icon_state = "impact_laser_purple" + duration = 4 + +/obj/effect/temp_visual/impact_effect/ion + icon_state = "shieldsparkles" + duration = 6 \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9dbb02553ca..34ec25c902d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -331,7 +331,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d else return ..() -/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, atom/movable/AM) SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args) if(prob(final_block_chance)) owner.visible_message("[owner] blocks [attack_text] with [src]!") @@ -347,6 +347,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d A.Remove(user) if(flags & DROPDEL) qdel(src) + if((flags & NODROP) && !(initial(flags) & NODROP)) //Remove NODROP is dropped + flags &= ~NODROP in_inventory = FALSE SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user) diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 7ce7b07193d..77aef9bb71d 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -4,6 +4,7 @@ /obj/item/storage/pill_bottle/happy name = "Happy pills" desc = "Highly illegal drug. When you want to see the rainbow." + wrapper_color = COLOR_PINK /obj/item/storage/pill_bottle/happy/New() ..() @@ -18,6 +19,7 @@ /obj/item/storage/pill_bottle/zoom name = "Zoom pills" desc = "Highly illegal drug. Trade brain for speed." + wrapper_color = COLOR_BLUE /obj/item/storage/pill_bottle/zoom/New() ..() @@ -49,15 +51,12 @@ adulterants-- reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3) - - /obj/item/storage/pill_bottle/random_drug_bottle name = "pill bottle (???)" desc = "Huh." + allow_wrap = FALSE /obj/item/storage/pill_bottle/random_drug_bottle/New() ..() for(var/i in 1 to 5) new /obj/item/reagent_containers/food/pill/random_drugs(src) - - diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm new file mode 100644 index 00000000000..e28b5b3bef5 --- /dev/null +++ b/code/game/objects/items/devices/enginepicker.dm @@ -0,0 +1,96 @@ +/* +////////// + Item meant to spawn one of the three (Tesla / Singularity / Supermatter) engines on-station at round-start. + Should be found in the CE's office. Not access-restricted. +////////// +*/ + +/obj/item/enginepicker + name = "Bluespace Engine Delivery Device" + desc = "A per-station bluespace-based delivery system for a unique engine Engineering Department's choice. Only one option can be chosen. Device self-destructs on use." + icon = 'icons/obj/device.dmi' + icon_state = "enginepicker" + + var/list/list_enginebeacons = list() + var/isactive = FALSE + +/obj/item/enginepicker/attack_self(mob/living/carbon/user) + if(usr.stat || !usr.canmove || usr.restrained()) + return + + if(!isactive) + isactive = TRUE //Self-attack spam exploit prevention + else + return + + locatebeacons() + var/default = null + var/E = input("Select the station's Engine:", "[src]", default) as null|anything in list_enginebeacons + if(E) + processchoice(E, user) + else + isactive = FALSE + return + +//This proc re-assigns all of engine beacons in the global list to a local list. +/obj/item/enginepicker/proc/locatebeacons() + LAZYCLEARLIST(list_enginebeacons) + for(var/obj/item/radio/beacon/engine/B in GLOB.engine_beacon_list) + if(B && !QDELETED(B)) //This ensures that the input pop-up won't have any qdeleted beacons + list_enginebeacons += B + +//Spawns and logs / announces the appropriate engine based on the choice made +/obj/item/enginepicker/proc/processchoice(var/obj/item/radio/beacon/engine/choice, mob/living/carbon/user) + var/issuccessful = FALSE //Check for a successful choice + var/engtype //Engine type + var/G //Generator that will be spawned + var/turf/T = get_turf(choice) + + if(choice.enginetype.len > 1) //If the beacon has multiple engine types + var/default = null + var/E = input("You have selected a combined beacon, which option would you prefer?", "[src]", default) as null|anything in choice.enginetype + if(E) + engtype = E + issuccessful = TRUE + else + isactive = FALSE + return + + if(!engtype) //If it has only one type + engtype = DEFAULTPICK(choice.enginetype, null) //This should(?) account for a possibly scrambled list with a single entry + switch(engtype) + if(ENGTYPE_TESLA) + G = /obj/machinery/the_singularitygen/tesla + if(ENGTYPE_SING) + G = /obj/machinery/the_singularitygen + + if(G) //This can only be not-null if the switch operation was successful + issuccessful = TRUE + + if(issuccessful) + clearturf(T) //qdels all items / gibs all mobs on the turf. Let's not have an SM shard spawn on top of a poor sod. + new G(T) //Spawns the switch-selected engine on the chosen beacon's turf + + var/ailist[] = list() + for(var/mob/living/silicon/ai/A in GLOB.living_mob_list) + ailist += A + if(ailist.len) + var/mob/living/silicon/ai/announcer = pick(ailist) + announcer.say(";Engine delivery detected. Type: [engtype].") //Let's announce the terrible choice to everyone + + visible_message("\The [src] begins to violently vibrate and hiss, then promptly disintegrates!") + qdel(src) //Self-destructs to prevent crew from spawning multiple engines. + else + visible_message("\The [src] buzzes! No beacon found or selected!") + isactive = FALSE + return + +//Deletes objects and mobs from the beacon's turf. +/obj/item/enginepicker/proc/clearturf(var/turf/T) + for(var/obj/item/I in T) + I.visible_message("\The [I] gets crushed to dust!") + qdel(I) + + for(var/mob/living/M in T) + M.visible_message("\The [M] gets obliterated!") + M.gib() \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index d45bcfa2ff4..ea7d95d0a9c 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -85,3 +85,23 @@ playsound(src, 'sound/effects/pop.ogg', 100, 1, 1) qdel(src) return + +/obj/item/radio/beacon/engine + desc = "A label on it reads: Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!." + anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations + var/list/enginetype = list() + +/obj/item/radio/beacon/engine/Initialize() + LAZYADD(GLOB.engine_beacon_list, src) + +/obj/item/radio/beacon/engine/tesling + name = "Engine Beacon for Tesla and Singularity" + enginetype = list(ENGTYPE_TESLA, ENGTYPE_SING) + +/obj/item/radio/beacon/engine/tesla + name = "Engine Beacon for Tesla" + enginetype = list(ENGTYPE_TESLA) + +/obj/item/radio/beacon/engine/sing + name = "Engine Beacon for Singularity" + enginetype = list(ENGTYPE_SING) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 610c257b03f..27d27b11a9b 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -4,6 +4,10 @@ var/radio_desc = "" icon_state = "headset" item_state = "headset" + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/ears.dmi', + "Vox Armalis" = 'icons/mob/species/armalis/ears.dmi' + ) //We read you loud and skree-er. materials = list(MAT_METAL=75) subspace_transmission = TRUE canhear_range = 0 // can't hear headsets from very far away diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index cad4ae25ac8..d838fe7ec0d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -135,8 +135,13 @@ REAGENT SCANNER user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("Body Temperature: ???", 1) return - user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") + user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") + healthscan(user, M, mode, upgraded) + add_fingerprint(user) + + +proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE) if(!ishuman(M) || M.isSynthetic()) //these sensors are designed for organic life user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR") @@ -271,8 +276,9 @@ REAGENT SCANNER user.show_message("Subject's genes are showing minor signs of instability.") else user.show_message("Subject's genes are stable.") - add_fingerprint(user) +/obj/item/healthanalyzer/attack_self(mob/user) + toggle_mode() /obj/item/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index 587b1d27d14..e51bac10005 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -123,6 +123,7 @@ /obj/item/storage/pill_bottle/random_meds name = "unlabelled pillbottle" desc = "The sheer recklessness of this bottle's existence astounds you." + allow_wrap = FALSE var/labelled = FALSE /obj/item/storage/pill_bottle/random_meds/New() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 9ec921fef92..f7df69cad2f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -178,8 +178,12 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), + new /datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wooden, 3, time = 10), + new /datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 10), + new /datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15), - new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50) + new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50), + new /datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100) ) /obj/item/stack/sheet/wood diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 084dac30a60..736ba1cc767 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/dice.dmi' icon_state = "dicebag" can_hold = list(/obj/item/dice) + allow_wrap = FALSE /obj/item/storage/pill_bottle/dice/New() ..() diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 4f94a6b8a1b..21161c2642a 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -115,7 +115,8 @@ throw_range = 6 materials = list(MAT_METAL=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - sharp = 1 + sharp = TRUE + var/bayonet = FALSE //Can this be attached to a gun? /obj/item/kitchen/knife/suicide_act(mob/user) user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ @@ -164,6 +165,7 @@ throwforce = 20 origin_tech = "materials=3;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") + bayonet = TRUE /obj/item/kitchen/knife/combat/survival name = "survival knife" diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index ab946de5f0f..56d237c4eda 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -224,3 +224,13 @@ var/mask_item = M.get_item_by_slot(slot_wear_mask) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item + + +/obj/item/match/firebrand + name = "firebrand" + desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." + smoketime = 20 //40 seconds + +/obj/item/match/firebrand/New() + ..() + matchignite() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 713259e081c..ddae7d87f85 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -18,8 +18,10 @@ burn_state = FLAMMABLE burntime = 20 sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/back.dmi' - ) + "Vox" = 'icons/mob/species/vox/back.dmi', + "Vox Armalis" = 'icons/mob/species/armalis/back.dmi', + "Grey" = 'icons/mob/species/grey/back.dmi' + ) //For Armalis anything but this and the nitrogen tank will use the default backpack icon. /obj/item/storage/backpack/attackby(obj/item/W as obj, mob/user as mob, params) playsound(src.loc, "rustle", 50, 1, -5) @@ -398,7 +400,7 @@ new /obj/item/gun/projectile/automatic/shotgun/bulldog(src) new /obj/item/ammo_box/magazine/m12g(src) new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/clothing/glasses/thermal/syndi(src) + new /obj/item/clothing/glasses/chameleon/thermal(src) /obj/item/storage/backpack/duffel/syndie/med/medicalbundle desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index e7342774619..3fe5c140407 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -113,7 +113,7 @@ New() ..() contents = list() - new /obj/item/clothing/mask/breath(src) + new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/tank/emergency_oxygen/engi(src) new /obj/item/crowbar/red(src) new /obj/item/reagent_containers/hypospray/autoinjector(src) @@ -372,6 +372,20 @@ new /obj/item/implantpad(src) new /obj/item/locator(src) +/obj/item/storage/box/minertracker + name = "boxed tracking implant kit" + desc = "For finding those who have died on the accursed lavaworld." + icon_state = "implant" + +/obj/item/storage/box/minertracker/New() + ..() + new /obj/item/implantcase/tracking(src) + new /obj/item/implantcase/tracking(src) + new /obj/item/implantcase/tracking(src) + new /obj/item/implanter(src) + new /obj/item/implantpad(src) + new /obj/item/locator(src) + /obj/item/storage/box/chemimp name = "chemical implant kit" desc = "Box of stuff used to implant chemicals." diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index fab82df4b4e..8d8cb77e597 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -254,10 +254,21 @@ var/applying_meds = FALSE //To Prevent spam clicking and generating runtimes from apply a deleting pill multiple times. var/rapid_intake_message = "unscrews the cap on the pill bottle and begins dumping the entire contents down their throat!" var/rapid_post_instake_message = "downs the entire bottle of pills in one go!" + var/allow_wrap = TRUE + var/wrapper_color = null /obj/item/storage/pill_bottle/New() ..() base_name = name + if(allow_wrap) + apply_wrap() + +/obj/item/storage/pill_bottle/proc/apply_wrap() + if(wrapper_color) + overlays.Cut() + var/image/I = image(icon, "pillbottle_wrap") + I.color = wrapper_color + overlays += I /obj/item/storage/pill_bottle/attack(mob/M, mob/user) if(iscarbon(M) && contents.len) @@ -274,6 +285,9 @@ else return ..() +/obj/item/storage/pill_bottle/ert + wrapper_color = COLOR_MAROON + /obj/item/storage/pill_bottle/ert/New() ..() new /obj/item/reagent_containers/food/pill/salicylic(src) @@ -319,15 +333,18 @@ /obj/item/storage/pill_bottle/patch_pack name = "Patch Pack" + desc = "It's a container for storing medical patches." icon_state = "patch_pack" can_hold = list(/obj/item/reagent_containers/food/pill/patch) cant_hold = list() rapid_intake_message = "flips the lid of the Patch Pack open and begins rapidly stamping patches on themselves!" rapid_post_instake_message = "stamps the entire contents of the Patch Pack all over their entire body!" + allow_wrap = FALSE /obj/item/storage/pill_bottle/charcoal name = "Pill bottle (Charcoal)" desc = "Contains pills used to counter toxins." + wrapper_color = COLOR_GREEN New() ..() @@ -342,6 +359,7 @@ /obj/item/storage/pill_bottle/painkillers name = "Pill Bottle (Salicylic Acid)" desc = "Contains various pills for minor pain relief." + wrapper_color = COLOR_RED /obj/item/storage/pill_bottle/painkillers/New() ..() @@ -354,8 +372,11 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) new /obj/item/reagent_containers/food/pill/salicylic(src) +/obj/item/storage/pill_bottle/fakedeath + allow_wrap = FALSE + /obj/item/storage/pill_bottle/fakedeath/New() ..() new /obj/item/reagent_containers/food/pill/fakedeath(src) new /obj/item/reagent_containers/food/pill/fakedeath(src) - new /obj/item/reagent_containers/food/pill/fakedeath(src) \ No newline at end of file + new /obj/item/reagent_containers/food/pill/fakedeath(src) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 9cd4178aaf2..edccca3ff4a 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -116,15 +116,10 @@ /obj/item/storage/lockbox/medal/New() ..() - new /obj/item/clothing/accessory/medal/gold/heroism(src) - new /obj/item/clothing/accessory/medal/silver/security(src) - new /obj/item/clothing/accessory/medal/silver/valor(src) - new /obj/item/clothing/accessory/medal/nobel_science(src) - new /obj/item/clothing/accessory/medal/bronze_heart(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) - new /obj/item/clothing/accessory/medal/conduct(src) new /obj/item/clothing/accessory/medal/gold/captain(src) + new /obj/item/clothing/accessory/medal/silver/leadership(src) + new /obj/item/clothing/accessory/medal/silver/valor(src) + new /obj/item/clothing/accessory/medal/heart(src) /obj/item/storage/lockbox/t4 name = "lockbox (T4)" diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 5d31cc3f59b..3736d93f3f6 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -20,7 +20,7 @@ if("thief") // 40TC new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) // 12TC new /obj/item/chameleon(src) // 8TC - new /obj/item/clothing/glasses/thermal/syndi(src) // 6TC + new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC new /obj/item/clothing/gloves/color/black/thief(src) // 6TC new /obj/item/card/id/syndicate(src) // 2TC new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC @@ -108,7 +108,7 @@ new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate/penetrator(src) // 16TC new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5TC new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) // 3TC - new /obj/item/clothing/glasses/thermal/syndi/sunglasses(src) // 6TC + new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC new /obj/item/clothing/gloves/combat(src) // 0 TC new /obj/item/clothing/under/suit_jacket/really_black(src) // 0 TC new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) // 0TC diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index f7b8d59528e..ea178aa3345 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -205,7 +205,7 @@ obj/item/tank/emergency_oxygen/double/empty/New() desc = "A tank of nitrogen." icon_state = "oxygen_fr" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - + sprite_sheets = list("Vox Armalis" = 'icons/mob/species/armalis/back.dmi') //Do it for Big Bird. /obj/item/tank/nitrogen/New() ..() @@ -222,6 +222,7 @@ obj/item/tank/emergency_oxygen/double/empty/New() desc = "A high-tech nitrogen tank designed specifically for Vox." icon_state = "emergency_vox" volume = 25 + sprite_sheets = list("Vox Armalis" = 'icons/mob/species/armalis/belt.dmi') //Do it for Big Bird. /obj/item/tank/emergency_oxygen/vox/New() ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index b759139dba6..f42decd4363 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -157,6 +157,8 @@ icon = 'icons/obj/items.dmi' icon_state = "baseball_bat" item_state = "baseball_bat" + var/deflectmode = FALSE // deflect small/medium thrown objects + var/lastdeflect force = 10 throwforce = 12 attack_verb = list("beat", "smacked") @@ -169,14 +171,54 @@ desc = "This thing looks dangerous... Dangerously good at baseball, that is." homerun_able = 1 +/obj/item/melee/baseball_bat/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type, atom/movable/AM) + . = ..() + if(!istype(AM, /obj/item) || attack_type != THROWN_PROJECTILE_ATTACK) + return FALSE + var/obj/item/I = AM + if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting + if(deflectmode) + if(prob(10)) + visible_message("[owner] Deflects [I] directly back at the thrower! It's a home run!", "You deflect the [I] directly back at the thrower! It's a home run!") + playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1) + do_attack_animation(I, ATTACK_EFFECT_DISARM) + I.throw_at(I.thrownby, 20, 20, owner) + deflectmode = FALSE + if(!istype(I, /obj/item/beach_ball)) + lastdeflect = world.time + 3000 + return TRUE + else if(prob(30)) + visible_message("[owner] swings! And [p_they()] miss[p_es()]! How embarassing.", "You swing! You miss! Oh no!") + playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM) + deflectmode = FALSE + if(!istype(I, /obj/item/beach_ball)) + lastdeflect = world.time + 3000 + return FALSE + else + visible_message("[owner] swings and deflects [I]!", "You swing and deflect the [I]!") + playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1) + do_attack_animation(I, ATTACK_EFFECT_DISARM) + I.throw_at(get_edge_target_turf(owner, pick(cardinal)), rand(8,10), 14, owner) + deflectmode = FALSE + if(!istype(I, /obj/item/beach_ball)) + lastdeflect = world.time + 3000 + return TRUE + /obj/item/melee/baseball_bat/attack_self(mob/user) if(!homerun_able) - ..() - return + if(!deflectmode && world.time >= lastdeflect) + to_chat(user, "You prepare to deflect objects thrown at you. You cannot attack during this time.") + deflectmode = TRUE + else if(deflectmode && world.time >= lastdeflect) + to_chat(user, "You no longer deflect objects thrown at you. You can attack during this time") + deflectmode = FALSE + else + to_chat(user, "You need to wait until you can deflect again. The ability will be ready in [time2text(lastdeflect - world.time, "m:ss")]") + return ..() if(homerun_ready) to_chat(user, "You're already ready to do a home run!") - ..() - return + return ..() to_chat(user, "You begin gathering strength...") playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1) if(do_after(user, 90, target = user)) @@ -185,6 +227,9 @@ ..() /obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user) + if(deflectmode) + to_chat(user, "You cannot attack in deflect mode!") + return . = ..() var/atom/throw_target = get_edge_target_turf(target, user.dir) if(homerun_ready) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index afb3ae15df4..0cd6e541398 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -38,6 +38,7 @@ new /obj/item/rpd(src) new /obj/item/reagent_containers/food/drinks/mug/ce(src) new /obj/item/organ/internal/cyberimp/eyes/meson(src) + new /obj/item/clothing/accessory/medal/engineering(src) /obj/structure/closet/secure_closet/engineering_electrical diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 5e300b0e7a0..189cbc5893d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -110,6 +110,7 @@ /obj/item/storage/pill_bottle/psychiatrist name = "psychiatrist's pill bottle" desc = "Contains various pills to calm or sedate patients." + wrapper_color = COLOR_PALE_BTL_GREEN /obj/item/storage/pill_bottle/psychiatrist/New() ..() @@ -193,6 +194,7 @@ new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src) new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/reagent_containers/food/drinks/mug/cmo(src) + new /obj/item/clothing/accessory/medal/medical(src) /obj/structure/closet/secure_closet/animal diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 6be824a4246..4d688f65dac 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -77,7 +77,7 @@ new /obj/item/door_remote/research_director(src) new /obj/item/reagent_containers/food/drinks/mug/rd(src) new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src) - + new /obj/item/clothing/accessory/medal/science(src) /obj/structure/closet/secure_closet/research_reagents name = "research chemical storage closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 746c9cb52ef..fe6b0082207 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -60,7 +60,7 @@ new /obj/item/clothing/accessory/petcollar(src) new /obj/item/door_remote/civillian(src) new /obj/item/reagent_containers/food/drinks/mug/hop(src) - + new /obj/item/clothing/accessory/medal/service(src) /obj/structure/closet/secure_closet/hop2 name = "head of personnel's attire" @@ -128,7 +128,7 @@ new /obj/item/door_remote/head_of_security(src) new /obj/item/reagent_containers/food/drinks/mug/hos(src) new /obj/item/organ/internal/cyberimp/eyes/hud/security(src) - + new /obj/item/clothing/accessory/medal/security(src) /obj/structure/closet/secure_closet/warden name = "warden's locker" @@ -464,4 +464,5 @@ new /obj/item/clothing/head/powdered_wig(src) new /obj/item/gavelblock(src) new /obj/item/gavelhammer(src) - new /obj/item/clothing/head/justice_wig(src) \ No newline at end of file + new /obj/item/clothing/head/justice_wig(src) + new /obj/item/clothing/accessory/medal/legal(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index d44ec20c515..4a2dadffcc7 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -5,9 +5,9 @@ icon_state = "crate" icon_opened = "crateopen" icon_closed = "crate" - climbable = 1 + climbable = TRUE // mouse_drag_pointer = MOUSE_ACTIVE_POINTER //??? - var/rigged = 0 + var/rigged = FALSE var/obj/item/paper/manifest/manifest // A list of beacon names that the crate will announce the arrival of, when delivered. var/list/announce_beacons = list() @@ -23,16 +23,16 @@ overlays += "manifest" /obj/structure/closet/crate/can_open() - return 1 + return TRUE /obj/structure/closet/crate/can_close() - return 1 + return TRUE /obj/structure/closet/crate/open() if(src.opened) - return 0 + return FALSE if(!src.can_open()) - return 0 + return FALSE if(rigged && locate(/obj/item/radio/electropack) in src) if(isliving(usr)) @@ -47,18 +47,18 @@ for(var/mob/M in src) //Mobs M.forceMove(loc) icon_state = icon_opened - src.opened = 1 + src.opened = TRUE if(climbable) structure_shaken() - return 1 + return TRUE /obj/structure/closet/crate/close() if(!src.opened) - return 0 + return FALSE if(!src.can_close()) - return 0 + return FALSE playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3) var/itemcount = 0 @@ -75,8 +75,8 @@ itemcount++ icon_state = icon_closed - src.opened = 0 - return 1 + src.opened = FALSE + return TRUE /obj/structure/closet/crate/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/rcs) && !src.opened) @@ -105,7 +105,7 @@ return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [src.name]...") - E.teleporting = 1 + E.teleporting = TRUE if(!do_after(user, 50 * E.toolspeed, target = src)) E.teleporting = 0 return @@ -127,9 +127,9 @@ return playsound(E.loc, E.usesound, 50, 1) to_chat(user, "Teleporting [src.name]...") - E.teleporting = 1 + E.teleporting = TRUE if(!do_after(user, 50 * E.toolspeed, target = src)) - E.teleporting = 0 + E.teleporting = FALSE return E.teleporting = 0 if(!(E.rcell && E.rcell.use(E.chargecost))) @@ -154,14 +154,16 @@ else if(istype(W, /obj/item/stack/packageWrap)) return else if(istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W if(rigged) to_chat(user, "[src] is already rigged!") return - to_chat(user, "You rig [src].") - user.drop_item() - qdel(W) - rigged = 1 - return + if(C.use(15)) + to_chat(user, "You rig [src].") + rigged = TRUE + else + to_chat(user, "You need atleast 15 wires to rig [src]!") + return else if(istype(W, /obj/item/radio/electropack)) if(rigged) to_chat(user, "You attach [W] to [src].") @@ -172,7 +174,7 @@ if(rigged) to_chat(user, "You cut away the wiring.") playsound(loc, W.usesound, 100, 1) - rigged = 0 + rigged = FALSE return else return attack_hand(user) @@ -653,4 +655,4 @@ new /obj/item/storage/bag/ore(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/card/id/golem(src) - new /obj/item/flashlight/lantern(src) \ No newline at end of file + new /obj/item/flashlight/lantern(src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index eca9d524730..b21754cae96 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -226,6 +226,7 @@ door = new airlock_type(loc) door.setDir(dir) door.electronics = electronics + door.unres_sides = electronics.unres_sides door.heat_proof = heat_proof_finished if(electronics.one_access) door.req_access = null diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 4a70729d7e9..9f3829a8277 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -97,12 +97,9 @@ else icon_state = "fwall_open" -/obj/structure/falsewall/proc/ChangeToWall(delete = 1) +/obj/structure/falsewall/proc/ChangeToWall(delete = TRUE) var/turf/T = get_turf(src) - if(!walltype || walltype == "metal") - T.ChangeTurf(/turf/simulated/wall) - else - T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[walltype]")) + T.ChangeTurf(walltype) if(delete) qdel(src) return T diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 005f0e721fb..15e578ed88f 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -64,6 +64,12 @@ if(usr.incapacitated()) to_chat(usr, "You can't do that right now!") return + if(!usr.has_right_hand() && !usr.has_left_hand()) + to_chat(usr, "You try to grab the chair, but you are missing both of your hands!") + return + if(usr.get_active_hand() && usr.get_inactive_hand()) + to_chat(usr, "You try to grab the chair, but your hands are already full!") + return if(!ishuman(usr)) return usr.visible_message("[usr] grabs \the [src.name].", "You grab \the [src.name].") diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index ac013ebcf93..93b2e30b6d9 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -91,6 +91,12 @@ if(climber) climber.Weaken(2) climber.visible_message("[climber.name] has been knocked off the table", "You've been knocked off the table", "You see [climber.name] get knocked off the table") + else if(user.pulling.pass_flags & PASSTABLE) + user.Move_Pulled(src) + if (user.pulling.loc == loc) + user.visible_message("[user] places [user.pulling] onto [src].", + "You place [user.pulling] onto [src].") + user.stop_pulling() /obj/structure/table/attack_tk() // no telehulk sorry return diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index 5f2ad4b629c..04ac165fc56 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -5,6 +5,7 @@ baseturf = /turf/simulated/floor/plating/asteroid icon_state = "asteroid" icon_plating = "asteroid" + footstep_sounds = list() var/environment_type = "asteroid" var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal var/dug = 0 //0 = has not yet been dug, 1 = has already been dug diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm index 6a213400d04..17807bd255b 100644 --- a/code/game/turfs/simulated/floor/chasm.dm +++ b/code/game/turfs/simulated/floor/chasm.dm @@ -22,6 +22,11 @@ if(!drop_stuff()) STOP_PROCESSING(SSprocessing, src) +/turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE + /turf/simulated/floor/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) ..() if(istype(C, /obj/item/stack/rods)) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 97065cd9711..12b1654994c 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -117,6 +117,9 @@ burnt = 1 update_icon() +/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE + /turf/simulated/floor/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' floor_tile = /obj/item/stack/tile/carpet/black @@ -127,6 +130,7 @@ icon_state = "0" floor_tile = /obj/item/stack/tile/fakespace broken_states = list("damaged") + plane = PLANE_SPACE /turf/simulated/floor/fakespace/New() ..() @@ -137,3 +141,9 @@ icon_state = "arcade" floor_tile = /obj/item/stack/tile/arcade_carpet smooth = SMOOTH_FALSE + +/turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE + return TRUE diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm index 6c1679776e6..3705e24eea0 100644 --- a/code/game/turfs/simulated/floor/indestructible.dm +++ b/code/game/turfs/simulated/floor/indestructible.dm @@ -81,5 +81,8 @@ planetary_atmos = TRUE desc = "A floor with a square pattern. It's faintly cool to the touch." +/turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE + /turf/simulated/floor/indestructible/hierophant/two icon_state = "hierophant2" diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm index 0882bb18766..66d7eaca83d 100644 --- a/code/game/turfs/simulated/floor/lava.dm +++ b/code/game/turfs/simulated/floor/lava.dm @@ -41,6 +41,11 @@ /turf/simulated/floor/plating/lava/remove_plating() return +/turf/open/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE + /turf/simulated/floor/plating/lava/proc/is_safe() var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 2ef4602d268..11ff392b824 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -7,6 +7,8 @@ broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") burnt_states = list("floorscorched1", "floorscorched2") + var/unfastened = FALSE + footstep_sounds = list( "human" = list('sound/effects/footstep/plating_human.ogg'), "xeno" = list('sound/effects/footstep/plating_xeno.ogg') @@ -31,6 +33,12 @@ if(!broken && !burnt) icon_state = icon_plating //Because asteroids are 'platings' too. +/turf/simulated/floor/plating/examine(mob/user) + . = ..() + + if(unfastened) + to_chat(user, "It has been unfastened.") + /turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params) if(..()) return TRUE @@ -64,6 +72,15 @@ to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") return TRUE + else if(isscrewdriver(C)) + var/obj/item/screwdriver/screwdriver = C + to_chat(user, "You start [unfastened ? "fastening" : "unfastening"] [src].") + playsound(src, screwdriver.usesound, 50, 1) + if(do_after(user, 20 * screwdriver.toolspeed, target = src) && screwdriver) + to_chat(user, "You [unfastened ? "fasten" : "unfasten"] [src].") + unfastened = !unfastened + return TRUE + else if(iswelder(C)) var/obj/item/weldingtool/welder = C if(welder.isOn()) @@ -79,7 +96,7 @@ burnt = FALSE broken = FALSE update_icon() - else + if(unfastened) to_chat(user, "You start removing [src].") playsound(src, welder.usesound, 100, 1) if(do_after(user, 50 * welder.toolspeed, target = src) && welder && welder.isOn()) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 119f0b000d9..aee23831050 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -48,6 +48,13 @@ setDir(angle2dir(rotation + dir2angle(dir))) queue_smooth(src) +/turf/simulated/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + if(turf_type) + underlay_appearance.icon = initial(turf_type.icon) + underlay_appearance.icon_state = initial(turf_type.icon_state) + return TRUE + return ..() + /turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params) if(!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 5a8f842307e..26b79c9e9f4 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -1,3 +1,7 @@ +#define WALL_DENT_HIT 1 +#define WALL_DENT_SHOT 2 +#define MAX_DENT_DECALS 15 + /turf/simulated/wall name = "wall" desc = "A huge chunk of metal used to seperate rooms." @@ -25,7 +29,7 @@ var/slicing_duration = 100 var/engraving //engraving on the wall var/engraving_quality - + var/list/dent_decals var/sheet_type = /obj/item/stack/sheet/metal var/sheet_amount = 2 var/girder_type = /obj/structure/girder @@ -167,6 +171,8 @@ /turf/simulated/wall/blob_act() if(prob(50)) dismantle_wall() + else + add_dent(WALL_DENT_HIT) /turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd) if(our_rpd.mode == RPD_ATMOS_MODE) @@ -191,6 +197,8 @@ M.occupant_message("You smash through the wall.") visible_message("[src.name] smashes through the wall!") playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) + else + add_dent(WALL_DENT_HIT) // Wall-rot effect, a nasty fungus that destroys walls. /turf/simulated/wall/proc/rot() @@ -260,6 +268,7 @@ dismantle_wall(TRUE) else playsound(src, 'sound/effects/bang.ogg', 50, 1) + add_dent(WALL_DENT_HIT) to_chat(user, text("You punch the wall.")) return TRUE @@ -296,7 +305,6 @@ if(try_wallmount(I, user, params)) return - // The magnetic gripper does a separate attackby, so bail from this one if(istype(I, /obj/item/gripper)) return @@ -327,7 +335,7 @@ return TRUE // this means "don't continue trying to find alternative uses in attackby", not "decon succeeded" var/response = "Dismantle" - if(damage) + if(damage || LAZYLEN(dent_decals)) response = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle") switch(response) @@ -336,6 +344,8 @@ playsound(src, WT.usesound, 100, 1) if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn()) to_chat(user, "You finish repairing the damage to [src].") + cut_overlay(dent_decals) + dent_decals.Cut() take_damage(-damage) else to_chat(user, "You begin slicing through the outer plating.") @@ -435,3 +445,27 @@ /turf/simulated/wall/narsie_act() if(prob(20)) ChangeTurf(/turf/simulated/wall/cult) + +/turf/simulated/wall/proc/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8)) + if(LAZYLEN(dent_decals) >= MAX_DENT_DECALS) + return + + var/mutable_appearance/decal = mutable_appearance('icons/effects/effects.dmi', "", BULLET_HOLE_LAYER) + switch(denttype) + if(WALL_DENT_SHOT) + decal.icon_state = "bullet_hole" + if(WALL_DENT_HIT) + decal.icon_state = "impact[rand(1, 3)]" + + decal.pixel_x = x + decal.pixel_y = y + + if(LAZYLEN(dent_decals)) + cut_overlay(dent_decals) + dent_decals += decal + else + dent_decals = list(decal) + + add_overlay(dent_decals) + +#undef MAX_DENT_DECALS \ No newline at end of file diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 0d6428b10a2..40c0d83272e 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -16,6 +16,7 @@ var/destination_z var/destination_x var/destination_y + plane = PLANE_SPACE /turf/space/Initialize(mapload) if(!istype(src, /turf/space/transit)) @@ -262,4 +263,10 @@ /turf/space/attack_ghost(mob/dead/observer/user) if(destination_z) var/turf/T = locate(destination_x, destination_y, destination_z) - user.forceMove(T) \ No newline at end of file + user.forceMove(T) + +/turf/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE + return TRUE diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 79bf171ce1f..15c553b3f95 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -1,5 +1,6 @@ /turf/space/transit var/pushdirection // push things that get caught in the transit tile this direction + plane = PLANE_SPACE //Overwrite because we dont want people building rods in space. /turf/space/transit/attackby(obj/O as obj, mob/user as mob, params) @@ -151,3 +152,9 @@ icon_state = "speedspace_ns_[state]" transform = turn(matrix(), angle) + +/turf/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE + return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e315ad26ad0..51285932f00 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -470,6 +470,12 @@ if(ismob(A) || .) A.ratvar_act() +/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = icon + underlay_appearance.icon_state = icon_state + underlay_appearance.dir = adjacency_dir + return TRUE + /turf/proc/add_blueprints(atom/movable/AM) var/image/I = new I.appearance = AM.appearance diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 8febe20e840..0b171dac199 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -229,3 +229,19 @@ setCloneLoss(100, FALSE) updatehealth() + +/mob/living/simple_animal/mouse/verb/suicide() + set hidden = 1 + if(stat == DEAD) + to_chat(src, "You're already dead!") + return + if(suiciding) + to_chat(src, "You're already committing suicide! Be patient!") + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = TRUE + visible_message("[src] is playing dead permanently! It looks like [p_theyre()] trying to commit suicide.") + adjustOxyLoss(max(100 - getBruteLoss(100), 0)) \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3b282fa6893..b66f83543dd 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -77,9 +77,11 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ /client/proc/list_ssds, + /client/proc/list_afks, /client/proc/cmd_admin_headset_message, /client/proc/spawn_floor_cluwne, - /client/proc/show_discord_duplicates, + /client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359 + /client/proc/toggle_panic_bunker ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -118,7 +120,8 @@ var/list/admin_verbs_event = list( /client/proc/cmd_admin_create_centcom_report, /client/proc/fax_panel, /client/proc/event_manager_panel, - /client/proc/modify_goals + /client/proc/modify_goals, + /client/proc/outfit_manager ) var/list/admin_verbs_spawn = list( @@ -642,7 +645,7 @@ var/list/admin_verbs_ticket = list( if(!message) return for(var/mob/V in hearers(O)) - V.show_message(message, 2) + V.show_message(admin_pencode_to_html(message), 2) log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound") message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound") feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -1026,4 +1029,17 @@ var/list/admin_verbs_ticket = list( if(!check_rights(R_ADMIN)) return - holder.discord_duplicates() \ No newline at end of file + holder.discord_duplicates() + +/client/proc/toggle_panic_bunker() + set name = "Toggle Panic Bunker" + set category = "Admin" + set desc = "Disables new players connecting." + + if(!check_rights(R_ADMIN)) + return + + GLOB.panic_bunker_enabled = !GLOB.panic_bunker_enabled + + log_admin("[key_name(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.") + message_admins("[key_name_admin(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.") diff --git a/code/modules/admin/outfits.dm b/code/modules/admin/outfits.dm new file mode 100644 index 00000000000..336edc89c88 --- /dev/null +++ b/code/modules/admin/outfits.dm @@ -0,0 +1,262 @@ +GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits + +/client/proc/outfit_manager() + set category = "Event" + set name = "Outfit Manager" + + if(!check_rights(R_EVENT)) + return + holder.outfit_manager(usr) + +/datum/admins/proc/outfit_manager(mob/admin) + var/list/dat = list("" + dat += "Create
" + dat += "Load from file" + admin << browse(dat.Join(),"window=outfitmanager") + +/datum/admins/proc/save_outfit(mob/admin,datum/outfit/O) + O.save_to_file(admin) + outfit_manager(admin) + +/datum/admins/proc/delete_outfit(mob/admin,datum/outfit/O) + GLOB.custom_outfits -= O + qdel(O) + to_chat(admin,"Outfit deleted.") + outfit_manager(admin) + +/datum/admins/proc/load_outfit(mob/admin) + var/outfit_file = input("Pick outfit json file:", "File") as null|file + if(!outfit_file) + return + var/filedata = file2text(outfit_file) + var/json = json_decode(filedata) + if(!json) + to_chat(admin,"JSON decode error.") + return + var/otype = text2path(json["outfit_type"]) + if(!ispath(otype,/datum/outfit)) + to_chat(admin,"Malformed/Outdated file.") + return + var/datum/outfit/O = new otype + if(!O.load_from(json)) + to_chat(admin,"Malformed/Outdated file.") + return + GLOB.custom_outfits += O + outfit_manager(admin) + +/datum/admins/proc/create_outfit(mob/admin) + var/list/uniforms = typesof(/obj/item/clothing/under) + var/list/suits = typesof(/obj/item/clothing/suit) + var/list/gloves = typesof(/obj/item/clothing/gloves) + var/list/shoes = typesof(/obj/item/clothing/shoes) + var/list/headwear = typesof(/obj/item/clothing/head) + var/list/glasses = typesof(/obj/item/clothing/glasses) + var/list/masks = typesof(/obj/item/clothing/mask) + var/list/pdas = typesof(/obj/item/pda) + var/list/ids = typesof(/obj/item/card/id) + + var/uniform_select = "" + + var/suit_select = "" + + var/gloves_select = "" + + var/shoes_select = "" + + var/head_select = "" + + var/glasses_select = "" + + var/mask_select = "" + + var/id_select = "" + + var/pda_select = "" + + var/dat = {" + Create Outfit +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: + +
Uniform: + [uniform_select] +
Suit: + [suit_select] +
Back: + +
Belt: + +
Gloves: + [gloves_select] +
Shoes: + [shoes_select] +
Head: + [head_select] +
Mask: + [mask_select] +
Left Ear: + +
Right Ear: + +
Glasses: + [glasses_select] +
ID: + [id_select] +
PDA: + [pda_select] +
Left Pocket: + +
Right Pocket: + +
Suit Store: + +
Right Hand: + +
Left Hand: + +
+
+ +
+ "} + admin << browse(dat, "window=dressup;size=550x600") + + +/datum/admins/proc/create_outfit_finalize(mob/admin, list/href_list) + var/datum/outfit/O = new + + O.name = href_list["outfit_name"] + O.uniform = text2path(href_list["outfit_uniform"]) + O.shoes = text2path(href_list["outfit_shoes"]) + O.gloves = text2path(href_list["outfit_gloves"]) + O.suit = text2path(href_list["outfit_suit"]) + O.head = text2path(href_list["outfit_head"]) + O.back = text2path(href_list["outfit_back"]) + O.mask = text2path(href_list["outfit_mask"]) + O.glasses = text2path(href_list["outfit_glasses"]) + O.r_hand = text2path(href_list["outfit_r_hand"]) + O.l_hand = text2path(href_list["outfit_l_hand"]) + O.suit_store = text2path(href_list["outfit_s_store"]) + O.l_pocket = text2path(href_list["outfit_l_pocket"]) + O.r_pocket = text2path(href_list["outfit_r_pocket"]) + O.id = text2path(href_list["outfit_id"]) + O.pda = text2path(href_list["outfit_pda"]) + O.belt = text2path(href_list["outfit_belt"]) + O.l_ear = text2path(href_list["outfit_l_ear"]) + O.r_ear = text2path(href_list["outfit_r_ear"]) + + GLOB.custom_outfits.Add(O) + message_admins("[key_name_admin(usr)] created \"[O.name]\" outfit.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index ebe2219d90b..cb10ba4d335 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -341,9 +341,6 @@ if("Cancel") return if("Yes") delmob = 1 - log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") - message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) - switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob, 1 ) if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob, 1 ) @@ -351,7 +348,11 @@ if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 ) if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 ) if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 ) - if("human") M.change_mob_type( /mob/living/carbon/human, null, null, delmob, 1 ) + if("human") + var/posttransformoutfit = usr.client.robust_dress_shop() + var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1) + if(posttransformoutfit && istype(newmob)) + newmob.equipOutfit(posttransformoutfit) if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 ) if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 ) @@ -368,6 +369,9 @@ if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 ) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 ) + log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") + message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) + /////////////////////////////////////new ban stuff else if(href_list["unbanf"]) @@ -1510,14 +1514,22 @@ usr.client.cmd_admin_animalize(M) else if(href_list["incarn_ghost"]) - if(!check_rights(R_SPAWN)) return + if(!check_rights(R_SPAWN)) + return var/mob/dead/observer/G = locateUID(href_list["incarn_ghost"]) if(!istype(G)) to_chat(usr, "This will only work on /mob/dead/observer") - log_admin("[key_name(G)] was incarnated by [key_name(src.owner)]") - message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(src.owner)]") - G.incarnate_ghost() + + var/posttransformoutfit = usr.client.robust_dress_shop() + + var/mob/living/carbon/human/H = G.incarnate_ghost() + + if(posttransformoutfit && istype(H)) + H.equipOutfit(posttransformoutfit) + + log_admin("[key_name(G)] was incarnated by [key_name(owner)]") + message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(owner)]") else if(href_list["togmutate"]) if(!check_rights(R_SPAWN)) return @@ -1930,7 +1942,7 @@ evilcookie.reagents.add_reagent("mutagen", 10) evilcookie.desc = "It has a faint green glow." evilcookie.bitesize = 100 - evilcookie.flags = NODROP + evilcookie.flags = NODROP | DROPDEL H.drop_l_hand() H.equip_to_slot_or_del(evilcookie, slot_l_hand) logmsg = "a mutagen cookie." @@ -1939,7 +1951,7 @@ evilcookie.reagents.add_reagent("hell_water", 25) evilcookie.desc = "Sulphur-flavored." evilcookie.bitesize = 100 - evilcookie.flags = NODROP + evilcookie.flags = NODROP | DROPDEL H.drop_l_hand() H.equip_to_slot_or_del(evilcookie, slot_l_hand) logmsg = "a hellwater cookie." @@ -2001,7 +2013,7 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - if(!isLivingSSD(H)) + if(!href_list["cryoafk"] && !isLivingSSD(H)) to_chat(usr, "This can only be used on living, SSD players.") return if(istype(H.loc, /obj/machinery/cryopod)) @@ -2012,6 +2024,11 @@ else if(cryo_ssd(H)) log_admin("[key_name(usr)] sent [H.job] [H] to cryo.") message_admins("[key_name_admin(usr)] sent [H.job] [H] to cryo.") + if(href_list["cryoafk"]) // Warn them if they are send to storage and are AFK + to_chat(H, "The admins have moved you to cryo storage for being AFK. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.") + SEND_SOUND(H, 'sound/effects/adminhelp.ogg') + if(H.client) + window_flash(H.client) else if(href_list["FaxReplyTemplate"]) if(!check_rights(R_ADMIN)) return @@ -2166,7 +2183,7 @@ var/obj/item/paper/P = new /obj/item/paper(null) //hopefully the null loc won't cause trouble for us if(!fax) - var/list/departmentoptions = alldepartments + "All Departments" + var/list/departmentoptions = alldepartments + hidden_departments + "All Departments" destination = input(usr, "To which department?", "Choose a department", "") as null|anything in departmentoptions if(!destination) qdel(P) @@ -2181,7 +2198,7 @@ if(!input) qdel(P) return - input = P.parsepencode(input) // Encode everything from pencode to html + input = admin_pencode_to_html(html_encode(input)) // Encode everything from pencode to html var/customname = clean_input("Pick a title for the fax.", "Fax Title", , owner) if(!customname) @@ -3368,6 +3385,29 @@ message_admins("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]") log_admin("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]") + else if(href_list["create_outfit_finalize"]) + if(!check_rights(R_EVENT)) + return + create_outfit_finalize(usr,href_list) + else if(href_list["load_outfit"]) + if(!check_rights(R_EVENT)) + return + load_outfit(usr) + else if(href_list["create_outfit_menu"]) + if(!check_rights(R_EVENT)) + return + create_outfit(usr) + else if(href_list["delete_outfit"]) + if(!check_rights(R_EVENT)) + return + var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits + delete_outfit(usr,O) + else if(href_list["save_outfit"]) + if(!check_rights(R_EVENT)) + return + var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits + save_outfit(usr,O) + /client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0) if(!check_rights(R_EVENT)) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 4aceade3526..853b367e15b 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -27,7 +27,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN)) return - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return var/original_msg = msg diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 0b7632595e8..1069e981c37 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -3,7 +3,7 @@ set category = null set name = "Admin PM Mob" if(!holder) - to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") return if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) @@ -14,7 +14,7 @@ set category = "Admin" set name = "Admin PM Name" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -37,7 +37,7 @@ set category = "Admin" set name = "Admin PM Key" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -60,7 +60,7 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg, type = "PM") if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") return var/client/C @@ -106,11 +106,11 @@ //clean the message if it's not sent by a high-rank admin if(!check_rights(R_SERVER|R_DEBUG,0)) - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return else - msg = pencode_to_html(msg) + msg = admin_pencode_to_html(msg) var/recieve_span = "playerreply" var/send_pm_type = " " @@ -129,7 +129,7 @@ recieve_pm_type = holder.rank else if(!C.holder) - to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") return var/recieve_message = "" @@ -161,7 +161,9 @@ var/emoji_msg = "[msg]" recieve_message = "[type] from-[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]: [emoji_msg]" to_chat(C, recieve_message) - to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg]") + var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(PING)" : "" + var/window_link = "(WINDOW)" + to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg] [ping_link] [window_link]") /*if(holder && !C.holder) C.last_pm_recieved = world.time @@ -215,7 +217,7 @@ /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") + to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") return var/msg = clean_input("Message:", "Private message to admins on IRC / 400 character limit", , src) as text|null @@ -232,14 +234,14 @@ send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]") - to_chat(src, "IRC PM to-IRC-Admins: [msg]") + to_chat(src, "IRC PM to-IRC-Admins: [msg]") log_admin("PM: [key_name(src)]->IRC: [msg]") for(var/client/X in GLOB.admins) if(X == src) continue if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob)) - to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]") + to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]") /client/verb/open_pms_ui() set name = "My PMs" @@ -380,7 +382,6 @@ window_flash(C) C.pm_tracker.show_ui(C.mob) to_chat(usr, "Forced open [C]'s messages window.") - show_ui(usr) return if(href_list["reply"]) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 008eaa4a910..11664349274 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -576,109 +576,79 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_EVENT)) return - if(!ishuman(M)) + if(!ishuman(M) && !isobserver(M)) alert("Invalid mob") return - var/list/choices = list( - "strip", - "as job...", - "emergency response team member", - "emergency response team leader" + var/dresscode = robust_dress_shop() + + if(!dresscode) + return + + var/delete_pocket + var/mob/living/carbon/human/H + if(isobserver(M)) + H = M.change_mob_type(/mob/living/carbon/human, null, null, TRUE) + else + H = M + if(H.l_store || H.r_store || H.s_store) //saves a lot of time for admins and coders alike + if(alert("Should the items in their pockets be dropped? Selecting \"No\" will delete them.", "Robust quick dress shop", "Yes", "No") == "No") + delete_pocket = TRUE + + for (var/obj/item/I in H.get_equipped_items(delete_pocket)) + qdel(I) + if(dresscode != "Naked") + H.equipOutfit(dresscode) + + H.regenerate_icons() + + feedback_add_details("admin_verb", "SE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") + message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) + +/client/proc/robust_dress_shop() + var/list/outfits = list( + "Naked", + "As Job...", + "Custom..." ) - var/admin_outfits = subtypesof(/datum/outfit/admin) - for(var/type in admin_outfits) - var/datum/outfit/O = type - var/name = initial(O.name) - if(name != "Naked") - choices[initial(O.name)] = type + var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) + for(var/path in paths) + var/datum/outfit/O = path //not much to initalize here but whatever + if(initial(O.can_be_admin_equipped)) + outfits[initial(O.name)] = path - var/dostrip = 0 - switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel")) - if("Yes") - dostrip = 1 - if("Cancel") - return - - var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices + var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits if(isnull(dresscode)) return - var/datum/outfit/O - if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader"))) - O = choices[dresscode] + if(outfits[dresscode]) + dresscode = outfits[dresscode] - var/datum/job/jobdatum - if(dresscode == "as job...") - var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs() - jobdatum = SSjobs.GetJob(jobname) + if(dresscode == "As Job...") + var/list/job_paths = subtypesof(/datum/outfit/job) + var/list/job_outfits = list() + for(var/path in job_paths) + var/datum/outfit/O = path + if(initial(O.can_be_admin_equipped)) + job_outfits[initial(O.name)] = path - feedback_add_details("admin_verb", "SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(dostrip) - for(var/obj/item/I in M) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) + dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits + dresscode = job_outfits[dresscode] + if(isnull(dresscode)) + return + if(dresscode == "Custom...") + var/list/custom_names = list() + for(var/datum/outfit/D in GLOB.custom_outfits) + custom_names[D.name] = D + var/selected_name = input("Select outfit", "Robust quick dress shop") as null|anything in custom_names + dresscode = custom_names[selected_name] + if(isnull(dresscode)) + return - switch(dresscode) - if("strip") - //do nothing - - // god is dead - if("as job...") - if(jobdatum) - dresscode = "[jobdatum.title]" - jobdatum.equip(M) - - if("emergency response team member", "emergency response team leader") - var/datum/response_team/equip_team = null - switch(alert("Level", "Emergency Response Team", "Amber", "Red", "Gamma")) - if("Amber") - equip_team = new /datum/response_team/amber - if("Red") - equip_team = new /datum/response_team/red - if("Gamma") - equip_team = new /datum/response_team/gamma - if(!equip_team) - return - if(dresscode == "emergency response team leader") - equip_team.equip_officer("Commander", M) - else - var/list/ert_outfits = list("Security", "Engineer", "Medic", "Janitor", "Paranormal") - var/echoice = input("Loadout Type", "Emergency Response Team") as null|anything in ert_outfits - if(!echoice) - return - switch(echoice) - if("Commander") - equip_team.equip_officer("Commander", M) - if("Security") - equip_team.equip_officer("Security", M) - if("Engineer") - equip_team.equip_officer("Engineer", M) - if("Medic") - equip_team.equip_officer("Medic", M) - if("Janitor") - equip_team.equip_officer("Janitor", M) - if("Paranormal") - equip_team.equip_officer("Paranormal", M) - else - to_chat(src, "Invalid ERT Loadout selected") - - - else // outfit datum - if(O) - M.equipOutfit(O, FALSE) - - M.regenerate_icons() - - log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].") - message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) - return - + return dresscode /client/proc/startSinglo() set category = "Debug" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ae44648b5d5..2c7c6181b1d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -58,6 +58,9 @@ if(!msg) return + + msg = admin_pencode_to_html(msg) + if(usr) if(usr.client) if(usr.client.holder) @@ -136,7 +139,7 @@ if( !msg ) return - msg = pencode_to_html(msg) + msg = admin_pencode_to_html(msg) to_chat(M, msg) log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]") @@ -613,7 +616,6 @@ Traitors and the like can also be revived with the previous role mostly intact. var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What's the message?") as message|null if(!input) return - input = pencode_to_html(html_encode(input)) switch(alert("Should this be announced to the general population?",,"Yes","No", "Cancel")) if("Yes") @@ -1004,6 +1006,57 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "" src << browse(msg, "window=Player_ssd_check") +/client/proc/list_afks() + set category = "Admin" + set name = "List AFKs" + set desc = "Lists AFK players" + + if(!check_rights(R_ADMIN)) + return + + var/msg = "AFK Report" + msg += "AFK Players:
" + msg += "" + var/mins_afk + var/job_string + var/key_string + var/role_string + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(H.client == null || H.stat == DEAD) // No clientless or dead + continue + mins_afk = round(H.client.inactivity / 600) + if(mins_afk < config.list_afk_minimum) + continue + if(H.job) + job_string = H.job + else + job_string = "-" + key_string = H.key + if(job_string in command_positions) + job_string = "" + job_string + "" + role_string = "-" + var/obj_count = 0 + var/obj_string = "" + if(H.mind) + if(H.mind.special_role) + role_string = "[H.mind.special_role]" + if(!H.key && H.mind.key) + key_string = H.mind.key + for(var/datum/objective/O in all_objectives) + if(O.target == H.mind) + obj_count++ + if(obj_count > 0) + obj_string = "
Obj Target" + msg += "" + msg += "" + if(istype(H.loc, /obj/machinery/cryopod)) + msg += "" + else + msg += "" + msg += "" + msg += "
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo
[key_string][H.real_name][job_string][mins_afk][role_string][obj_string][get_area(H)][ADMIN_PP(H,"PP")]De-SpawnCryo
" + src << browse(msg, "window=Player_afk_check") + /client/proc/toggle_ert_calling() set category = "Event" set name = "Toggle ERT" diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index d15b3e3075d..e41e29a747f 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -193,7 +193,7 @@ servant_mind.objectives += O servant_mind.transfer_to(H) - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 50) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 300) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index fd89434331e..22325fed75f 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -60,7 +60,7 @@ var/list/related_accounts_ip = list() //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip var/list/related_accounts_cid = list() //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id - preload_rsc = 1 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server. + preload_rsc = 0 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server. var/global/obj/screen/click_catcher/void diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index d429330bd62..744cb44ea63 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -307,11 +307,6 @@ qdel(src) return - // Change the way they should download resources. - if(config.resource_urls) - preload_rsc = pick(config.resource_urls) - else preload_rsc = 1 // If config.resource_urls is not set, preload like normal. - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") @@ -413,6 +408,16 @@ Master.UpdateTickRate() + // Check total playercount + var/playercount = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + playercount += 1 + + if(playercount >= 150 && GLOB.panic_bunker_enabled == 0) + GLOB.panic_bunker_enabled = 1 + message_admins("Panic bunker has been automatically enabled due to playercount surpassing 150") + /client/proc/is_connecting_from_localhost() var/localhost_addresses = list("127.0.0.1", "::1") // Adresses if(!isnull(address) && address in localhost_addresses) @@ -428,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 ..() @@ -538,6 +546,14 @@ message_admins("SQL ERROR during log_client_to_db (update). Error : \[[err]\]\n") else //New player!! Need to insert all the stuff + + // Check new peeps for panic bunker + if(GLOB.panic_bunker_enabled) + message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") + src << "Sorry but the server is currently not accepting connections from never before seen players. Please try again later." + del(src) + return // Dont insert or they can just go in again + var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") if(!query_insert.Execute()) var/err = query_insert.ErrorMsg() @@ -755,6 +771,11 @@ //Send resources to the client. /client/proc/send_resources() + // Change the way they should download resources. + if(config.resource_urls) + preload_rsc = pick(config.resource_urls) + else + preload_rsc = 1 // If config.resource_urls is not set, preload like normal. // Most assets are now handled through global_cache.dm getFiles( 'html/search.js', // Used in various non-NanoUI HTML windows for search functionality 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/chameleon.dm b/code/modules/clothing/chameleon.dm index 0a0a2e45abd..f2e9e639dd6 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -15,7 +15,8 @@ standard_outfit_options = list() for(var/path in subtypesof(/datum/outfit/job)) var/datum/outfit/O = path - standard_outfit_options[initial(O.name)] = path + if(initial(O.can_be_admin_equipped)) + standard_outfit_options[initial(O.name)] = path sortTim(standard_outfit_options, /proc/cmp_text_asc) outfit_options = standard_outfit_options @@ -276,6 +277,34 @@ . = ..() chameleon_action.emp_randomise(INFINITY) +/obj/item/clothing/glasses/chameleon/thermal + origin_tech = "magnets=3;syndicate=4" + vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + flash_protect = -1 + prescription_upgradable = TRUE + +/obj/item/clothing/glasses/hud/security/chameleon + flash_protect = 1 + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/glasses/hud/security/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "HUD" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/glasses/hud/security/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + /obj/item/clothing/gloves/chameleon desc = "These gloves will protect the wearer from electric shock." name = "insulated gloves" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1de1fd694af..0dbde8ef728 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -125,6 +125,10 @@ throwforce = 2 slot_flags = SLOT_EARS burn_state = FIRE_PROOF + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/ears.dmi', + "Vox Armalis" = 'icons/mob/species/armalis/ears.dmi' + ) //We read you loud and skree-er. /obj/item/clothing/ears/attack_hand(mob/user) if(!user) @@ -660,38 +664,45 @@ BLIND // can't see anything /obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) if(istype(A)) - . = 1 + . = TRUE else - return 0 + return FALSE + if(accessories.len) for(var/obj/item/clothing/accessory/AC in accessories) if((A.slot in list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND)) && AC.slot == A.slot) - return 0 + return FALSE if(!A.allow_duplicates && AC.type == A.type) - return 0 + return FALSE /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/accessory)) - var/obj/item/clothing/accessory/A = I - if(can_attach_accessory(A)) - user.unEquip(I) // Make absolutely sure this accessory is removed from hands - accessories += A - A.on_attached(src, user) - - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() - - return - else - to_chat(user, "You cannot attach more accessories of this type to [src].") + attach_accessory(I, user, TRUE) if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) A.attackby(I, user, params) - return + return TRUE - ..() + . = ..() + +/obj/item/clothing/under/proc/attach_accessory(obj/item/clothing/accessory/A, mob/user, unequip = FALSE) + if(can_attach_accessory(A)) + if(unequip && !user.unEquip(A)) // Make absolutely sure this accessory is removed from hands + return FALSE + + accessories += A + A.on_attached(src, user) + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform() + + return TRUE + else + to_chat(user, "You cannot attach more accessories of this type to [src].") + + return FALSE /obj/item/clothing/under/examine(mob/user) ..(user) diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 2e3a1d40bda..74164f0e245 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -14,7 +14,7 @@ desc = "Unce unce unce unce." var/on = 0 icon_state = "headphones0" - item_state = "earmuffs" + item_state = null actions_types = list(/datum/action/item_action/toggle_headphones) burn_state = FLAMMABLE diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 457df3fac8a..ac6c3b6dd0b 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -58,7 +58,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', "Drask" = 'icons/mob/species/drask/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/meson/night @@ -106,7 +107,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) actions_types = list(/datum/action/item_action/toggle_research_scanner) @@ -155,7 +157,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/monocle @@ -211,7 +214,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/regular/hipster @@ -228,7 +232,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/gglasses @@ -239,7 +244,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) prescription_upgradable = 1 @@ -387,7 +393,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/thermal/emp_act(severity) @@ -403,25 +410,6 @@ M.CureNearsighted() ..() -/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete - name = "Optical Meson Scanner" - desc = "Used for seeing walls, floors, and stuff through anything." - icon_state = "meson" - origin_tech = "magnets=3;syndicate=4" - prescription_upgradable = 1 - -/obj/item/clothing/glasses/thermal/syndi/sunglasses - name = "sunglasses" - desc = "Strangely ancient technology used to help provide rudimentary eye cover." - icon_state = "sun" - item_state = "sunglasses" - - sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Drask" = 'icons/mob/species/drask/eyes.dmi', - "Grey" = 'icons/mob/species/grey/eyes.dmi' - ) - /obj/item/clothing/glasses/thermal/monocle name = "Thermoncle" desc = "A monocle thermal." @@ -447,56 +435,6 @@ item_state = "eyepatch" flags = NODROP -/obj/item/clothing/glasses/proc/chameleon(var/mob/user) - var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") as null|anything in list("Sunglasses", "Medical HUD", "Mesons", "Science Goggles", "Glasses", "Security Sunglasses","Eyepatch","Welding","Gar") - - if(user && src in user.contents) - switch(input_glasses) - if("Sunglasses") - desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes." - name = "sunglasses" - icon_state = "sun" - item_state = "sunglasses" - if("Medical HUD") - name = "Health Scanner HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." - icon_state = "healthhud" - item_state = "healthhud" - if("Mesons") - name = "Optical Meson Scanner" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - icon_state = "meson" - item_state = "meson" - if("Science Goggles") - name = "Science Goggles" - desc = "A pair of snazzy goggles used to protect against chemical spills." - icon_state = "purple" - item_state = "glasses" - if("Glasses") - name = "Prescription Glasses" - desc = "Made by Nerd. Co." - icon_state = "glasses" - item_state = "glasses" - if("Security Sunglasses") - name = "HUDSunglasses" - desc = "Sunglasses with a HUD." - icon_state = "sunhud" - item_state = "sunglasses" - if("Eyepatch") - name = "eyepatch" - desc = "Yarr." - icon_state = "eyepatch" - item_state = "eyepatch" - if("Welding") - name = "welding goggles" - desc = "Protects the eyes from welders; approved by the mad scientist association." - icon_state = "welding-g" - item_state = "welding-g" - if("Gar") - desc = "Just who the hell do you think I am?!" - name = "gar glasses" - icon_state = "gar" - item_state = "gar" /obj/item/clothing/glasses/godeye name = "eye of god" @@ -510,6 +448,12 @@ flags_cover = null lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' + ) + /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) if(W.icon_state == "godeye") @@ -535,7 +479,9 @@ tint = 0 sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/tajblind/eng diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 59ebb6c9446..1e639beb5de 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -63,6 +63,7 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' ) @@ -91,13 +92,6 @@ "Grey" = 'icons/mob/species/grey/eyes.dmi' ) -/obj/item/clothing/glasses/hud/security/chameleon - name = "Chameleon Security HUD" - desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection." - flash_protect = 1 - -/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user) - chameleon(user) /obj/item/clothing/glasses/hud/security/sunglasses/jensenshades name = "augmented shades" @@ -146,6 +140,7 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi', "Grey" = 'icons/mob/species/grey/eyes.dmi' ) @@ -184,7 +179,9 @@ up = 0 sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/eyes.dmi' + "Vox" = 'icons/mob/species/vox/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) /obj/item/clothing/glasses/hud/health/tajblind/attack_self() 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/masks/breath.dm b/code/modules/clothing/masks/breath.dm index df229f5b9c3..638aa3c2c84 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -12,6 +12,7 @@ burn_state = FIRE_PROOF sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', + "Vox Armalis" = 'icons/mob/species/armalis/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', @@ -43,7 +44,7 @@ icon_state = "voxmask" item_state = "voxmask" permeability_coefficient = 0.01 - species_restricted = list("Vox") + species_restricted = list("Vox", "Vox Armalis") //These should fit the "Mega Vox" just fine. actions_types = list() /obj/item/clothing/mask/breath/vox/attack_self(var/mob/user) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index b11dfd45d68..3151ddca083 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -214,7 +214,8 @@ "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/eyes.dmi' ) @@ -233,7 +234,8 @@ "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi' ) /obj/item/clothing/mask/fakemoustache/attack_self(mob/user) @@ -308,7 +310,8 @@ var/originalname = "" sprite_sheets = list( - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi' ) /obj/item/clothing/mask/horsehead/equipped(mob/user, slot) @@ -420,7 +423,8 @@ "Unathi" = 'icons/mob/species/unathi/mask.dmi', "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi', - "Grey" = 'icons/mob/species/grey/mask.dmi' + "Grey" = 'icons/mob/species/grey/mask.dmi', + "Drask" = 'icons/mob/species/drask/mask.dmi' ) actions_types = list(/datum/action/item_action/adjust) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 1805d911caa..7a5bd2255da 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -71,6 +71,30 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team silence_steps = 1 shoe_sound = "clownstep" origin_tech = "magnets=4;syndicate=2" + var/enabled_waddle = TRUE + var/datum/component/waddle + +/obj/item/clothing/shoes/magboots/clown/equipped(mob/user, slot) + . = ..() + if(slot == slot_shoes && enabled_waddle) + waddle = user.AddComponent(/datum/component/waddling) + +/obj/item/clothing/shoes/magboots/clown/dropped(mob/user) + . = ..() + QDEL_NULL(waddle) + +/obj/item/clothing/shoes/magboots/clown/CtrlClick(mob/living/user) + if(!isliving(user)) + return + if(user.get_active_hand() != src) + to_chat(user, "You must hold [src] in your hand to do this.") + return + if(!enabled_waddle) + to_chat(user, "You switch off the waddle dampeners!") + enabled_waddle = TRUE + else + to_chat(user, "You switch on the waddle dampeners!") + enabled_waddle = FALSE /obj/item/clothing/shoes/magboots/wizard //bundled with the wiz hardsuit name = "boots of gripping" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f878ec0d65e..bca650a30b1 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -55,7 +55,7 @@ t_loc.MakeDry(TURF_WET_WATER) /obj/item/clothing/shoes/clown_shoes - desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" + desc = "The prankster's standard-issue clowning shoes. Damn they're huge! Ctrl-click to toggle the waddle dampeners!" name = "clown shoes" icon_state = "clown" item_state = "clown_shoes" @@ -63,6 +63,30 @@ item_color = "clown" var/footstep = 1 //used for squeeks whilst walking shoe_sound = "clownstep" + var/enabled_waddle = TRUE + var/datum/component/waddle + +/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) + . = ..() + if(slot == slot_shoes && enabled_waddle) + waddle = user.AddComponent(/datum/component/waddling) + +/obj/item/clothing/shoes/clown_shoes/dropped(mob/user) + . = ..() + QDEL_NULL(waddle) + +/obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user) + if(!isliving(user)) + return + if(user.get_active_hand() != src) + to_chat(user, "You must hold [src] in your hand to do this.") + return + if(!enabled_waddle) + to_chat(user, "You switch off the waddle dampeners!") + enabled_waddle = TRUE + else + to_chat(user, "You switch on the waddle dampeners!") + enabled_waddle = FALSE /obj/item/clothing/shoes/clown_shoes/magical name = "magical clown shoes" 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/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 9f225e48884..96e174ed2dd 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -182,34 +182,7 @@ materials = list(MAT_METAL=1000) burn_state = FIRE_PROOF -/obj/item/clothing/accessory/medal/conduct - name = "distinguished conduct medal" - desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is the most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." - -/obj/item/clothing/accessory/medal/bronze_heart - name = "bronze heart medal" - desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." - icon_state = "bronze_heart" - -/obj/item/clothing/accessory/medal/nobel_science - name = "nobel sciences award" - desc = "A bronze medal which represents significant contributions to the field of science or engineering." - -/obj/item/clothing/accessory/medal/silver - name = "silver medal" - desc = "A silver medal." - icon_state = "silver" - item_color = "silver" - materials = list(MAT_SILVER=1000) - -/obj/item/clothing/accessory/medal/silver/valor - name = "medal of valor" - desc = "A silver medal awarded for acts of exceptional valor." - -/obj/item/clothing/accessory/medal/silver/security - name = "robust security award" - desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." - +// GOLD (awarded by centcom) /obj/item/clothing/accessory/medal/gold name = "gold medal" desc = "A prestigious golden medal." @@ -223,7 +196,61 @@ /obj/item/clothing/accessory/medal/gold/heroism name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist." + +// SILVER (awarded by Captain) + +/obj/item/clothing/accessory/medal/silver + name = "silver medal" + desc = "A silver medal." + icon_state = "silver" + item_color = "silver" + materials = list(MAT_SILVER=1000) + +/obj/item/clothing/accessory/medal/silver/valor + name = "medal of valor" + desc = "An award issued by Captains to crew members whose exceptional performance and service to the station has been commended by the station's top leadership." + +/obj/item/clothing/accessory/medal/silver/leadership + name = "medal of command" + desc = "An award issued by Captains to heads of department who do an excellent job managing their department. Made of pure silver." + + +// BRONZE (awarded by heads of department, except for the bronze heart) + + + +/obj/item/clothing/accessory/medal/security + name = "robust security medal" + desc = "An award issued by the HoS to security staff who excel at upholding the law." + +/obj/item/clothing/accessory/medal/science + name = "smart science medal" + desc = "An award issued by the RD to science staff who advance the frontiers of knowledge." + +/obj/item/clothing/accessory/medal/engineering + name = "excellent engineering medal" + desc = "An award issued by the CE to engineering staff whose dedication keep the station running at its best." + +/obj/item/clothing/accessory/medal/service + name = "superior service medal" + desc = "An award issued by the HoP to service staff who go above and beyond." + +/obj/item/clothing/accessory/medal/medical + name = "magnificient medical medal" + desc = "An award issued by the CMO to medical staff who excel at saving lives." + +/obj/item/clothing/accessory/medal/legal + name = "meritous legal medal" + desc = "An award issued by the Magistrate to legal staff who uphold the rule of law." + +/obj/item/clothing/accessory/medal/heart + name = "bronze heart medal" + desc = "A rarely-awarded medal for those who sacrifice themselves in the line of duty to save their fellow crew." + icon_state = "bronze_heart" + + + /* Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized 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/events/grid_check.dm b/code/modules/events/grid_check.dm index d8d1f46ad9b..67881662db5 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -45,6 +45,11 @@ continue if(C.cell) C.cell.charge = 0 + for(var/obj/machinery/power/P in GLOB.machines) + var/area/current_area = get_area(P) + if((current_area.type in skipped_areas_apc) || (current_area.type in skipped_areas) || !is_station_level(P.z)) + continue + P.malfunction = TRUE /proc/power_restore(var/announce = 1) var/list/skipped_areas = list(/area/turret_protected/ai) @@ -67,6 +72,8 @@ S.input_attempt = S.last_input_attempt S.update_icon() S.power_change() + for(var/obj/machinery/power/P in GLOB.machines) + P.malfunction = FALSE /proc/power_restore_quick(var/announce = 1) if(announce) diff --git a/code/modules/events/headcrabs.dm b/code/modules/events/headcrabs.dm new file mode 100644 index 00000000000..3c02212a40f --- /dev/null +++ b/code/modules/events/headcrabs.dm @@ -0,0 +1,146 @@ +#define LOC_ATMOS_CONTROL 0 +#define LOC_FPMAINT 1 +#define LOC_FPMAINT2 2 +#define LOC_FSMAINT 3 +#define LOC_FSMAINT2 4 +#define LOC_ASMAINT 5 +#define LOC_ASMAINT2 6 +#define LOC_APMAINT 7 +#define LOC_MAINTCENTRAL 8 +#define LOC_FORE 9 +#define LOC_STARBOARD 10 +#define LOC_PORT 11 +#define LOC_AFT 12 +#define LOC_STORAGE 13 +#define LOC_DISPOSAL 14 +#define LOC_GENETICS 15 +#define LOC_ELECTRICAL 16 +#define LOC_ABANDONEDBAR 17 +#define LOC_ELECTRICAL_SHOP 18 +#define LOC_GAMBLING_DEN 19 + +#define HEADCRAB_NORMAL 0 +/*#define HEADCRAB_SPECIAL 1 +#define HEADCRAB_CLOWN 2 */ //Planned for the future + +/datum/event/headcrabs + announceWhen = 10 + endWhen = 11 + var/location + var/locstring + var/headcrab + +/datum/event/headcrabs/start() + + location = rand(0,19) + var/list/turf/simulated/floor/turfs = list() + var/spawn_area_type + switch(location) + if(LOC_ATMOS_CONTROL) + spawn_area_type = /area/maintenance/atmos_control + locstring = "Atmospherics Maintenance" + if(LOC_FPMAINT) + spawn_area_type = /area/maintenance/fpmaint + locstring = "EVA Maintenance" + if(LOC_FPMAINT2) + spawn_area_type = /area/maintenance/fpmaint2 + locstring = "Arrivals North Maintenance" + if(LOC_FSMAINT) + spawn_area_type = /area/maintenance/fsmaint + locstring = "Dormitory Maintenance" + if(LOC_FSMAINT2) + spawn_area_type = /area/maintenance/fsmaint2 + locstring = "Bar Maintenance" + if(LOC_ASMAINT) + spawn_area_type = /area/maintenance/asmaint + locstring = "Medbay Maintenance" + if(LOC_ASMAINT2) + spawn_area_type = /area/maintenance/asmaint2 + locstring = "Science Maintenance" + if(LOC_APMAINT) + spawn_area_type = /area/maintenance/apmaint + locstring = "Cargo Maintenance" + if(LOC_MAINTCENTRAL) + spawn_area_type = /area/maintenance/maintcentral + locstring = "Bridge Maintenance" + if(LOC_FORE) + spawn_area_type = /area/maintenance/fore + locstring = "Fore Maintenance" + if(LOC_STARBOARD) + spawn_area_type = /area/maintenance/starboard + locstring = "Starboard Maintenance" + if(LOC_PORT) + spawn_area_type = /area/maintenance/port + locstring = "Locker Room Maintenance" + if(LOC_AFT) + spawn_area_type = /area/maintenance/aft + locstring = "Engineering Maintenance" + if(LOC_STORAGE) + spawn_area_type = /area/maintenance/storage + locstring = "Atmospherics Maintenance" + if(LOC_DISPOSAL) + spawn_area_type = /area/maintenance/disposal + locstring = "Waste Disposal" + if(LOC_GENETICS) + spawn_area_type = /area/maintenance/genetics + locstring = "Genetics Maintenance" + if(LOC_ELECTRICAL) + spawn_area_type = /area/maintenance/electrical + locstring = "Electrical Maintenance" + if(LOC_ABANDONEDBAR) + spawn_area_type = /area/maintenance/abandonedbar + locstring = "Maintenance Bar" + if(LOC_ELECTRICAL_SHOP) + spawn_area_type = /area/maintenance/electrical_shop + locstring ="Electronics Den" + if(LOC_GAMBLING_DEN) + spawn_area_type = /area/maintenance/gambling_den + locstring = "Gambling Den" + for(var/areapath in typesof(spawn_area_type)) + var/area/A = locate(areapath) + for(var/turf/simulated/floor/F in A.contents) + if(turf_clear(F)) + turfs += F + + var/list/spawn_types = list() + var/max_number + headcrab = 0 //rand(0,x) for the future + switch(headcrab) //Switch is for the future + if(HEADCRAB_NORMAL) + spawn_types = list(/mob/living/simple_animal/hostile/headcrab) + max_number = 6 + + var/num = rand(2,max_number) + while(turfs.len > 0 && num > 0) + var/turf/simulated/floor/T = pick(turfs) + turfs.Remove(T) + num-- + var/spawn_type = pick(spawn_types) + new spawn_type(T) + + +/datum/event/headcrabs/announce() + event_announcement.Announce("Bioscans indicate that creatures have been breeding in [locstring]. Clear them out, before this starts to affect productivity", "Lifesign Alert") + +#undef LOC_ATMOS_CONTROL +#undef LOC_FPMAINT +#undef LOC_FPMAINT2 +#undef LOC_FSMAINT +#undef LOC_FSMAINT2 +#undef LOC_ASMAINT +#undef LOC_ASMAINT2 +#undef LOC_APMAINT +#undef LOC_MAINTCENTRAL +#undef LOC_FORE +#undef LOC_STARBOARD +#undef LOC_PORT +#undef LOC_AFT +#undef LOC_STORAGE +#undef LOC_DISPOSAL +#undef LOC_GENETICS +#undef LOC_ELECTRICAL +#undef LOC_ABANDONEDBAR +#undef LOC_ELECTRICAL_SHOP +#undef LOC_GAMBLING_DEN + +#undef HEADCRAB_NORMAL diff --git a/code/modules/food_and_drinks/food/foods/pasta.dm b/code/modules/food_and_drinks/food/foods/pasta.dm index 36c340656e3..77bfb0728ca 100644 --- a/code/modules/food_and_drinks/food/foods/pasta.dm +++ b/code/modules/food_and_drinks/food/foods/pasta.dm @@ -68,3 +68,10 @@ icon_state = "macncheese" filling_color = "#ffe45d" list_reagents = list("nutriment" = 5, "vitamin" = 2, "cheese" = 4) + +/obj/item/reagent_containers/food/snacks/lasagna + name = "Lasagna" + icon_state = "lasagna" + desc = "Tajarans loves to eat this, for some reason." + filling_color = "#E18712" + list_reagents = list("nutriment" = 10, "msg" = 3, "vitamin" = 4, "tomatojuice" = 10) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 446e919a4a4..c5cf20ce10f 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -11,6 +11,7 @@ broken_icon = "mwb" dirty_icon = "mwbloody" open_icon = "mw-o" + pass_flags = PASSTABLE // see code/modules/food/recipes_microwave.dm for recipes diff --git a/code/modules/food_and_drinks/recipes/recipes_oven.dm b/code/modules/food_and_drinks/recipes/recipes_oven.dm index 0a6072e51a9..a53ee6e75d9 100644 --- a/code/modules/food_and_drinks/recipes/recipes_oven.dm +++ b/code/modules/food_and_drinks/recipes/recipes_oven.dm @@ -467,3 +467,16 @@ /obj/item/reagent_containers/food/snacks/stuffing ) result = /obj/item/reagent_containers/food/snacks/sliceable/turkey + +/datum/recipe/oven/lasagna + items = list( + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/meat, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/cheesewedge, + /obj/item/reagent_containers/food/snacks/grown/tomato, + /obj/item/reagent_containers/food/snacks/grown/tomato, + /obj/item/reagent_containers/food/snacks/dough + ) + result = /obj/item/reagent_containers/food/snacks/lasagna diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index a9511b00fcd..10e135f5fe6 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -2,6 +2,7 @@ name = "plant DNA manipulator" desc = "An advanced device designed to manipulate plant genetic makeup." icon = 'icons/obj/hydroponics/equipment.dmi' + pass_flags = PASSTABLE icon_state = "dnamod" density = 1 anchored = 1 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/keybindings/bindings_admin.dm b/code/modules/keybindings/bindings_admin.dm index 1413d9b0f8d..695a5c6baef 100644 --- a/code/modules/keybindings/bindings_admin.dm +++ b/code/modules/keybindings/bindings_admin.dm @@ -13,7 +13,7 @@ user.cmd_admin_pm_panel() return if("F9") - user.stealth() + user.invisimin() return if("F10") user.get_dead_say() diff --git a/code/modules/keybindings/bindings_ai.dm b/code/modules/keybindings/bindings_ai.dm new file mode 100644 index 00000000000..b496f3521f9 --- /dev/null +++ b/code/modules/keybindings/bindings_ai.dm @@ -0,0 +1,6 @@ +/mob/living/silicon/ai/key_down(_key, client/user) + switch(_key) + if("4") + a_intent_change(INTENT_HOTKEY_LEFT) + return + return ..() \ No newline at end of file diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm new file mode 100644 index 00000000000..47b3fb01501 --- /dev/null +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -0,0 +1,439 @@ +/*********************Mining Hammer****************/ +/obj/item/twohanded/kinetic_crusher + icon = 'icons/obj/mining.dmi' + icon_state = "crusher" + item_state = "crusher0" + name = "proto-kinetic crusher" + desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \ + While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." + force = 0 //You can't hit stuff unless wielded + w_class = WEIGHT_CLASS_BULKY + slot_flags = SLOT_BACK + force_unwielded = 0 + force_wielded = 20 + throwforce = 5 + throw_speed = 4 + armour_penetration = 10 + materials = list(MAT_METAL = 1150, MAT_GLASS = 2075) + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") + sharp = TRUE + actions_types = list(/datum/action/item_action/toggle_light) + var/list/trophies = list() + var/charged = TRUE + var/charge_time = 15 + var/detonation_damage = 50 + var/backstab_bonus = 30 + var/light_on = FALSE + var/brightness_on = 5 + +/obj/item/twohanded/kinetic_crusher/Destroy() + QDEL_LIST(trophies) + return ..() + +/obj/item/twohanded/kinetic_crusher/examine(mob/living/user) + ..() + to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") + to_chat(user, "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") + +/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user) + if(iscrowbar(I)) + if(LAZYLEN(trophies)) + to_chat(user, "You remove [src]'s trophies.") + playsound(loc, I.usesound, 100, 1) + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.remove_from(src, user) + else + to_chat(user, "There are no trophies on [src].") + else if(istype(I, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/T = I + T.add_to(src, user) + else + return ..() + +/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) + if(!wielded) + to_chat(user, "[src] is too heavy to use with one hand. You fumble and drop everything.") + user.drop_r_hand() + user.drop_l_hand() + return + var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + var/target_health = target.health + ..() + for(var/t in trophies) + if(!QDELETED(target)) + var/obj/item/crusher_trophy/T = t + T.on_melee_hit(target, user) + if(!QDELETED(C) && !QDELETED(target)) + C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + +/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) + . = ..() + if(!wielded) + return + if(!proximity_flag && charged)//Mark a target, or mine a tile. + var/turf/proj_turf = user.loc + if(!isturf(proj_turf)) + return + var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf) + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.on_projectile_fire(D, user) + D.preparePixelProjectile(target, get_turf(target), user, clickparams) + D.firer = user + D.hammer_synced = src + playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) + D.fire() + charged = FALSE + update_icon() + addtimer(CALLBACK(src, .proc/Recharge), charge_time) + return + if(proximity_flag && isliving(target)) + var/mob/living/L = target + var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK) + if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK)) + return + var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + var/target_health = L.health + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.on_mark_detonation(target, user) + if(!QDELETED(L)) + if(!QDELETED(C)) + C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did + new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) + var/backstab_dir = get_dir(user, L) + var/def_check = L.getarmor(type = "bomb") + if((user.dir & backstab_dir) && (L.dir & backstab_dir)) + if(!QDELETED(C)) + C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item + L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check) + playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + if(!QDELETED(C)) + C.total_damage += detonation_damage + L.apply_damage(detonation_damage, BRUTE, blocked = def_check) + +/obj/item/twohanded/kinetic_crusher/proc/Recharge() + if(!charged) + charged = TRUE + update_icon() + playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) + +/obj/item/twohanded/kinetic_crusher/ui_action_click(mob/user, actiontype) + light_on = !light_on + playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) + update_brightness(user) + update_icon() + +/obj/item/twohanded/kinetic_crusher/proc/update_brightness(mob/user = null) + if(light_on) + set_light(brightness_on) + else + set_light(0) + +/obj/item/twohanded/kinetic_crusher/update_icon() + ..() + cut_overlays() + if(!charged) + add_overlay("[icon_state]_uncharged") + if(light_on) + add_overlay("[icon_state]_lit") + spawn(1) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + item_state = "crusher[wielded]" + +//destablizing force +/obj/item/projectile/destabilizer + name = "destabilizing force" + icon_state = "pulse1" + nodamage = TRUE + damage = 0 //We're just here to mark people. This is still a melee weapon. + damage_type = BRUTE + flag = "bomb" + range = 6 + log_override = TRUE + var/obj/item/twohanded/kinetic_crusher/hammer_synced + +/obj/item/projectile/destabilizer/Destroy() + hammer_synced = null + return ..() + +/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/mob/living/L = target + var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean + var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced) + if(hammer_synced) + for(var/t in hammer_synced.trophies) + var/obj/item/crusher_trophy/T = t + T.on_mark_application(target, CM, had_effect) + var/target_turf = get_turf(target) + if(ismineralturf(target_turf)) + var/turf/simulated/mineral/M = target_turf + new /obj/effect/temp_visual/kinetic_blast(M) + M.gets_drilled(firer) + ..() + +//trophies +/obj/item/crusher_trophy + name = "tail spike" + desc = "A strange spike with no usage." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "tail_spike" + var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is + var/denied_type = /obj/item/crusher_trophy + +/obj/item/crusher_trophy/examine(mob/living/user) + ..() + to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher.") + +/obj/item/crusher_trophy/proc/effect_desc() + return "errors" + +/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user) + if(istype(A, /obj/item/twohanded/kinetic_crusher)) + add_to(A, user) + else + ..() + +/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + for(var/t in H.trophies) + var/obj/item/crusher_trophy/T = t + if(istype(T, denied_type) || istype(src, T.denied_type)) + to_chat(user, "You can't seem to attach [src] to [H]. Maybe remove a few trophies?") + return FALSE + if(!user.drop_item()) + return + forceMove(H) + H.trophies += src + to_chat(user, "You attach [src] to [H].") + return TRUE + +/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + forceMove(get_turf(H)) + H.trophies -= src + return TRUE + +/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user + +/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user + +/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before + +/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user + +//goliath +/obj/item/crusher_trophy/goliath_tentacle + name = "goliath tentacle" + desc = "A sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher." + icon_state = "goliath_tentacle" + denied_type = /obj/item/crusher_trophy/goliath_tentacle + bonus_value = 2 + var/missing_health_ratio = 0.1 + var/missing_health_desc = 10 + +/obj/item/crusher_trophy/goliath_tentacle/effect_desc() + return "mark detonation to do [bonus_value] more damage for every [missing_health_desc] health you are missing" + +/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user) + var/missing_health = user.health - user.maxHealth + missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health + missing_health *= bonus_value //multiply the remaining amount by bonus_value + if(missing_health > 0) + target.adjustBruteLoss(missing_health) //and do that much damage + +//watcher +/obj/item/crusher_trophy/watcher_wing + name = "watcher wing" + desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher." + icon_state = "watcher_wing" + denied_type = /obj/item/crusher_trophy/watcher_wing + bonus_value = 5 + +/obj/item/crusher_trophy/watcher_wing/effect_desc() + return "mark detonation to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s" + +/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user) + if(ishostile(target)) + var/mob/living/simple_animal/hostile/H = target + if(H.ranged) //briefly delay ranged attacks + if(H.ranged_cooldown >= world.time) + H.ranged_cooldown += bonus_value + else + H.ranged_cooldown = bonus_value + world.time + +//magmawing watcher +/obj/item/crusher_trophy/blaster_tubes/magma_wing + name = "magmawing watcher wing" + desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher." + icon_state = "magma_wing" + gender = NEUTER + bonus_value = 5 + +/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc() + return "mark detonation to make the next destabilizer shot deal [bonus_value] damage" + +/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) + if(deadly_shot) + marker.name = "heated [marker.name]" + marker.icon_state = "lava" + marker.damage = bonus_value + marker.nodamage = FALSE + deadly_shot = FALSE + +//icewing watcher +/obj/item/crusher_trophy/watcher_wing/ice_wing + name = "icewing watcher wing" + desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher." + icon_state = "ice_wing" + bonus_value = 8 + +//legion +/obj/item/crusher_trophy/legion_skull + name = "legion skull" + desc = "A dead and lifeless legion skull. Suitable as a trophy for a kinetic crusher." + icon_state = "legion_skull" + denied_type = /obj/item/crusher_trophy/legion_skull + bonus_value = 3 + +/obj/item/crusher_trophy/legion_skull/effect_desc() + return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster" + +/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + . = ..() + if(.) + H.charge_time -= bonus_value + +/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + . = ..() + if(.) + H.charge_time += bonus_value + +//blood-drunk hunter +/obj/item/crusher_trophy/miner_eye + name = "eye of a blood-drunk hunter" + desc = "Its pupil is collapsed and turned to mush. Suitable as a trophy for a kinetic crusher." + icon_state = "hunter_eye" + denied_type = /obj/item/crusher_trophy/miner_eye + +/obj/item/crusher_trophy/miner_eye/effect_desc() + return "mark detonation to grant stun immunity and 90% damage reduction for 1 second" + +/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user) + user.apply_status_effect(STATUS_EFFECT_BLOODDRUNK) + +//ash drake +/obj/item/crusher_trophy/tail_spike + desc = "A spike taken from an ash drake's tail. Suitable as a trophy for a kinetic crusher." + denied_type = /obj/item/crusher_trophy/tail_spike + bonus_value = 5 + +/obj/item/crusher_trophy/tail_spike/effect_desc() + return "mark detonation to do [bonus_value] damage to nearby creatures and push them back" + +/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user) + for(var/mob/living/L in oview(2, user)) + if(L.stat == DEAD) + continue + playsound(L, 'sound/magic/fireball.ogg', 20, 1) + new /obj/effect/temp_visual/fire(L.loc) + addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done + L.adjustFireLoss(bonus_value) + +/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) + if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed + step(target, get_dir(user, target)) + +//bubblegum +/obj/item/crusher_trophy/demon_claws + name = "demon claws" + desc = "A set of blood-drenched claws from a massive demon's hand. Suitable as a trophy for a kinetic crusher." + icon_state = "demon_claws" + gender = PLURAL + denied_type = /obj/item/crusher_trophy/demon_claws + bonus_value = 10 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/crusher_trophy/demon_claws/effect_desc() + return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation" + +/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + . = ..() + if(.) + H.force += bonus_value * 0.2 + H.force_unwielded += bonus_value * 0.2 + H.force_wielded += bonus_value * 0.2 + H.detonation_damage += bonus_value * 0.8 + +/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user) + . = ..() + if(.) + H.force -= bonus_value * 0.2 + H.force_unwielded -= bonus_value * 0.2 + H.force_wielded -= bonus_value * 0.2 + H.detonation_damage -= bonus_value * 0.8 + +/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user) + user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order) + +/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user) + user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order) + +//colossus +/obj/item/crusher_trophy/blaster_tubes + name = "blaster tubes" + desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher." + icon_state = "blaster_tubes" + gender = PLURAL + denied_type = /obj/item/crusher_trophy/blaster_tubes + bonus_value = 15 + var/deadly_shot = FALSE + +/obj/item/crusher_trophy/blaster_tubes/effect_desc() + return "mark detonation to make the next destabilizer shot deal [bonus_value] damage but move slower" + +/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) + if(deadly_shot) + marker.name = "deadly [marker.name]" + marker.icon_state = "chronobolt" + marker.damage = bonus_value + marker.nodamage = FALSE + marker.speed = 2 + deadly_shot = FALSE + +/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) + deadly_shot = TRUE + addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot() + deadly_shot = FALSE + +//hierophant +/obj/item/crusher_trophy/vortex_talisman + name = "vortex talisman" + desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher." + icon_state = "vortex_talisman" + denied_type = /obj/item/crusher_trophy/vortex_talisman + +/obj/item/crusher_trophy/vortex_talisman/effect_desc() + return "mark detonation to create a barrier you can pass" + +/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) + var/turf/T = get_turf(user) + new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! + var/turf/otherT = get_step(T, turn(user.dir, 90)) + if(otherT) + new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + otherT = get_step(T, turn(user.dir, -90)) + if(otherT) + new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + +/obj/effect/temp_visual/hierophant/wall/crusher + duration = 75 \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9d6ca608759..ef7a74f5d60 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -400,54 +400,57 @@ density = 1 anchored = 1.0 var/obj/item/card/id/inserted_id - var/list/prize_list = list( - new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50), - new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50), - new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200), - new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), - new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400), - new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500), - new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400), - new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/mine_bot_upgrade/health, 400), - new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/mine_bot_upgrade/cooldown, 600), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), - new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), - new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), - new /datum/data/mining_equipment("Explorer\'s Webbing", /obj/item/storage/belt/mining, 500), - new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), - new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), - new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), - new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), - new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), - new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), - new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), - new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/storage/box/mininghardsuit, 2000), - new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), - new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), - new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), - new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), - new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), - new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), - new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), - new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), - new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), - new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1000), + var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. + new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), + new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), + new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), + new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), + new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100), + new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), + new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), + new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), + new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), + new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), + new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), + new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), + new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), + new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500), + new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), + new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), + new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750), + new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), + new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), + new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000), + new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), + new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), + new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500), + new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000), + new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/storage/box/mininghardsuit, 2000), + new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), + new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), + new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), + new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800), + new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), + new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), + new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600), + new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), + new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100), + new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), + new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), + new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), + new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), + new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), + new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), + new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), + new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), + new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), + new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000) ) /obj/machinery/mineral/equipment_vendor/golem @@ -474,7 +477,9 @@ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000), + new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000), new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) + ) /datum/data/mining_equipment @@ -597,16 +602,14 @@ ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/items = list("Kinetic Accelerator", "Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Crusher Kit", "Mining Conscription Kit", "Advanced Scanner") + var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) return - var/drop_location = loc + var/drop_location = drop_location() switch(selection) - if("Kinetic Accelerator") - new /obj/item/gun/energy/kinetic_accelerator(drop_location) if("Survival Capsule and Explorer's Webbing") new /obj/item/storage/belt/mining(drop_location) if("Resonator Kit") @@ -616,13 +619,15 @@ new /obj/item/mining_drone_cube(drop_location) new /obj/item/weldingtool/hugetank(drop_location) new /obj/item/clothing/head/welding(drop_location) + if("Extraction and Rescue Kit") + new /obj/item/extraction_pack(drop_location) + new /obj/item/fulton_core(drop_location) + new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") new /obj/item/extinguisher/mini(drop_location) - new /obj/item/twohanded/required/kinetic_crusher(drop_location) + new /obj/item/twohanded/kinetic_crusher(drop_location) if("Mining Conscription Kit") new /obj/item/storage/backpack/duffel/mining_conscript(drop_location) - if("Advanced Scanner") - new /obj/item/t_scanner/adv_mining_scanner(drop_location) qdel(voucher) @@ -686,14 +691,16 @@ /obj/item/storage/backpack/duffel/mining_conscript/New() ..() - new /obj/item/pickaxe(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/suit/hooded/explorer(src) new /obj/item/encryptionkey/headset_cargo(src) - new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/id/mining_access_card(src) + new /obj/item/gun/energy/kinetic_accelerator(src) + new /obj/item/kitchen/knife/combat/survival(src) + new /obj/item/flashlight/seclite(src) /**********************Jaunter**********************/ @@ -784,30 +791,20 @@ origin_tech = "magnets=3;engineering=3" desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vaccuum." w_class = WEIGHT_CLASS_NORMAL - force = 8 + force = 15 throwforce = 10 - var/cooldown = 0 - var/fieldsactive = 0 - var/burst_time = 50 - var/fieldlimit = 3 + var/burst_time = 30 + var/fieldlimit = 4 + var/list/fields = list() + var/quick_burst_mod = 0.8 /obj/item/resonator/upgraded name = "upgraded resonator" desc = "An upgraded version of the resonator that can produce more fields at once." icon_state = "resonator_u" origin_tech = "materials=4;powerstorage=3;engineering=3;magnets=3" - fieldlimit = 5 - -/obj/item/resonator/proc/CreateResonance(var/target, var/creator) - var/turf/T = get_turf(target) - if(locate(/obj/effect/resonance) in T) - return - if(fieldsactive < fieldlimit) - playsound(src,'sound/weapons/resonator_fire.ogg',50,1) - new /obj/effect/resonance(T, creator, burst_time) - fieldsactive++ - spawn(burst_time) - fieldsactive-- + fieldlimit = 6 + quick_burst_mod = 1 /obj/item/resonator/attack_self(mob/user) if(burst_time == 50) @@ -817,48 +814,88 @@ burst_time = 50 to_chat(user, "You set the resonator's fields to detonate after 5 seconds.") -/obj/item/resonator/afterattack(atom/target, mob/user, proximity_flag) - if(proximity_flag) - if(!check_allowed_items(target, 1)) return - CreateResonance(target, user) +/obj/item/resonator/proc/CreateResonance(target, mob/user) + var/turf/T = get_turf(target) + var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T + if(R) + R.damage_multiplier = quick_burst_mod + R.burst() + return + if(LAZYLEN(fields) < fieldlimit) + new /obj/effect/temp_visual/resonance(T, user, src, burst_time) + user.changeNext_move(CLICK_CD_MELEE) -/obj/effect/resonance +/obj/item/resonator/pre_attackby(atom/target, mob/user, params) + if(check_allowed_items(target, 1)) + CreateResonance(target, user) + return TRUE + +/obj/effect/temp_visual/resonance name = "resonance field" - desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures." + desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments." icon = 'icons/effects/effects.dmi' icon_state = "shield1" - layer = 4.1 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT + duration = 50 var/resonance_damage = 20 + var/damage_multiplier = 1 + var/creator + var/obj/item/resonator/res -/obj/effect/resonance/New(loc, var/creator = null, var/timetoburst) - var/turf/proj_turf = get_turf(src) - if(!istype(proj_turf)) - return - if(istype(proj_turf, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = proj_turf - spawn(timetoburst) - playsound(src,'sound/weapons/resonator_blast.ogg',50,1) - M.gets_drilled(creator) - qdel(src) +/obj/effect/temp_visual/resonance/New(loc, set_creator, set_resonator, set_duration) + duration = set_duration + . = ..() + creator = set_creator + res = set_resonator + if(res) + res.fields += src + playsound(src,'sound/weapons/resonator_fire.ogg',50,1) + transform = matrix() * 0.75 + animate(src, transform = matrix() * 1.5, time = duration) + deltimer(timerid) + timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE) + +/obj/effect/temp_visual/resonance/Destroy() + if(res) + res.fields -= src + res = null + creator = null + return ..() + +/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf) + if(!proj_turf) + proj_turf = get_turf(src) + resonance_damage = initial(resonance_damage) + if(lavaland_equipment_pressure_check(proj_turf)) + name = "strong [initial(name)]" + resonance_damage *= 3 else - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure < 50) - name = "strong resonance field" - resonance_damage = 50 - spawn(timetoburst) - playsound(src,'sound/weapons/resonator_blast.ogg',50,1) - if(creator) - for(var/mob/living/L in src.loc) - add_attack_logs(creator, L, "Resonance field'ed") - to_chat(L, "The [src.name] ruptured with you in it!") - L.adjustBruteLoss(resonance_damage) - else - for(var/mob/living/L in src.loc) - to_chat(L, "The [src.name] ruptured with you in it!") - L.adjustBruteLoss(resonance_damage) - qdel(src) + name = initial(name) + resonance_damage *= damage_multiplier + +/obj/effect/temp_visual/resonance/proc/burst() + var/turf/T = get_turf(src) + new /obj/effect/temp_visual/resonance_crush(T) + if(ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.gets_drilled(creator) + check_pressure(T) + playsound(T,'sound/weapons/resonator_blast.ogg',50,1) + for(var/mob/living/L in T) + if(creator) + add_attack_logs(creator, L, "Resonance field'ed") + to_chat(L, "[src] ruptured with you in it!") + L.apply_damage(resonance_damage, BRUTE) + qdel(src) + +/obj/effect/temp_visual/resonance_crush + icon_state = "shield1" + layer = ABOVE_ALL_MOB_LAYER + duration = 4 + +/obj/effect/temp_visual/resonance_crush/New() + ..() + transform = matrix()*1.5 + animate(src, transform = matrix() * 0.1, alpha = 50, time = 4) /**********************Facehugger toy**********************/ @@ -1111,103 +1148,4 @@ return ..() C.preserved = 1 to_chat(user, "You inject the hivelord core with the stabilizer. It will no longer go inert.") - qdel(src) - -/*********************Mining Hammer****************/ -/obj/item/twohanded/required/kinetic_crusher - icon = 'icons/obj/mining.dmi' - icon_state = "mining_hammer1" - item_state = "mining_hammer1" - name = "proto-kinetic crusher" - desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club.\ - While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna. \ - \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \ - This weapon is only particularly effective against large creatures." - force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times - w_class = WEIGHT_CLASS_BULKY - slot_flags = SLOT_BACK - force_unwielded = 20 //It's never not wielded so these are the same - force_wielded = 20 - throwforce = 5 - throw_speed = 4 - light_range = 4 - armour_penetration = 10 - materials = list(MAT_METAL=1150, MAT_GLASS=2075) - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb = list("smashes", "crushes", "cleaves", "chops", "pulps") - sharp = 1 - var/charged = 1 - var/charge_time = 16 - var/atom/mark = null - var/marked_image = null - -/obj/item/projectile/destabilizer - name = "destabilizing force" - icon_state = "pulse1" - damage = 0 //We're just here to mark people. This is still a melee weapon. - damage_type = BRUTE - flag = "bomb" - range = 6 - var/obj/item/twohanded/required/kinetic_crusher/hammer_synced = null - -/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0, hit_zone) - if(hammer_synced) - if(hammer_synced.mark == target) - return ..() - if(isliving(target)) - if(hammer_synced.mark && hammer_synced.marked_image) - hammer_synced.mark.underlays -= hammer_synced.marked_image - hammer_synced.marked_image = null - var/mob/living/L = target - if(L.mob_size >= MOB_SIZE_LARGE) - hammer_synced.mark = L - var/image/I = image('icons/effects/effects.dmi', loc = L, icon_state = "shield2",pixel_y = (-L.pixel_y),pixel_x = (-L.pixel_x)) - L.underlays += I - hammer_synced.marked_image = I - var/target_turf = get_turf(target) - if(istype(target_turf, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = target_turf - new /obj/effect/temp_visual/kinetic_blast(M) - M.gets_drilled(firer) - ..() - -/obj/item/twohanded/required/kinetic_crusher/afterattack(atom/target, mob/user, proximity_flag) - if(!proximity_flag && charged)//Mark a target, or mine a tile. - var/turf/proj_turf = get_turf(src) - if(!istype(proj_turf, /turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure > 50) - playsound(user, 'sound/weapons/empty.ogg', 100, 1) - return - var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(user.loc) - D.preparePixelProjectile(target,get_turf(target), user) - D.hammer_synced = src - playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) - D.fire() - charged = 0 - icon_state = "mining_hammer1_uncharged" - spawn(charge_time) - Recharge() - return - if(proximity_flag && target == mark && isliving(target)) - var/mob/living/L = target - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - mark = 0 - if(L.mob_size >= MOB_SIZE_LARGE) - L.underlays -= marked_image - QDEL_NULL(marked_image) - var/backstab = check_target_facings(user, L) - var/def_check = L.getarmor(type = "bomb") - if(backstab == FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR || backstab == FACING_SAME_DIR) - L.apply_damage(80, BRUTE, blocked = def_check) - playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong - else - L.apply_damage(50, BRUTE, blocked = def_check) - -/obj/item/twohanded/required/kinetic_crusher/proc/Recharge() - if(!charged) - charged = 1 - icon_state = "mining_hammer1" - playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) + qdel(src) \ No newline at end of file diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm index a9464efe959..566694d480d 100644 --- a/code/modules/mining/explorer_gear.dm +++ b/code/modules/mining/explorer_gear.dm @@ -41,4 +41,57 @@ "Drask" = 'icons/mob/species/drask/head.dmi', "Grey" = 'icons/mob/species/grey/head.dmi', "Skrell" = 'icons/mob/species/skrell/head.dmi' - ) \ No newline at end of file + ) + +/obj/item/clothing/suit/space/hostile_environment + name = "H.E.C.K. suit" + desc = "Hostile Environment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner." + icon_state = "hostile_env" + item_state = "hostile_env" + flags = THICKMATERIAL //not spaceproof + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + burn_state = FIRE_PROOF | LAVA_PROOF + slowdown = 0 + armor = list(melee = 70, bullet = 40, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 100) + allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) + +/obj/item/clothing/suit/space/hostile_environment/New() + ..() + AddComponent(/datum/component/spraycan_paintable) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/space/hostile_environment/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/suit/space/hostile_environment/process() + var/mob/living/carbon/C = loc + if(istype(C) && prob(2)) //cursed by bubblegum + if(prob(15)) + new /obj/effect/hallucination/oh_yeah(get_turf(C), C) + to_chat(C, "[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]") + else + to_chat(C, "[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]") + +/obj/item/clothing/head/helmet/space/hostile_environment + name = "H.E.C.K. helmet" + desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner." + icon_state = "hostile_env" + item_state = "hostile_env" + w_class = WEIGHT_CLASS_NORMAL + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + flags = THICKMATERIAL // no space protection + armor = list(melee = 70, bullet = 40, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 100) + burn_state = FIRE_PROOF | LAVA_PROOF + +/obj/item/clothing/head/helmet/space/hostile_environment/New() + ..() + AddComponent(/datum/component/spraycan_paintable) + update_icon() + +/obj/item/clothing/head/helmet/space/hostile_environment/update_icon() + ..() + cut_overlays() + var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass") + glass_overlay.appearance_flags = RESET_COLOR + add_overlay(glass_overlay) \ No newline at end of file diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm new file mode 100644 index 00000000000..2d09c6a8e7a --- /dev/null +++ b/code/modules/mining/fulton.dm @@ -0,0 +1,195 @@ +GLOBAL_LIST_EMPTY(total_extraction_beacons) + +/obj/item/extraction_pack + name = "fulton extraction pack" + desc = "A balloon that can be used to extract equipment or personnel to a Fulton Recovery Beacon. Anything not bolted down can be moved. Link the pack to a beacon by using the pack in hand." + icon = 'icons/obj/fulton.dmi' + icon_state = "extraction_pack" + w_class = WEIGHT_CLASS_NORMAL + var/obj/structure/extraction_point/beacon + var/list/beacon_networks = list("station") + var/uses_left = 3 + var/can_use_indoors + var/safe_for_living_creatures = TRUE + var/max_force_fulton = MOVE_FORCE_STRONG + +/obj/item/extraction_pack/examine(mob/user) + ..() + to_chat(user, "It has [uses_left] use\s remaining.") + +/obj/item/extraction_pack/attack_self(mob/user) + var/list/possible_beacons = list() + for(var/B in GLOB.total_extraction_beacons) + var/obj/structure/extraction_point/EP = B + if(EP.beacon_network in beacon_networks) + possible_beacons += EP + + if(!possible_beacons.len) + to_chat(user, "There are no extraction beacons in existence!") + return + + else + var/A + + A = input("Select a beacon to connect to", "Balloon Extraction Pack", A) as null|anything in possible_beacons + + if(!A) + return + beacon = A + to_chat(user, "You link the extraction pack to the beacon system.") + +/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params) + . = ..() + if(!beacon) + to_chat(user, "[src] is not linked to a beacon, and cannot be used!") + return + if(!can_use_indoors) + var/area/area = get_area(A) + if(!area.outdoors) + to_chat(user, "[src] can only be used on things that are outdoors!") + return + if(!flag) + return + if(!istype(A)) + return + else + if(!safe_for_living_creatures && check_for_living_mobs(A)) + to_chat(user, "[src] is not safe for use with living creatures, they wouldn't survive the trip back!") + return + if(!isturf(A.loc)) // no extracting stuff inside other stuff + return + if(A.anchored || (A.move_resist > max_force_fulton)) + return + to_chat(user, "You start attaching the pack to [A]...") + if(do_after(user, 50, target = A)) + to_chat(user, "You attach the pack to [A] and activate it.") + if(loc == user && istype(user.back, /obj/item/storage/backpack)) + var/obj/item/storage/backpack/B = user.back + if(B.can_be_inserted(src, stop_messages = TRUE)) + B.handle_item_insertion(src) + uses_left-- + if(uses_left <= 0) + user.drop_item(src) + forceMove(A) + var/mutable_appearance/balloon + var/mutable_appearance/balloon2 + var/mutable_appearance/balloon3 + if(isliving(A)) + var/mob/living/M = A + M.Weaken(16) // Keep them from moving during the duration of the extraction + M.buckled = 0 // Unbuckle them to prevent anchoring problems + else + A.anchored = TRUE + A.density = FALSE + var/obj/effect/extraction_holder/holder_obj = new(A.loc) + holder_obj.appearance = A.appearance + A.forceMove(holder_obj) + balloon2 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_expand") + balloon2.pixel_y = 10 + balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + holder_obj.add_overlay(balloon2) + sleep(4) + balloon = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_balloon") + balloon.pixel_y = 10 + balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + holder_obj.cut_overlay(balloon2) + holder_obj.add_overlay(balloon) + playsound(holder_obj.loc, 'sound/items/fultext_deploy.ogg', 50, 1, -3) + animate(holder_obj, pixel_z = 10, time = 20) + sleep(20) + animate(holder_obj, pixel_z = 15, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 10, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 15, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 10, time = 10) + sleep(10) + playsound(holder_obj.loc, 'sound/items/fultext_launch.ogg', 50, 1, -3) + animate(holder_obj, pixel_z = 1000, time = 30) + if(ishuman(A)) + var/mob/living/carbon/human/L = A + L.SetParalysis(0) + L.drowsyness = 0 + L.SetSleeping(0) + sleep(30) + var/list/flooring_near_beacon = list() + for(var/turf/floor in orange(1, beacon)) + if(floor.density) + continue + flooring_near_beacon += floor + holder_obj.forceMove(pick(flooring_near_beacon)) + animate(holder_obj, pixel_z = 10, time = 50) + sleep(50) + animate(holder_obj, pixel_z = 15, time = 10) + sleep(10) + animate(holder_obj, pixel_z = 10, time = 10) + sleep(10) + balloon3 = mutable_appearance('icons/obj/fulton_balloon.dmi', "fulton_retract") + balloon3.pixel_y = 10 + balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + holder_obj.cut_overlay(balloon) + holder_obj.add_overlay(balloon3) + sleep(4) + holder_obj.cut_overlay(balloon3) + A.anchored = FALSE // An item has to be unanchored to be extracted in the first place. + A.density = initial(A.density) + animate(holder_obj, pixel_z = 0, time = 5) + sleep(5) + A.forceMove(holder_obj.loc) + qdel(holder_obj) + if(uses_left <= 0) + qdel(src) + + +/obj/item/fulton_core + name = "extraction beacon signaller" + desc = "Emits a signal which fulton recovery devices can lock onto. Activate in hand to create a beacon." + icon = 'icons/obj/stock_parts.dmi' + icon_state = "subspace_amplifier" + +/obj/item/fulton_core/attack_self(mob/user) + if(do_after(user, 15, target = user) && !QDELETED(src)) + new /obj/structure/extraction_point(get_turf(user)) + qdel(src) + +/obj/structure/extraction_point + name = "fulton recovery beacon" + desc = "A beacon for the fulton recovery system. Activate a pack in your hand to link it to a beacon." + icon = 'icons/obj/fulton.dmi' + icon_state = "extraction_point" + anchored = TRUE + density = FALSE + var/beacon_network = "station" + +/obj/structure/extraction_point/New() + ..() + name += " ([rand(100,999)]) ([get_location_name(src)])" + GLOB.total_extraction_beacons += src + +/obj/structure/extraction_point/Destroy() + GLOB.total_extraction_beacons -= src + return ..() + +/obj/effect/extraction_holder + name = "extraction holder" + desc = "you shouldnt see this" + var/atom/movable/stored_obj + +/obj/item/extraction_pack/proc/check_for_living_mobs(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.stat != DEAD) + return TRUE + for(var/thing in A.GetAllContents()) + if(isliving(A)) + var/mob/living/L = A + if(L.stat != DEAD) + return TRUE + return FALSE + +/obj/effect/extraction_holder/singularity_pull() + return + +/obj/effect/extraction_holder/singularity_pull() + return \ No newline at end of file diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 4f8f01498d0..6a30c565547 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -15,6 +15,15 @@ if(4) new /obj/item/dragons_blood(src) + +/obj/structure/closet/crate/necropolis/dragon/crusher + name = "firey dragon chest" + +/obj/structure/closet/crate/necropolis/dragon/crusher/New() + ..() + new /obj/item/crusher_trophy/tail_spike(src) + + // Spectral Blade /obj/item/melee/ghost_sword diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm index bb0031ea77d..6cc33e1ad92 100644 --- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -3,6 +3,8 @@ /obj/structure/closet/crate/necropolis/bubblegum/New() ..() + new /obj/item/clothing/suit/space/hostile_environment(src) + new /obj/item/clothing/head/helmet/space/hostile_environment(src) var/loot = rand(1,3) switch(loot) if(1) @@ -12,6 +14,13 @@ if(3) new /obj/item/gun/magic/staff/spellblade(src) +/obj/structure/closet/crate/necropolis/bubblegum/crusher + name = "bloody bubblegum chest" + +/obj/structure/closet/crate/necropolis/bubblegum/crusher/New() + ..() + new /obj/item/crusher_trophy/demon_claws(src) + // Mayhem /obj/item/mayhem diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 2490f6f48db..9b6bd8c5893 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -1,3 +1,22 @@ +//Colossus +/obj/structure/closet/crate/necropolis/colossus + name = "colossus chest" + +/obj/structure/closet/crate/necropolis/colossus/New() + ..() + var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) + var/random_crystal = pick(choices) + new random_crystal(src) + new /obj/item/organ/internal/vocal_cords/colossus(src) + +/obj/structure/closet/crate/necropolis/colossus/crusher + name = "angelic colossus chest" + +/obj/structure/closet/crate/necropolis/colossus/crusher/New() + ..() + new /obj/item/crusher_trophy/blaster_tubes(src) + + //Black Box /obj/machinery/smartfridge/black_box diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 7eed5577aeb..ab9b7979d03 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -8,18 +8,18 @@ icon_closed = "necrocrate" burn_state = LAVA_PROOF | FIRE_PROOF unacidable = 1 - + /obj/structure/closet/crate/necropolis/tendril desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/New(add_loot = TRUE) ..() - + if(!add_loot) return - var/loot = rand(1,24) - switch(loot) + var/loot = rand(1,25) + switch(loot) if(1) new /obj/item/shared_storage/red(src) if(2) @@ -37,7 +37,10 @@ new /obj/item/clothing/suit/hooded/cultrobes(src) new /obj/item/bedsheet/cult(src) if(8) - new /obj/item/organ/internal/brain/xeno(src) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) + else + new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) if(9) new /obj/item/organ/internal/heart/cursed/wizard(src) if(10) @@ -54,7 +57,10 @@ if(15) new /obj/item/guardiancreator(src) if(16) - new /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs(src) + if(prob(50)) + new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) + else + new /obj/item/disk/design_disk/modkit_disc/bounty(src) if(17) new /obj/item/warp_cube/red(src) if(18) @@ -73,6 +79,9 @@ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) if(24) new /obj/item/spellbook/oneuse/summonitem(src) + if(25) + new /obj/item/borg/upgrade/modkit/lifesteal(src) + new /obj/item/bedsheet/cult(src) /obj/structure/closet/crate/necropolis/puzzle name = "puzzling chest" @@ -88,3 +97,63 @@ new /obj/item/wisp_lantern(src) if(3) new /obj/item/prisoncube(src) + +//KA modkit design discs +/obj/item/disk/design_disk/modkit_disc + name = "KA Mod Disk" + desc = "A design disc containing the design for a unique kinetic accelerator modkit. It's compatible with a research console." + icon_state = "datadisk1" + var/modkit_design = /datum/design/unique_modkit + +/obj/item/disk/design_disk/modkit_disc/New() + . = ..() + blueprint = new modkit_design + +/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe + name = "Offensive Mining Explosion Mod Disk" + modkit_design = /datum/design/unique_modkit/offensive_turf_aoe + +/obj/item/disk/design_disk/modkit_disc/rapid_repeater + name = "Rapid Repeater Mod Disk" + modkit_design = /datum/design/unique_modkit/rapid_repeater + +/obj/item/disk/design_disk/modkit_disc/resonator_blast + name = "Resonator Blast Mod Disk" + modkit_design = /datum/design/unique_modkit/resonator_blast + +/obj/item/disk/design_disk/modkit_disc/bounty + name = "Death Syphon Mod Disk" + modkit_design = /datum/design/unique_modkit/bounty + +/datum/design/unique_modkit + category = list("Mining", "Cyborg Upgrade Modules") //can't be normally obtained + build_type = PROTOLATHE | MECHFAB + +/datum/design/unique_modkit/offensive_turf_aoe + name = "Kinetic Accelerator Offensive Mining Explosion Mod" + desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures." + id = "hyperaoemod" + materials = list(MAT_METAL = 7000, MAT_GLASS = 3000, MAT_SILVER= 3000, MAT_GOLD = 3000, MAT_DIAMOND = 4000) + build_path = /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs + +/datum/design/unique_modkit/rapid_repeater + name = "Kinetic Accelerator Rapid Repeater Mod" + desc = "A device which greatly reduces a kinetic accelerator's cooldown on striking a living target or rock, but greatly increases its base cooldown." + id = "repeatermod" + materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_URANIUM = 8000, MAT_BLUESPACE = 2000) + build_path = /obj/item/borg/upgrade/modkit/cooldown/repeater + +/datum/design/unique_modkit/resonator_blast + name = "Kinetic Accelerator Resonator Blast Mod" + desc = "A device which causes kinetic accelerators to fire shots that leave and detonate resonator blasts." + id = "resonatormod" + materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_SILVER= 5000, MAT_URANIUM = 5000) + build_path = /obj/item/borg/upgrade/modkit/resonator_blasts + +/datum/design/unique_modkit/bounty + name = "Kinetic Accelerator Death Syphon Mod" + desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it." + id = "bountymod" + materials = list(MAT_METAL = 4000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 4000) + reagents_list = list("blood" = 40) + build_path = /obj/item/borg/upgrade/modkit/bounty \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index f10b78dc526..87b919ea238 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -17,35 +17,20 @@ icon_closed = "mixed" /obj/structure/closet/wardrobe/miner/New() - ..() - contents = list() - new /obj/item/storage/backpack/duffel(src) - new /obj/item/storage/backpack/industrial(src) - new /obj/item/storage/backpack/satchel_eng(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/shoes/workboots(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/gloves/fingerless(src) - -/obj/structure/closet/wardrobe/miner/lavaland - -/obj/structure/closet/wardrobe/miner/lavaland/New() ..() contents = list() new /obj/item/storage/backpack/duffel(src) new /obj/item/storage/backpack/explorer(src) - new /obj/item/storage/backpack/explorer(src) + new /obj/item/storage/backpack/satchel/explorer(src) new /obj/item/clothing/under/rank/miner/lavaland(src) new /obj/item/clothing/under/rank/miner/lavaland(src) new /obj/item/clothing/under/rank/miner/lavaland(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/gloves/color/black(src) + new /obj/item/clothing/gloves/color/black(src) + new /obj/item/clothing/gloves/color/black(src) /obj/structure/closet/secure_closet/miner name = "miner's equipment" @@ -59,14 +44,18 @@ /obj/structure/closet/secure_closet/miner/New() ..() +// new /obj/item/stack/sheet/mineral/sandbags(src, 5) +// new /obj/item/storage/box/emptysandbags(src) new /obj/item/shovel(src) - new /obj/item/pickaxe(src) + new /obj/item/pickaxe/mini(src) new /obj/item/radio/headset/headset_cargo/mining(src) - new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/flashlight/seclite(src) + new /obj/item/storage/bag/plants(src) new /obj/item/storage/bag/ore(src) + new /obj/item/t_scanner/adv_mining_scanner/lesser(src) + new /obj/item/gun/energy/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/survivalcapsule(src) - new /obj/item/stack/marker_beacon/ten /**********************Shuttle Computer**************************/ @@ -122,6 +111,15 @@ throwforce = 1 attack_verb = list("ineffectively hit") +/obj/item/pickaxe/mini + name = "compact pickaxe" + desc = "A smaller, compact version of the standard pickaxe." + icon_state = "minipick" + force = 10 + throwforce = 7 + w_class = WEIGHT_CLASS_NORMAL + materials = list(MAT_METAL = 1000) + /obj/item/pickaxe/silver name = "silver-plated pickaxe" icon_state = "spickaxe" diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 5b20aad5047..2ff2a686439 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -5,6 +5,7 @@ /mob/living/simple_animal/hostile/mining_drone name = "nanotrasen minebot" desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder." + gender = NEUTER icon = 'icons/obj/aibots.dmi' icon_state = "mining_drone" icon_living = "mining_drone" @@ -14,36 +15,31 @@ a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 - wander = 0 idle_vision_range = 5 move_to_delay = 10 - retreat_distance = 1 - minimum_distance = 2 health = 125 maxHealth = 125 melee_damage_lower = 15 melee_damage_upper = 15 - obj_damage = 0 + obj_damage = 10 environment_smash = 0 - check_friendly_fire = 1 - stop_automated_movement_when_pulled = 1 + check_friendly_fire = TRUE + stop_automated_movement_when_pulled = TRUE attacktext = "drills" attack_sound = 'sound/weapons/circsawhit.ogg' - ranged = 1 sentience_type = SENTIENCE_MINEBOT - ranged_message = "shoots" - ranged_cooldown_time = 30 - projectiletype = /obj/item/projectile/kinetic - projectilesound = 'sound/weapons/gunshots/gunshot4.ogg' speak_emote = list("states") wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, /obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron, /obj/item/stack/ore/bananium, /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/glass, /obj/item/stack/ore/titanium) healable = 0 + loot = list(/obj/effect/decal/cleanable/robot_debris) + del_on_death = TRUE var/mode = MINEDRONE_COLLECT var/light_on = 0 var/mesons_active + var/obj/item/gun/energy/kinetic_accelerator/minebot/stored_gun var/datum/action/innate/minedrone/toggle_light/toggle_light_action var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action @@ -52,6 +48,8 @@ /mob/living/simple_animal/hostile/mining_drone/New() ..() + stored_gun = new(src) + zone_sel = new /obj/screen/zone_sel(src) //Gross, but necessary TO-DO; remove this. toggle_light_action = new() toggle_light_action.Grant(src) toggle_meson_vision_action = new() @@ -72,8 +70,27 @@ ..() check_friendly_fire = 0 +/mob/living/simple_animal/hostile/mining_drone/examine(mob/user) + . = ..() + var/t_He = p_they(TRUE) + var/t_him = p_them() + var/t_s = p_s() + if(health < maxHealth) + if(health >= maxHealth * 0.5) + . += "[t_He] look[t_s] slightly dented." + else + . += "[t_He] look[t_s] severely dented!" + . += {"Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore\n + Field repairs can be done with a welder."} + if(stored_gun && stored_gun.max_mod_capacity) + . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining." + for(var/A in stored_gun.get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A + . += "There is \a [M] installed, using [M.cost]% capacity." + + /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) + if(iswelder(I) && user.a_intent == INTENT_HELP) var/obj/item/weldingtool/W = I if(W.welding && !stat) if(AIStatus != AI_OFF && AIStatus != AI_IDLE) @@ -90,29 +107,18 @@ to_chat(user, "You instruct [src] to drop any collected ore.") DropOre() return + if(iscrowbar(I) || istype(I, /obj/item/borg/upgrade/modkit)) + I.melee_attack_chain(user, stored_gun, params) + return ..() /mob/living/simple_animal/hostile/mining_drone/death() - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - visible_message("[src] is destroyed!") - new /obj/effect/decal/cleanable/blood/gibs/robot(loc) DropOre(0) - qdel(src) - -/mob/living/simple_animal/hostile/mining_drone/Shoot(atom/targeted_atom) - var/obj/item/projectile/kinetic/K = ..() - var/turf/proj_turf = get_turf(K) - if(!isturf(proj_turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure > 50) - K.name = "weakened [K.name]" - - K.damage *= K.pressure_decrease + if(stored_gun) + for(var/obj/item/borg/upgrade/modkit/M in stored_gun.modkits) + M.uninstall(stored_gun) + deathmessage = "blows apart!" + . = ..() /mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M) if(M.a_intent == INTENT_HELP) @@ -125,12 +131,24 @@ return ..() +/mob/living/simple_animal/hostile/mining_drone/CanPass(atom/movable/O) + if(istype(O, /obj/item/projectile/kinetic)) + var/obj/item/projectile/kinetic/K = O + if(K.kinetic_gun) + for(var/A in K.kinetic_gun.get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A + if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough)) + return TRUE + if(istype(O, /obj/item/projectile/destabilizer)) + return TRUE + return ..() + /mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() mode = MINEDRONE_COLLECT idle_vision_range = 9 search_objects = 2 - wander = 1 - ranged = 0 + wander = TRUE + ranged = FALSE minimum_distance = 1 retreat_distance = null icon_state = "mining_drone" @@ -140,18 +158,25 @@ mode = MINEDRONE_ATTACK idle_vision_range = 7 search_objects = 0 - wander = 0 - ranged = 1 - retreat_distance = 1 - minimum_distance = 2 + wander = FALSE + ranged = TRUE + retreat_distance = 2 + minimum_distance = 1 icon_state = "mining_drone_offense" to_chat(src, "You are set to attack mode. You can now attack from range.") /mob/living/simple_animal/hostile/mining_drone/AttackingTarget() - if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT) + if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT) CollectOre() return - ..() + if(isliving(target)) + SetOffenseBehavior() + return ..() + +/mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/A) + if(CheckFriendlyFire(A)) + return + stored_gun.afterattack(A, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best? /mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() for(var/obj/item/stack/ore/O in range(1, src)) @@ -160,14 +185,12 @@ /mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1) if(!contents.len) if(message) - to_chat(src, "You attempt to dump your stored ore, but you have none.") + to_chat(src, "You attempt to dump your stored ore, but you have none.") return if(message) to_chat(src, "You dump your stored ore.") for(var/obj/item/stack/ore/O in contents) - contents -= O - O.forceMove(loc) - return + O.forceMove(drop_location()) /mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount) if(mode != MINEDRONE_ATTACK && amount > 0) @@ -176,13 +199,10 @@ /mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode() switch(mode) - if(MINEDRONE_COLLECT) - SetOffenseBehavior() if(MINEDRONE_ATTACK) SetCollectBehavior() - else //This should never happen. - mode = MINEDRONE_COLLECT - SetCollectBehavior() + else + SetOffenseBehavior() //Actions for sentient minebots @@ -264,41 +284,24 @@ if(M.melee_damage_upper != initial(M.melee_damage_upper)) to_chat(user, "[M] already has a combat upgrade installed!") return - M.melee_damage_lower = 22 - M.melee_damage_upper = 22 + M.melee_damage_lower += 7 + M.melee_damage_upper += 7 to_chat(user, "You upgrade [M]'s combat module.") qdel(src) //Health /obj/item/mine_bot_upgrade/health - name = "minebot chassis upgrade" + name = "minebot armor upgrade" /obj/item/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) if(M.maxHealth != initial(M.maxHealth)) to_chat(user, "[M] already has a reinforced chassis!") return - var/previous = M.maxHealth - M.maxHealth = 170 - M.health += M.maxHealth - previous - to_chat(user, "You reinforce [M]'s chassis.") + M.maxHealth += 45 + M.updatehealth() qdel(src) - -//Cooldown - -/obj/item/mine_bot_upgrade/cooldown - name = "minebot cooldown upgrade" - -/obj/item/mine_bot_upgrade/cooldown/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user) - if(M.ranged_cooldown_time != initial(M.ranged_cooldown_time)) - to_chat(user, "[M] already has a decreased weapon cooldown!") - return - M.ranged_cooldown_time = 10 - to_chat(user, "You upgrade [M]'s ranged weaponry, reducing its cooldown.") - qdel(src) - - //AI /obj/item/slimepotion/sentience/mining name = "minebot AI upgrade" @@ -307,6 +310,20 @@ icon = 'icons/obj/doors/door_assembly.dmi' sentience_type = SENTIENCE_MINEBOT origin_tech = "programming=6" + var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values + var/base_damage_add = 1 //this thus disables other minebot upgrades + var/base_speed_add = 1 + var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module + +/obj/item/slimepotion/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/SM) + if(istype(SM, /mob/living/simple_animal/hostile/mining_drone)) + var/mob/living/simple_animal/hostile/mining_drone/M = SM + M.maxHealth = initial(M.maxHealth) + base_health_add + M.melee_damage_lower = initial(M.melee_damage_lower) + base_damage_add + M.melee_damage_upper = initial(M.melee_damage_upper) + base_damage_add + M.move_to_delay = initial(M.move_to_delay) + base_speed_add + if(M.stored_gun) + M.stored_gun.overheat_time += base_cooldown_add #undef MINEDRONE_COLLECT #undef MINEDRONE_ATTACK diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 731f53c7838..7c80b93e5ee 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -29,6 +29,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/seedarkness = TRUE var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm var/ghost_orbit = GHOST_ORBIT_CIRCLE + var/health_scan = FALSE //does the ghost have health scanner mode on? by default it should be off /mob/dead/observer/New(var/mob/body=null, var/flags=1) set_invisibility(GLOB.observer_default_invisibility) @@ -236,6 +237,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 +419,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 +514,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.") @@ -537,6 +542,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set hidden = 1 to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/dead/observer/verb/toggle_health_scan() + set name = "Toggle Health Scan" + set desc = "Toggles whether you health-scan living beings on click" + set category = "Ghost" + + if(health_scan) //remove old huds + to_chat(src, "Health scan disabled.") + health_scan = FALSE + else + to_chat(src, "Health scan enabled.") + health_scan = TRUE + /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" set category = "Ghost" @@ -761,14 +779,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/incarnate_ghost() if(!client) return + var/mob/living/carbon/human/new_char = new(get_turf(src)) client.prefs.copy_to(new_char) if(mind) - mind.active = 1 + mind.active = TRUE mind.transfer_to(new_char) else new_char.key = key + return new_char + /mob/dead/observer/is_literate() return TRUE diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 475b7079444..4aef44444e9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -338,18 +338,9 @@ msg += "[p_they(TRUE)] [p_are()] mostly dessicated now, with only bones remaining of what used to be a person.\n" if(hasHUD(user,"security")) - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/criminal = "None" - if(wear_id) - var/obj/item/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name - if(perpname) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) @@ -361,18 +352,9 @@ msg += "Security records: \[View\] \[Add comment\]\n" if(hasHUD(user,"medical")) - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/medical = "None" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name - for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.general) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 643319dc8dd..0cd4b176e0b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -711,17 +711,9 @@ if(usr.incapacitated()) return var/found_record = 0 - var/perpname = "wot" - if(wear_id) - var/obj/item/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name + var/perpname = get_visible_name(TRUE) - if(perpname) + if(perpname != "Unknown") for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -758,17 +750,9 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -790,24 +774,16 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) if(R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"security")) read = 1 - if(length(R.fields["comments"])) + if(LAZYLEN(R.fields["comments"])) for(var/c in R.fields["comments"]) to_chat(usr, c) else @@ -821,15 +797,8 @@ if(hasHUD(usr,"security")) if(usr.incapacitated()) return - var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) + for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.security) @@ -852,17 +821,8 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" var/modified = 0 - - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) @@ -887,17 +847,9 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" var/read = 0 - - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) + for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) @@ -920,24 +872,16 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" + var/perpname = get_visible_name(TRUE) var/read = 0 - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) if(R.fields["id"] == E.fields["id"]) if(hasHUD(usr,"medical")) read = 1 - if(length(R.fields["comments"])) + if(LAZYLEN(R.fields["comments"])) for(var/c in R.fields["comments"]) to_chat(usr, c) else @@ -951,15 +895,7 @@ if(hasHUD(usr,"medical")) if(usr.incapacitated()) return - var/perpname = "wot" - if(wear_id) - if(istype(wear_id,/obj/item/card/id)) - perpname = wear_id:registered_name - else if(istype(wear_id,/obj/item/pda)) - var/obj/item/pda/tempPda = wear_id - perpname = tempPda.owner - else - perpname = src.name + var/perpname = get_visible_name(TRUE) for(var/datum/data/record/E in data_core.general) if(E.fields["name"] == perpname) for(var/datum/data/record/R in data_core.medical) @@ -974,6 +910,9 @@ if(isrobot(usr)) var/mob/living/silicon/robot/U = usr R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()]
[t1]" + if(isAI(usr)) + var/mob/living/silicon/ai/U = usr + R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()]
[t1]" if(href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) @@ -1606,7 +1545,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X //Check for arrest warrant if(judgebot.check_records) - var/perpname = get_face_name(get_id_name()) + var/perpname = get_visible_name(TRUE) var/datum/data/record/R = find_record("name", perpname, data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) @@ -1938,6 +1877,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X . = ..() . += "---" .["Set Species"] = "?_src_=vars;setspecies=[UID()]" + .["Copy Outfit"] = "?_src_=vars;copyoutfit=[UID()]" .["Make AI"] = "?_src_=vars;makeai=[UID()]" .["Make cyborg"] = "?_src_=vars;makerobot=[UID()]" .["Make monkey"] = "?_src_=vars;makemonkey=[UID()]" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b95920e688b..d172fabef00 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -141,19 +141,19 @@ emp_act if(l_hand && !istype(l_hand, /obj/item/clothing)) var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example - if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) + if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM)) return 1 if(r_hand && !istype(r_hand, /obj/item/clothing)) var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts - if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) + if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM)) return 1 if(wear_suit) var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier - if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) + if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM)) return 1 if(w_uniform) var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier - if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type)) + if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM)) return 1 return 0 @@ -525,4 +525,4 @@ emp_act if(head) to_chat(src, "Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!") return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index cf9fcfd632c..c4ceb829fff 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -567,3 +567,10 @@ return 0 return O.equip(src, visualsOnly) + +//delete all equipment without dropping anything +/mob/living/carbon/human/proc/delete_equipment() + for(var/slot in get_all_slots())//order matters, dependant slots go first + qdel(slot) + for(var/obj/item/I in l_hand, r_hand) + qdel(I) diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 30653023751..379eb183292 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -7,19 +7,19 @@ /mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0) if(dna.species) amount = amount * dna.species.stun_mod - ..() + return ..() /mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0) if(dna.species) amount = amount * dna.species.stun_mod - ..() + return ..() /mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0) if(dna.species) amount = amount * dna.species.stun_mod - ..() + return ..() /mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE) if(dna.species) amount = amount * dna.species.stun_mod - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 988f4159612..a682a61d68d 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -586,7 +586,8 @@ var/global/list/damage_icon_parts = list() standing.overlays += image("icon" = A.sprite_sheets[dna.species.name], "icon_state" = "[A.icon_state]") else standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") - + standing.alpha = w_uniform.alpha + standing.color = w_uniform.color overlays_standing[UNIFORM_LAYER] = standing else // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY @@ -716,12 +717,13 @@ var/global/list/damage_icon_parts = list() l_ear.screen_loc = ui_l_ear //...draw the item in the inventory screen client.screen += l_ear //Either way, add the item to the HUD - var/t_type = l_ear.icon_state + var/t_type = l_ear.item_state + if(!t_type) + t_type = l_ear.icon_state if(l_ear.icon_override) t_type = "[t_type]_l" overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name]) - t_type = "[t_type]_l" overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) @@ -732,12 +734,13 @@ var/global/list/damage_icon_parts = list() r_ear.screen_loc = ui_r_ear //...draw the item in the inventory screen client.screen += r_ear //Either way, add the item to the HUD - var/t_type = r_ear.icon_state + var/t_type = r_ear.item_state + if(!t_type) + t_type = r_ear.icon_state if(r_ear.icon_override) t_type = "[t_type]_r" overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name]) - t_type = "[t_type]_r" overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) @@ -769,6 +772,8 @@ var/global/list/damage_icon_parts = list() var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood") bloodsies.color = shoes.blood_color standing.overlays += bloodsies + standing.alpha = shoes.alpha + standing.color = shoes.color overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) @@ -819,6 +824,8 @@ var/global/list/damage_icon_parts = list() var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color standing.overlays += bloodsies + standing.alpha = head.alpha + standing.color = head.color overlays_standing[HEAD_LAYER] = standing apply_overlay(HEAD_LAYER) @@ -886,6 +893,8 @@ var/global/list/damage_icon_parts = list() bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies + standing.alpha = wear_suit.alpha + standing.color = wear_suit.color overlays_standing[SUIT_LAYER] = standing apply_overlay(SUIT_LAYER) @@ -952,6 +961,9 @@ var/global/list/damage_icon_parts = list() var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood") bloodsies.color = wear_mask.blood_color standing.overlays += bloodsies + + standing.alpha = wear_mask.alpha + standing.color = wear_mask.color overlays_standing[FACEMASK_LAYER] = standing apply_overlay(FACEMASK_LAYER) @@ -974,6 +986,8 @@ var/global/list/damage_icon_parts = list() standing = mutable_appearance('icons/mob/back.dmi', "[back.icon_state]", layer = -BACK_LAYER) //create the image + standing.alpha = back.alpha + standing.color = back.color overlays_standing[BACK_LAYER] = standing apply_overlay(BACK_LAYER) @@ -1007,9 +1021,14 @@ var/global/list/damage_icon_parts = list() if(!t_state) t_state = r_hand.icon_state - var/mutable_appearance/I = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER) - I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) - overlays_standing[R_HAND_LAYER] = I + var/mutable_appearance/standing + if(r_hand.sprite_sheets && r_hand.sprite_sheets[dna.species.name]) + t_state = "[t_state]_r" + standing = mutable_appearance(r_hand.sprite_sheets[dna.species.name], "[t_state]", layer = -R_HAND_LAYER) + else + standing = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER) + standing = center_image(standing, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) + overlays_standing[R_HAND_LAYER] = standing apply_overlay(R_HAND_LAYER) @@ -1021,9 +1040,14 @@ var/global/list/damage_icon_parts = list() if(!t_state) t_state = l_hand.icon_state - var/mutable_appearance/I = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER) - I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) - overlays_standing[L_HAND_LAYER] = I + var/mutable_appearance/standing + if(l_hand.sprite_sheets && l_hand.sprite_sheets[dna.species.name]) + t_state = "[t_state]_l" + standing = mutable_appearance(l_hand.sprite_sheets[dna.species.name], "[t_state]", layer = -L_HAND_LAYER) + else + standing = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER) + standing = center_image(standing, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) + overlays_standing[L_HAND_LAYER] = standing apply_overlay(L_HAND_LAYER) //human HUD updates for items in our inventory diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 63f9f10dc71..c5cbbc0b1d3 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -332,7 +332,7 @@ break //Only count the first bedsheet if(drunk) comfort += 1 //Aren't naps SO much better when drunk? - AdjustDrunk(1-0.0015*comfort) //reduce drunkenness ~6% per two seconds, when on floor. + AdjustDrunk(-0.2*comfort) //reduce drunkenness while sleeping. if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket. adjustBruteLoss(-1*comfort) adjustFireLoss(-1*comfort) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 914c810da27..38dadbbbfa7 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -146,6 +146,44 @@ stat(null,"Power Level: [powerlevel]") +/mob/living/carbon/slime/updatehealth(reason) + . = ..() + update_health_hud() + +/mob/living/carbon/slime/proc/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(stat != DEAD) + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(0 to 20) + healths.icon_state = "slime_health5" + severity = 5 + if(-199 to 0) + healths.icon_state = "slime_health6" + severity = 6 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + /mob/living/carbon/slime/adjustFireLoss(amount) ..(-abs(amount)) // Heals them return diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index afca9ad8798..4f2323e2025 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -44,6 +44,22 @@ if(BRAIN) return adjustBrainLoss(damage) +/mob/living/proc/get_damage_amount(damagetype = BRUTE) + switch(damagetype) + if(BRUTE) + return getBruteLoss() + if(BURN) + return getFireLoss() + if(TOX) + return getToxLoss() + if(OXY) + return getOxyLoss() + if(CLONE) + return getCloneLoss() + if(STAMINA) + return getStaminaLoss() + + /mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0) if(blocked >= 100) return 0 if(brute) apply_damage(brute, BRUTE, def_zone, blocked) @@ -309,4 +325,16 @@ updatehealth("take overall damage") /mob/living/proc/has_organic_damage() - return (maxHealth - health) \ No newline at end of file + return (maxHealth - health) + +//heal up to amount damage, in a given order +/mob/living/proc/heal_ordered_damage(amount, list/damage_types) + . = amount //we'll return the amount of damage healed + for(var/i in damage_types) + var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have + if(amount_to_heal) + apply_damage_type(-amount_to_heal, i) + amount -= amount_to_heal //remove what we healed from our current amount + if(!amount) + break + . -= amount //if there's leftover healing, remove it from what we return \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f9dba949b4b..57c67f5fd61 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -256,8 +256,10 @@ death() to_chat(src, "You have given up life and succumbed to death.") + /mob/living/proc/InCritical() return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS) + /mob/living/ex_act(severity) ..() 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/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index d584d5a50f5..0750e4ea3ed 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -235,6 +235,12 @@ to_chat(user, "Body Temperature: ???") return + user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.") + robot_healthscan(user, M) + add_fingerprint(user) + + +proc/robot_healthscan(mob/user, mob/living/M) var/scan_type if(istype(M, /mob/living/silicon/robot)) scan_type = "robot" @@ -244,7 +250,7 @@ to_chat(user, "You can't analyze non-robotic things!") return - user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.") + switch(scan_type) if("robot") var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() @@ -308,5 +314,3 @@ to_chat(user, "Internal Fluid Level:[H.blood_volume]/[H.max_blood]") if(H.bleed_rate) to_chat(user, "Warning:External component leak detected!") - - src.add_fingerprint(user) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 131477d086e..900705733ba 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -576,6 +576,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/restrained() return 0 +/mob/living/silicon/robot/InCritical() + return low_power_mode /mob/living/silicon/robot/ex_act(severity) switch(severity) @@ -883,6 +885,8 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/attack_ghost(mob/user) if(wiresexposed) wires.Interact(user) + else + ..() //this calls the /mob/living/attack_ghost proc for the ghost health/cyborg analyzer /mob/living/silicon/robot/proc/allowed(obj/item/I) var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 2cb9ddf6252..bac58d8f124 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -337,4 +337,5 @@ /////////////////////////////////// EAR DAMAGE //////////////////////////////////// /mob/living/silicon/can_hear() - . = TRUE \ No newline at end of file + . = TRUE + diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index cbc125beeab..2c9cbc355f7 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -34,13 +34,29 @@ holder_type = /obj/item/holder/mouse can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY + var/chew_probability = 1 /mob/living/simple_animal/mouse/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100) +/mob/living/simple_animal/mouse/handle_automated_action() + if(prob(chew_probability)) + var/turf/simulated/floor/F = get_turf(src) + if(istype(F) && !F.intact) + var/obj/structure/cable/C = locate() in F + if(C && prob(15)) + if(C.avail()) + visible_message("[src] chews through [C]. It's toast!") + playsound(src, 'sound/effects/sparks2.ogg', 100, 1) + C.deconstruct() + toast() // mmmm toasty. + else + C.deconstruct() + visible_message("[src] chews through [C].") + /mob/living/simple_animal/mouse/handle_automated_speech() - ..() + ..() if(prob(speak_chance)) for(var/mob/M in view()) M << squeak_sound @@ -98,7 +114,12 @@ to_chat(M, "[bicon(src)] Squeek!") ..() -/mob/living/simple_animal/mouse/death(gibbed) +/mob/living/simple_animal/mouse/proc/toast() + add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY) + desc = "It's toast." + death() + +/mob/living/simple_animal/mouse/death(gibbed) // Only execute the below if we successfully died playsound(src, squeak_sound, 40, 1) . = ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 545866858ca..d408045a923 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -16,6 +16,10 @@ turns_per_move = 10 icon = 'icons/mob/penguins.dmi' +/mob/living/simple_animal/pet/penguin/Initialize(mapload) + . = ..() + AddComponent(/datum/component/waddling) + /mob/living/simple_animal/pet/penguin/emperor name = "Emperor penguin" real_name = "penguin" diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 13e7c893d86..ac913170c86 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -12,8 +12,8 @@ response_disarm = "shoos" response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") - var/colour = "grey" pass_flags = PASSTABLE + var/colour = "grey" /mob/living/simple_animal/slime/adult health = 200 @@ -24,3 +24,37 @@ /mob/living/simple_animal/slime/New() ..() overlays += "aslime-:33" + +/mob/living/simple_animal/slime/updatehealth(reason) + . = ..() + update_health_hud() + +/mob/living/simple_animal/slime/proc/update_health_hud() + if(hud_used) + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(1 to 20) + healths.icon_state = "slime_health5" + severity = 5 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index c82a0ee7806..1ef6f06259f 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -1,100 +1,106 @@ -#define EGG_INCUBATION_TIME 120 - /mob/living/simple_animal/hostile/headcrab - name = "headslug" - desc = "Absolutely not de-beaked or harmless. Keep away from corpses." + name = "headcrab" + desc = "A small parasitic creature that would like to connect with your brain stem." + icon = 'icons/mob/headcrab.dmi' icon_state = "headcrab" icon_living = "headcrab" icon_dead = "headcrab_dead" - icon = 'icons/mob/mob.dmi' - health = 50 - maxHealth = 50 + health = 40 + maxHealth = 40 melee_damage_lower = 5 - melee_damage_upper = 5 - attacktext = "chomps" - attack_sound = 'sound/weapons/bite.ogg' - faction = list("creature") - robust_searching = 1 - stat_attack = 2 - obj_damage = 0 - environment_smash = 0 - speak_emote = list("squeaks") - ventcrawler = 2 - var/datum/mind/origin - var/egg_lain = 0 + melee_damage_upper = 10 + ranged = 1 + ranged_message = "leaps" + ranged_cooldown_time = 40 + var/jumpdistance = 4 + var/jumpspeed = 1 + attacktext = "bites" + attack_sound = 'sound/creatures/headcrab_attack.ogg' + speak_emote = list("hisses") + var/is_zombie = 0 + stat_attack = 1 //so they continue to attack when they are on the ground. + var/host_species = "" + var/list/human_overlays = list() -/mob/living/simple_animal/hostile/headcrab/examine(mob/user) +/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired) + if(!is_zombie && isturf(src.loc) && stat != DEAD) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) + Zombify(H) + break ..() - if(stat == DEAD) - to_chat(desc = "It appears to be dead.") -/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim) - var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) - egg.insert(victim) - if(origin) - egg.origin = origin - else if(mind) // Let's make this a feature - egg.origin = mind - for(var/obj/item/organ/internal/I in src) - I.loc = egg - visible_message("[src] plants something in [victim]'s flesh!", \ - "We inject our egg into [victim]'s body!") - egg_lain = 1 +/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A) + if(check_friendly_fire) + for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory + for(var/mob/living/L in T) + if(L == src || L == A) + continue + if(faction_check(L) && !attack_same) + return + visible_message("[src] [ranged_message] at [A]!") + throw_at(A, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE) + ranged_cooldown = world.time + ranged_cooldown_time -/mob/living/simple_animal/hostile/headcrab/AttackingTarget() - if(egg_lain) - target.attack_animal(src) - return - if(iscarbon(target) && !issmall(target)) - // Changeling egg can survive in aliens! - var/mob/living/carbon/C = target - if(C.stat == DEAD) - if(C.status_flags & XENO_HOST) - to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?") - return - Infect(target) - to_chat(src, "With our egg laid, our death approaches rapidly...") - spawn(100) - death() - return - target.attack_animal(src) +/mob/living/simple_animal/hostile/headcrab/proc/Zombify(mob/living/carbon/human/H) + if(!H.check_death_method()) + H.death() + var/obj/item/organ/external/head/head_organ = H.get_organ("head") + is_zombie = TRUE + if(H.wear_suit) + var/obj/item/clothing/suit/armor/A = H.wear_suit + if(A.armor && A.armor["melee"]) + maxHealth += A.armor["melee"] //That zombie's got armor, I want armor! + maxHealth += 50 + health = maxHealth + name = "zombie" + desc = "A corpse animated by the alien being on its head." + melee_damage_lower = 10 + melee_damage_upper = 15 + ranged = 0 + icon = H.icon + speak = list('sound/creatures/zombie_idle1.ogg','sound/creatures/zombie_idle2.ogg','sound/creatures/zombie_idle3.ogg') + speak_chance = 50 + speak_emote = list("groans") + attacktext = "bites" + attack_sound = 'sound/creatures/zombie_attack.ogg' + icon_state = "zombie2_s" + if(head_organ) + head_organ.h_style = null + H.update_hair() + host_species = H.dna.species.name + human_overlays = H.overlays + update_icons() + H.forceMove(src) + visible_message("The corpse of [H.name] suddenly rises!") -/obj/item/organ/internal/body_egg/changeling_egg - name = "changeling egg" - desc = "Twitching and disgusting." - origin_tech = "biotech=7" // You need to be really lucky to obtain it. - var/datum/mind/origin - var/time - -/obj/item/organ/internal/body_egg/changeling_egg/egg_process() - // Changeling eggs grow in dead people - time++ - if(time >= EGG_INCUBATION_TIME) - Pop() - remove(owner) +/mob/living/simple_animal/hostile/headcrab/death() + ..() + if(is_zombie) qdel(src) -/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop() - var/mob/living/carbon/human/monkey/M = new(owner) - owner.stomach_contents += M - for(var/obj/item/organ/internal/I in src) - I.insert(M, 1) +/mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though. + if(speak_chance) + if(rand(0,200) < speak_chance) + if(speak && speak.len) + playsound(get_turf(src), pick(speak), 200, 1) - if(origin && origin.current && (origin.current.stat == DEAD)) - origin.transfer_to(M) - if(!origin.changeling) - M.make_changeling() - if(origin.changeling.can_absorb_dna(M, owner)) - origin.changeling.absorb_dna(owner, M) +/mob/living/simple_animal/hostile/headcrab/Destroy() + if(contents) + for(var/mob/M in contents) + M.loc = get_turf(src) + return ..() - var/datum/action/changeling/humanform/HF = new - HF.Grant(M) - for(var/power in origin.changeling.purchasedpowers) - var/datum/action/changeling/S = power - if(istype(S) && S.needs_button) - S.Grant(M) - M.key = origin.key - owner.gib() -#undef EGG_INCUBATION_TIME +/mob/living/simple_animal/hostile/headcrab/update_icons() + ..() + if(is_zombie) + overlays.Cut() + overlays = human_overlays + var/image/I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod") + if(host_species == "Vox") + I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_vox") + else if(host_species == "Gray") + I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray") + overlays += I diff --git a/code/modules/mob/living/simple_animal/hostile/headslug.dm b/code/modules/mob/living/simple_animal/hostile/headslug.dm new file mode 100644 index 00000000000..e2fc98c483f --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/headslug.dm @@ -0,0 +1,100 @@ +#define EGG_INCUBATION_TIME 120 + +/mob/living/simple_animal/hostile/headslug + name = "headslug" + desc = "Absolutely not de-beaked or harmless. Keep away from corpses." + icon_state = "headslug" + icon_living = "headslug" + icon_dead = "headslug_dead" + icon = 'icons/mob/mob.dmi' + health = 50 + maxHealth = 50 + melee_damage_lower = 5 + melee_damage_upper = 5 + attacktext = "chomps" + attack_sound = 'sound/weapons/bite.ogg' + faction = list("creature") + robust_searching = 1 + stat_attack = 2 + obj_damage = 0 + environment_smash = 0 + speak_emote = list("squeaks") + ventcrawler = 2 + var/datum/mind/origin + var/egg_lain = 0 + +/mob/living/simple_animal/hostile/headslug/examine(mob/user) + ..() + if(stat == DEAD) + to_chat(desc = "It appears to be dead.") + +/mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim) + var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) + egg.insert(victim) + if(origin) + egg.origin = origin + else if(mind) // Let's make this a feature + egg.origin = mind + for(var/obj/item/organ/internal/I in src) + I.loc = egg + visible_message("[src] plants something in [victim]'s flesh!", \ + "We inject our egg into [victim]'s body!") + egg_lain = 1 + +/mob/living/simple_animal/hostile/headslug/AttackingTarget() + if(egg_lain) + target.attack_animal(src) + return + if(iscarbon(target) && !issmall(target)) + // Changeling egg can survive in aliens! + var/mob/living/carbon/C = target + if(C.stat == DEAD) + if(C.status_flags & XENO_HOST) + to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?") + return + Infect(target) + to_chat(src, "With our egg laid, our death approaches rapidly...") + spawn(100) + death() + return + target.attack_animal(src) + +/obj/item/organ/internal/body_egg/changeling_egg + name = "changeling egg" + desc = "Twitching and disgusting." + origin_tech = "biotech=7" // You need to be really lucky to obtain it. + var/datum/mind/origin + var/time + +/obj/item/organ/internal/body_egg/changeling_egg/egg_process() + // Changeling eggs grow in dead people + time++ + if(time >= EGG_INCUBATION_TIME) + Pop() + remove(owner) + qdel(src) + +/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop() + var/mob/living/carbon/human/monkey/M = new(owner) + owner.stomach_contents += M + + for(var/obj/item/organ/internal/I in src) + I.insert(M, 1) + + if(origin && origin.current && (origin.current.stat == DEAD)) + origin.transfer_to(M) + if(!origin.changeling) + M.make_changeling() + if(origin.changeling.can_absorb_dna(M, owner)) + origin.changeling.absorb_dna(owner, M) + + var/datum/action/changeling/humanform/HF = new + HF.Grant(M) + for(var/power in origin.changeling.purchasedpowers) + var/datum/action/changeling/S = power + if(istype(S) && S.needs_button) + S.Grant(M) + M.key = origin.key + owner.gib() + +#undef EGG_INCUBATION_TIME diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9c787639ba4..a96c78d09d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -309,14 +309,18 @@ else M.Goto(src,M.move_to_delay,M.minimum_distance) -/mob/living/simple_animal/hostile/proc/OpenFire(atom/A) +/mob/living/simple_animal/hostile/proc/CheckFriendlyFire(atom/A) if(check_friendly_fire) for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory for(var/mob/living/L in T) if(L == src || L == A) continue - if(faction_check(L) && !attack_same) - return + if(faction_check_mob(L) && !attack_same) + return TRUE + +/mob/living/simple_animal/hostile/proc/OpenFire(atom/A) + if(CheckFriendlyFire(A)) + return visible_message("[src] [ranged_message] at [A]!") if(rapid) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 7fd32bd71ec..d45e6f6ead8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -37,6 +37,7 @@ Difficulty: Medium ranged = 1 ranged_cooldown_time = 16 pixel_x = -16 + crusher_loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye) loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator) wander = FALSE del_on_death = TRUE @@ -48,7 +49,7 @@ Difficulty: Medium var/guidance = FALSE deathmessage = "falls to the ground, decaying into glowing particles." death_sound = "bodyfall" - + /obj/item/gps/internal/miner icon_state = null gpstag = "Resonant Signal" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index a53b8092e54..ac5e40025c6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -42,6 +42,7 @@ Difficulty: Hard ranged = 1 pixel_x = -32 del_on_death = 1 + crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) var/charging = 0 medal_type = BOSS_MEDAL_BUBBLEGUM diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 5d66061335c..3ebea47e353 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -45,7 +45,8 @@ Difficulty: Very Hard del_on_death = 1 medal_type = BOSS_MEDAL_COLOSSUS score_type = COLOSSUS_SCORE - loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus) + crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher) + loot = list(/obj/structure/closet/crate/necropolis/colossus) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/misc/demon_dies.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 68db8cb1274..0789d00832d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -43,6 +43,7 @@ Difficulty: Medium move_to_delay = 10 ranged = 1 pixel_x = -16 + crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher) loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) var/swooping = 0 @@ -271,6 +272,7 @@ Difficulty: Medium melee_damage_lower = 30 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) loot = list() + crusher_loot = list() /mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 6caee40ba80..bb4e9297605 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -53,6 +53,7 @@ Difficulty: Hard ranged_cooldown_time = 40 aggro_vision_range = 23 loot = list(/obj/item/hierophant_staff) + crusher_loot = list(/obj/item/hierophant_staff, /obj/item/crusher_trophy/vortex_talisman) wander = FALSE var/burst_range = 3 //range on burst aoe var/beam_range = 5 //range on cross blast beams @@ -496,6 +497,7 @@ Difficulty: Hard icon = 'icons/effects/effects.dmi' icon_state = "hierophant_blast" name = "vortex blast" + layer = 3.9 // between LYING_MOB_LAYER and ABOVE_MOB_LAYER luminosity = 1 desc = "Get out of the way!" duration = 9 @@ -555,6 +557,37 @@ Difficulty: Hard playsound(M,'sound/weapons/sear.ogg', 50, 1, -4) M.take_damage(damage, BURN, 0, 0) +/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead. + name = "vortex wall" + icon = 'icons/turf/walls/hierophant_wall_temp.dmi' + icon_state = "wall" + light_range = MINIMUM_USEFUL_LIGHT_RANGE + duration = 100 + smooth = SMOOTH_TRUE + +/obj/effect/temp_visual/hierophant/wall/New(loc, new_caster) + ..() + queue_smooth_neighbors(src) + queue_smooth(src) + +/obj/effect/temp_visual/hierophant/wall/Destroy() + queue_smooth_neighbors(src) + return ..() + +/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target) + if(QDELETED(caster)) + return FALSE + if(mover == caster.pulledby) + return TRUE + if(istype(mover, /obj/item/projectile)) + var/obj/item/projectile/P = mover + if(P.firer == caster) + return TRUE + if(mover == caster) + return TRUE + return FALSE + + /obj/effect/hierophant name = "hierophant rune" desc = "A powerful magic mark allowing whomever attunes themself to it to return to it at will." diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index a32aceb33e3..f57559d549a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -31,6 +31,7 @@ /obj/structure/barricade, /obj/machinery/field, /obj/machinery/power/emitter) + var/list/crusher_loot var/medal_type var/score_type = BOSS_SCORE var/elimination = 0 @@ -43,6 +44,10 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway +/mob/living/simple_animal/hostile/megafauna/New() + ..() + apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal_gps) . = ..() @@ -53,11 +58,17 @@ /mob/living/simple_animal/hostile/megafauna/death(gibbed) // this happens before the parent call because `del_on_death` may be set if(can_die() && !admin_spawned) - feedback_set_details("megafauna_kills","[initial(name)]") + var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + if(C && crusher_loot && C.total_damage >= maxHealth * 0.6) + spawn_crusher_loot() if(!elimination) //used so the achievment only occurs for the last legion to die. grant_achievement(medal_type,score_type) + feedback_set_details("megafauna_kills","[initial(name)]") return ..() +/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot() + loot = crusher_loot + /mob/living/simple_animal/hostile/megafauna/AttackingTarget() ..() if(isliving(target)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm index 28aacd37a73..ad8dcf44699 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm @@ -77,6 +77,7 @@ stat_attack = 1 flying = TRUE robust_searching = 1 + crusher_loot = /obj/item/crusher_trophy/watcher_wing loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) @@ -102,6 +103,8 @@ light_power = 2.5 light_color = LIGHT_COLOR_ORANGE projectiletype = /obj/item/projectile/temp/basilisk/magmawing + crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing + crusher_drop_mod = 60 /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing name = "icewing watcher" @@ -114,6 +117,8 @@ health = 170 projectiletype = /obj/item/projectile/temp/basilisk/icewing butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable + crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing + crusher_drop_mod = 30 /obj/item/projectile/temp/basilisk/magmawing name = "scorching blast" diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm index a1c488b4068..dae7a688cb3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm @@ -83,6 +83,7 @@ icon_dead = "goliath_dead" throw_message = "does nothing to the tough hide of the" pre_attack_icon = "goliath2" + crusher_loot = /obj/item/crusher_trophy/goliath_tentacle butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2) loot = list() stat_attack = TRUE 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 60c1f5e08e7..c90a06a9fb8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -45,6 +45,9 @@ /mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() OpenFire() +/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot() + loot += crusher_loot //we don't butcher + /mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) // Only execute the below if we successfully died . = ..(gibbed) @@ -231,6 +234,7 @@ speak_emote = list("echoes") attack_sound = 'sound/weapons/pierce.ogg' throw_message = "bounces harmlessly off of" + crusher_loot = /obj/item/crusher_trophy/legion_skull loot = list(/obj/item/organ/internal/hivelord_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion del_on_death = 1 @@ -403,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/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm index e23624a5a9d..434869c1d6d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/asteroid/ +/mob/living/simple_animal/hostile/asteroid vision_range = 2 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 15 @@ -13,12 +13,18 @@ response_harm = "strikes" status_flags = 0 a_intent = INTENT_HARM + var/crusher_loot var/throw_message = "bounces off of" var/icon_aggro = null // for swapping to when we get aggressive var/fromtendril = FALSE see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM mob_size = MOB_SIZE_LARGE + var/crusher_drop_mod = 25 + +/mob/living/simple_animal/hostile/asteroid/New() + ..() + apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) /mob/living/simple_animal/hostile/asteroid/Aggro() ..() @@ -46,3 +52,12 @@ visible_message("The [T.name] [src.throw_message] [src.name]!") return ..() + +/mob/living/simple_animal/hostile/asteroid/death(gibbed) + var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item + spawn_crusher_loot() + ..(gibbed) + +/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot() + butcher_results[crusher_loot] = 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index fc39035618e..70d279fd400 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -69,6 +69,7 @@ desc = null //see examine() icon_state = "nether" health = 50 + maxHealth = 50 spawn_time = 600 //1 minute max_mobs = 15 icon = 'icons/mob/nest.dmi' @@ -76,9 +77,9 @@ mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody) faction = list("nether") -/mob/living/simple_animal/hostile/spawner/nether/Initialize() - .=..() - START_PROCESSING(SSprocessing, src) +/mob/living/simple_animal/hostile/spawner/nether/death() + . = ..() + qdel(src) /mob/living/simple_animal/hostile/spawner/nether/examine(mob/user) ..() @@ -96,7 +97,8 @@ "Touching the portal, you are quickly pulled through into a world of unimaginable horror!") contents.Add(user) -/mob/living/simple_animal/hostile/spawner/nether/process() +/mob/living/simple_animal/hostile/spawner/nether/Life() + . = ..() for(var/mob/living/M in contents) if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 1dded6c4e8c..0794b7d9c70 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -397,6 +397,9 @@ // STUN /mob/living/Stun(amount, updating = 1, force = 0) + if(status_flags & CANSTUN || force) + if(absorb_stun(amount, force)) + return FALSE return SetStunned(max(stunned, amount), updating, force) /mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" @@ -434,6 +437,9 @@ // WEAKEN /mob/living/Weaken(amount, updating = 1, force = 0) + if(status_flags & CANWEAKEN || force) + if(absorb_stun(amount, force)) + return FALSE return SetWeakened(max(weakened, amount), updating, force) /mob/living/SetWeakened(amount, updating = 1, force = 0) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 279610f0925..0a0e8422dbf 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -369,7 +369,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) if(hud_used && hud_used.action_intent) hud_used.action_intent.icon_state = "[a_intent]" - else if(isrobot(src) || islarva(src) || isanimal(src)) + else if(isrobot(src) || islarva(src) || isanimal(src) || isAI(src)) switch(input) if(INTENT_HELP) a_intent = INTENT_HELP @@ -569,7 +569,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) if(force) newname = clean_input("Pick a new name.", "Name Change", oldname, src) else - newname = input("You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname, src) + newname = clean_input("You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname, src) if(((world.time - time_passed) > 1800) && !force) alert(src, "Unfortunately, more than 3 minutes have passed for selecting your name. If you are a robot, use the Namepick verb; otherwise, adminhelp.", "Name Change") return //took too long diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm index b4c0a5305b7..7f1059f062e 100644 --- a/code/modules/ninja/suit/gloves.dm +++ b/code/modules/ninja/suit/gloves.dm @@ -11,4 +11,4 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - transfer_prints = FALSE \ No newline at end of file + transfer_prints = FALSE diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm index 6ed302feaad..a7a21f072f3 100644 --- a/code/modules/ninja/suit/head.dm +++ b/code/modules/ninja/suit/head.dm @@ -7,4 +7,4 @@ item_state = "s-ninja_hood" armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 25) unacidable = 1 - blockTracking = 1 \ No newline at end of file + blockTracking = 1 diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 0ebec2e724f..2f76673ab13 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -28,4 +28,4 @@ Contents: /obj/item/clothing/mask/gas/space_ninja/Destroy() QDEL_NULL(voice_changer) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 5cb67e73db6..af5f4d3ecc1 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -9,4 +9,4 @@ cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET - max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT \ No newline at end of file + max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 6e550e64893..365cc35cfc6 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -86,4 +86,4 @@ Contents: suitShoes = null suitOccupant = null - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 13d85941a79..176d2abc85c 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -2,6 +2,7 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() var/list/admin_departments = list("Central Command") var/list/hidden_admin_departments = list("Syndicate") var/list/alldepartments = list() +var/list/hidden_departments = list() var/global/list/fax_blacklist = list() /obj/machinery/photocopier/faxmachine @@ -9,7 +10,9 @@ var/global/list/fax_blacklist = list() icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" + pass_flags = PASSTABLE var/fax_network = "Local Fax Network" + var/syndie_restricted = FALSE //is it a syndicate base fax restricted from contacting NT assets? var/long_range_enabled = 0 // Can we send messages off the station? req_one_access = list(access_lawyer, access_heads, access_armory) @@ -35,7 +38,7 @@ var/global/list/fax_blacklist = list() /obj/machinery/photocopier/faxmachine/proc/update_network() if(department != "Unknown") - if(!(("[department]" in alldepartments) || ("[department]" in admin_departments) || ("[department]" in hidden_admin_departments))) + if(!(("[department]" in alldepartments) || ("[department]" in hidden_departments) || ("[department]" in admin_departments) || ("[department]" in hidden_admin_departments))) alldepartments |= department /obj/machinery/photocopier/faxmachine/longrange @@ -43,6 +46,17 @@ var/global/list/fax_blacklist = list() fax_network = "Central Command Quantum Entanglement Network" long_range_enabled = 1 +/obj/machinery/photocopier/faxmachine/longrange/syndie + name = "syndicate long range fax machine" + emagged = TRUE + syndie_restricted = TRUE + req_one_access = list(access_syndicate) + //No point setting fax network, being emagged overrides that anyway. + +/obj/machinery/photocopier/faxmachine/longrange/syndie/update_network() + if(department != "Unknown") + hidden_departments |= department + /obj/machinery/photocopier/faxmachine/attack_hand(mob/user) ui_interact(user) @@ -119,7 +133,7 @@ var/global/list/fax_blacklist = list() if((destination in admin_departments) || (destination in hidden_admin_departments)) send_admin_fax(usr, destination) else - sendfax(destination,usr) + sendfax(destination, usr) if(sendcooldown) spawn(sendcooldown) // cooldown time @@ -155,6 +169,14 @@ var/global/list/fax_blacklist = list() if(emagged) combineddepartments += hidden_admin_departments.Copy() + combineddepartments += hidden_departments.Copy() + + if(syndie_restricted) + combineddepartments = hidden_admin_departments.Copy() + combineddepartments += hidden_departments.Copy() + for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) + if(F.emagged)//we can contact emagged faxes on the station + combineddepartments |= F.department destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments if(!destination) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index cf021cb2618..9e844d6cf21 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -54,8 +54,6 @@ /obj/item/paper/update_icon() ..() - if(icon_state == "paper_talisman") - return if(info) icon_state = "paper_words" return diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 33741d1475b..0ee03a2b272 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -15,6 +15,7 @@ use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 + var/malfunction = FALSE /obj/machinery/power/Destroy() disconnect_from_network() @@ -30,7 +31,7 @@ // Non-machines should use add_delayedload(), delayed_surplus(), newavail() /obj/machinery/power/proc/add_avail(amount) - if(powernet) + if(powernet && !malfunction) powernet.newavail += amount return TRUE else diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 9d16a9c2123..c2333da9107 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -40,14 +40,16 @@ if(!istype(targloc) || !istype(curloc) || !BB) return 0 BB.ammo_casing = src - + if(target && get_dist(user, target) <= 1) //Point blank shot must always hit + BB.prehit(target) target.bullet_act(BB, BB.def_zone) QDEL_NULL(BB) return 1 if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() + BB.prehit(target) target.bullet_act(BB, BB.def_zone) QDEL_NULL(BB) return 1 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/alien.dm b/code/modules/projectiles/guns/alien.dm index 2a20e7e6c81..36bba8f3112 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -80,6 +80,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/sonic) cell_type = /obj/item/stock_parts/cell/super restricted_species = list(/datum/species/vox/armalis) + sprite_sheets = list("Vox Armalis" = 'icons/mob/species/armalis/held.dmi') /obj/item/gun/energy/noisecannon/update_icon() return 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 fa483903012..d214309728e 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,10 +16,15 @@ 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() + var/recharge_timerid + var/empty_state = "kineticgun_empty" /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) @@ -30,20 +35,20 @@ var/obj/item/borg/upgrade/modkit/M = A to_chat(user, "There is a [M.name] mod installed, using [M.cost]% capacity.") -/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/crowbar)) +/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) + if(iscrowbar(I)) if(modkits.len) to_chat(user, "You pry the modifications out.") - playsound(loc, A.usesound, 100, 1) + playsound(loc, I.usesound, 100, 1) for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) else to_chat(user, "There are no modifications currently installed.") - else if(istype(A, /obj/item/borg/upgrade/modkit)) - var/obj/item/borg/upgrade/modkit/MK = A + else if(istype(I, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) else - ..() + return ..() /obj/item/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 @@ -58,6 +63,7 @@ . += A /obj/item/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) + K.kinetic_gun = src //do something special on-hit, easy! for(var/A in get_modkits()) var/obj/item/borg/upgrade/modkit/M = A M.modify_projectile(K) @@ -67,6 +73,12 @@ unique_frequency = TRUE max_mod_capacity = 80 +/obj/item/gun/energy/kinetic_accelerator/minebot + trigger_guard = TRIGGER_GUARD_ALLOW_ALL + overheat_time = 20 + holds_charge = TRUE + unique_frequency = TRUE + /obj/item/gun/energy/kinetic_accelerator/New() . = ..() if(!holds_charge) @@ -83,7 +95,7 @@ /obj/item/gun/energy/kinetic_accelerator/dropped() . = ..() - if(!holds_charge) + if(!QDELING(src) && !holds_charge) // Put it on a delay because moving item from slot to hand // calls dropped(). spawn(2) @@ -97,24 +109,25 @@ power_supply.use(500) update_icon() -/obj/item/gun/energy/kinetic_accelerator/proc/attempt_reload() +/obj/item/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) if(overheat) return + if(!recharge_time) + recharge_time = overheat_time overheat = TRUE var/carried = 0 if(!unique_frequency) - for(var/obj/item/gun/energy/kinetic_accelerator/K in \ - loc.GetAllContents()) - - carried++ + for(var/obj/item/gun/energy/kinetic_accelerator/K in loc.GetAllContents()) + if(!K.unique_frequency) + carried++ carried = max(carried, 1) else carried = 1 - spawn(overheat_time * carried) - reload() + deltimer(recharge_timerid) + recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE) /obj/item/gun/energy/kinetic_accelerator/emp_act(severity) return @@ -138,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 @@ -161,16 +176,6 @@ var/obj/item/gun/energy/kinetic_accelerator/KA = loc KA.modify_projectile(BB) - var/turf/proj_turf = get_turf(BB) - if(!isturf(proj_turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - var/pressure = environment.return_pressure() - if(pressure > 50) - BB.name = "weakened [BB.name]" - var/obj/item/projectile/kinetic/K = BB - K.damage *= K.pressure_decrease - //Projectiles /obj/item/projectile/kinetic @@ -181,10 +186,9 @@ flag = "bomb" range = 3 + var/pressure_decrease_active = FALSE var/pressure_decrease = 0.25 - var/turf_aoe = FALSE - var/mob_aoe = FALSE - var/list/hit_overlays = list() + var/obj/item/gun/energy/kinetic_accelerator/kinetic_gun /obj/item/projectile/kinetic/pod range = 4 @@ -193,9 +197,22 @@ damage = 50 pressure_decrease = 0.5 -/obj/item/projectile/kinetic/pod/enhanced - turf_aoe = TRUE - mob_aoe = TRUE +/obj/item/projectile/kinetic/Destroy() + kinetic_gun = null + return ..() + +/obj/item/projectile/kinetic/prehit(atom/target) + . = ..() + if(.) + if(kinetic_gun) + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_prehit(src, target, kinetic_gun) + if(!lavaland_equipment_pressure_check(get_turf(target))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + /obj/item/projectile/kinetic/on_range() strike_thing() @@ -209,30 +226,22 @@ var/turf/target_turf = get_turf(target) if(!target_turf) target_turf = get_turf(src) + if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike(src, target_turf, target, kinetic_gun) if(ismineralturf(target_turf)) var/turf/simulated/mineral/M = target_turf M.gets_drilled(firer) var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color - for(var/type in hit_overlays) - new type(target_turf) - if(turf_aoe) - for(var/T in RANGE_TURFS(1, target_turf) - target_turf) - if(ismineralturf(T)) - var/turf/simulated/mineral/M = T - M.gets_drilled(firer) - if(mob_aoe) - for(var/mob/living/L in range(1, target_turf) - firer - target) - var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration) - L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor) - L.visible_message("[L] is hit by \a [src]!", - "You are hit by \a [src]!") - add_attack_logs(firer, L, "Shot with a [type]") //Modkits /obj/item/borg/upgrade/modkit - name = "modification kit" + name = "kinetic accelerator modification kit" desc = "An upgrade for kinetic accelerators." icon = 'icons/obj/objects.dmi' icon_state = "modkit" @@ -244,6 +253,8 @@ var/maximum_of_type = 1 var/cost = 30 var/modifier = 1 //For use in any mod kit that has numerical modifiers + var/minebot_upgrade = TRUE + var/minebot_exclusive = FALSE /obj/item/borg/upgrade/modkit/examine(mob/user) if(..(user, 1)) @@ -253,7 +264,7 @@ if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user)) install(A, user) else - ..() + return ..() /obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) if(..()) @@ -264,6 +275,13 @@ /obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user) . = TRUE + if(minebot_upgrade) + if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + to_chat(user, "The modkit you're trying to install is only rated for minebot use.") + return FALSE + else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + to_chat(user, "The modkit you're trying to install is not rated for minebot use.") + return FALSE if(denied_type) var/number_of_denied = 0 for(var/A in KA.get_modkits()) @@ -292,6 +310,12 @@ /obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K) +//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure +/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) +//use this one for effects you want to trigger before mods that do damage +/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) +//and this one for things that don't need to trigger before other damage-dealing mods +/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) //Range /obj/item/borg/upgrade/modkit/range @@ -317,8 +341,9 @@ //Cooldown /obj/item/borg/upgrade/modkit/cooldown name = "cooldown decrease" - desc = "Decreases the cooldown of a kinetic accelerator." - modifier = 2.5 + desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use." + modifier = 3.2 + minebot_upgrade = FALSE /obj/item/borg/upgrade/modkit/cooldown/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user) . = ..() @@ -329,25 +354,61 @@ KA.overheat_time += modifier ..() +/obj/item/borg/upgrade/modkit/cooldown/minebot + name = "minebot cooldown decrease" + desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use." + icon_state = "door_electronics" + icon = 'icons/obj/module.dmi' + denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot + modifier = 10 + cost = 0 + minebot_upgrade = TRUE + minebot_exclusive = TRUE //AoE blasts /obj/item/borg/upgrade/modkit/aoe modifier = 0 + var/turf_aoe = FALSE + var/stats_stolen = FALSE -/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K) - K.name = "kinetic explosion" - if(!K.turf_aoe && !K.mob_aoe) - K.hit_overlays += /obj/effect/temp_visual/explosion/fast - K.mob_aoe += modifier +/obj/item/borg/upgrade/modkit/aoe/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user) + if(..()) + return + for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple + if(AOE.stats_stolen || AOE == src) + continue + modifier += AOE.modifier //take its modifiers + AOE.modifier = 0 + turf_aoe += AOE.turf_aoe + AOE.turf_aoe = FALSE + AOE.stats_stolen = TRUE + +/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/gun/energy/kinetic_accelerator/KA) + ..() + modifier = initial(modifier) //get our modifiers back + turf_aoe = initial(turf_aoe) + stats_stolen = FALSE + +/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + if(stats_stolen) + return + new /obj/effect/temp_visual/explosion/fast(target_turf) + if(turf_aoe) + for(var/T in RANGE_TURFS(1, target_turf) - target_turf) + if(ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.gets_drilled(K.firer) + if(modifier) + for(var/mob/living/L in range(1, target_turf) - K.firer - target) + var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration) + L.apply_damage(K.damage * modifier, K.damage_type, K.def_zone, armor) + to_chat(L, "You're struck by a [K.name]!") /obj/item/borg/upgrade/modkit/aoe/turfs name = "mining explosion" desc = "Causes the kinetic accelerator to destroy rock in an AoE." denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs - -/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K) - ..() - K.turf_aoe = TRUE + turf_aoe = TRUE /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs name = "offensive mining explosion" @@ -360,15 +421,111 @@ desc = "Causes the kinetic accelerator to damage mobs in an AoE." modifier = 0.2 +//Minebot passthrough +/obj/item/borg/upgrade/modkit/minebot_passthrough + name = "minebot passthrough" + desc = "Causes kinetic accelerator shots to pass through minebots." + cost = 0 + +//Tendril-unique modules +/obj/item/borg/upgrade/modkit/cooldown/repeater + name = "rapid repeater" + desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown." + denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater + modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. + cost = 50 + +/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + var/valid_repeat = FALSE + if(isliving(target)) + var/mob/living/L = target + if(L.stat != DEAD) + valid_repeat = TRUE + if(ismineralturf(target_turf)) + valid_repeat = TRUE + if(valid_repeat) + KA.overheat = FALSE + KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. + +/obj/item/borg/upgrade/modkit/lifesteal + name = "lifesteal crystal" + desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target." + icon_state = "modkit_crystal" + modifier = 2.5 //Not a very effective method of healing. + cost = 20 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + if(isliving(target) && isliving(K.firer)) + var/mob/living/L = target + if(L.stat == DEAD) + return + L = K.firer + L.heal_ordered_damage(modifier, damage_heal_order) + +/obj/item/borg/upgrade/modkit/resonator_blasts + name = "resonator blast" + desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts." + denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts + cost = 30 + modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it. + +/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs. + var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf + if(R) + R.damage_multiplier = modifier + R.burst() + return + new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30) + +/obj/item/borg/upgrade/modkit/bounty + name = "death syphon" + desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature." + denied_type = /obj/item/borg/upgrade/modkit/bounty + modifier = 1.25 + cost = 30 + var/maximum_bounty = 25 + var/list/bounties_reaped = list() + +/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK) + for(var/i in existing_marks) + var/datum/status_effect/syphon_mark/SM = i + if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward + SM.reward_target = null + qdel(SM) + L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src) + +/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + if(bounties_reaped[L.type]) + var/kill_modifier = 1 + if(K.pressure_decrease_active) + kill_modifier *= K.pressure_decrease + var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration) + L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor) + +/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L) + var/bonus_mod = 1 + if(ismegafauna(L)) //megafauna reward + bonus_mod = 4 + if(!bounties_reaped[L.type]) + bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty) + else + bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty) //Indoors /obj/item/borg/upgrade/modkit/indoors name = "decrease pressure penalty" - desc = "Increases the damage a kinetic accelerator does in a high pressure environment." + desc = "A syndicate modification kit that increases the damage a kinetic accelerator does in high pressure environments." modifier = 2 denied_type = /obj/item/borg/upgrade/modkit/indoors maximum_of_type = 2 - cost = 40 + cost = 35 /obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K) K.pressure_decrease *= modifier @@ -431,7 +588,7 @@ /obj/item/borg/upgrade/modkit/tracer/adjustable name = "adjustable tracer bolts" - desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color." + desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." /obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) - bolt_color = input(user,"Choose Color") as color + bolt_color = input(user,"","Choose Color",bolt_color) as color|null \ No newline at end of file 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/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a8d368d6aef..881635d0e21 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -30,9 +30,9 @@ var/spread = 0 //amount (in degrees) of projectile spread var/legacy = FALSE //legacy projectile system animate_movement = 0 - + var/ignore_source_check = FALSE - + var/damage = 10 var/tile_dropoff = 0 //how much damage should be decremented as the bullet moves var/tile_dropoff_s = 0 //same as above but for stamina @@ -56,6 +56,7 @@ var/jitter = 0 var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. + var/impact_effect_type //what type of impact effect to show when hitting something var/ricochets = 0 var/ricochets_max = 2 var/ricochet_chance = 0 @@ -80,11 +81,31 @@ /obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range qdel(src) +/obj/item/projectile/proc/prehit(atom/target) + return TRUE + /obj/item/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone) var/turf/target_loca = get_turf(target) + var/hitx + var/hity + if(target == original) + hitx = target.pixel_x + p_x - 16 + hity = target.pixel_y + p_y - 16 + else + hitx = target.pixel_x + rand(-8, 8) + hity = target.pixel_y + rand(-8, 8) + if(!nodamage && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_loca) && prob(75)) + var/turf/simulated/wall/W = target_loca + if(impact_effect_type) + new impact_effect_type(target_loca, hitx, hity) + + W.add_dent(WALL_DENT_SHOT, hitx, hity) + return 0 if(alwayslog) add_attack_logs(firer, target, "Shot with a [type]") if(!isliving(target)) + if(impact_effect_type) + new impact_effect_type(target_loca, hitx, hity) return 0 var/mob/living/L = target var/mob/living/carbon/human/H @@ -115,7 +136,8 @@ M.bloody_hands(H) /* Uncomment when bloody_body stops randomly not transferring blood colour. M.bloody_body(H) */ - + else if(impact_effect_type) + new impact_effect_type(target_loca, hitx, hity) var/organ_hit_text = "" if(L.has_limbs) organ_hit_text = " in \the [parse_zone(def_zone)]" @@ -162,7 +184,7 @@ /obj/item/projectile/Bump(atom/A, yes) if(!yes) //prevents double bumps. return - + if(check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) ricochets++ if(A.handle_ricochet(src)) @@ -190,7 +212,7 @@ return var/turf/target_turf = get_turf(A) - + prehit(A) var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null if(permutation == -1 || forcedodge)// the bullet passes through a dense object! loc = target_turf @@ -204,6 +226,7 @@ mobs_list += L if(mobs_list.len) var/mob/living/picked_mob = pick(mobs_list) + prehit(picked_mob) picked_mob.bullet_act(src, def_zone) qdel(src) @@ -293,7 +316,7 @@ obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile wi /obj/item/projectile/proc/dumbfire(var/dir) current = get_ranged_target_turf(src, dir, world.maxx) //world.maxx is the range. Not sure how to handle this better. fire() - + /obj/item/projectile/proc/on_ricochet(atom/A) return @@ -307,7 +330,7 @@ obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile wi if(A.flags_2 & CHECK_RICOCHET_1) return TRUE return FALSE - + /obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides. Angle = new_angle return TRUE diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index b34364c4c93..bad6b6db68b 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' flag = "laser" eyeblur = 2 + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser is_reflectable = TRUE light_range = 2 light_color = LIGHT_COLOR_RED @@ -38,6 +39,7 @@ irradiate = 30 forcedodge = 1 range = 15 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN /obj/item/projectile/beam/disabler @@ -48,12 +50,14 @@ flag = "energy" hitsound = 'sound/weapons/tap.ogg' eyeblur = 0 + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_CYAN /obj/item/projectile/beam/pulse name = "pulse" icon_state = "u_laser" damage = 50 + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_DARKBLUE /obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) @@ -70,6 +74,7 @@ damage = 30 legacy = 1 animate_movement = SLIDE_STEPS + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN /obj/item/projectile/beam/emitter/singularity_pull() @@ -84,6 +89,7 @@ flag = "laser" var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag) log_override = TRUE + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_DARKBLUE /obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0) @@ -102,6 +108,7 @@ /obj/item/projectile/beam/lasertag/redtag icon_state = "laser" suit_types = list(/obj/item/clothing/suit/bluetag) + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED /obj/item/projectile/beam/lasertag/bluetag @@ -115,6 +122,7 @@ stun = 5 weaken = 5 stutter = 5 + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser light_color = LIGHT_COLOR_PINK /obj/item/projectile/beam/immolator @@ -142,14 +150,17 @@ icon_state = "purple_laser" damage = 200 damage_type = BURN + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser light_color = LIGHT_COLOR_PURPLE /obj/item/projectile/beam/instakill/blue icon_state = "blue_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_DARKBLUE /obj/item/projectile/beam/instakill/red icon_state = "red_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED /obj/item/projectile/beam/instakill/on_hit(atom/target) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 1cde9ef5017..a973ce1dd87 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -5,6 +5,7 @@ damage_type = BRUTE flag = "bullet" hitsound_wall = "ricochet" + impact_effect_type = /obj/effect/temp_visual/impact_effect /obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage name = "beanbag slug" diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 5da56d179bd..e1ca470c95a 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -41,6 +41,7 @@ damage = 20 damage_type = CLONE irradiate = 10 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser /obj/item/projectile/energy/dart name = "dart" @@ -73,6 +74,7 @@ /obj/item/projectile/energy/shock_revolver name = "shock bolt" icon_state = "purple_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser var/chain /obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index 1c23605f2b3..bd249037946 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -3,6 +3,7 @@ desc = "How do you even reuse a bullet?" var/ammo_type = /obj/item/ammo_casing/caseless/ var/dropped = 0 + impact_effect_type = null /obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0) . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index d313195a40e..de11cb557a9 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -5,6 +5,7 @@ alwayslog = TRUE damage_type = BURN nodamage = 1 + impact_effect_type = /obj/effect/temp_visual/impact_effect/ion flag = "energy" /obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0) @@ -129,6 +130,7 @@ damage = 0 damage_type = TOX nodamage = 1 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser flag = "energy" /obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0) @@ -244,18 +246,7 @@ damage = 5 range = 3 dismemberment = 20 - -/obj/item/projectile/plasma/New() - var/turf/proj_turf = get_turf(src) - if(!istype(proj_turf, /turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - if(environment) - var/pressure = environment.return_pressure() - if(pressure < 30) - name = "full strength plasma blast" - damage *= 3 - ..() + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser /obj/item/projectile/plasma/on_hit(atom/target) . = ..() @@ -267,7 +258,8 @@ forcedodge = 0 /obj/item/projectile/plasma/adv - range = 6 + damage = 7 + range = 5 /obj/item/projectile/plasma/adv/mech damage = 10 diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 36605867781..48b76b0de98 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -133,6 +133,39 @@ if(loaded_pill_bottle) loaded_pill_bottle.forceMove(loc) loaded_pill_bottle = null + else if(href_list["change_pillbottle"]) + if(loaded_pill_bottle) + var/list/wrappers = list("Default wrapper", "Red wrapper", "Green wrapper", "Pale green wrapper", "Blue wrapper", "Light blue wrapper", "Teal wrapper", "Yellow wrapper", "Orange wrapper", "Pink wrapper", "Brown wrapper") + var/chosen = input(usr, "Select a pillbottle wrapper", "Pillbottle wrapper", wrappers[1]) as null|anything in wrappers + if(!chosen) + return + var/color + switch(chosen) + if("Default wrapper") + loaded_pill_bottle.cut_overlays() + return + if("Red wrapper") + color = COLOR_RED + if("Green wrapper") + color = COLOR_GREEN + if("Pink wrapper") + color = COLOR_PINK + if("Teal wrapper") + color = COLOR_TEAL + if("Blue wrapper") + color = COLOR_BLUE + if("Brown wrapper") + color = COLOR_MAROON + if("Light blue wrapper") + color = COLOR_CYAN_BLUE + if("Yellow wrapper") + color = COLOR_YELLOW + if("Pale green wrapper") + color = COLOR_PALE_BTL_GREEN + if("Orange wrapper") + color = COLOR_ORANGE + loaded_pill_bottle.wrapper_color = color; + loaded_pill_bottle.apply_wrap(); else if(href_list["close"]) usr << browse(null, "window=chem_master") onclose(usr, "chem_master") @@ -185,7 +218,7 @@ dat += "(Back)" else dat += "Condimaster 3000Condiment infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" - usr << browse(dat, "window=chem_master;size=575x400") + usr << browse(dat, "window=chem_master;size=575x500") return else if(href_list["add"]) @@ -388,7 +421,7 @@ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 400) + ui = new(user, src, ui_key, "chem_master.tmpl", name, 575, 500) ui.open() /obj/machinery/chem_master/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 9ea55dd5af7..1e3bcb92db5 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -9,8 +9,9 @@ active_power_usage = 100 pass_flags = PASSTABLE var/operating = 0 - var/obj/item/reagent_containers/beaker = null - var/limit = 10 + var/obj/item/reagent_containers/beaker = new /obj/item/reagent_containers/glass/beaker/large + var/limit = null + var/efficiency = null //IMPORTANT NOTE! A negative number is a multiplier, a positive number is a flat amount to add. 0 means equal to the amount of the original reagent var/list/blend_items = list ( @@ -88,10 +89,28 @@ var/list/holdingitems = list() +/obj/machinery/reagentgrinder/empty + icon_state = "juicer0" + beaker = null + /obj/machinery/reagentgrinder/New() ..() - beaker = new /obj/item/reagent_containers/glass/beaker/large(src) - return + component_parts = list() + component_parts += new /obj/item/circuitboard/reagentgrinder(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + RefreshParts() + +/obj/machinery/reagentgrinder/RefreshParts() + var/H + var/T + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + H += M.rating + for(var/obj/item/stock_parts/manipulator/M in component_parts) + T += M.rating + limit = 10*H + efficiency = 0.8+T*0.1 /obj/machinery/reagentgrinder/Destroy() QDEL_NULL(beaker) @@ -112,16 +131,29 @@ if(default_unfasten_wrench(user, I)) return + if(exchange_parts(user, I)) + return + + if(anchored && !beaker) + if(default_deconstruction_screwdriver(user, "juicer_open", "juicer0", I)) + return + + if(panel_open && istype(I, /obj/item/crowbar)) + default_deconstruction_crowbar(I) + return + if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) ) - if (!beaker) + if(beaker) + to_chat(user, "There's already a container inside.") + else if(panel_open) + to_chat(user, "Close the maintenance panel first.") + else if(!user.drop_item()) return 1 beaker = I beaker.loc = src update_icon() src.updateUsrDialog() - else - to_chat(user, "There's already a container inside.") return 1 //no afterattack if(is_type_in_list(I, dried_items)) @@ -331,7 +363,7 @@ var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume var/amount = get_juice_amount(O) - beaker.reagents.add_reagent(r_id, min(amount, space)) + beaker.reagents.add_reagent(r_id, min(amount*efficiency, space)) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break @@ -371,17 +403,17 @@ if(amount <= 0) if(amount == 0) if (O.reagents != null && O.reagents.has_reagent("nutriment")) - beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space)) + beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment")*efficiency, space)) O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) if (O.reagents != null && O.reagents.has_reagent("plantmatter")) - beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space)) + beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter")*efficiency, space)) O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) else if (O.reagents != null && O.reagents.has_reagent("nutriment")) - beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space)) + beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)*efficiency), space)) O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space)) if (O.reagents != null && O.reagents.has_reagent("plantmatter")) - beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space)) + beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)*efficiency), space)) O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space)) @@ -403,7 +435,7 @@ for (var/r_id in allowed) var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume var/amount = allowed[r_id] - beaker.reagents.add_reagent(r_id,min(amount, space)) + beaker.reagents.add_reagent(r_id,min(amount*efficiency, space)) if (space < amount) break if (i == round(O.amount, 1)) @@ -419,9 +451,9 @@ var/amount = allowed[r_id] if (amount == 0) if (O.reagents != null && O.reagents.has_reagent(r_id)) - beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space)) + beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id)*efficiency, space)) else - beaker.reagents.add_reagent(r_id,min(amount, space)) + beaker.reagents.add_reagent(r_id,min(amount*efficiency, space)) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break @@ -436,7 +468,7 @@ var/amount = O.reagents.total_volume O.reagents.trans_to(beaker, min(amount, space)) if (O.Uses > 0) - beaker.reagents.add_reagent("slimejelly",min(20, space)) + beaker.reagents.add_reagent("slimejelly",min(20*efficiency, space)) remove_object(O) //Everything else - Transfers reagents from it into beaker 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/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 4d42e9060ae..886105e6465 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -457,6 +457,7 @@ C.AdjustDizzy(volume) C.AddComponent(/datum/component/jestosterone, mind_type) C.AddComponent(/datum/component/squeak, null, null, null, null, null, TRUE) + C.AddComponent(/datum/component/waddling) /datum/reagent/jestosterone/on_mob_life(mob/living/carbon/M) if(!istype(M)) @@ -493,8 +494,10 @@ ..() GET_COMPONENT_FROM(remove_fun, /datum/component/jestosterone, M) GET_COMPONENT_FROM(squeaking, /datum/component/squeak, M) + GET_COMPONENT_FROM(waddling, /datum/component/waddling, M) remove_fun.Destroy() squeaking.Destroy() + waddling.Destroy() /datum/reagent/royal_bee_jelly name = "royal bee jelly" 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/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index c604105dc04..a6dfb7bd848 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -12,6 +12,16 @@ build_path = /obj/item/circuitboard/thermomachine category = list ("Engineering Machinery") +/datum/design/recharger + name = "Machine Board(Weapon Recharger)" + desc = "The circuit board for a weapon recharger" + id = "recharger" + build_path = /obj/item/circuitboard/recharger + materials = list(MAT_GLASS = 1000) + build_type = IMPRINTER + req_tech = list("powerstorage" = 3, "materials" = 3) + category = list("Misc. Machinery") + /datum/design/smes name = "Machine Board (SMES)" desc = "The circuit board for a SMES." @@ -182,6 +192,16 @@ build_path = /obj/item/circuitboard/chem_heater category = list ("Medical Machinery") +/datum/design/reagentgrinder + name = "Machine Design (All-In-One Grinder)" + desc = "The circuit board for an All-In-One Grinder." + id = "reagentgrinder" + req_tech = list("biotech" = 2, "materials" = 2, "programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + build_path = /obj/item/circuitboard/reagentgrinder + category = list ("Medical Machinery") + /datum/design/sleeper name = "Machine Board (Sleeper)" desc = "Allows for the construction of circuit boards used to build a Sleeper." diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index 14cd12c6837..76439c64987 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -1,16 +1,6 @@ ///////////////////////////////////////// /////////////////Mining////////////////// ///////////////////////////////////////// -/datum/design/drill_diamond - name = "Diamond Mining Drill" - desc = "Yours is the drill that will pierce the heavens!" - id = "drill_diamond" - req_tech = list("materials" = 6, "powerstorage" = 5, "engineering" = 5) - build_type = PROTOLATHE - materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) //Yes, a whole diamond is needed. - build_path = /obj/item/pickaxe/drill/diamonddrill - category = list("Mining") - /datum/design/drill name = "Mining Drill" desc = "Yours is the drill that will pierce through the rock walls." @@ -21,13 +11,23 @@ build_path = /obj/item/pickaxe/drill category = list("Mining") +/datum/design/drill_diamond + name = "Diamond Mining Drill" + desc = "Yours is the drill that will pierce the heavens!" + id = "drill_diamond" + req_tech = list("materials" = 6, "powerstorage" = 5, "engineering" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) //Yes, a whole diamond is needed. + build_path = /obj/item/pickaxe/drill/diamonddrill + category = list("Mining") + /datum/design/plasmacutter name = "Plasma Cutter" desc = "You could use it to cut limbs off of xenos! Or, you know, mine stuff." id = "plasmacutter" req_tech = list("materials" = 3, "plasmatech" = 3, "magnets" = 2) build_type = PROTOLATHE - materials = list(MAT_METAL = 2000, MAT_GLASS = 1000, MAT_PLASMA = 1500) + materials = list(MAT_METAL = 1500, MAT_GLASS = 500, MAT_PLASMA = 400) build_path = /obj/item/gun/energy/plasmacutter category = list("Mining") @@ -37,7 +37,7 @@ id = "plasmacutter_adv" req_tech = list("materials" = 4, "plasmatech" = 4, "engineering" = 2, "combat" = 3, "magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_PLASMA = 4000, MAT_GOLD = 500) + materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_PLASMA = 2000, MAT_GOLD = 500) build_path = /obj/item/gun/energy/plasmacutter/adv category = list("Mining") @@ -101,16 +101,6 @@ build_path = /obj/item/borg/upgrade/modkit/range category = list("Mining", "Cyborg Upgrade Modules") -/datum/design/superaccelerator - name = "Kinetic Accelerator Pressure Mod" - desc = "A modification kit which allows Kinetic Accelerators to do more damage while indoors." - id = "indoormod" - req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3) - build_type = PROTOLATHE | MECHFAB - materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_URANIUM = 2000) - build_path = /obj/item/borg/upgrade/modkit/indoors - category = list("Mining", "Cyborg Upgrade Modules") - /datum/design/hyperaccelerator name = "Kinetic Accelerator Mining AoE Mod" desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock." @@ -119,4 +109,4 @@ build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000) build_path = /obj/item/borg/upgrade/modkit/aoe/turfs - category = list("Mining", "Cyborg Upgrade Modules") + category = list("Mining", "Cyborg Upgrade Modules") \ No newline at end of file diff --git a/code/modules/research/designs/spacepod_designs.dm b/code/modules/research/designs/spacepod_designs.dm index 44bef918678..9930426df86 100644 --- a/code/modules/research/designs/spacepod_designs.dm +++ b/code/modules/research/designs/spacepod_designs.dm @@ -149,17 +149,6 @@ build_path = /obj/item/spacepod_equipment/weaponry/mining_laser category = list("Pod_Weaponry") -/datum/design/pod_mining_laser_hyper - construction_time = 200 - name = "Enhanced Mining Laser" - desc = "Allows for the construction of an enhanced mining laser." - id = "pod_mining_laser_hyper" - req_tech = list("materials" = 7, "powerstorage" = 6, "engineering" = 5, "magnets" = 6, "combat" = 4) - build_type = PODFAB - materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_DIAMOND = 4000) - build_path = /obj/item/spacepod_equipment/weaponry/mining_laser_hyper - category = list("Pod_Weaponry") - ////////////////////////////////////////// //////SPACEPOD MISC. ITEMS//////////////// ////////////////////////////////////////// diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 4d1195e29ce..05786daed94 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -372,8 +372,9 @@ datum/tech/robotics var/default_desc = "A disk for storing device design data for construction in lathes." /obj/item/disk/design_disk/New() - src.pixel_x = rand(-5.0, 5) - src.pixel_y = rand(-5.0, 5) + ..() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) /obj/item/disk/design_disk/proc/load_blueprint(datum/design/D) name = "[default_name] \[[D]\]" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 0587f6e4f73..81ca4bfeb9b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -211,12 +211,16 @@ if(SM.flags_2 & HOLOGRAM_2) //Check to see if it's a holodeck creature to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") to_chat(user, "[M] accepts the potion and suddenly becomes attentive and aware. It worked!") + after_success(user, SM) qdel(src) else to_chat(user, "[M] looks interested for a moment, but then looks back down. Maybe you should try again later.") being_used = 0 ..() +/obj/item/slimepotion/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM) + return + /obj/item/slimepotion/transference name = "consciousness transference potion" desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being." diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index cdc81a9e759..9c8d963fdcd 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -63,7 +63,7 @@ var/ert_request_answered = FALSE active_team.setSlots(commander_slots, security_slots, medical_slots, engineering_slots, janitor_slots, paranormal_slots, cyborg_slots) send_emergency_team = TRUE - var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT]) + var/list/ert_candidates = shuffle(pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600, 1, role_playtime_requirements[ROLE_ERT])) if(!ert_candidates.len) active_team.cannot_send_team() send_emergency_team = FALSE @@ -95,8 +95,8 @@ var/ert_request_answered = FALSE for(var/datum/async_input/A in ert_gender_prefs) A.close() for(var/mob/M in response_team_members) - ert_role_prefs.Add(input_ranked_async(M, "Please order ERT roles from most to least preferred (15 seconds):", active_team.get_slot_list())) - addtimer(CALLBACK(GLOBAL_PROC, .proc/dispatch_response_team, response_team_members, ert_gender_prefs, ert_role_prefs), 150) + ert_role_prefs.Add(input_ranked_async(M, "Please order ERT roles from most to least preferred (20 seconds):", active_team.get_slot_list())) + addtimer(CALLBACK(GLOBAL_PROC, .proc/dispatch_response_team, response_team_members, ert_gender_prefs, ert_role_prefs), 200) /proc/dispatch_response_team(list/response_team_members, list/ert_gender_prefs, list/ert_role_prefs) var/spawn_index = 1 @@ -240,32 +240,21 @@ var/ert_request_answered = FALSE switch(officer_type) if("Engineer") M.equipOutfit(engineering_outfit) - M.job = "ERT Engineering" if("Security") M.equipOutfit(security_outfit) - M.job = "ERT Security" if("Medic") M.equipOutfit(medical_outfit) - M.job = "ERT Medical" if("Janitor") M.equipOutfit(janitor_outfit) - M.job = "ERT Janitor" if("Paranormal") M.equipOutfit(paranormal_outfit) - M.job = "ERT Paranormal" - M.mind.isholy = TRUE if("Commander") - // Override name and age for the commander - M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]") - M.age = rand(35,45) - M.equipOutfit(command_outfit) - M.job = "ERT Commander" /datum/response_team/proc/cannot_send_team() event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable") @@ -317,6 +306,7 @@ var/ert_request_answered = FALSE name = "Response team" var/rt_assignment = "Emergency Response Team Member" var/rt_job = "This is a bug" + var/rt_mob_job = "This is a bug" // The job set on the actual mob. allow_backbag_choice = FALSE allow_loadout = FALSE pda = /obj/item/pda/heads/ert diff --git a/code/modules/response_team/ert_outfits.dm b/code/modules/response_team/ert_outfits.dm index b287643901d..93b87e7d1ec 100644 --- a/code/modules/response_team/ert_outfits.dm +++ b/code/modules/response_team/ert_outfits.dm @@ -23,6 +23,10 @@ PDA.ownrank = rt_assignment PDA.name = "PDA-[H.real_name] ([PDA.ownjob])" +/datum/outfit/job/centcom/response_team/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + + H.job = rt_mob_job //////////////////// COMMANDER /////////////////// @@ -30,6 +34,7 @@ name = "RT Commander" rt_assignment = "Emergency Response Team Leader" rt_job = "Emergency Response Team Leader" + rt_mob_job = "ERT Commander" uniform = /obj/item/clothing/under/rank/centcom_officer back = /obj/item/storage/backpack/ert/commander @@ -39,6 +44,12 @@ l_pocket = /obj/item/pinpointer r_pocket = /obj/item/melee/classic_baton/telescopic +/datum/outfit/job/centcom/response_team/commander/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + + H.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]") + H.age = rand(35,45) + /datum/outfit/job/centcom/response_team/commander/amber name = "RT Commander (Amber)" shoes = /obj/item/clothing/shoes/combat @@ -107,6 +118,7 @@ /datum/outfit/job/centcom/response_team/security name = "RT Security" rt_job = "Emergency Response Team Officer" + rt_mob_job = "ERT Security" uniform = /obj/item/clothing/under/rank/security back = /obj/item/storage/backpack/ert/security belt = /obj/item/storage/belt/security/response_team @@ -194,6 +206,7 @@ /datum/outfit/job/centcom/response_team/engineer name = "RT Engineer" rt_job = "Emergency Response Team Engineer" + rt_mob_job = "ERT Engineering" back = /obj/item/storage/backpack/ert/engineer uniform = /obj/item/clothing/under/rank/engineer @@ -276,6 +289,7 @@ /datum/outfit/job/centcom/response_team/medic name = "RT Medic" rt_job = "Emergency Response Team Medic" + rt_mob_job = "ERT Medical" uniform = /obj/item/clothing/under/rank/medical back = /obj/item/storage/backpack/ert/medical pda = /obj/item/pda/heads/ert/medical @@ -312,6 +326,7 @@ /datum/outfit/job/centcom/response_team/medic/red name = "RT Medic (Red)" + rt_mob_job = "ERT Medical" shoes = /obj/item/clothing/shoes/white gloves = /obj/item/clothing/gloves/color/latex/nitrile suit = /obj/item/clothing/suit/space/hardsuit/ert/medical @@ -377,6 +392,7 @@ /datum/outfit/job/centcom/response_team/paranormal name = "RT Paranormal" rt_job = "Emergency Response Team Inquisitor" + rt_mob_job = "ERT Paranormal" uniform = /obj/item/clothing/under/rank/chaplain back = /obj/item/storage/backpack/ert/security gloves = /obj/item/clothing/gloves/color/black @@ -392,6 +408,11 @@ /obj/item/flashlight/seclite = 1 ) +/datum/outfit/job/centcom/response_team/paranormal/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(H.mind) + H.mind.isholy = TRUE + /datum/outfit/job/centcom/response_team/paranormal/amber name = "RT Paranormal (Amber)" suit = /obj/item/clothing/suit/armor/vest/ert/security/paranormal @@ -433,6 +454,7 @@ /datum/outfit/job/centcom/response_team/janitorial name = "RT Janitor" rt_job = "Emergency Response Team Janitor" + rt_mob_job = "ERT Janitor" uniform = /obj/item/clothing/under/color/purple back = /obj/item/storage/backpack/ert/janitor belt = /obj/item/storage/belt/janitor/full 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 5fad9348769..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) @@ -503,7 +504,7 @@ SSair.remove_from_active(T1) T1.CalculateAdjacentTurfs() SSair.add_to_active(T1,1) - + T1.lighting_build_overlay() T0.ChangeTurf(turf_type) @@ -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) @@ -836,20 +838,6 @@ shuttleId = "whiteship" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4" -/obj/machinery/computer/shuttle/golem_ship - name = "Golem Ship Console" - desc = "Used to control the Golem Ship." - circuit = /obj/item/circuitboard/golem_ship - shuttleId = "freegolem" - possible_destinations = "freegolem_z3;freegolem_z5;freegolem_z1;freegolem_z6" - resistance_flags = INDESTRUCTIBLE - -/obj/machinery/computer/shuttle/golem_ship/attack_hand(mob/user) - if(!isgolem(user)) - to_chat(user, "The console is unresponsive. Seems only golems can use it.") - return - ..() - /obj/machinery/computer/shuttle/engineering name = "Engineering Shuttle Console" desc = "Used to call and send the engineering shuttle." @@ -893,6 +881,25 @@ possible_destinations = "trade_sol_base;trade_dock" shuttleId = "trade_sol" +/obj/machinery/computer/shuttle/golem_ship + name = "Golem Ship Console" + desc = "Used to control the Golem Ship." + circuit = /obj/item/circuitboard/shuttle/golem_ship + shuttleId = "freegolem" + possible_destinations = "freegolem_lavaland;freegolem_z5;freegolem_z4;freegolem_z6" + +/obj/machinery/computer/shuttle/golem_ship/attack_hand(mob/user) + if(!isgolem(user) && !isobserver(user)) + to_chat(user, "The console is unresponsive. Seems only golems can use it.") + return + ..() + +/obj/machinery/computer/shuttle/golem_ship/recall + name = "golem ship recall terminal" + desc = "Used to recall the Golem Ship." + possible_destinations = "freegolem_lavaland" + resistance_flags = INDESTRUCTIBLE + //#undef DOCKING_PORT_HIGHLIGHT /turf/proc/copyTurf(turf/T) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index b6a7e7bb28f..9da43d08fbf 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -247,7 +247,8 @@ /obj/machinery/clonepod, /obj/effect/hierophant, /obj/item/warp_cube, - /obj/machinery/quantumpad + /obj/machinery/quantumpad, + /obj/structure/extraction_point ) if(A) if(is_type_in_list(A, blacklist)) diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm index e64087d5561..d509b4f745c 100644 --- a/code/modules/spacepods/equipment.dm +++ b/code/modules/spacepods/equipment.dm @@ -131,16 +131,6 @@ fire_delay = 10 fire_sound = 'sound/weapons/kenetic_accel.ogg' -/obj/item/spacepod_equipment/weaponry/mining_laser_hyper - name = "enhanced mining laser system" - desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock." - icon = 'icons/goonstation/pods/ship.dmi' - icon_state = "pod_w_laser" - projectile_type = /obj/item/projectile/kinetic/pod/enhanced - shot_cost = 200 - fire_delay = 8 - fire_sound = 'sound/weapons/kenetic_accel.ogg' - /* /////////////////////////////////////// /////////Misc. System/////////////////// 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/code/modules/vr/vr_outfits.dm b/code/modules/vr/vr_outfits.dm index ce8d52b4880..e61ea829b27 100644 --- a/code/modules/vr/vr_outfits.dm +++ b/code/modules/vr/vr_outfits.dm @@ -1,12 +1,12 @@ //place all the outfits for your levels in here. /datum/outfit/vr/vr_basic - name = "basic vr" + name = "Basic Virtual Reality" uniform = /obj/item/clothing/under/psysuit shoes = /obj/item/clothing/shoes/black /datum/outfit/vr/roman - name = "roman" + name = "Roman" uniform = /obj/item/clothing/under/roman shoes = /obj/item/clothing/shoes/roman l_hand = /obj/item/shield/riot/roman diff --git a/config/example/config.txt b/config/example/config.txt index 89b8767feab..183f85437f0 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -85,6 +85,8 @@ LOG_WORLD_OUTPUT ## log admin warning messages LOG_ADMINWARN +## Amount of minutes that a person has to be AFK before he'll be listed on the "List AFK players" verb +#LIST_AFK_MINIMUM 5 ## Amount of minutes that a person has to be AFK before he will be warned by the AFK subsystem. Leave this 0 to prevent the subsystem from activating WARN_AFK_MINIMUM 0 @@ -119,12 +121,6 @@ PROBABILITY ABDUCTION 0 PROBABILITY DEVIL 0 PROBABILITY DEVILAGENTS 0 -## Probability in % for Free Golems to spawn at roundstart, set to 0 for no golems -PROB_FREE_GOLEMS 75 - -## Uncomment to allow free golems on all roundtypes. Otherwise, disabled on cult, wiz, raging mages, blob, and nuclear. -#UNRESTRICTED_FREE_GOLEMS - ## Maximum cycles shadowlings can remain unhatched before they take damage. 1800 = 60 minutes, 900 = 30 minutes, 0 = feature disabled. SHADOWLING_MAX_AGE 0 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/goon/browserassets/css/browserOutput-dark.css b/goon/browserassets/css/browserOutput-dark.css index fed5a252ba3..b19cc07275f 100644 --- a/goon/browserassets/css/browserOutput-dark.css +++ b/goon/browserassets/css/browserOutput-dark.css @@ -261,6 +261,7 @@ em {font-style: normal; font-weight: bold;} .mentorhelp {color: #0077bb; font-weight: bold;} .adminhelp {color: #aa0000; font-weight: bold;} .playerreply {color: #8800bb; font-weight: bold;} +.pmsend {color: #0000ff;} .name { font-weight: bold;} .say {} .yell { font-weight: bold;} diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 1af8b03bd58..3b77bb1f97e 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -258,6 +258,7 @@ em {font-style: normal; font-weight: bold;} .mentorhelp {color: #0077bb; font-weight: bold;} .adminhelp {color: #aa0000; font-weight: bold;} .playerreply {color: #8800bb; font-weight: bold;} +.pmsend {color: #0000ff;} .name { font-weight: bold;} .say {} .yell { font-weight: bold;} diff --git a/html/browser/marked.js b/html/browser/marked.js index 6fe0e1e4e41..fa151b6befd 100644 --- a/html/browser/marked.js +++ b/html/browser/marked.js @@ -11,16 +11,26 @@ function parse(node) { parse(node.childNodes[i]); } - if(!node.innerHTML) { + if (!node.innerHTML || node.tagName === 'A') { return; } - node.innerHTML = marked(node.innerHTML.replace(/
/gi, '\n'), { breaks: true }); + + node.innerHTML = marked(node.innerHTML.replace(/
/gi, '\n').replace(/\t/gi, ''), { breaks: true, gfm: false }); } -function main() { +window.onload = function() { + var para = marked.Renderer.prototype.paragraph; + var field = ''; + marked.Renderer.prototype.paragraph = function(text) { + if (text.slice(0, field.length) === field || + text.slice(0, 2) === '= 0) { + return text; + } + return para(text); + }; + if ($('#markdown')) { parse($('#markdown')); } } - -window.onload = main; diff --git a/html/browser/rankedInput.js b/html/browser/rankedInput.js new file mode 100644 index 00000000000..fb5af2aeb69 --- /dev/null +++ b/html/browser/rankedInput.js @@ -0,0 +1,26 @@ +var uid; + +function allowDrop(ev) { + ev.preventDefault(); +} + +function drag(ev) { + var index = ev.target.getAttribute('index'); + if (index) { + ev.dataTransfer.setData('text', index); + } +} + +function drop(ev) { + ev.preventDefault(); + var data = ev.dataTransfer.getData('text'); + if (data && ev.target.getAttribute('index')) { + window.location = '?src=' + uid + ';' + 'cut=' + data + ';' + 'insert=' + ev.target.getAttribute('index'); + } +} + +function setUid() { + uid = document.getElementById('choices').getAttribute('uid'); +} + +window.onload = setUid; diff --git a/html/changelog.html b/html/changelog.html index b639984a5a6..023f1918124 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,361 @@ -->
+

23 August 2019

+

AffectedArc07, Keekenox, Floyd/Qustinnus updated:

+
    +
  • P A R A L L A X (That fancy space thing)
  • +
  • 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.
  • +
+

Arkatos updated:

+
    +
  • Added colored pillbottles
  • +
  • Added an option to change color of the pillbottles to ChemMaster3000
  • +
  • Added new description to patch packs
  • +
  • Jump to Node ability now shows a location of each Blob node
  • +
  • Added SlimeHUD when playing as a slime. This means slimes will have their own unique health doll and pull icon.
  • +
  • Action buttons can now be dragged onto each other to swap places
  • +
  • Fixed a case where dragging locked action buttons could result in white tooltip over the screen
  • +
+

AzuleUtama updated:

+
    +
  • The Traitor thermal glasses and chameleon security HUD now use the updated chameleon code. balance: Traitor thermal glasses will no longer cause eye damage when hit with EMP.
  • +
+

Citinited updated:

+
    +
  • Removes the big pipe dispensers from atmospherics, you can still find them elsewhere.
  • +
+

Couls updated:

+
    +
  • After many complaints about being stuck in medbay. NT has modified all the airlocks on the station to allow leaving certain departments without requiring an respective ID. This new modification is indicated by a white light near the airlocks in the direction of unrestricted access.
  • +
  • New unrestricted access can be built by NT engineers through modification of the airlock electronics.
  • +
  • hit effects!
  • +
  • hit effect sprites for lasers, bullet hole and dent decals for walls
  • +
  • mice now have a very low chance of chewing through wires, this kills them if the wire is powered
  • +
  • You can now homerun things thrown at you with a baseball bat!
  • +
  • new baseball hit noise, new baseball sprite
  • +
  • there are much less one-way airlocks on station
  • +
+

DoctorDrugs updated:

+
    +
  • removed the ability to eat the divine vocal cords
  • +
+

EmanTheAlmighty updated:

+
    +
  • The AI can now change its intent by clicking on the new on-screen button or pressing 4 to switch to help or harm.
  • +
  • The AI can now toggle airlock safeties instead of toggling door bolt lights by pressing middle mouse.
  • +
+

Fox McCloud updated:

+
    +
  • Majorly updates lavaland
  • +
  • Miner starting equipment altered. They now start with a kinetic accelerator
  • +
  • Miners start off with a mini pickaxe
  • +
  • Adds in the boxed implant kit, regular shelter capsule, and mining drone passthrough upgrade to the mining equipment vendor
  • +
  • re-ordered the equipment vendor, so things are grouped together more logically
  • +
  • Added a number of new kinetic accelerator upgrades acquirable through tendril chests
  • +
  • Mining bot now uses an actual kinetic accelerator as opposed to a "Look alike"; you can upgrade its internal gun with various kinetic accelerator modkits.
  • +
  • Sentient mining bot nerfed; you can no longer apply the armor or melee buff to them; offset by the fact you can upgrade their kinetic gun.
  • +
  • Indoor pressure mod removed from R&D and made into a miner traitor item
  • +
  • Resonators have an increased amount of fields and do more damage in low pressure. Additionally, if you place a field on a tile that already has a field, it'll cause it to detonate early
  • +
  • Plasmacutter no longer does increased damage in low pressure, Advanced plasma cutter does slightly more base damage but has a bit less range. Price has been cut at R&D
  • +
  • removed the AoE Mob+Turf upgrade for mining pods
  • +
  • Fixes ripleys being slow on lavaland
  • +
  • Fixes walking on lavaland sounding like walking on metal plating
  • +
  • Adds in kinetic crusher trophies
  • +
  • Kinetic crusher can be wielded/unwielded (but you can't attack with it unwielded)
  • +
  • Adds the HECK suit as Bubblegum loot
  • +
  • Adds the kinetic accelerator bounty mod as Tendril loot
  • +
  • Add fulton extract packs to the mining vendor; rescue precious valuable or dead miners!
  • +
  • Adds mini-fans to the mining, engineering, and security shuttles
  • +
  • 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)
  • +
  • Can attach bayonets to C20rs, bolt action rifles, security auto-rifles, and kinetic accelerator; harm intent to stab with them
  • +
  • can craft ore boxes out of wood
  • +
  • Skull helmets are now proper helmets
  • +
  • Survival autoinjectors tweaked
  • +
  • Survival autoinjectors have 15 units of teporone in them
  • +
  • Survival autoinjectors have double the epinpehrine and weak omnizine instead of saline glucose.
  • +
  • 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
  • +
  • Fixes airlocks spamming their open and close when you stand in them
  • +
  • Fixes overriden door timers not working
  • +
+

Fox McCloud and FullofSkittles updated:

+
    +
  • Changes the Venus Human Flytrap sprite
  • +
+

Ionward updated:

+
    +
  • Adjusted Greys uniforms and backpack sprites.
  • +
  • Added a bunch of Drask masks and glasses.
  • +
  • Added God Eye sprites for Greys, Drask, and Vox.
  • +
+

JKnutson101 updated:

+
    +
  • Issue where Emergency NanoMed Vendors required Medical ID to Access.
  • +
  • Added the ability for cyborgs with zero battery to use the 'succumb' verb.
  • +
+

Markolie updated:

+
    +
  • Players now have thirty seconds instead of just five seconds to select if they want to be somebody's butler through a die of fate roll.
  • +
  • The Netherworld portal is now properly destroyed upon being killed. In addition, its max health is now equal to its starting health.
  • +
  • The iron ore sprite that shows up when using the miner scanner no longer has a background, making it blend in better with the actual rock.
  • +
  • Tightening the bolts of a falsewall now works properly.
  • +
  • Deconstructing plating now requires it to be unfastened using a screwdriver first, in order to prevent it from being accidentally deconstructed with a welder.
  • +
+

Quantum-M updated:

+
    +
  • Minor grammar edits to the text that tells you that your thirst is dealt with but no blood power is given. balance: Vampires are no longer able to drink get power from ckeyless humanoid monkeys, they will now need to hunt down actual characters with ckey to get power.
  • +
+

Shadow-Quill updated:

+
    +
  • Mass drivers now need two rods/cable coil instead of three to construct.
  • +
  • The RD's office door can now be opened by the RD, instead of by just the Captain.
  • +
  • Science lockdown can now only be (de)activated by the RD, instead of any scientist.
  • +
  • Using a health analyzer in-hand will switch the verbosity.
  • +
  • You no longer have to unscrew a plating to repair it.
  • +
  • The shivering symptom in virology now properly chills people.
  • +
+

SteelSlayer updated:

+
    +
  • Wizard rounds now end if all wizards and apprentices are either dead, inside cyborgs, or in MMIs
  • +
  • Re-enabled the wizard's hud. Wizards can now see their own antag icon along with seeing other wizard's and apprentice's icons
  • +
  • When a cult sacrifice target leaves the round via cryo, the game will reassign a new target for them
  • +
  • Added an alarm sound that plays for cultists when their sacrifice target leave the round via cryo
  • +
  • When a cult sacrifice target leaves the round via cryo, the game will update every cultist's notes to reflect the change
  • +
  • Adds a new verb named "Toggle Health Scan" to the ghost tab. While toggled on, ghosts can perform health scans on humanoids and cyborgs by left clicking on them
  • +
+

TDSSS updated:

+
    +
  • syndicate fax machine to lavaland syndie base.
  • +
  • syndicate lavaland base self destruct now requires syndie access.
  • +
  • moved headsets in lavaland syndie base.
  • +
  • Gave the HoP fax long-ranged faxing capabilities.
  • +
  • midround event spawned xeno larva now need less time to grow up and evolve.
  • +
  • cult talisman got unique icons to tell them apart
  • +
  • mining hardsuits come with helmets now again
  • +
+

Tayyyyyyy updated:

+
    +
  • Whether you join the ERT is no longer determined by how fast you click "yes" on the prompt.
  • +
  • Drag and drop support and 20 seconds to pick ERT role instead of 15
  • +
  • Fix extra newline after field and disable Github Flavored Markdown in papers (normal markdown still works)
  • +
  • autogenerated papers no longer appear as HTML code
  • +
  • message window links added to PM send receipt
  • +
  • Many shuttle flight directions fixed
  • +
+

TheSardele updated:

+
    +
  • All-In-one Grinders can now be constructed and upgraded
  • +
  • All-In-one Grinders now produce more reagents when upgraded.
  • +
  • Icon for cybernetic eyes
  • +
  • Sleeping while drunk no longer makes you more drunk.
  • +
+

dovydas12345 updated:

+
    +
  • Fixes being able to pick up chairs and stools when you have items in both hand or when you don't have hands.
  • +
  • Adds a ERT shuttle console which is accessible to ERT members
  • +
+

farie82 updated:

+
    +
  • Rigging a crate now doesn't delete your coil stack anymore but instead uses 15 of it. Borgs can use it safely again
  • +
+

kazboo updated:

+
    +
  • adjusts the hierophant blast layer to make for it to always be below the effect. this should be the case already due to mouse_opacity, though for some unknown reason, it just doesn't work sometimes, so this should fix it.
  • +
+ +

12 August 2019

+

AffectedArc07 updated:

+
    +
  • Panic Bunker
  • +
+

Allfd updated:

+
    +
  • Panthers can now see in the dark.
  • +
+

Arkatos updated:

+
    +
  • You can ctrl-click any action button to lock/unlock its position
  • +
  • All actions buttons now start with their position locked
  • +
+

Citinited updated:

+
    +
  • Mappers have a new tool that creates a fully functional cycling airlock.
  • +
+

CornMyCob updated:

+
    +
  • The cursed heart you get from necropolis chests is now the one that heals you.
  • +
+

Couls updated:

+
    +
  • Diagonal movement
  • +
  • Input subsystem(numpad targetting, press numpad 8 multiple times to target eyes and mouth, numpad 6 or 4 to target arms and press them again to target hands and numpad 1 or 3 to target legs and press them again to target feet) taken from https://github.com/tgstation/tgstation/pull/32751
  • +
  • change confused status to have you move diagonally randomly in the direction you're headed if not too confused(now you can drunkenly walk down the hall)
  • +
  • clients are now children of datums like everything else in BYOND taken from https://github.com/tgstation/tgstation/pull/20394
  • +
  • AZERTY and numpad targetting preferences
  • +
  • Reworks the biohazard event to have a chance of giving a randomized advanced disease with 6 varying symptoms instead of a preset disease.
  • +
  • change how bone breakage is calculated
  • +
  • can now butcher koi for salmon meat
  • +
  • adds a line to alert people as to why they're not getting blood from the monkeys
  • +
  • The vampires are finally off their monkey diet, theycan now suck blood from players and humanized monkeys
  • +
  • Symptoms are now correctly generated for level 7 biohazards
  • +
  • Borgs can now cycle modules with X again
  • +
  • Ahelp message is less confusing
  • +
  • F2 (say) F3(ooc) F4(me) buttons have been restored tweak:when numpad targetting is off you can use numpad 1-4 to change intents tweak:pressing shift before any of the intent buttons doesn't change intents(for people with shift+1-4 macros) tweak:backspace now sets the focus to the chat bar
  • +
  • fixes the runtime caused by running keyloop for clients
  • +
  • Preferences not saving properly
  • +
  • issue with preload_rsc
  • +
  • Restore hotkey mode
  • +
  • Q no longer drops items as a cyborg on AZERTY mode
  • +
  • Automatically offload ore you're carrying to an orebox you're dragging
  • +
  • typing indicators show up again
  • +
  • TG waddle component, clowns can now optionally waddle, penguins always waddle. Ctrl Click clown shoes in hand to toggle waddling
  • +
  • Added invismin macro back to F9
  • +
  • stealthmin macro removed from F9
  • +
+

Crazylemon64 updated:

+
    +
  • Fixes a bug that would cause ghosts to teleport their bodies sometimes
  • +
+

Dave-TH updated:

+
    +
  • The syndicate uplink is now complete with a new spooky background. Very neat!
  • +
+

DoctorDrugs updated:

+
    +
  • Adds additional roundstart miner slots and the additional gear required for them to do their jobs
  • +
+

Fox McCloud updated:

+
    +
  • Fixes being able to sharpen toy double-bladed energy swords
  • +
+

IAmBigCoat updated:

+
    +
  • Added explosion warnings to medbeams, because medbeams can cause explosions. DON'T CROSS THE BEAMS!
  • +
+

Ionward updated:

+
    +
  • Fixed vox jester uniform not appearing correctly.
  • +
  • species specific fit underwear for greys
  • +
+

KasparoVy updated:

+
    +
  • Re-adds the ability to see in the dark. Adds overlays for each level of darksight (>=8,7,6,5,4,3,<=2).
  • +
+

Kyep updated:

+
    +
  • Round time (h:mm) and station security level (green/red/blue/etc) are now visible on our server hub entry.
  • +
  • Round time is now visible to all player-controlled mobs in their status panel (including simple animals).
  • +
  • Admins using the 'MOST' attack log setting no longer see player-v-NPC combat, or any attack logs generated in the admin room, admin testing area, thunderdome arena, or lavaland syndicate base. Prevents admins being spammed with attack logs.
  • +
  • Heads of department may now issue department-specific medals to members of their department.
  • +
+

Markolie updated:

+
    +
  • Humans and mice that are secretly blobs now have an antagHUD icon.
  • +
  • All hivemind languages now display follow links to ghosts.
  • +
  • Announcements, whispers (with ghost ears) and cultist messages are no longer displayed in the lobby.
  • +
  • The sentience event no longer triggers a huge number of ghost polling messages.
  • +
  • When xenomorphs are damaged, their health HUD now updates properly.
  • +
  • Custom title for ghost notifications now work properly.
  • +
  • Fixed double admin commands in the grenade priming message.
  • +
  • Ghosts will now always see whispers/zero pressure speaking if they're on the screen with the mob speaking.
  • +
  • Ghosts with ghost sight enabled will no longer see emotes from clientless mobs.
  • +
  • The prison labor point system has been refactored so it works properly.
  • +
  • Plating can now be removed (exposing the baseturf) using a welder.
  • +
  • All remaining Lavaland ruins have been ported over from /tg/.
  • +
  • All chairs on shuttles have been replaced with brand new shuttle chairs.
  • +
  • Tribal splints have been added to the game, which can be crafted with two bones and one piece of sinew.
  • +
  • The Lavaland Syndicate base now has a defibrillator and mounted defibrillator. The animal hospital now has a mounted defibrillator.
  • +
  • The Ash Walker storage area now comes with an advanced medkit instead of a regular one and one set of medical splints. It also comes with aloe vera, comfrey and wheat seeds.
  • +
  • The water tank in the Ash Walker nest has been replaced with a puddle.
  • +
  • The items in vending machines on the beach ruin and animal hospital are now free.
  • +
  • Fixed an issue where slimes wouldn't take damage from water in space.
  • +
  • It is no longer possible to unanchor the surivval pod storage units.
  • +
  • Drinking from a beaker now only applies the effect of five units of the ingested chemical, instead of the entire volume of the beaker.
  • +
  • Resolved an issue where beaker attack logs were reversed.
  • +
  • Moving through portals very quickly no longer breaks movement.
  • +
+

Quantum-M updated:

+
    +
  • New sprites for vampires being "hungry".
  • +
  • New sprite for vampire usable blood count.
  • +
  • New sprites for the safety muzzle.
  • +
  • Safety muzzle (aka the anti-bitting one) can no longer be resisted out of.
  • +
  • Vampires can now suck blood from monkey mobs (e.g. monkeys, stoks, etc.) for sustenance but do not get blood power points.
  • +
  • RnD is no longer able to print out any telescience boards.
  • +
+

SteelSlayer updated:

+
    +
  • Gives vampire thralls an objective, which can be viewed in their notes
  • +
  • Increases the size of the enthralling message seen by newly created vampire thralls
  • +
  • Vampire thralls are now stunned briefly (about 3 seconds) upon being enthralled
  • +
  • The AI's robot control window now allows you to see and interact with available bots again
  • +
+

TDSSS updated:

+
    +
  • cult teleport runes and similar powers now work on z levels 9-12
  • +
+

Tayyyyyyy updated:

+
    +
  • Inputs sanitized
  • +
  • autocomplete input mishandling single quotes (you can teleport to Wizard's den now)
  • +
  • newlines not working in CC announcements
  • +
  • players not being able to send single quotes in ahelps or PMs
  • +
  • robots not being able to pick their name
  • +
+

TheSardele updated:

+
    +
  • Lowers throwforce of drinking cartons from 15 to 0
  • +
  • Bees no longer inject venom when nuzzling
  • +
  • Sec pod pilots can now spawn with the loadout security armbands
  • +
  • It is no longer possible to raise zero to -infinity fingers using the *signal emote
  • +
  • Earmuffs now properly protect you from vampire screeches no matter what you are wearing on your other ear
  • +
+

Ty-Omaha updated:

+
    +
  • Reworded permanent bans to non-expiring bans.
  • +
  • Door remotes now add to admin-only hidden fingerprint list
  • +
  • Gave plastic surgery to line 364 of atoms.dm
  • +
+

and DominikPanic updated:

+
    +
  • Limits IC notes
  • +
+

datlo updated:

+
    +
  • Free Golems are now a lavaland ruin spawn instead of a space ruin spawn.
  • +
  • Free Golems must now purchase their shuttle board for 2000 mining points before being able to fly their shuttle.
  • +
  • Added a shuttle recall console at the golem lavaland spawn point so that golems can always recall the shuttle back to lavaland
  • +
  • The Free Golem Ship can now move to the Construction Site, the Derelict, or back to their Lavaland spawn.
  • +
  • The Free Golem Ship has been redesigned with an open floor plan, removing most of its interior walls for extra space.
  • +
  • Free Golems no longer get a free kinetic accelerator on their ship.
  • +
  • New crit species with below -100 health will be considered dead for hijack purposes, and will not interrupt a shuttle hijack attempt.
  • +
  • Fix some cases of traitors getting conflicting objectives, such as assassinating and protecting the same target.
  • +
+

farie82 updated:

+
    +
  • Beepsky will now respect your disguise again. No more looking right through that gasmask
  • +
  • Medical and security HUDs now use the correct way to identify somebody. They will see the same as you do on your screen.
  • +
  • You will now get a job icon in the sec HUD when you use your PDA as ID. It'll use the PDA's assigned job.
  • +
  • Ticket takes now ask for confirmation if you want to take an already assigned ticket.
  • +
  • Blindfolds are now craftable from 3 cloth. For those vampire prisoners you want to keep in check
  • +
  • Empty beaker button from the PANDEMIC is now replaced with Empty and eject beaker
  • +
  • List AFK players is now a verb for admins to use
  • +
  • Adds the AFK auto cryo system. By default it won't affect players unless they activate it themselves by setting the preference in their game preferences tab.
  • +
  • The syndicate can't use meta warfare no more. Advanced pinpointers no longer crash the server
  • +
+

iantine updated:

+
    +
  • Mouse suicide
  • +
+

improvedname updated:

+
    +
  • adds lasagna
  • +
+

kazboo updated:

+
    +
  • changed the display name shown to a player upon being frozen in a manner that only the admins ckey is displayed, not the character name along with it
  • +
+

08 July 2019

Arkatos updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 49e86db023d..647b9735e00 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10454,3 +10454,368 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fix a bug where a player who reconnects is still shown as disconnected datlo: - bugfix: Fix an antag rolling exploit. +2019-08-12: + AffectedArc07: + - rscadd: Panic Bunker + Allfd: + - tweak: Panthers can now see in the dark. + Arkatos: + - rscadd: You can ctrl-click any action button to lock/unlock its position + - tweak: All actions buttons now start with their position locked + Citinited: + - rscadd: Mappers have a new tool that creates a fully functional cycling airlock. + CornMyCob: + - bugfix: The cursed heart you get from necropolis chests is now the one that heals + you. + Couls: + - rscadd: Diagonal movement + - rscadd: Input subsystem(numpad targetting, press numpad 8 multiple times to target + eyes and mouth, numpad 6 or 4 to target arms and press them again to target + hands and numpad 1 or 3 to target legs and press them again to target feet) + taken from https://github.com/tgstation/tgstation/pull/32751 + - rscadd: change confused status to have you move diagonally randomly in the direction + you're headed if not too confused(now you can drunkenly walk down the hall) + - rscadd: clients are now children of datums like everything else in BYOND taken + from https://github.com/tgstation/tgstation/pull/20394 + - rscadd: AZERTY and numpad targetting preferences + - tweak: Reworks the biohazard event to have a chance of giving a randomized advanced + disease with 6 varying symptoms instead of a preset disease. + - tweak: change how bone breakage is calculated + - rscadd: can now butcher koi for salmon meat + - rscadd: adds a line to alert people as to why they're not getting blood from the + monkeys + - bugfix: The vampires are finally off their monkey diet, theycan now suck blood + from players and humanized monkeys + - bugfix: Symptoms are now correctly generated for level 7 biohazards + - tweak: Borgs can now cycle modules with X again + - tweak: Ahelp message is less confusing + - tweak: F2 (say) F3(ooc) F4(me) buttons have been restored tweak:when numpad targetting + is off you can use numpad 1-4 to change intents tweak:pressing shift before + any of the intent buttons doesn't change intents(for people with shift+1-4 macros) + tweak:backspace now sets the focus to the chat bar + - bugfix: fixes the runtime caused by running keyloop for clients + - bugfix: Preferences not saving properly + - bugfix: issue with preload_rsc + - rscadd: Restore hotkey mode + - bugfix: Q no longer drops items as a cyborg on AZERTY mode + - rscadd: Automatically offload ore you're carrying to an orebox you're dragging + - bugfix: typing indicators show up again + - rscadd: TG waddle component, clowns can now optionally waddle, penguins always + waddle. Ctrl Click clown shoes in hand to toggle waddling + - rscadd: Added invismin macro back to F9 + - rscdel: stealthmin macro removed from F9 + Crazylemon64: + - bugfix: Fixes a bug that would cause ghosts to teleport their bodies sometimes + Dave-TH: + - imageadd: The syndicate uplink is now complete with a new spooky background. Very + neat! + DoctorDrugs: + - rscadd: Adds additional roundstart miner slots and the additional gear required + for them to do their jobs + Fox McCloud: + - bugfix: Fixes being able to sharpen toy double-bladed energy swords + IAmBigCoat: + - tweak: Added explosion warnings to medbeams, because medbeams can cause explosions. + DON'T CROSS THE BEAMS! + Ionward: + - bugfix: Fixed vox jester uniform not appearing correctly. + - imageadd: species specific fit underwear for greys + KasparoVy: + - rscadd: Re-adds the ability to see in the dark. Adds overlays for each level of + darksight (>=8,7,6,5,4,3,<=2). + Kyep: + - rscadd: Round time (h:mm) and station security level (green/red/blue/etc) are + now visible on our server hub entry. + - tweak: Round time is now visible to all player-controlled mobs in their status + panel (including simple animals). + - tweak: Admins using the 'MOST' attack log setting no longer see player-v-NPC combat, + or any attack logs generated in the admin room, admin testing area, thunderdome + arena, or lavaland syndicate base. Prevents admins being spammed with attack + logs. + - tweak: Heads of department may now issue department-specific medals to members + of their department. + Markolie: + - rscadd: Humans and mice that are secretly blobs now have an antagHUD icon. + - tweak: All hivemind languages now display follow links to ghosts. + - bugfix: Announcements, whispers (with ghost ears) and cultist messages are no + longer displayed in the lobby. + - bugfix: The sentience event no longer triggers a huge number of ghost polling + messages. + - bugfix: When xenomorphs are damaged, their health HUD now updates properly. + - bugfix: Custom title for ghost notifications now work properly. + - bugfix: Fixed double admin commands in the grenade priming message. + - tweak: Ghosts will now always see whispers/zero pressure speaking if they're on + the screen with the mob speaking. + - tweak: Ghosts with ghost sight enabled will no longer see emotes from clientless + mobs. + - rscadd: The prison labor point system has been refactored so it works properly. + - rscadd: Plating can now be removed (exposing the baseturf) using a welder. + - rscadd: All remaining Lavaland ruins have been ported over from /tg/. + - rscadd: All chairs on shuttles have been replaced with brand new shuttle chairs. + - rscadd: Tribal splints have been added to the game, which can be crafted with + two bones and one piece of sinew. + - rscadd: The Lavaland Syndicate base now has a defibrillator and mounted defibrillator. + The animal hospital now has a mounted defibrillator. + - tweak: The Ash Walker storage area now comes with an advanced medkit instead of + a regular one and one set of medical splints. It also comes with aloe vera, + comfrey and wheat seeds. + - tweak: The water tank in the Ash Walker nest has been replaced with a puddle. + - tweak: The items in vending machines on the beach ruin and animal hospital are + now free. + - bugfix: Fixed an issue where slimes wouldn't take damage from water in space. + - bugfix: It is no longer possible to unanchor the surivval pod storage units. + - bugfix: Drinking from a beaker now only applies the effect of five units of the + ingested chemical, instead of the entire volume of the beaker. + - bugfix: Resolved an issue where beaker attack logs were reversed. + - bugfix: Moving through portals very quickly no longer breaks movement. + Quantum-M: + - rscadd: New sprites for vampires being "hungry". + - rscadd: New sprite for vampire usable blood count. + - rscadd: New sprites for the safety muzzle. + - tweak: Safety muzzle (aka the anti-bitting one) can no longer be resisted out + of. + - tweak: Vampires can now suck blood from monkey mobs (e.g. monkeys, stoks, etc.) + for sustenance but do not get blood power points. + - rscdel: RnD is no longer able to print out any telescience boards. + SteelSlayer: + - rscadd: Gives vampire thralls an objective, which can be viewed in their notes + - tweak: Increases the size of the enthralling message seen by newly created vampire + thralls + - tweak: Vampire thralls are now stunned briefly (about 3 seconds) upon being enthralled + - bugfix: The AI's robot control window now allows you to see and interact with + available bots again + TDSSS: + - tweak: cult teleport runes and similar powers now work on z levels 9-12 + Tayyyyyyy: + - tweak: Inputs sanitized + - bugfix: autocomplete input mishandling single quotes (you can teleport to Wizard's + den now) + - bugfix: newlines not working in CC announcements + - bugfix: players not being able to send single quotes in ahelps or PMs + - bugfix: robots not being able to pick their name + TheSardele: + - tweak: Lowers throwforce of drinking cartons from 15 to 0 + - bugfix: Bees no longer inject venom when nuzzling + - bugfix: Sec pod pilots can now spawn with the loadout security armbands + - bugfix: It is no longer possible to raise zero to -infinity fingers using the + *signal emote + - bugfix: Earmuffs now properly protect you from vampire screeches no matter what + you are wearing on your other ear + Ty-Omaha: + - tweak: Reworded permanent bans to non-expiring bans. + - bugfix: Door remotes now add to admin-only hidden fingerprint list + - tweak: Gave plastic surgery to line 364 of atoms.dm + and DominikPanic: + - bugfix: Limits IC notes + datlo: + - tweak: Free Golems are now a lavaland ruin spawn instead of a space ruin spawn. + - tweak: Free Golems must now purchase their shuttle board for 2000 mining points + before being able to fly their shuttle. + - rscadd: Added a shuttle recall console at the golem lavaland spawn point so that + golems can always recall the shuttle back to lavaland + - tweak: The Free Golem Ship can now move to the Construction Site, the Derelict, + or back to their Lavaland spawn. + - tweak: The Free Golem Ship has been redesigned with an open floor plan, removing + most of its interior walls for extra space. + - tweak: Free Golems no longer get a free kinetic accelerator on their ship. + - tweak: New crit species with below -100 health will be considered dead for hijack + purposes, and will not interrupt a shuttle hijack attempt. + - bugfix: Fix some cases of traitors getting conflicting objectives, such as assassinating + and protecting the same target. + farie82: + - bugfix: Beepsky will now respect your disguise again. No more looking right through + that gasmask + - bugfix: Medical and security HUDs now use the correct way to identify somebody. + They will see the same as you do on your screen. + - bugfix: You will now get a job icon in the sec HUD when you use your PDA as ID. + It'll use the PDA's assigned job. + - tweak: Ticket takes now ask for confirmation if you want to take an already assigned + ticket. + - rscadd: Blindfolds are now craftable from 3 cloth. For those vampire prisoners + you want to keep in check + - tweak: Empty beaker button from the PANDEMIC is now replaced with Empty and eject + beaker + - rscadd: List AFK players is now a verb for admins to use + - rscadd: Adds the AFK auto cryo system. By default it won't affect players unless + they activate it themselves by setting the preference in their game preferences + tab. + - bugfix: The syndicate can't use meta warfare no more. Advanced pinpointers no + longer crash the server + iantine: + - rscadd: Mouse suicide + improvedname: + - rscadd: adds lasagna + kazboo: + - tweak: changed the display name shown to a player upon being frozen in a manner + that only the admins ckey is displayed, not the character name along with it +2019-08-23: + AffectedArc07, Keekenox, Floyd/Qustinnus: + - 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. + Arkatos: + - imageadd: Added colored pillbottles + - rscadd: Added an option to change color of the pillbottles to ChemMaster3000 + - rscadd: Added new description to patch packs + - tweak: Jump to Node ability now shows a location of each Blob node + - rscadd: Added SlimeHUD when playing as a slime. This means slimes will have their + own unique health doll and pull icon. + - rscadd: Action buttons can now be dragged onto each other to swap places + - bugfix: Fixed a case where dragging locked action buttons could result in white + tooltip over the screen + AzuleUtama: + - tweak: 'The Traitor thermal glasses and chameleon security HUD now use the updated + chameleon code. balance: Traitor thermal glasses will no longer cause eye damage + when hit with EMP.' + Citinited: + - rscdel: Removes the big pipe dispensers from atmospherics, you can still find + them elsewhere. + Couls: + - rscadd: After many complaints about being stuck in medbay. NT has modified all + the airlocks on the station to allow leaving certain departments without requiring + an respective ID. This new modification is indicated by a white light near the + airlocks in the direction of unrestricted access. + - rscadd: New unrestricted access can be built by NT engineers through modification + of the airlock electronics. + - rscadd: hit effects! + - imageadd: hit effect sprites for lasers, bullet hole and dent decals for walls + - tweak: mice now have a very low chance of chewing through wires, this kills them + if the wire is powered + - rscadd: You can now homerun things thrown at you with a baseball bat! + - tweak: new baseball hit noise, new baseball sprite + - tweak: there are much less one-way airlocks on station + DoctorDrugs: + - tweak: removed the ability to eat the divine vocal cords + EmanTheAlmighty: + - rscadd: The AI can now change its intent by clicking on the new on-screen button + or pressing 4 to switch to help or harm. + - tweak: The AI can now toggle airlock safeties instead of toggling door bolt lights + by pressing middle mouse. + Fox McCloud: + - rscadd: Majorly updates lavaland + - rscadd: Miner starting equipment altered. They now start with a kinetic accelerator + - rscadd: Miners start off with a mini pickaxe + - rscadd: Adds in the boxed implant kit, regular shelter capsule, and mining drone + passthrough upgrade to the mining equipment vendor + - tweak: re-ordered the equipment vendor, so things are grouped together more logically + - rscadd: Added a number of new kinetic accelerator upgrades acquirable through + tendril chests + - tweak: Mining bot now uses an actual kinetic accelerator as opposed to a "Look + alike"; you can upgrade its internal gun with various kinetic accelerator modkits. + - tweak: Sentient mining bot nerfed; you can no longer apply the armor or melee + buff to them; offset by the fact you can upgrade their kinetic gun. + - tweak: Indoor pressure mod removed from R&D and made into a miner traitor item + - tweak: Resonators have an increased amount of fields and do more damage in low + pressure. Additionally, if you place a field on a tile that already has a field, + it'll cause it to detonate early + - tweak: Plasmacutter no longer does increased damage in low pressure, Advanced + plasma cutter does slightly more base damage but has a bit less range. Price + has been cut at R&D + - rscdel: removed the AoE Mob+Turf upgrade for mining pods + - bugfix: Fixes ripleys being slow on lavaland + - bugfix: Fixes walking on lavaland sounding like walking on metal plating + - rscadd: Adds in kinetic crusher trophies + - tweak: Kinetic crusher can be wielded/unwielded (but you can't attack with it + unwielded) + - rscadd: Adds the HECK suit as Bubblegum loot + - rscadd: Adds the kinetic accelerator bounty mod as Tendril loot + - rscadd: Add fulton extract packs to the mining vendor; rescue precious valuable + or dead miners! + - tweak: Adds mini-fans to the mining, engineering, and security shuttles + - 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 + - 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 + - bugfix: Fixes airlocks spamming their open and close when you stand in them + - bugfix: Fixes overriden door timers not working + Fox McCloud and FullofSkittles: + - rscadd: Changes the Venus Human Flytrap sprite + Ionward: + - imageadd: Adjusted Greys uniforms and backpack sprites. + - imageadd: Added a bunch of Drask masks and glasses. + - imageadd: Added God Eye sprites for Greys, Drask, and Vox. + JKnutson101: + - bugfix: Issue where Emergency NanoMed Vendors required Medical ID to Access. + - rscadd: Added the ability for cyborgs with zero battery to use the 'succumb' verb. + Markolie: + - tweak: Players now have thirty seconds instead of just five seconds to select + if they want to be somebody's butler through a die of fate roll. + - bugfix: The Netherworld portal is now properly destroyed upon being killed. In + addition, its max health is now equal to its starting health. + - tweak: The iron ore sprite that shows up when using the miner scanner no longer + has a background, making it blend in better with the actual rock. + - 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. + Quantum-M: + - tweak: 'Minor grammar edits to the text that tells you that your thirst is dealt + with but no blood power is given. balance: Vampires are no longer able to drink + get power from ckeyless humanoid monkeys, they will now need to hunt down actual + characters with ckey to get power.' + Shadow-Quill: + - tweak: Mass drivers now need two rods/cable coil instead of three to construct. + - 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. + - tweak: Using a health analyzer in-hand will switch the verbosity. + - bugfix: You no longer have to unscrew a plating to repair it. + - bugfix: The shivering symptom in virology now properly chills people. + SteelSlayer: + - bugfix: Wizard rounds now end if all wizards and apprentices are either dead, + inside cyborgs, or in MMIs + - tweak: Re-enabled the wizard's hud. Wizards can now see their own antag icon along + with seeing other wizard's and apprentice's icons + - bugfix: When a cult sacrifice target leaves the round via cryo, the game will + reassign a new target for them + - rscadd: Added an alarm sound that plays for cultists when their sacrifice target + leave the round via cryo + - rscadd: When a cult sacrifice target leaves the round via cryo, the game will + update every cultist's notes to reflect the change + - rscadd: Adds a new verb named "Toggle Health Scan" to the ghost tab. While toggled + on, ghosts can perform health scans on humanoids and cyborgs by left clicking + on them + TDSSS: + - rscadd: syndicate fax machine to lavaland syndie base. + - tweak: syndicate lavaland base self destruct now requires syndie access. + - tweak: moved headsets in lavaland syndie base. + - tweak: Gave the HoP fax long-ranged faxing capabilities. + - tweak: midround event spawned xeno larva now need less time to grow up and evolve. + - tweak: cult talisman got unique icons to tell them apart + - bugfix: mining hardsuits come with helmets now again + Tayyyyyyy: + - tweak: Whether you join the ERT is no longer determined by how fast you click + "yes" on the prompt. + - tweak: Drag and drop support and 20 seconds to pick ERT role instead of 15 + - bugfix: Fix extra newline after field and disable Github Flavored Markdown in + papers (normal markdown still works) + - bugfix: autogenerated papers no longer appear as HTML code + - tweak: message window links added to PM send receipt + - bugfix: Many shuttle flight directions fixed + TheSardele: + - rscadd: All-In-one Grinders can now be constructed and upgraded + - rscadd: All-In-one Grinders now produce more reagents when upgraded. + - rscadd: Icon for cybernetic eyes + - bugfix: Sleeping while drunk no longer makes you more drunk. + dovydas12345: + - bugfix: Fixes being able to pick up chairs and stools when you have items in both + hand or when you don't have hands. + - rscadd: Adds a ERT shuttle console which is accessible to ERT members + farie82: + - bugfix: Rigging a crate now doesn't delete your coil stack anymore but instead + uses 15 of it. Borgs can use it safely again + kazboo: + - bugfix: adjusts the hierophant blast layer to make for it to always be below the + effect. this should be the case already due to mouse_opacity, though for some + unknown reason, it just doesn't work sometimes, so this should fix it. diff --git a/html/changelogs/AutoChangeLog-pr-11125.yml b/html/changelogs/AutoChangeLog-pr-11125.yml deleted file mode 100644 index 2208cf5854c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11125.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Quantum-M" -delete-after: True -changes: - - rscadd: "New sprites for vampires being \"hungry\"." - - rscadd: "New sprite for vampire usable blood count." - - rscadd: "New sprites for the safety muzzle." - - tweak: "Safety muzzle (aka the anti-bitting one) can no longer be resisted out of." - - tweak: "Vampires can now suck blood from monkey mobs (e.g. monkeys, stoks, etc.) for sustenance but do not get blood power points." diff --git a/html/changelogs/AutoChangeLog-pr-11358.yml b/html/changelogs/AutoChangeLog-pr-11358.yml deleted file mode 100644 index ed5662b1047..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11358.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Diagonal movement" - - rscadd: "Input subsystem(numpad targetting, press numpad 8 multiple times to target eyes and mouth, numpad 6 or 4 to target arms and press them again to target hands and numpad 1 or 3 to target legs and press them again to target feet) taken from https://github.com/tgstation/tgstation/pull/32751" - - rscadd: "change confused status to have you move diagonally randomly in the direction you're headed if not too confused(now you can drunkenly walk down the hall)" - - rscadd: "clients are now children of datums like everything else in BYOND taken from https://github.com/tgstation/tgstation/pull/20394" - - rscadd: "AZERTY and numpad targetting preferences" diff --git a/html/changelogs/AutoChangeLog-pr-11374.yml b/html/changelogs/AutoChangeLog-pr-11374.yml deleted file mode 100644 index 30c13ddd753..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11374.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Quantum-M" -delete-after: True -changes: - - rscdel: "RnD is no longer able to print out any telescience boards." diff --git a/html/changelogs/AutoChangeLog-pr-11484.yml b/html/changelogs/AutoChangeLog-pr-11484.yml deleted file mode 100644 index a6237397de8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11484.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Re-adds the ability to see in the dark. Adds overlays for each level of darksight (>=8,7,6,5,4,3,<=2)." diff --git a/html/changelogs/AutoChangeLog-pr-11515.yml b/html/changelogs/AutoChangeLog-pr-11515.yml deleted file mode 100644 index 288b209456b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - tweak: "Inputs sanitized" diff --git a/html/changelogs/AutoChangeLog-pr-11566.yml b/html/changelogs/AutoChangeLog-pr-11566.yml deleted file mode 100644 index 09138dc9324..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11566.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "You can ctrl-click any action button to lock/unlock its position" - - tweak: "All actions buttons now start with their position locked" diff --git a/html/changelogs/AutoChangeLog-pr-11605.yml b/html/changelogs/AutoChangeLog-pr-11605.yml deleted file mode 100644 index 46c791aaa32..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11605.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - tweak: "Reworks the biohazard event to have a chance of giving a randomized advanced disease with 6 varying symptoms instead of a preset disease." diff --git a/html/changelogs/AutoChangeLog-pr-11606.yml b/html/changelogs/AutoChangeLog-pr-11606.yml deleted file mode 100644 index ff4cade715f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11606.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Humans and mice that are secretly blobs now have an antagHUD icon." - - tweak: "All hivemind languages now display follow links to ghosts." - - bugfix: "Announcements, whispers (with ghost ears) and cultist messages are no longer displayed in the lobby." - - bugfix: "The sentience event no longer triggers a huge number of ghost polling messages." - - bugfix: "When xenomorphs are damaged, their health HUD now updates properly." - - bugfix: "Custom title for ghost notifications now work properly." - - bugfix: "Fixed double admin commands in the grenade priming message." - - tweak: "Ghosts will now always see whispers/zero pressure speaking if they're on the screen with the mob speaking." - - tweak: "Ghosts with ghost sight enabled will no longer see emotes from clientless mobs." diff --git a/html/changelogs/AutoChangeLog-pr-11611.yml b/html/changelogs/AutoChangeLog-pr-11611.yml deleted file mode 100644 index b9bf93fafa2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11611.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - rscadd: "Blindfolds are now craftable from 3 cloth. For those vampire prisoners you want to keep in check" diff --git a/html/changelogs/AutoChangeLog-pr-11612.yml b/html/changelogs/AutoChangeLog-pr-11612.yml deleted file mode 100644 index 3403b988c69..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11612.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Empty beaker button from the PANDEMIC is now replaced with Empty and eject beaker" diff --git a/html/changelogs/AutoChangeLog-pr-11634.yml b/html/changelogs/AutoChangeLog-pr-11634.yml deleted file mode 100644 index c51b73a64ae..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11634.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "The prison labor point system has been refactored so it works properly." diff --git a/html/changelogs/AutoChangeLog-pr-11653.yml b/html/changelogs/AutoChangeLog-pr-11653.yml deleted file mode 100644 index 141c0adf1be..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11653.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - tweak: "change how bone breakage is calculated" diff --git a/html/changelogs/AutoChangeLog-pr-11658.yml b/html/changelogs/AutoChangeLog-pr-11658.yml deleted file mode 100644 index a7deadb4af8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11658.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Plating can now be removed (exposing the baseturf) using a welder." diff --git a/html/changelogs/AutoChangeLog-pr-11666.yml b/html/changelogs/AutoChangeLog-pr-11666.yml deleted file mode 100644 index c2246efe956..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11666.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CornMyCob" -delete-after: True -changes: - - bugfix: "The cursed heart you get from necropolis chests is now the one that heals you." diff --git a/html/changelogs/AutoChangeLog-pr-11674.yml b/html/changelogs/AutoChangeLog-pr-11674.yml deleted file mode 100644 index 5c9edc40e27..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11674.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DoctorDrugs" -delete-after: True -changes: - - rscadd: "Adds additional roundstart miner slots and the additional gear required for them to do their jobs" diff --git a/html/changelogs/AutoChangeLog-pr-11684.yml b/html/changelogs/AutoChangeLog-pr-11684.yml deleted file mode 100644 index 0f1250497f2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11684.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IAmBigCoat" -delete-after: True -changes: - - tweak: "Added explosion warnings to medbeams, because medbeams can cause explosions. DON'T CROSS THE BEAMS!" diff --git a/html/changelogs/AutoChangeLog-pr-11687.yml b/html/changelogs/AutoChangeLog-pr-11687.yml deleted file mode 100644 index b6ceea4d139..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11687.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Round time (h:mm) and station security level (green/red/blue/etc) are now visible on our server hub entry." - - tweak: "Round time is now visible to all player-controlled mobs in their status panel (including simple animals)." diff --git a/html/changelogs/AutoChangeLog-pr-11695.yml b/html/changelogs/AutoChangeLog-pr-11695.yml deleted file mode 100644 index d3208ba926b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11695.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "All remaining Lavaland ruins have been ported over from /tg/." diff --git a/html/changelogs/AutoChangeLog-pr-11696.yml b/html/changelogs/AutoChangeLog-pr-11696.yml deleted file mode 100644 index b52c32cd755..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11696.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "All chairs on shuttles have been replaced with brand new shuttle chairs." diff --git a/html/changelogs/AutoChangeLog-pr-11697.yml b/html/changelogs/AutoChangeLog-pr-11697.yml deleted file mode 100644 index 03370b18a45..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11697.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Tribal splints have been added to the game, which can be crafted with two bones and one piece of sinew." - - rscadd: "The Lavaland Syndicate base now has a defibrillator and mounted defibrillator. The animal hospital now has a mounted defibrillator." - - tweak: "The Ash Walker storage area now comes with an advanced medkit instead of a regular one and one set of medical splints. It also comes with aloe vera, comfrey and wheat seeds." - - tweak: "The water tank in the Ash Walker nest has been replaced with a puddle." - - tweak: "The items in vending machines on the beach ruin and animal hospital are now free." diff --git a/html/changelogs/AutoChangeLog-pr-11698.yml b/html/changelogs/AutoChangeLog-pr-11698.yml deleted file mode 100644 index e5cbf739573..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11698.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "Admins using the 'MOST' attack log setting no longer see player-v-NPC combat, or any attack logs generated in the admin room, admin testing area, thunderdome arena, or lavaland syndicate base. Prevents admins being spammed with attack logs." diff --git a/html/changelogs/AutoChangeLog-pr-11712.yml b/html/changelogs/AutoChangeLog-pr-11712.yml new file mode 100644 index 00000000000..ed9937e57c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11712.yml @@ -0,0 +1,9 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "A new outfit manager has been added for admins (under debug). It lets them save and load custom outfits on their computer and use these to equip players." + - rscadd: "Upon transforming players into humans or reincarnating them through the player panel, admins will now directly be able to select their equipment." + - rscadd: "The select equipment verb now works on observers: it'll create a human with the given equipment under the ghost." + - rscadd: "A \"Copy Outfit\" button has been added to the View Variables dropdown, which lets admins instantly copy an outfit." + - rscadd: "Outfits now support accessories and internal boxes." + - rscdel: "The separate option to equip ERT members has been removed. It's been integrated into their regular outfits." diff --git a/html/changelogs/AutoChangeLog-pr-11719.yml b/html/changelogs/AutoChangeLog-pr-11719.yml new file mode 100644 index 00000000000..26164747593 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11719.yml @@ -0,0 +1,5 @@ +author: "Terilia" +delete-after: True +changes: + - rscadd: "added headcrabs" + - tweak: "adjusted the path's for headslugs. They are not called headcrab anymore" diff --git a/html/changelogs/AutoChangeLog-pr-11732.yml b/html/changelogs/AutoChangeLog-pr-11732.yml deleted file mode 100644 index 8f44fc99dae..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11732.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - rscadd: "Adds the AFK auto cryo system. By default it won't affect players unless they activate it themselves by setting the preference in their game preferences tab." diff --git a/html/changelogs/AutoChangeLog-pr-11765.yml b/html/changelogs/AutoChangeLog-pr-11765.yml deleted file mode 100644 index f67b2ad41d8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11765.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "can now butcher koi for salmon meat" diff --git a/html/changelogs/AutoChangeLog-pr-11772.yml b/html/changelogs/AutoChangeLog-pr-11772.yml new file mode 100644 index 00000000000..a59b8791f03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11772.yml @@ -0,0 +1,6 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "Rechargers can now be crafted from science using one capacitor and a recharger board +tweak:Smaller machines like microwaves and cell chargers can now be placed on tables(Fax machines included) +tweak:can screwdriver open rechargers and then apply a crowbar to deconstruct them" diff --git a/html/changelogs/AutoChangeLog-pr-11804.yml b/html/changelogs/AutoChangeLog-pr-11804.yml deleted file mode 100644 index 355e6f0a32e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11804.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed an issue where slimes wouldn't take damage from water in space." diff --git a/html/changelogs/AutoChangeLog-pr-11805.yml b/html/changelogs/AutoChangeLog-pr-11805.yml deleted file mode 100644 index 32aeba3f9eb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11805.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "It is no longer possible to unanchor the surivval pod storage units." diff --git a/html/changelogs/AutoChangeLog-pr-11806.yml b/html/changelogs/AutoChangeLog-pr-11806.yml deleted file mode 100644 index f70b8e32b82..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11806.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - bugfix: "autocomplete input mishandling single quotes (you can teleport to Wizard's den now)" diff --git a/html/changelogs/AutoChangeLog-pr-11812.yml b/html/changelogs/AutoChangeLog-pr-11812.yml deleted file mode 100644 index e5bad933f7e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11812.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "adds a line to alert people as to why they're not getting blood from the monkeys" - - bugfix: "The vampires are finally off their monkey diet, theycan now suck blood from players and humanized monkeys" diff --git a/html/changelogs/AutoChangeLog-pr-11821.yml b/html/changelogs/AutoChangeLog-pr-11821.yml deleted file mode 100644 index 2a98f4dbae6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11821.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - bugfix: "Symptoms are now correctly generated for level 7 biohazards" diff --git a/html/changelogs/AutoChangeLog-pr-11823.yml b/html/changelogs/AutoChangeLog-pr-11823.yml deleted file mode 100644 index 473db53ff6b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11823.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - bugfix: "Fixed vox jester uniform not appearing correctly." diff --git a/html/changelogs/AutoChangeLog-pr-11824.yml b/html/changelogs/AutoChangeLog-pr-11824.yml deleted file mode 100644 index 7c18acd5757..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11824.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dave-TH" -delete-after: True -changes: - - imageadd: "The syndicate uplink is now complete with a new spooky background. Very neat!" diff --git a/html/changelogs/AutoChangeLog-pr-11825.yml b/html/changelogs/AutoChangeLog-pr-11825.yml deleted file mode 100644 index ca3de2da45c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11825.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Reworded permanent bans to non-expiring bans." diff --git a/html/changelogs/AutoChangeLog-pr-11829.yml b/html/changelogs/AutoChangeLog-pr-11829.yml deleted file mode 100644 index 7af1b527603..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11829.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - tweak: "Borgs can now cycle modules with X again" - - tweak: "Ahelp message is less confusing" - - tweak: "F2 (say) F3(ooc) F4(me) buttons have been restored -tweak:when numpad targetting is off you can use numpad 1-4 to change intents -tweak:pressing shift before any of the intent buttons doesn't change intents(for people with shift+1-4 macros) -tweak:backspace now sets the focus to the chat bar" diff --git a/html/changelogs/AutoChangeLog-pr-11836.yml b/html/changelogs/AutoChangeLog-pr-11836.yml deleted file mode 100644 index 24758efc273..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11836.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSardele" -delete-after: True -changes: - - tweak: "Lowers throwforce of drinking cartons from 15 to 0" diff --git a/html/changelogs/AutoChangeLog-pr-11837.yml b/html/changelogs/AutoChangeLog-pr-11837.yml deleted file mode 100644 index 880599037b4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11837.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - tweak: "New crit species with below -100 health will be considered dead for hijack purposes, and will not interrupt a shuttle hijack attempt." diff --git a/html/changelogs/AutoChangeLog-pr-11841.yml b/html/changelogs/AutoChangeLog-pr-11841.yml deleted file mode 100644 index 7bb2a0e04e3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11841.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Crazylemon64" -delete-after: True -changes: - - bugfix: "Fixes a bug that would cause ghosts to teleport their bodies sometimes" diff --git a/html/changelogs/AutoChangeLog-pr-11851.yml b/html/changelogs/AutoChangeLog-pr-11851.yml deleted file mode 100644 index 47a8eb82c03..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11851.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Allfd" -delete-after: True -changes: - - tweak: "Panthers can now see in the dark." diff --git a/html/changelogs/AutoChangeLog-pr-11852.yml b/html/changelogs/AutoChangeLog-pr-11852.yml deleted file mode 100644 index 5d94998f148..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11852.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - bugfix: "fixes the runtime caused by running keyloop for clients" diff --git a/html/changelogs/AutoChangeLog-pr-11856.yml b/html/changelogs/AutoChangeLog-pr-11856.yml deleted file mode 100644 index cefc38d19db..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11856.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Drinking from a beaker now only applies the effect of five units of the ingested chemical, instead of the entire volume of the beaker." - - bugfix: "Resolved an issue where beaker attack logs were reversed." diff --git a/html/changelogs/AutoChangeLog-pr-11861.yml b/html/changelogs/AutoChangeLog-pr-11861.yml deleted file mode 100644 index c430f657cbf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11861.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - bugfix: "Preferences not saving properly" diff --git a/html/changelogs/AutoChangeLog-pr-11862.yml b/html/changelogs/AutoChangeLog-pr-11862.yml new file mode 100644 index 00000000000..ecd4aa0fa8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11862.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - bugfix: "Fixed a bug where hotwiring solar panels would allow for the station to remain powered in the Grid Check power failure event." diff --git a/html/changelogs/AutoChangeLog-pr-11864.yml b/html/changelogs/AutoChangeLog-pr-11864.yml deleted file mode 100644 index 7f0a98c7c36..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11864.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Moving through portals very quickly no longer breaks movement." diff --git a/html/changelogs/AutoChangeLog-pr-11867.yml b/html/changelogs/AutoChangeLog-pr-11867.yml deleted file mode 100644 index f18b03fc944..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11867.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Restore hotkey mode" diff --git a/html/changelogs/AutoChangeLog-pr-11870.yml b/html/changelogs/AutoChangeLog-pr-11870.yml deleted file mode 100644 index 2b8c3acfe3b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11870.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SteelSlayer" -delete-after: True -changes: - - rscadd: "Gives vampire thralls an objective, which can be viewed in their notes" - - tweak: "Increases the size of the enthralling message seen by newly created vampire thralls" - - tweak: "Vampire thralls are now stunned briefly (about 3 seconds) upon being enthralled" diff --git a/html/changelogs/AutoChangeLog-pr-11872.yml b/html/changelogs/AutoChangeLog-pr-11872.yml deleted file mode 100644 index 066c6bb27ea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11872.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - bugfix: "Q no longer drops items as a cyborg on AZERTY mode" diff --git a/html/changelogs/AutoChangeLog-pr-11873.yml b/html/changelogs/AutoChangeLog-pr-11873.yml deleted file mode 100644 index 40626a2525b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11873.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SteelSlayer" -delete-after: True -changes: - - bugfix: "The AI's robot control window now allows you to see and interact with available bots again" diff --git a/html/changelogs/AutoChangeLog-pr-11884.yml b/html/changelogs/AutoChangeLog-pr-11884.yml deleted file mode 100644 index 4c15fa9618c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11884.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSardele" -delete-after: True -changes: - - bugfix: "Bees no longer inject venom when nuzzling" diff --git a/html/changelogs/AutoChangeLog-pr-11885.yml b/html/changelogs/AutoChangeLog-pr-11885.yml deleted file mode 100644 index 39c0c324101..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11885.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSardele" -delete-after: True -changes: - - bugfix: "Sec pod pilots can now spawn with the loadout security armbands" diff --git a/html/changelogs/AutoChangeLog-pr-11886.yml b/html/changelogs/AutoChangeLog-pr-11886.yml deleted file mode 100644 index e0d2c5fe116..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11886.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSardele" -delete-after: True -changes: - - bugfix: "It is no longer possible to raise zero to -infinity fingers using the *signal emote" diff --git a/html/changelogs/AutoChangeLog-pr-11889.yml b/html/changelogs/AutoChangeLog-pr-11889.yml deleted file mode 100644 index 1a10b9737b4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11889.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Automatically offload ore you're carrying to an orebox you're dragging" diff --git a/html/changelogs/AutoChangeLog-pr-11908.yml b/html/changelogs/AutoChangeLog-pr-11908.yml deleted file mode 100644 index 51a251192fe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11908.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - imageadd: "species specific fit underwear for greys" diff --git a/html/changelogs/AutoChangeLog-pr-11919.yml b/html/changelogs/AutoChangeLog-pr-11919.yml deleted file mode 100644 index f4efec25c51..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11919.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kazboo" -delete-after: True -changes: - - tweak: "changed the display name shown to a player upon being frozen in a manner that only the admins ckey is displayed, not the character name along with it" diff --git a/html/changelogs/AutoChangeLog-pr-11920.yml b/html/changelogs/AutoChangeLog-pr-11920.yml deleted file mode 100644 index 224cb3173f7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11920.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - bugfix: "typing indicators show up again" diff --git a/html/changelogs/AutoChangeLog-pr-11933.yml b/html/changelogs/AutoChangeLog-pr-11933.yml deleted file mode 100644 index 29692d6a1d7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11933.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "and DominikPanic" -delete-after: True -changes: - - bugfix: "Limits IC notes" diff --git a/html/changelogs/AutoChangeLog-pr-11934.yml b/html/changelogs/AutoChangeLog-pr-11934.yml deleted file mode 100644 index a8bdd9a7805..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11934.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - bugfix: "Door remotes now add to admin-only hidden fingerprint list" diff --git a/html/changelogs/AutoChangeLog-pr-11935.yml b/html/changelogs/AutoChangeLog-pr-11935.yml deleted file mode 100644 index 2c480fcd02f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11935.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Gave plastic surgery to line 364 of atoms.dm" diff --git a/html/changelogs/AutoChangeLog-pr-11936.yml b/html/changelogs/AutoChangeLog-pr-11936.yml new file mode 100644 index 00000000000..bec331efe04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11936.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Items with NODROP that are dropped now lose the flag if they didn't get created with it" diff --git a/html/changelogs/AutoChangeLog-pr-11938.yml b/html/changelogs/AutoChangeLog-pr-11938.yml deleted file mode 100644 index 80b8fe04530..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11938.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "The syndicate can't use meta warfare no more. Advanced pinpointers no longer crash the server" diff --git a/html/changelogs/AutoChangeLog-pr-11940.yml b/html/changelogs/AutoChangeLog-pr-11940.yml new file mode 100644 index 00000000000..412460535f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11940.yml @@ -0,0 +1,4 @@ +author: "Couls" +delete-after: True +changes: + - tweak: "Update issue templates to latest version and clean up the current template" diff --git a/html/changelogs/AutoChangeLog-pr-11946.yml b/html/changelogs/AutoChangeLog-pr-11946.yml deleted file mode 100644 index 980f1fa2c52..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11946.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSardele" -delete-after: True -changes: - - bugfix: "Earmuffs now properly protect you from vampire screeches no matter what you are wearing on your other ear" diff --git a/html/changelogs/AutoChangeLog-pr-11957.yml b/html/changelogs/AutoChangeLog-pr-11957.yml new file mode 100644 index 00000000000..6e23f4bd87f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11957.yml @@ -0,0 +1,5 @@ +author: "FreeStylaLT" +delete-after: True +changes: + - rscadd: "Added an Engine Picker, which uses new engine beacons." + - tweak: "Replaced the current two engine generators with one engine beacon." diff --git a/html/changelogs/AutoChangeLog-pr-11970.yml b/html/changelogs/AutoChangeLog-pr-11970.yml deleted file mode 100644 index ee787e9e99a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11970.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - bugfix: "Fix some cases of traitors getting conflicting objectives, such as assassinating and protecting the same target." diff --git a/html/changelogs/AutoChangeLog-pr-11976.yml b/html/changelogs/AutoChangeLog-pr-11976.yml deleted file mode 100644 index b5916a16347..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11976.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes being able to sharpen toy double-bladed energy swords" diff --git a/html/changelogs/AutoChangeLog-pr-11978.yml b/html/changelogs/AutoChangeLog-pr-11978.yml new file mode 100644 index 00000000000..6a3cce38167 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11978.yml @@ -0,0 +1,9 @@ +author: "KasparoVy" +delete-after: True +changes: + - imageadd: "Adds sprites for all Vox & Armalis earwear." + - imageadd: "Adds sprites for Armalis default backpack, nitrogen tank (old-style back & new-style belt) & all breath mask variations." + - rscadd: "You can now species-fit in-hand icons: Use a single .dmi file and suffix the icon states with _l or _r." + - bugfix: "Fixes an issue preventing Vox Armalis from being rendered with the proper in-hand icons for their massive noise cannons." + - bugfix: "Fixes an issue preventing the species-fitting of earwear." + - bugfix: "Fixes an issue preventing Vox Armalis from wearing the 'Vox' breath mask." diff --git a/html/changelogs/AutoChangeLog-pr-12063.yml b/html/changelogs/AutoChangeLog-pr-12063.yml new file mode 100644 index 00000000000..49e805f3dc5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12063.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes stun absorbing not working" diff --git a/html/changelogs/AutoChangeLog-pr-12065.yml b/html/changelogs/AutoChangeLog-pr-12065.yml new file mode 100644 index 00000000000..865de5c6587 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12065.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes parallax insane setting not doing anything" diff --git a/html/changelogs/AutoChangeLog-pr-12079.yml b/html/changelogs/AutoChangeLog-pr-12079.yml new file mode 100644 index 00000000000..06e129f082d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12079.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes stuns and weakens related to reagents" diff --git a/html/changelogs/AutoChangeLog-pr-12081.yml b/html/changelogs/AutoChangeLog-pr-12081.yml new file mode 100644 index 00000000000..931893453db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12081.yml @@ -0,0 +1,4 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Implants like the IPC charging work again. They won't get deleted after first use" diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 26526f68951..bea6f281f7a 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ 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/animal.dmi b/icons/mob/animal.dmi index 0167380d885..eacb4367d74 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index c58a6b635f4..36025c083b4 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.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/head.dmi b/icons/mob/head.dmi index 7f84b29d04e..4bc39d8f80b 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/headcrab.dmi b/icons/mob/headcrab.dmi new file mode 100644 index 00000000000..4db08f13e76 Binary files /dev/null and b/icons/mob/headcrab.dmi differ diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi index b243f88e401..1f66332a577 100644 Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 47cb86a2c89..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 e4630c2764e..b11f98e74ed 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 014242b9d90..ed193927004 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index b18cb799817..cb6a2c6bd64 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/screen_slime.dmi b/icons/mob/screen_slime.dmi new file mode 100644 index 00000000000..d5786f3ca69 Binary files /dev/null and b/icons/mob/screen_slime.dmi differ diff --git a/icons/mob/species/armalis/back.dmi b/icons/mob/species/armalis/back.dmi new file mode 100644 index 00000000000..31f4f21f812 Binary files /dev/null and b/icons/mob/species/armalis/back.dmi differ diff --git a/icons/mob/species/armalis/belt.dmi b/icons/mob/species/armalis/belt.dmi new file mode 100644 index 00000000000..2aba8e97d8a Binary files /dev/null and b/icons/mob/species/armalis/belt.dmi differ diff --git a/icons/mob/species/armalis/ears.dmi b/icons/mob/species/armalis/ears.dmi new file mode 100644 index 00000000000..f88c03feae5 Binary files /dev/null and b/icons/mob/species/armalis/ears.dmi differ diff --git a/icons/mob/species/armalis/mask.dmi b/icons/mob/species/armalis/mask.dmi new file mode 100644 index 00000000000..e97eb74f8e0 Binary files /dev/null and b/icons/mob/species/armalis/mask.dmi differ diff --git a/icons/mob/species/drask/eyes.dmi b/icons/mob/species/drask/eyes.dmi index 918f6e5ef71..818c719a541 100644 Binary files a/icons/mob/species/drask/eyes.dmi and b/icons/mob/species/drask/eyes.dmi differ diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi index 9b9c341feb3..096faf15970 100644 Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ diff --git a/icons/mob/species/grey/back.dmi b/icons/mob/species/grey/back.dmi new file mode 100644 index 00000000000..e73a9798d65 Binary files /dev/null and b/icons/mob/species/grey/back.dmi differ diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi index 8c732aa782d..937474d97dc 100644 Binary files a/icons/mob/species/grey/eyes.dmi and b/icons/mob/species/grey/eyes.dmi differ diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi index 201e1032562..ca3737c75a8 100644 Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi index ddf0250fdc5..068ec0be122 100644 Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ diff --git a/icons/mob/species/vox/ears.dmi b/icons/mob/species/vox/ears.dmi new file mode 100644 index 00000000000..b09c349cae9 Binary files /dev/null and b/icons/mob/species/vox/ears.dmi differ diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi index 3d9a6c77bf8..3e3705d2a90 100644 Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index f79ca1fb338..abce25ab86f 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/airlock_spawner.dmi b/icons/obj/airlock_spawner.dmi new file mode 100644 index 00000000000..9815b3f42b1 Binary files /dev/null and b/icons/obj/airlock_spawner.dmi differ diff --git a/icons/obj/basketball.dmi b/icons/obj/basketball.dmi index a26c3935719..7b34fda1a32 100644 Binary files a/icons/obj/basketball.dmi and b/icons/obj/basketball.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 9c9f6d38e94..f007687d568 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.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/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a20cf61eb33..a3d66d4d921 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 8e5a4b8e879..8371295985f 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index d0b9c69a98e..b5c25d474d1 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi index b1e4f9aeab5..ec1a418dab1 100644 Binary files a/icons/obj/doors/airlocks/station/overlays.dmi and b/icons/obj/doors/airlocks/station/overlays.dmi differ diff --git a/icons/obj/food/pasta.dmi b/icons/obj/food/pasta.dmi index 0179c3f5cc7..c9c05372622 100644 Binary files a/icons/obj/food/pasta.dmi and b/icons/obj/food/pasta.dmi differ diff --git a/icons/obj/fulton.dmi b/icons/obj/fulton.dmi new file mode 100644 index 00000000000..c56c275b3b1 Binary files /dev/null and b/icons/obj/fulton.dmi differ diff --git a/icons/obj/fulton_balloon.dmi b/icons/obj/fulton_balloon.dmi new file mode 100644 index 00000000000..5a1fa98e148 Binary files /dev/null and b/icons/obj/fulton_balloon.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 05a5768ce89..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/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index b39c3668294..0e9ee4649ac 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index cd2c6da08ee..8e91b20368f 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 29196e625ae..82ab4786c37 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index f9c13a5c332..f3cff7fbd9a 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/paper.dmi b/icons/obj/paper.dmi index ce3c79adc73..55781076833 100644 Binary files a/icons/obj/paper.dmi and b/icons/obj/paper.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index c8a9abd40f3..c33efec0f5f 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 5a976767f11..20a27b2781c 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/turf/mining.dmi b/icons/turf/mining.dmi index 9621ef05d5c..f648883072a 100644 Binary files a/icons/turf/mining.dmi and b/icons/turf/mining.dmi differ diff --git a/icons/turf/walls/hierophant_wall_temp.dmi b/icons/turf/walls/hierophant_wall_temp.dmi new file mode 100644 index 00000000000..9f0d4b8d23c Binary files /dev/null and b/icons/turf/walls/hierophant_wall_temp.dmi differ diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl index 385237727db..1d040d52af7 100644 --- a/nano/templates/chem_master.tmpl +++ b/nano/templates/chem_master.tmpl @@ -80,10 +80,27 @@ {{else}} No beaker loaded
    {{/if}} - - {{if data.loaded_pill_bottle}} - {{:helper.link('Pill Bottle (' + data.loaded_pill_bottle_contents_len + '/' + data.loaded_pill_bottle_storage_slots + ')', 'eject', {'ejectp': 1})}} - {{else}} - {{:helper.link('No Pill Bottle', 'eject', {}, 'disabled')}} - {{/if}} - \ No newline at end of file +
    + + {{if data.loaded_pill_bottle}} + + + + + +
    + {{:helper.link('Pill Bottle (' + data.loaded_pill_bottle_contents_len + '/' + data.loaded_pill_bottle_storage_slots + ')', 'eject', {'ejectp': 1})}} + + {{:helper.link('Change Wrapper', 'pencil', {'change_pillbottle': 1})}} +
    + {{else}} + + + + +
    + {{:helper.link('No Pill Bottle', 'eject', {}, 'disabled')}} +
    + {{/if}} +
    +
    \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 61fb875aec8..69d9e4ddacd 100644 --- a/paradise.dme +++ b/paradise.dme @@ -143,11 +143,13 @@ #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" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\slime.dm" #include "code\_onclick\hud\swarmer.dm" #include "code\ATMOSPHERICS\atmospherics.dm" #include "code\ATMOSPHERICS\datum_icon_manager.dm" @@ -222,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" @@ -277,7 +280,9 @@ #include "code\datums\components\ducttape.dm" #include "code\datums\components\jestosterone.dm" #include "code\datums\components\material_container.dm" +#include "code\datums\components\paintable.dm" #include "code\datums\components\squeak.dm" +#include "code\datums\components\waddling.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" @@ -349,6 +354,7 @@ #include "code\datums\outfits\outfit.dm" #include "code\datums\outfits\outfit_admin.dm" #include "code\datums\outfits\plasmamen.dm" +#include "code\datums\outfits\vv_outfit.dm" #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\spells\area_teleport.dm" @@ -481,7 +487,7 @@ #include "code\game\gamemodes\changeling\powers\epinephrine.dm" #include "code\game\gamemodes\changeling\powers\fakedeath.dm" #include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\headcrab.dm" +#include "code\game\gamemodes\changeling\powers\headslug.dm" #include "code\game\gamemodes\changeling\powers\hivemind.dm" #include "code\game\gamemodes\changeling\powers\humanform.dm" #include "code\game\gamemodes\changeling\powers\lesserform.dm" @@ -810,6 +816,7 @@ #include "code\game\objects\effects\effect_system\effects_smoke.dm" #include "code\game\objects\effects\effect_system\effects_sparks.dm" #include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\spawners\airlock_spawner.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\lootdrop.dm" @@ -844,6 +851,7 @@ #include "code\game\objects\items\devices\autopsy.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\enginepicker.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" @@ -1155,6 +1163,7 @@ #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\machine_upgrade.dm" #include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\outfits.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" #include "code\modules\admin\sql_notes.dm" @@ -1444,6 +1453,7 @@ #include "code\modules\events\false_alarm.dm" #include "code\modules\events\floorcluwne.dm" #include "code\modules\events\grid_check.dm" +#include "code\modules\events\headcrabs.dm" #include "code\modules\events\immovable_rod.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" @@ -1596,6 +1606,7 @@ #include "code\modules\hydroponics\grown\towercap.dm" #include "code\modules\karma\karma.dm" #include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_ai.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_carbon.dm" #include "code\modules\keybindings\bindings_client.dm" @@ -1643,6 +1654,7 @@ #include "code\modules\mining\coins.dm" #include "code\modules\mining\equipment_locker.dm" #include "code\modules\mining\explorer_gear.dm" +#include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm" #include "code\modules\mining\machine_stacking.dm" #include "code\modules\mining\machine_unloading.dm" @@ -1653,6 +1665,7 @@ #include "code\modules\mining\ore.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\shelters.dm" +#include "code\modules\mining\equipment\kinetic_crusher.dm" #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\laborcamp\laborshuttle.dm" @@ -1921,6 +1934,7 @@ #include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" +#include "code\modules\mob\living\simple_animal\hostile\headslug.dm" #include "code\modules\mob\living\simple_animal\hostile\hellhound.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" diff --git a/sound/creatures/headcrab_attack.ogg b/sound/creatures/headcrab_attack.ogg new file mode 100644 index 00000000000..4f6d114aa75 Binary files /dev/null and b/sound/creatures/headcrab_attack.ogg differ diff --git a/sound/creatures/zombie_attack.ogg b/sound/creatures/zombie_attack.ogg new file mode 100644 index 00000000000..1e9b2a63024 Binary files /dev/null and b/sound/creatures/zombie_attack.ogg differ diff --git a/sound/creatures/zombie_idle1.ogg b/sound/creatures/zombie_idle1.ogg new file mode 100644 index 00000000000..851c88deff4 Binary files /dev/null and b/sound/creatures/zombie_idle1.ogg differ diff --git a/sound/creatures/zombie_idle2.ogg b/sound/creatures/zombie_idle2.ogg new file mode 100644 index 00000000000..04e75da9b22 Binary files /dev/null and b/sound/creatures/zombie_idle2.ogg differ diff --git a/sound/creatures/zombie_idle3.ogg b/sound/creatures/zombie_idle3.ogg new file mode 100644 index 00000000000..b4cd2600757 Binary files /dev/null and b/sound/creatures/zombie_idle3.ogg differ diff --git a/sound/items/fultext_deploy.ogg b/sound/items/fultext_deploy.ogg new file mode 100644 index 00000000000..2433b9e0fe3 Binary files /dev/null and b/sound/items/fultext_deploy.ogg differ diff --git a/sound/items/fultext_launch.ogg b/sound/items/fultext_launch.ogg new file mode 100644 index 00000000000..2c874419927 Binary files /dev/null and b/sound/items/fultext_launch.ogg differ diff --git a/sound/weapons/baseball_hit.ogg b/sound/weapons/baseball_hit.ogg new file mode 100644 index 00000000000..6530945b6c1 Binary files /dev/null and b/sound/weapons/baseball_hit.ogg differ