diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6c4d6ddcb98..d26dd12beda 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -16,14 +16,12 @@ # Cyberboss /code/__DATASTRUCTURES/globals.dm @Cyberboss -/code/__DEFINES/components.dm @Cyberboss /code/__DEFINES/server_tools.config.dm @Cyberboss /code/__DEFINES/server_tools.dm @Cyberboss /code/controllers/subsystem/atoms.dm @Cyberboss /code/controllers/subsystem/mapping.dm @Cyberboss /code/controllers/globals.dm @Cyberboss /code/datums/helper_datums/getrev.dm @Cyberboss -/code/datums/components/ @Cyberboss /code/datums/map_config.dm @Cyberboss /code/datums/forced_movement.dm @Cyberboss /code/datums/holocall.dm @Cyberboss @@ -67,4 +65,6 @@ # Multiple Owners +/code/__DEFINES/components.dm @Cyberboss @ninjanomnom /code/controllers/subsystem/air.dm @duncathan @MrStonedOne +/code/datums/components/ @Cyberboss @ninjanomnom \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 7138b233548..f09e4557b9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: generic +dist: trusty sudo: false +dist: xenial branches: except: - ___TGS3TempBranch @@ -14,6 +16,7 @@ matrix: packages: - python3 - python3-pip + - python3-setuptools cache: directories: - tgui/node_modules @@ -43,7 +46,8 @@ matrix: - gcc-multilib - g++-7 - g++-7-multilib - - libmariadbclient-dev:i386 + - libmariadb-client-lgpl-dev:i386 + - libmariadbd-dev cache: directories: - $HOME/.cargo @@ -67,4 +71,3 @@ script: - tools/travis/build_tools.sh || travis_terminate 1 - tools/travis/build_dependencies.sh || travis_terminate 1 - tools/travis/build_byond.sh - diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 21f2d380905..b66fbdf3d5a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -28,7 +28,7 @@ "g" = ( /obj/structure/reagent_dispensers/water_cooler{ name = "punch cooler"; - reagent_id = "bacchus_blessing" + reagent_id = /datum/reagent/consumable/ethanol/bacchus_blessing }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood{ diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 0fadc72f863..69a1c2046ca 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -3372,7 +3372,7 @@ "lq" = ( /obj/structure/table, /obj/item/reagent_containers/glass/beaker{ - list_reagents = list("sacid" = 50) + list_reagents = list(/datum/reagent/toxin/acid = 50) }, /obj/item/paper/crumpled/bloody/ruins/thederelict/unfinished, /obj/item/pen, diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm index 624aa03d7cc..7d718d69043 100644 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm @@ -912,6 +912,10 @@ }, /turf/open/indestructible/paper, /area/ruin/powered) +"Ns" = ( +/obj/item/paper/secretrecipe, +/turf/open/indestructible/paper, +/area/ruin/powered) (1,1,1) = {" aa @@ -2246,7 +2250,7 @@ ap az af al -aA +Ns bW ca af diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index ef386f20de9..cc995c423bd 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -5239,6 +5239,15 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"aku" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "akv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -5300,6 +5309,55 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"akC" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"akD" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + name = "output gas connector port" + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom{ + dir = 4; + pixel_x = 27 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"akE" = ( +/obj/structure/sign/warning/deathsposal{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"akF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/storage/toolbox/emergency, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "akG" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -5573,6 +5631,14 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) +"alf" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to MiniSat" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "alg" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -5597,12 +5663,39 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/port/fore) +"alj" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "alk" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 1 }, /turf/open/floor/plasteel, /area/engine/atmos) +"all" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"alm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "aln" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -5614,6 +5707,12 @@ }, /turf/open/floor/plating, /area/security/processing) +"alo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "alp" = ( /turf/open/floor/plating, /area/security/processing) @@ -5755,6 +5854,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/courtroom) +"alE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "alF" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 2 @@ -5827,6 +5934,26 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"alM" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"alN" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/item/extinguisher, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "alO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5882,6 +6009,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, /area/engine/atmos) +"alY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/tank/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"alZ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/maintenance/disposal/incinerator) "ama" = ( /mob/living/simple_animal/sloth/paperwork, /turf/open/floor/plasteel, @@ -6032,6 +6173,13 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"amp" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/turf/open/space/basic, +/area/space) "amq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -24443,6 +24591,10 @@ dir = 1; pixel_y = -22 }, +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "bgt" = ( @@ -36427,13 +36579,10 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bIH" = ( +/obj/machinery/pipedispenser/disposal, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/atmos) "bII" = ( @@ -36839,14 +36988,10 @@ /turf/closed/wall/r_wall, /area/medical/medbay/central) "bJF" = ( +/obj/machinery/pipedispenser/disposal/transit_tube, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/space_heater, -/obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/engine/atmos) "bJG" = ( @@ -38158,10 +38303,7 @@ /turf/open/floor/plating, /area/engine/atmos) "bMR" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +/obj/machinery/pipedispenser, /turf/open/floor/plasteel, /area/engine/atmos) "bMS" = ( @@ -38975,7 +39117,7 @@ }, /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, @@ -42385,10 +42527,10 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bXR" = ( +/obj/structure/closet/secure_closet/atmospherics, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/atmos) "bXS" = ( @@ -43492,7 +43634,7 @@ "caE" = ( /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, @@ -43961,9 +44103,6 @@ /area/maintenance/port/aft) "cbz" = ( /obj/machinery/vending/wardrobe/atmos_wardrobe, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, /turf/open/floor/plasteel, /area/engine/atmos) "cbA" = ( @@ -43971,15 +44110,17 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cbB" = ( +/obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/plasteel, /area/engine/atmos) "cbC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cbD" = ( @@ -44198,7 +44339,7 @@ /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "ccg" = ( -/obj/machinery/telecomms/message_server, +/obj/machinery/telecomms/message_server/preset, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "cch" = ( @@ -45063,31 +45204,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"ces" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cet" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cev" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -45309,15 +45425,14 @@ /turf/open/floor/plating, /area/crew_quarters/heads/chief) "cfd" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/closet/radiation, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/engineering) "cfe" = ( @@ -45462,6 +45577,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel, /area/engine/engineering) "cfD" = ( @@ -45554,6 +45673,7 @@ req_access_txt = "10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "cfN" = ( @@ -45648,21 +45768,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"cgb" = ( -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cgc" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/plating{ @@ -46100,13 +46205,6 @@ "chg" = ( /turf/open/floor/plating, /area/engine/atmos) -"chh" = ( -/obj/machinery/atmospherics/components/unary/tank/toxins{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "chi" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -46115,11 +46213,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"chj" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "chk" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/closed/wall, @@ -46149,16 +46242,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"chn" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cho" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -46651,15 +46734,6 @@ /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/closed/wall/r_wall, /area/engine/atmos) -"ciy" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ciz" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -46667,20 +46741,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"ciA" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"ciB" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ciC" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible{ @@ -46688,17 +46748,6 @@ }, /turf/open/space, /area/space/nearstation) -"ciD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - name = "output gas connector port" - }, -/obj/machinery/portable_atmospherics/canister, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ciF" = ( /obj/structure/table, /obj/item/cartridge/medical, @@ -46915,7 +46964,7 @@ /obj/machinery/requests_console{ announcementConsole = 1; department = "Chief Engineer's Desk"; - departmentType = 3; + departmentType = 4; name = "Chief Engineer RC"; pixel_x = -32 }, @@ -47011,30 +47060,10 @@ /obj/structure/closet/toolcloset, /turf/open/floor/plasteel, /area/construction) -"cjp" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/storage/toolbox/emergency, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cjr" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"cjs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cju" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -47049,20 +47078,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"cjv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cjw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47327,11 +47342,6 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos) -"cke" = ( -/obj/structure/chair/stool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ckf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -47344,15 +47354,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"ckh" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to MiniSat" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cki" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -47572,14 +47573,15 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "ckT" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_access_txt = "10" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/engine/engineering) "ckU" = ( @@ -47656,18 +47658,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"clg" = ( -/obj/item/radio/intercom{ - pixel_y = -29 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/plating, -/area/maintenance/disposal/incinerator) "clh" = ( /obj/machinery/light/small, /obj/structure/extinguisher_cabinet{ @@ -47932,15 +47922,11 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"clO" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) +/area/engine/engineering) "clQ" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -52103,17 +52089,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cyM" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering) "cyT" = ( /obj/docking_port/stationary{ dir = 8; @@ -55190,7 +55165,7 @@ /obj/machinery/requests_console{ announcementConsole = 0; department = "Engineering"; - departmentType = 4; + departmentType = 3; name = "Engineering RC"; pixel_y = 30 }, @@ -55460,20 +55435,6 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/central) -"dQC" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space, -/area/solar/port/fore) "dUO" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -55544,14 +55505,6 @@ }, /turf/open/floor/plasteel, /area/vacant_room/commissary) -"eHI" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "eRu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -55561,10 +55514,6 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"eTd" = ( -/obj/machinery/pipedispenser/disposal, -/turf/open/floor/plating, -/area/maintenance/disposal) "eUr" = ( /obj/machinery/door/poddoor/preopen{ id = "testlab"; @@ -55640,6 +55589,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"foE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "fsD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -55779,10 +55738,6 @@ }, /turf/open/floor/plasteel, /area/science/nanite) -"gwp" = ( -/obj/machinery/pipedispenser, -/turf/open/floor/plasteel, -/area/construction) "gwQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -55800,16 +55755,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/vacant_room/commissary) -"gGE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "gHj" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel/white/corner{ @@ -55959,20 +55904,6 @@ "hZk" = ( /turf/open/floor/plasteel, /area/science/nanite) -"iaI" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/space, -/area/solar/port/aft) "ibG" = ( /obj/machinery/nanite_programmer, /obj/effect/turf_decal/bot, @@ -56099,6 +56030,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"jvP" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "jxy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56523,20 +56460,6 @@ }, /turf/open/floor/plasteel, /area/science/nanite) -"lNg" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/port/aft) "lNB" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -56585,20 +56508,6 @@ /obj/machinery/vending/wardrobe/bar_wardrobe, /turf/open/floor/wood, /area/crew_quarters/bar) -"mll" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/solar/starboard/fore) "mvb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white/corner{ @@ -56654,20 +56563,6 @@ }, /turf/open/floor/plasteel/white, /area/science/explab) -"mKx" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) "mMA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow{ @@ -57150,20 +57045,6 @@ dir = 4 }, /area/science/explab) -"qtY" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space, -/area/solar/starboard/aft) "quT" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -57421,6 +57302,13 @@ }, /turf/open/floor/engine, /area/science/misc_lab) +"sWA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -57581,20 +57469,6 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) -"tVp" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/solar/port/fore) "tXL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -58125,20 +57999,6 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"xKR" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space, -/area/solar/starboard/fore) "xXe" = ( /obj/machinery/door/poddoor/preopen{ id = "telelab"; @@ -72204,7 +72064,7 @@ bgj bgj bjc cAF -eTd +cAF bja aaa aaa @@ -73431,15 +73291,15 @@ aaa abY aaa acV -tVp +adu adZ aaf acV -tVp +adu adZ aaf acV -tVp +adu adZ aaa aaf @@ -73526,7 +73386,7 @@ aaS aaa ccc ccX -iaI +ccX ccX ccX cgz @@ -73534,7 +73394,7 @@ chL ciP cjH cjH -lNg +cjH cjH cnl aaa @@ -74554,7 +74414,7 @@ aaS aaa ccc ccX -iaI +ccX ccX ccX cgz @@ -74562,7 +74422,7 @@ chL ciP cjH cjH -lNg +cjH cjH cnl aaa @@ -75487,15 +75347,15 @@ aaa aaS aaa acV -dQC +adz adZ aaf acV -dQC +adz adZ aaf acV -dQC +adz adZ aaa aaf @@ -75582,7 +75442,7 @@ aaS aaa ccc ccX -iaI +ccX ccX ccX cgz @@ -75590,7 +75450,7 @@ chL ciP cjH cjH -lNg +cjH cjH cnl aaa @@ -85846,7 +85706,7 @@ bJm bFa bHO bCs -gwp +cCd cCd aYg cjL @@ -89208,9 +89068,9 @@ bZE cbs cCT cdn +sWA cej cep -ces clN ccm ckF @@ -89465,10 +89325,10 @@ cfh cfM cco cdp -cel -cyM -ckT cgU +cel +ckT +foE cco cgU cgU @@ -89722,9 +89582,9 @@ cap ctR ccn cdo +jvP cek ccw -cet cfd cfB cfI @@ -94013,10 +93873,10 @@ aaa aaa aaf arj -clO +aua asZ aua -clO +aua awB axY azh @@ -94865,8 +94725,8 @@ bVu bVu bVu bVu -bVu caJ +aaf aoV aoV aoV @@ -95119,11 +94979,11 @@ aaf cfj cfU cfj -cfj ckf cfj cfj -bUr +amp +bVu bVu bVu bVu @@ -95374,11 +95234,11 @@ bzs bzs cfj cfj -cjp -chh -ciy -cke -clg +akC +akF +alN +alY +alZ cfj aoV aoV @@ -95630,10 +95490,10 @@ bzs bAw caK cfj -ciB -ckh -chj -ciA +aku +alf +cjr +cjr cjr clh cfj @@ -95890,7 +95750,7 @@ chk chl ciz chi -gGE +alm cjr ckg cmb @@ -96147,7 +96007,7 @@ cfl cfZ cki cld -eHI +alo cjr csq xEu @@ -96404,7 +96264,7 @@ cfk cfY rfW ckj -cjs +alE cle cli uPT @@ -96658,10 +96518,10 @@ cbL cdI ceG cfj -cgb -chn -clj -cjv +akE +alj +all +alM clj ckk cmf @@ -96917,7 +96777,7 @@ ceF cfj cga chm -ciD +akD cju clf csr @@ -98360,15 +98220,15 @@ aaa aaS aaa ads -mll +adT aeG aaf ads -mll +adT aeG aaf ads -mll +adT aeG aaa aaf @@ -100416,15 +100276,15 @@ aaa aaS aaa ads -xKR +adW aeG aaf ads -xKR +adW aeG aaf ads -xKR +adW aeG aaa aaf @@ -107210,15 +107070,15 @@ aaa aaf aaa cMQ -mKx +crC cNa aaf cMQ -mKx +crC cNa aaf cMQ -mKx +crC cNa aaa aaS @@ -109266,15 +109126,15 @@ aaa aaf aaa cMQ -qtY +crE cNa aaf cMQ -qtY +crE cNa aaf cMQ -qtY +crE cNa aaa aaS diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index faad848a397..8d64643adb1 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -64671,7 +64671,7 @@ /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "cex" = ( -/obj/machinery/telecomms/message_server, +/obj/machinery/telecomms/message_server/preset, /obj/structure/cable/yellow{ icon_state = "4-8" }, diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 6ca4bd363a0..9eba5f6a3f9 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -18289,7 +18289,7 @@ }, /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = -30 }, @@ -20075,7 +20075,7 @@ /obj/machinery/requests_console{ announcementConsole = 1; department = "Chief Engineer's Desk"; - departmentType = 3; + departmentType = 4; name = "Chief Engineer RC"; pixel_y = -32 }, @@ -30380,7 +30380,7 @@ /obj/item/multitool, /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = -30 }, @@ -34441,7 +34441,7 @@ }, /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 23e7406bd6f..764e2035073 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -331,6 +331,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"aaU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/warning/deathsposal{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "aaV" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/dirt, @@ -338,6 +354,11 @@ /area/janitor) "aaW" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/sign/warning/nosmoking{ + pixel_x = -28 + }, +/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "aaX" = ( @@ -2238,6 +2259,13 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) +"aeD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "aeE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -4472,7 +4500,7 @@ /turf/open/floor/plating, /area/maintenance/disposal) "aij" = ( -/obj/machinery/pipedispenser/disposal, +/obj/item/vending_refill/coffee, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -4849,6 +4877,11 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) +"aiT" = ( +/obj/effect/landmark/start/atmospheric_technician, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "aiU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral{ @@ -6454,7 +6487,6 @@ dir = 9 }, /obj/item/bot_assembly/cleanbot, -/obj/item/vending_refill/coffee, /turf/open/floor/plating, /area/maintenance/port/fore) "alI" = ( @@ -7641,7 +7673,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "anM" = ( -/obj/machinery/pipedispenser, +/obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/starboard) "anN" = ( @@ -8796,6 +8828,13 @@ /obj/item/assembly/flash/handheld, /turf/open/floor/plasteel, /area/security/main) +"apX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/storage/toolbox/emergency, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) "apY" = ( /obj/structure/table, /obj/item/folder/red, @@ -11279,6 +11318,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"auQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Incinerator Access"; + req_access_txt = "24" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "auU" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -24375,7 +24425,7 @@ /obj/machinery/requests_console{ announcementConsole = 0; department = "Engineering"; - departmentType = 4; + departmentType = 3; name = "Engineering RC" }, /turf/closed/wall, @@ -25117,7 +25167,7 @@ /obj/machinery/requests_console{ announcementConsole = 1; department = "Chief Engineer's Desk"; - departmentType = 3; + departmentType = 4; name = "Chief Engineer RC"; pixel_y = 32 }, @@ -40987,7 +41037,7 @@ }, /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, @@ -45142,7 +45192,7 @@ /turf/closed/wall/r_wall, /area/space/nearstation) "bJg" = ( -/obj/machinery/telecomms/message_server, +/obj/machinery/telecomms/message_server/preset, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "bJh" = ( @@ -48213,10 +48263,10 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bPr" = ( +/obj/structure/closet/secure_closet/atmospherics, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/atmos) "bPs" = ( @@ -50015,7 +50065,7 @@ "bTj" = ( /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, @@ -50658,10 +50708,10 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "bUA" = ( +/obj/machinery/pipedispenser, /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/plasteel, /area/engine/atmos) "bUB" = ( @@ -50671,19 +50721,19 @@ /obj/machinery/light_switch{ pixel_y = 28 }, +/obj/machinery/pipedispenser/disposal, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, -/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/plasteel, /area/engine/atmos) "bUC" = ( /obj/item/radio/intercom{ pixel_y = 28 }, +/obj/machinery/pipedispenser/disposal/transit_tube, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/plasteel, /area/engine/atmos) "bUD" = ( @@ -51137,15 +51187,15 @@ /turf/open/floor/plasteel, /area/hydroponics) "bVx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/green{ dir = 1 }, /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hydroponics) "bVy" = ( @@ -51252,7 +51302,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/closet/radiation, /turf/open/floor/plasteel/dark/corner{ dir = 1 }, @@ -52506,6 +52555,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) "bYl" = ( @@ -53159,17 +53209,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/disposal/incinerator) -"bZD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Incinerator Access"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard) "bZE" = ( /turf/closed/wall, /area/maintenance/disposal/incinerator) @@ -53983,18 +54022,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"caZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/structure/sign/warning/deathsposal{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cba" = ( /obj/machinery/power/smes{ capacity = 9e+006; @@ -54859,6 +54886,9 @@ pixel_y = 2 }, /obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hydroponics) "ccA" = ( @@ -54874,14 +54904,12 @@ pixel_y = 5 }, /obj/item/watertank, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /obj/item/grenade/chem_grenade/antiweed, /obj/structure/table/glass, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) "ccB" = ( @@ -56800,13 +56828,6 @@ icon_state = "platingdmg2" }, /area/maintenance/starboard/aft) -"cgu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "cgv" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -78107,6 +78128,9 @@ dir = 1 }, /obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/hydroponics) "dbF" = ( @@ -82837,9 +82861,6 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) -"etr" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "eFN" = ( /obj/structure/bodycontainer/crematorium{ id = "crematoriumChapel"; @@ -83155,11 +83176,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"ieW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "ifN" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -83263,6 +83279,12 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"jHw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/hydroponics) "jKK" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -83420,6 +83442,19 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"lkf" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "lnO" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -83760,6 +83795,18 @@ "pcn" = ( /turf/open/floor/plasteel, /area/science/misc_lab/range) +"pgY" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "pmZ" = ( /obj/structure/sign/poster/official/random{ pixel_y = 32 @@ -83885,16 +83932,6 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"qbK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) "qcZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -83927,6 +83964,14 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"qkD" = ( +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hydroponics) "qom" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84200,6 +84245,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"tQN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hydroponics) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -84325,12 +84387,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) -"vlx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness/recreation) "vwi" = ( /obj/structure/girder, /obj/structure/grille, @@ -119956,7 +120012,7 @@ bKe bRW bST bUm -bVu +pgY bWT bYj bWT @@ -120213,11 +120269,11 @@ bQI bRX bST bUn -bVt -bWQ +lkf +qkD bYk -bWQ -caL +qkD +tQN dbE bST diB @@ -120732,7 +120788,7 @@ bST bST bST caQ -bST +jHw bST cfg pCp @@ -121692,9 +121748,9 @@ acP afz agz dBY -vlx -vlx -etr +ahl +ahl +ahg alk alk anK @@ -123560,9 +123616,9 @@ bYr avs bZE mKO -qbK -ieW -cgu +aaW +aeD +apX amV bZC arF @@ -124328,11 +124384,11 @@ alq alq bXb bYu -bZD +auQ caY ccI ced -aaW +aiT aju apP ciZ @@ -124586,7 +124642,7 @@ aut bXc apc bZE -caZ +aaU ccJ cee cgx @@ -128180,7 +128236,7 @@ bPu bPu bTl bUF -bKD +bCi bXo bMj bZI diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 43120ec1a6c..635dc97931c 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -2691,7 +2691,7 @@ area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 2; - height = 10; + height = 5; id = "laborcamp_away"; name = "labor camp"; width = 9 @@ -4102,7 +4102,7 @@ area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 3; - height = 5; + height = 10; id = "mining_away"; name = "lavaland mine"; width = 7 diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index b109ee13e46..7ebfb6721b5 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -6,12 +6,33 @@ /obj/effect/mapping_helpers/dead_body_placer, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"aac" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal/incinerator) "aad" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"aae" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal/incinerator) "abf" = ( /obj/structure/bed, /turf/open/floor/plating, @@ -41382,10 +41403,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bQH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/pipedispenser, /turf/open/floor/plasteel, /area/engine/atmos) "bQI" = ( @@ -41393,10 +41411,10 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bQJ" = ( +/obj/structure/closet/secure_closet/atmospherics, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/atmos) "bQK" = ( @@ -41747,7 +41765,7 @@ "bRu" = ( /obj/machinery/requests_console{ department = "Atmospherics"; - departmentType = 4; + departmentType = 3; name = "Atmos RC"; pixel_x = 30 }, @@ -41764,6 +41782,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bRv" = ( +/obj/machinery/pipedispenser/disposal, /obj/machinery/light{ dir = 8 }, @@ -41771,10 +41790,6 @@ c_tag = "Atmospherics Central"; dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/plasteel, /area/engine/atmos) "bRw" = ( @@ -42097,6 +42112,10 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"bSe" = ( +/obj/machinery/pipedispenser/disposal/transit_tube, +/turf/open/floor/plasteel, +/area/engine/atmos) "bSf" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -43253,7 +43272,7 @@ /obj/machinery/requests_console{ announcementConsole = 1; department = "Chief Engineer's Desk"; - departmentType = 3; + departmentType = 4; name = "Chief Engineer RC"; pixel_x = -32 }, @@ -43640,7 +43659,6 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/obj/machinery/pipedispenser, /turf/open/floor/plating, /area/maintenance/department/engine) "bVv" = ( @@ -46149,17 +46167,6 @@ "cby" = ( /turf/open/floor/engine/air, /area/engine/atmos) -"cbz" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/closet/radiation, -/turf/open/floor/plasteel/dark, -/area/maintenance/disposal/incinerator) "cbA" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -46563,17 +46570,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cdg" = ( -/obj/structure/table/glass, -/obj/item/storage/toolbox/emergency, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/disposal/incinerator) "cdk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -49228,7 +49224,7 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "cmH" = ( -/obj/machinery/telecomms/message_server, +/obj/machinery/telecomms/message_server/preset, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "cmK" = ( @@ -55869,7 +55865,7 @@ /obj/machinery/requests_console{ announcementConsole = 0; department = "Engineering"; - departmentType = 4; + departmentType = 3; name = "Engineering RC"; pixel_x = -32 }, @@ -59793,7 +59789,9 @@ /turf/open/floor/plating, /area/maintenance/disposal) "srZ" = ( -/obj/machinery/pipedispenser/disposal, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, /turf/open/floor/plating, /area/maintenance/disposal) "ssx" = ( @@ -97947,7 +97945,7 @@ bOS bPQ bQH bRv -bQH +bSe bPQ bTL uRj @@ -100531,8 +100529,8 @@ bZO caI cbA ccp -cdg -cbz +aac +aae hMa aaa aby diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index cb853d3c590..b011be59bca 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -8316,7 +8316,6 @@ /turf/open/floor/plasteel, /area/syndicate_mothership/control) "si" = ( -/obj/machinery/computer/telecrystals/uplinker, /obj/effect/turf_decal/stripes/line{ dir = 9 }, @@ -8827,7 +8826,6 @@ /turf/open/floor/plasteel, /area/syndicate_mothership/control) "tg" = ( -/obj/machinery/computer/telecrystals/uplinker, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -9522,7 +9520,6 @@ /turf/open/floor/plasteel, /area/syndicate_mothership/control) "uM" = ( -/obj/machinery/computer/telecrystals/uplinker, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -9951,7 +9948,7 @@ name = "Hanger Bay Shutters"; pixel_x = -8; pixel_y = 24; - req_access_txt = "2" + req_access_txt = "101" }, /obj/machinery/button/door/indestructible{ id = "XCCsec3"; @@ -10313,7 +10310,7 @@ id = "XCCFerry"; name = "Hanger Bay Shutters"; pixel_y = 24; - req_access_txt = "2" + req_access_txt = "101" }, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -10497,9 +10494,6 @@ /turf/open/floor/carpet, /area/wizard_station) "wV" = ( -/obj/machinery/computer/telecrystals/boss{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, diff --git a/_maps/shuttles/fugitive_hunter_space_cop.dmm b/_maps/shuttles/fugitive_hunter_space_cop.dmm deleted file mode 100644 index 9cb0b8d2a00..00000000000 --- a/_maps/shuttles/fugitive_hunter_space_cop.dmm +++ /dev/null @@ -1,176 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"bY" = ( -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"hB" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/turf/closed/wall/mineral/titanium, -/area/shuttle/hunter) -"hJ" = ( -/obj/structure/window/shuttle, -/obj/structure/grille, -/turf/open/floor/plating, -/area/shuttle/hunter) -"hU" = ( -/obj/structure/closet/crate, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"ku" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/hunter) -"lp" = ( -/obj/machinery/fugitive_capture, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"qH" = ( -/obj/machinery/button/door{ - id = "Interpolship"; - pixel_y = 26 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"rR" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"te" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/poddoor/shutters{ - id = "Interpolship" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"An" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, -/area/shuttle/hunter) -"Pq" = ( -/turf/template_noop, -/area/template_noop) -"RA" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"RO" = ( -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) -"WY" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/hunter) - -(1,1,1) = {" -Pq -ku -te -te -te -ku -Pq -"} -(2,1,1) = {" -Pq -ku -qH -RO -RO -ku -Pq -"} -(3,1,1) = {" -Pq -ku -bY -RO -RO -ku -Pq -"} -(4,1,1) = {" -hB -ku -bY -RO -RO -ku -hB -"} -(5,1,1) = {" -Pq -hJ -bY -RO -RO -hJ -Pq -"} -(6,1,1) = {" -Pq -ku -RO -RO -RO -ku -Pq -"} -(7,1,1) = {" -Pq -ku -RA -RO -hU -ku -Pq -"} -(8,1,1) = {" -Pq -ku -lp -RO -hU -ku -Pq -"} -(9,1,1) = {" -Pq -ku -ku -rR -ku -ku -Pq -"} -(10,1,1) = {" -hB -ku -RO -RO -RO -ku -hB -"} -(11,1,1) = {" -Pq -An -RA -WY -RO -An -Pq -"} -(12,1,1) = {" -Pq -ku -An -An -An -ku -Pq -"} diff --git a/_maps/shuttles/fugitive_hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm similarity index 68% rename from _maps/shuttles/fugitive_hunter_russian.dmm rename to _maps/shuttles/hunter_russian.dmm index 7143bea4b38..75b5dca6ba5 100644 --- a/_maps/shuttles/fugitive_hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -1,23 +1,17 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( /turf/closed/wall, /area/shuttle/hunter) -"ab" = ( -/obj/machinery/power/smes, -/turf/open/floor/plating, +"c" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/open/floor/plating/airless, /area/shuttle/hunter) -"ac" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/turf/open/floor/plating, -/area/shuttle/hunter) -"ad" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/shuttle/hunter) -"ae" = ( -/turf/open/floor/plating, -/area/shuttle/hunter) -"af" = ( +"d" = ( /obj/structure/shuttle/engine/heater{ icon_state = "heater"; dir = 8 @@ -27,65 +21,46 @@ }, /turf/open/floor/plating/airless, /area/shuttle/hunter) -"ag" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, +"e" = ( +/obj/machinery/portable_atmospherics/scrubber/huge, /turf/open/floor/plating, /area/shuttle/hunter) -"ah" = ( +"f" = ( +/obj/machinery/power/smes, +/turf/open/floor/plating, +/area/shuttle/hunter) +"g" = ( +/turf/open/floor/plating, +/area/shuttle/hunter) +"h" = ( /obj/machinery/door/airlock/security/glass, -/turf/open/floor/plating, +/turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"ai" = ( -/obj/structure/chair{ - icon_state = "chair"; - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/hunter) -"aj" = ( -/obj/structure/shuttle/engine/large{ - icon_state = "large_engine"; - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/hunter) -"ak" = ( -/obj/structure/chair{ - icon_state = "chair"; - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/hunter) -"al" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/plating, -/area/shuttle/hunter) -"am" = ( +"i" = ( /obj/machinery/door/airlock/security/glass, -/turf/open/floor/mineral/plastitanium, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"an" = ( +"j" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/shuttle/hunter) -"ao" = ( +"k" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"l" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/shuttle/hunter) -"ap" = ( +"m" = ( /obj/structure/reagent_dispensers/fueltank, /obj/item/weldingtool/largetank, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"aq" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/hunter) -"ar" = ( +"n" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/reagent_dispensers/watertank, /obj/item/reagent_containers/glass/bucket, @@ -95,7 +70,13 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"as" = ( +"o" = ( +/obj/effect/mob_spawn/human/fugitive/russian{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"p" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate{ @@ -103,21 +84,24 @@ }, /turf/open/floor/plating, /area/shuttle/hunter) -"at" = ( +"q" = ( /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"au" = ( -/obj/machinery/door/airlock/security/glass, +"r" = ( +/obj/effect/turf_decal/arrows{ + icon_state = "arrows"; + dir = 4 + }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"av" = ( +"s" = ( /obj/structure/table, /obj/item/storage/fancy/cigarettes/cigars/cohiba{ pixel_y = 6 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"aw" = ( +"t" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/large{ @@ -125,58 +109,66 @@ }, /turf/open/floor/plating, /area/shuttle/hunter) -"ax" = ( -/turf/open/space/basic, -/area/shuttle/hunter) -"ay" = ( +"u" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"az" = ( -/turf/open/floor/plating/airless, +"v" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/shuttle/hunter) -"aA" = ( +"w" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter) +"x" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/shuttle/hunter) -"aB" = ( +"y" = ( +/turf/template_noop, +/area/shuttle/hunter) +"z" = ( /obj/structure/chair{ icon_state = "chair"; dir = 4 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"aC" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker{ +"A" = ( +/obj/machinery/computer/shuttle/pirate/hunter{ dir = 8 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"aD" = ( -/obj/structure/shuttle/engine/large{ - icon_state = "large_engine"; - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/hunter) -"aE" = ( +"B" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ icon_state = "crateopen" }, /turf/open/floor/plating, /area/shuttle/hunter) -"aF" = ( +"C" = ( /obj/machinery/computer/camera_advanced{ dir = 8 }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"aG" = ( -/obj/machinery/fugitive_capture, +"D" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/hunter) +"E" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + dir = 8; + jumpto_ports = list("huntership_home" = 1); + view_range = 12; + x_offset = 0; + y_offset = 3 + }, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"aH" = ( +"F" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/engineering{ @@ -184,321 +176,325 @@ }, /turf/open/floor/plating, /area/shuttle/hunter) -"aI" = ( +"G" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/bottle/vodka, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"aJ" = ( +"H" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate/coffin{ icon_state = "coffinopen" }, /turf/open/floor/plating, /area/shuttle/hunter) -"aK" = ( +"I" = ( /obj/effect/turf_decal/bot, /obj/mecha/working/ripley, /turf/open/floor/plating, /area/shuttle/hunter) -"aL" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/hunter) -"aM" = ( +"J" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter) -"aN" = ( +"K" = ( /obj/machinery/door/airlock/security/glass, /obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dir = 1; + dwidth = 11; + height = 16; + id = "pirateship_home"; + name = "Deep Space"; + width = 17 + }, +/obj/docking_port/mobile{ + dheight = 3; + dir = 1; + dwidth = 3; + height = 13; + id = "huntership"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "hunter shuttle"; + rechargeTime = 1800; + width = 15 + }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter) -"aO" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 +"L" = ( +/obj/effect/mob_spawn/human/fugitive/russian{ + dir = 1 }, -/turf/open/floor/plating/airless, +/turf/open/floor/plating, /area/shuttle/hunter) -"aP" = ( -/obj/structure/shuttle/engine/heater{ - icon_state = "heater"; - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/hunter) -"Pq" = ( -/turf/template_noop, -/area/template_noop) (1,1,1) = {" -Pq -Pq -ae -aj -Pq -Pq -Pq -Pq -az -aD -Pq -Pq -Pq -Pq -Pq -Pq +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a "} (2,1,1) = {" -Pq -aa -ae -ae -aa -Pq -Pq -aa -az -az -aa -Pq -Pq -Pq -Pq -Pq +a +a +a +a +a +a +b +c +c +b +a +a +a +a +a +a "} (3,1,1) = {" -Pq -aa -af -af -aa -Pq -aa -aa -af -af -aa -aa -Pq -Pq -Pq -Pq +a +c +c +a +b +b +b +d +d +b +b +b +a +c +c +a "} (4,1,1) = {" -Pq -aa -ae -ak -aa -aa -as -aw -aA -aE -aE -aH -aa -Pq -Pq -Pq +b +d +d +b +b +p +t +x +B +B +F +b +b +d +d +b "} (5,1,1) = {" -Pq -aa -ag -ak -aa -an -at -ay -at -at -ay -ay -aJ -aa -Pq -Pq +b +e +g +b +j +q +u +q +q +u +u +H +b +g +L +b "} (6,1,1) = {" -Pq -aa -ae -ak -aa -an -at -at -at -at -ay -at -aK -aa -Pq -Pq +b +e +g +h +k +k +k +k +k +D +k +k +h +g +L +b "} (7,1,1) = {" -Pq -aa -ae -ak -aa -ao -at -ay -ay -at -ay -at -aL -aa -Pq -Pq +b +f +g +b +l +k +u +u +q +u +k +I +b +g +L +b "} (8,1,1) = {" -Pq -aa -ah -aa -aa -aa -am -aa -aa -aa -aa -am -aa -aa -Pq -Pq +b +b +b +b +b +h +b +b +b +b +h +b +b +b +b +b "} (9,1,1) = {" -Pq -aa -ae -al -aa -ap -aq -aa -ax -ax -aa -aq -at -aa -Pq -Pq +a +b +b +b +m +k +b +y +y +b +k +q +b +b +b +a "} (10,1,1) = {" -Pq -aa -ae -ae -am -aq -aq -aa -ax -ax -aa -aq -aq -aN -Pq -Pq +a +a +a +i +k +k +v +y +y +v +k +k +K +a +a +a "} (11,1,1) = {" -aa -ab -ae -ae -aa -ar -aq -aa -ax -ax -aa -aq -aM -aa -aO -aO +a +a +a +b +n +r +b +y +y +b +r +J +b +a +a +a "} (12,1,1) = {" -aa -ab -ai -ai -aa -aa -au -aa -aa -aa -aa -au -aa -aa -aP -aP +a +a +a +b +b +h +b +b +b +b +h +b +b +a +a +a "} (13,1,1) = {" -aa -ac -ae -ae -aa -aq -aq -aq -aB -aB -aq -aq -aq -aa -aa -aa +a +a +a +b +o +k +r +z +z +k +k +o +b +a +a +a "} (14,1,1) = {" -aa -ad -ad -ad -aa -aa -av -at -aC -aF -aG -aI -aa -aa -aa -Pq +a +a +a +b +b +s +w +A +C +E +G +b +b +a +a +a "} (15,1,1) = {" -Pq -Pq -Pq -Pq -Pq -Pq -aa -ad -ad -ad -ad -aa -Pq -Pq -Pq -Pq +a +a +a +a +b +b +v +v +v +v +b +b +a +a +a +a "} diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm new file mode 100644 index 00000000000..5c0538bc69e --- /dev/null +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -0,0 +1,263 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + dir = 8; + jumpto_ports = list("huntership_home" = 1); + view_range = 7; + x_offset = 6 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ab" = ( +/obj/machinery/computer/shuttle/pirate/hunter{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ac" = ( +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 3; + height = 12; + id = "huntership_home"; + name = "Deep Space"; + width = 7 + }, +/obj/docking_port/mobile{ + dheight = 0; + dir = 4; + dwidth = 3; + height = 12; + id = "huntership"; + name = "hunter shuttle"; + rechargeTime = 1800; + width = 7 + }, +/obj/machinery/door/poddoor/shutters{ + id = "Interpolship" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ae" = ( +/obj/machinery/button/door{ + id = "Interpolship"; + pixel_y = 26 + }, +/obj/effect/turf_decal/stripes{ + icon_state = "warningline"; + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"af" = ( +/obj/effect/turf_decal/stripes{ + icon_state = "warningline"; + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ag" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ah" = ( +/obj/effect/turf_decal/loading_area{ + icon_state = "loadingarea"; + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"aj" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/box, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"ak" = ( +/obj/structure/chair/comfy/shuttle{ + icon_state = "shuttle_chair"; + dir = 1 + }, +/obj/effect/mob_spawn/human/fugitive/spacepol{ + icon_state = "sleeper"; + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"al" = ( +/obj/effect/turf_decal/stripes{ + icon_state = "warningline"; + dir = 8 + }, +/obj/effect/turf_decal/caution{ + icon_state = "caution"; + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"bY" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"gi" = ( +/obj/structure/table, +/obj/effect/mob_spawn/human/fugitive/spacepol{ + dir = 8; + icon_state = "sleeper" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"hB" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/hunter) +"hJ" = ( +/obj/structure/window/shuttle, +/obj/structure/grille, +/turf/open/floor/plating, +/area/shuttle/hunter) +"ku" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/hunter) +"lp" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"rR" = ( +/obj/machinery/door/airlock/titanium, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"te" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/shutters{ + id = "Interpolship" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"An" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/shuttle/hunter) +"Pq" = ( +/turf/template_noop, +/area/template_noop) +"Rz" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) +"RO" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/hunter) + +(1,1,1) = {" +Pq +ku +te +ac +te +ku +Pq +"} +(2,1,1) = {" +Pq +ku +ae +al +af +ku +Pq +"} +(3,1,1) = {" +Pq +ku +bY +RO +ak +ku +Pq +"} +(4,1,1) = {" +hB +ku +bY +RO +ak +ku +hB +"} +(5,1,1) = {" +ku +ku +bY +RO +ak +ku +ku +"} +(6,1,1) = {" +Pq +hJ +ag +RO +RO +hJ +Pq +"} +(7,1,1) = {" +Pq +hJ +ah +RO +aj +hJ +Pq +"} +(8,1,1) = {" +Pq +ku +lp +RO +aj +ku +Pq +"} +(9,1,1) = {" +hB +ku +ku +rR +ku +ku +hB +"} +(10,1,1) = {" +ku +ku +RO +Rz +RO +ku +ku +"} +(11,1,1) = {" +Pq +An +aa +gi +ab +An +Pq +"} +(12,1,1) = {" +Pq +ku +An +An +An +ku +Pq +"} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index aa04f188601..33d774f22dc 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -93,6 +93,8 @@ #define TR_KEEPSE (1<<5) // changelings shouldn't edit the DNA's SE when turning into a monkey #define TR_DEFAULTMSG (1<<6) #define TR_KEEPORGANS (1<<8) +#define TR_KEEPSTUNS (1<<9) +#define TR_KEEPREAGENTS (1<<10) #define CLONER_FRESH_CLONE "fresh" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 1969b8296a7..d6d872a52b4 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -59,4 +59,4 @@ #define TRACKER_MINDSHIELD_TIME 1200 #define TRACKER_AWAKENED_TIME 3000 #define TRACKER_BONUS_LARGE 300 -#define TRACKER_BONUS_SMALL 100 \ No newline at end of file +#define TRACKER_BONUS_SMALL 100 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 49147dfe4d3..18ae4ac0cf8 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -36,6 +36,7 @@ #define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) #define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation #define COMSIG_PARENT_QDELETED "parent_qdeleted" //after a datum's Destroy() is called: (force, qdel_hint), at this point none of the other components chose to interrupt qdel and Destroy has been called +#define COMSIG_TOPIC "handle_topic" //generic topic handler (usr, href_list) // /atom signals #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) @@ -110,6 +111,7 @@ // /atom/movable signals #define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) + #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 #define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) #define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) #define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) @@ -134,7 +136,7 @@ #define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) #define COMSIG_MOB_CANCEL_CLICKON 1 #define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj -#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, major, self, protection_sources) +#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) #define COMPONENT_BLOCK_MAGIC 1 #define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of @@ -163,6 +165,10 @@ // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) +// /mob/living/simple_animal/hostile signals +#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" + #define COMPONENT_HOSTILE_NO_ATTACK 1 + // /obj signals #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) @@ -202,6 +208,8 @@ // /obj/item/pda signals #define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) #define COMPONENT_STOP_RINGTONE_CHANGE 1 +#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" + #define COMPONENT_PDA_NO_DETONATE 1 // /obj/item/radio signals #define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) @@ -209,6 +217,10 @@ // /obj/item/pen signals #define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) +// /obj/item/projectile signals (sent to the firer) +#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) +#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target) + // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) @@ -245,6 +257,7 @@ #define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount #define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount #define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. #define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected #define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs #define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component @@ -253,19 +266,19 @@ #define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component // /datum/component/storage signals -#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. -#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. -#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool -#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool -#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) -#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! -#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. -#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. -#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool -#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. +#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. +#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool +#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool +#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) +#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! +#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. +#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. +#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool +#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. #define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) -#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool +#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool // /datum/action signals #define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) diff --git a/code/__DEFINES/contracts.dm b/code/__DEFINES/contracts.dm index b600a5fdc01..c6e23394ba2 100644 --- a/code/__DEFINES/contracts.dm +++ b/code/__DEFINES/contracts.dm @@ -41,4 +41,4 @@ #define BANISH_FUNERAL_GARB "funeral" #define LORE 1 -#define LAW 2 \ No newline at end of file +#define LAW 2 diff --git a/code/__DEFINES/fantasy_affixes.dm b/code/__DEFINES/fantasy_affixes.dm new file mode 100644 index 00000000000..709d414d117 --- /dev/null +++ b/code/__DEFINES/fantasy_affixes.dm @@ -0,0 +1,5 @@ +#define AFFIX_PREFIX (1 << 0) +#define AFFIX_SUFFIX (1 << 1) + +#define AFFIX_GOOD (1 << 0) +#define AFFIX_EVIL (1 << 1) \ No newline at end of file diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 2c7a66ce40c..590be18be73 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -11,8 +11,10 @@ #define GROSS (1<<10) #define TOXIC (1<<11) #define PINEAPPLE (1<<12) +#define CLOTH (1<<14) #define DRINK_NICE 1 #define DRINK_GOOD 2 #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 +#define FOOD_AMAZING 5 diff --git a/code/__DEFINES/forensics.dm b/code/__DEFINES/forensics.dm index bb512edcde6..f6121482dab 100644 --- a/code/__DEFINES/forensics.dm +++ b/code/__DEFINES/forensics.dm @@ -1,2 +1 @@ -#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA)) -#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions)) +#define HAS_BLOOD_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.blood_DNA)) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 4dfcfb87b4c..7bf8bbd25a1 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -4,3 +4,8 @@ #define HUD_STYLE_NOHUD 3 //No hud (for screenshots) #define HUD_VERSIONS 3 //Used in show_hud(); Please ensure this is the same as the maximum index. + +//1:1 HUD layout stuff +#define UI_BOXCRAFT "EAST-4:22,SOUTH+1:6" +#define UI_BOXAREA "EAST-4:6,SOUTH+1:6" +#define UI_BOXLANG "EAST-5:22,SOUTH+1:6" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 759f01b97de..a74654c807e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -225,6 +225,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define isbodypart(A) (istype(A, /obj/item/bodypart)) +#define isprojectile(A) (istype(A, /obj/item/projectile)) + +#define isgun(A) (istype(A, /obj/item/gun)) + //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 35a675515a8..3df5f64874a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -175,6 +175,9 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) //Gets the turf this atom inhabits #define get_turf(A) (get_step(A, 0)) +//Same as above except gets the area instead +#define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc) + //Ghost orbit types: #define GHOST_ORBIT_CIRCLE "circle" #define GHOST_ORBIT_TRIANGLE "triangle" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 97486374e99..7d0b57ded51 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -71,6 +71,8 @@ #define HUMAN_MAX_OXYLOSS 3 #define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30) +#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS) + #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 526afab9308..88cb50b783c 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -25,6 +25,8 @@ #define MOVESPEED_ID_SLIME_STATUS "SLIME_STATUS" +#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB" + #define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD" #define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT" @@ -61,4 +63,4 @@ #define MOVESPEED_ID_SLAUGHTER "SLAUGHTER" #define MOVESPEED_ID_DIE_OF_FATE "DIE_OF_FATE" -#define MOVESPEED_ID_SHOVE "SHOVE" +#define MOVESPEED_ID_SHOVE "SHOVE" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 943acdbc7ef..bfba80a80cb 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -103,3 +103,13 @@ #define RADIO_MAGNETS "magnets" #define DEFAULT_SIGNALER_CODE 30 + +//Requests Console +#define REQ_NO_NEW_MESSAGE 0 +#define REQ_NORMAL_MESSAGE_PRIORITY 1 +#define REQ_HIGH_MESSAGE_PRIORITY 2 +#define REQ_EXTREME_MESSAGE_PRIORITY 3 + +#define REQ_DEP_TYPE_ASSISTANCE (1<<0) +#define REQ_DEP_TYPE_SUPPLIES (1<<1) +#define REQ_DEP_TYPE_INFORMATION (1<<2) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index b50423cc80c..47d7a8dff3b 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -122,3 +122,7 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor + +// Stasis helpers + +#define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS)) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index cb7e9b02042..b1810c95981 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -136,6 +136,7 @@ #define TRAIT_BOOZE_SLIDER "booze-slider" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_UNSTABLE "unstable" +#define TRAIT_OIL_FRIED "oil_fried" //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index cb5187b91a5..f5644114338 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -8,12 +8,6 @@ #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 -/proc/get_area(atom/A) - if(isarea(A)) - return A - var/turf/T = get_turf(A) - return T ? T.loc : null - /proc/get_area_name(atom/X, format_text = FALSE) var/area/A = isarea(X) ? X : get_area(X) if(!A) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 2b624a9dacd..226b85bc6ef 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -157,6 +157,10 @@ GLOBAL_VAR(command_name) GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. GLOBAL_VAR(syndicate_code_response) //Code response for traitors. +//Cached regex search - for checking if codewords are used. +GLOBAL_DATUM(syndicate_code_phrase_regex, /regex) +GLOBAL_DATUM(syndicate_code_response_regex, /regex) + /* Should be expanded. How this works: diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm new file mode 100644 index 00000000000..f1208abdd30 --- /dev/null +++ b/code/__HELPERS/reagents.dm @@ -0,0 +1,74 @@ +/proc/chem_recipes_do_conflict(datum/chemical_reaction/r1, datum/chemical_reaction/r2) + //do the non-list tests first, because they are cheaper + if(r1.required_container != r2.required_container) + return FALSE + if(r1.is_cold_recipe == r2.is_cold_recipe) + if(r1.required_temp != r2.required_temp) + //one reaction requires a more extreme temperature than the other, so there is no conflict + return FALSE + else + var/datum/chemical_reaction/cold_one = r1.is_cold_recipe ? r1 : r2 + var/datum/chemical_reaction/warm_one = r1.is_cold_recipe ? r2 : r1 + if(cold_one.required_temp < warm_one.required_temp) + //the range of temperatures does not overlap, so there is no conflict + return FALSE + + //find the reactions with the shorter and longer required_reagents list + var/datum/chemical_reaction/long_req + var/datum/chemical_reaction/short_req + if(r1.required_reagents.len > r2.required_reagents.len) + long_req = r1 + short_req = r2 + else if(r1.required_reagents.len < r2.required_reagents.len) + long_req = r2 + short_req = r1 + else + //if they are the same length, sort instead by the length of the catalyst list + //this is important if the required_reagents lists are the same + if(r1.required_catalysts.len > r2.required_catalysts.len) + long_req = r1 + short_req = r2 + else + long_req = r2 + short_req = r1 + + + //check if the shorter reaction list is a subset of the longer one + var/list/overlap = r1.required_reagents & r2.required_reagents + if(overlap.len != short_req.required_reagents.len) + //there is at least one reagent in the short list that is not in the long list, so there is no conflict + return FALSE + + //check to see if the shorter reaction's catalyst list is also a subset of the longer reaction's catalyst list + //if the longer reaction's catalyst list is a subset of the shorter ones, that is fine + //if the reaction lists are the same, the short reaction will have the shorter required_catalysts list, so it will register as a conflict + var/list/short_minus_long_catalysts = short_req.required_catalysts - long_req.required_catalysts + if(short_minus_long_catalysts.len) + //there is at least one unique catalyst for the short reaction, so there is no conflict + return FALSE + + //if we got this far, the longer reaction will be impossible to create if the shorter one is earlier in GLOB.chemical_reactions_list, and will require the reagents to be added in a particular order otherwise + return TRUE + +/proc/get_chemical_reaction(id) + if(!GLOB.chemical_reactions_list) + return + for(var/reagent in GLOB.chemical_reactions_list) + for(var/datum/chemical_reaction/R in GLOB.chemical_reactions_list[reagent]) + if(R.id == id) + return R + +/proc/remove_chemical_reaction(datum/chemical_reaction/R) + if(!GLOB.chemical_reactions_list || !R) + return + for(var/rid in R.required_reagents) + GLOB.chemical_reactions_list[rid] -= R + +//see build_chemical_reactions_list in holder.dm for explanations +/proc/add_chemical_reaction(datum/chemical_reaction/R) + if(!GLOB.chemical_reactions_list || !R.id || !R.required_reagents || !R.required_reagents.len) + return + var/primary_reagent = R.required_reagents[1] + if(!GLOB.chemical_reactions_list[primary_reagent]) + GLOB.chemical_reactions_list[primary_reagent] = list() + GLOB.chemical_reactions_list[primary_reagent] += R diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 677643b9edd..a7508699a9e 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -89,3 +89,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) if(hour) hourT = " and [hour] hour[(hour != 1)? "s":""]" return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" + + +/proc/daysSince(realtimev) + return round((world.realtime - realtimev) / (24 HOURS)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ba2474bb872..13a35209420 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1129,6 +1129,27 @@ B --><-- A /proc/get_random_station_turf() return safepick(get_area_turfs(pick(GLOB.the_station_areas))) +/proc/get_safe_random_station_turf() + for (var/i in 1 to 5) + var/list/L = get_area_turfs(pick(GLOB.the_station_areas)) + var/turf/target + while (L.len && !target) + var/I = rand(1, L.len) + var/turf/T = L[I] + if(!T.density) + var/clear = TRUE + for(var/obj/O in T) + if(O.density) + clear = FALSE + break + if(clear) + target = T + if (!target) + L.Cut(I,I+1) + if (target) + return target + + /proc/get_closest_atom(type, list, source) var/closest_atom var/closest_distance diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 490ddd62e30..001f29cb767 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -14,6 +14,12 @@ #define POLL_IGNORE_SWARMER "swarmer" #define POLL_IGNORE_DRONE "drone" #define POLL_IGNORE_FUGITIVE "fugitive" +#define POLL_IGNORE_DEFECTIVECLONE "defective_clone" +#define POLL_IGNORE_PYROSLIME "slime" +#define POLL_IGNORE_SHADE "shade" +#define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" +#define POLL_IGNORE_SPLITPERSONALITY "split_personality" + GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", @@ -30,6 +36,11 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SWARMER = "Swarmer shells", POLL_IGNORE_DRONE = "Drone shells", POLL_IGNORE_FUGITIVE = "Fugitive Hunter", + POLL_IGNORE_DEFECTIVECLONE = "Defective clone", + POLL_IGNORE_PYROSLIME = "Slime", + POLL_IGNORE_SHADE = "Shade", + POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", + POLL_IGNORE_SPLITPERSONALITY = "Split Personality", )) GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore()) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index fa0ecf117d5..2957c33dbc1 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -18,3 +18,12 @@ GLOBAL_LIST_EMPTY(powernets) GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details + +// All religion stuff +GLOBAL_VAR(religion) +GLOBAL_VAR(deity) +GLOBAL_VAR(bible_name) +GLOBAL_VAR(bible_icon_state) +GLOBAL_VAR(bible_item_state) +GLOBAL_VAR(holy_weapon_type) +GLOBAL_VAR(holy_armor_type) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index c64f0d7a3ea..b048fa224c9 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -102,20 +102,6 @@ /obj/screen/click_catcher/IsAutoclickable() . = 1 -//Please don't roast me too hard -/client/MouseMove(object,location,control,params) - mouseParams = params - mouseLocation = location - mouseObject = object - mouseControlObject = control - if(mob && LAZYLEN(mob.mousemove_intercept_objects)) - for(var/datum/D in mob.mousemove_intercept_objects) - D.onMouseMove(object, location, control, params) - ..() - -/datum/proc/onMouseMove(object, location, control, params) - return - /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) var/list/L = params2list(params) if (L["middle"]) @@ -143,4 +129,4 @@ if (middragatom == src_object) middragtime = 0 middragatom = null - ..() \ No newline at end of file + ..() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 3d05d899cf0..5790320af48 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -146,6 +146,11 @@ #define ui_pai_rest "SOUTH:6,WEST+3" #define ui_pai_light "SOUTH:6,WEST+4" #define ui_pai_newscaster "SOUTH:6,WEST+5" +#define ui_pai_host_monitor "SOUTH:6,WEST+6" +#define ui_pai_crew_manifest "SOUTH:6,WEST+7" +#define ui_pai_state_laws "SOUTH:6,WEST+8" +#define ui_pai_pda_send "SOUTH:6,WEST+9" +#define ui_pai_pda_log "SOUTH:6,WEST+10" #define ui_pai_take_picture "SOUTH:6,WEST+12" #define ui_pai_view_images "SOUTH:6,WEST+13" diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index d4ace893680..8b2829b8658 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -93,8 +93,8 @@ /obj/screen/blob/ReadaptStrain icon_state = "ui_chemswap" - name = "Readapt Chemical (40)" - desc = "Randomly rerolls your chemical for 40 resources." + name = "Readapt Strain (40)" + desc = "Allows you to choose a new strain from 4 random choices for 40 resources." /obj/screen/blob/ReadaptStrain/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 30cb719d51c..5bf11719999 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -84,19 +84,29 @@ ..() owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + var/widescreen_layout = FALSE + if(owner.client?.prefs?.widescreenpref) + widescreen_layout = TRUE + var/obj/screen/using var/obj/screen/inventory/inv_box using = new /obj/screen/craft using.icon = ui_style + if(!widescreen_layout) + using.screen_loc = UI_BOXCRAFT static_inventory += using using = new/obj/screen/language_menu using.icon = ui_style + if(!widescreen_layout) + using.screen_loc = UI_BOXLANG static_inventory += using using = new /obj/screen/area_creator using.icon = ui_style + if(!widescreen_layout) + using.screen_loc = UI_BOXAREA static_inventory += using action_intent = new /obj/screen/act_intent/segmented diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index 2da701f217a..c045223d983 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -1,17 +1,25 @@ +#define PAI_MISSING_SOFTWARE_MESSAGE "You must download the required software to use this." + /obj/screen/pai icon = 'icons/mob/screen_pai.dmi' + var/required_software /obj/screen/pai/Click() if(isobserver(usr) || usr.incapacitated()) - return TRUE + return FALSE + var/mob/living/silicon/pai/pAI = usr + if(required_software && !pAI.software.Find(required_software)) + to_chat(pAI, PAI_MISSING_SOFTWARE_MESSAGE) + return FALSE + return TRUE /obj/screen/pai/software name = "Software Interface" icon_state = "pai" - /obj/screen/pai/software/Click() - ..() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr pAI.paiInterface() @@ -20,7 +28,8 @@ icon_state = "pai_holoform" /obj/screen/pai/shell/Click() - ..() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr if(pAI.holoform) pAI.fold_in(0) @@ -32,7 +41,8 @@ icon_state = "pai_chassis" /obj/screen/pai/chassis/Click() - ..() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr pAI.choose_chassis() @@ -41,7 +51,8 @@ icon_state = "pai_rest" /obj/screen/pai/rest/Click() - ..() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr pAI.lay_down() @@ -50,41 +61,114 @@ icon_state = "light" /obj/screen/pai/light/Click() - ..() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr pAI.toggle_integrated_light() /obj/screen/pai/newscaster name = "pAI Newscaster" icon_state = "newscaster" + required_software = "newscaster" /obj/screen/pai/newscaster/Click() + if(!..()) + return var/mob/living/silicon/pai/pAI = usr pAI.newscaster.ui_interact(usr) +/obj/screen/pai/host_monitor + name = "Host Health Scan" + icon_state = "host_monitor" + required_software = "host scan" + +/obj/screen/pai/host_monitor/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + if(iscarbon(pAI.card.loc)) + pAI.hostscan.attack(pAI.card.loc, pAI) + else + to_chat(src, "You are not being carried by anyone!") + return 0 + +/obj/screen/pai/crew_manifest + name = "Crew Manifest" + icon_state = "manifest" + required_software = "crew manifest" + +/obj/screen/pai/crew_manifest/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + pAI.ai_roster() + +/obj/screen/pai/state_laws + name = "State Laws" + icon_state = "state_laws" + +/obj/screen/pai/state_laws/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + pAI.checklaws() + +/obj/screen/pai/pda_msg_send + name = "PDA - Send Message" + icon_state = "pda_send" + required_software = "digital messenger" + +/obj/screen/pai/pda_msg_send/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + pAI.cmd_send_pdamesg(usr) + +/obj/screen/pai/pda_msg_show + name = "PDA - Show Message Log" + icon_state = "pda_receive" + required_software = "digital messenger" + +/obj/screen/pai/pda_msg_show/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + pAI.cmd_show_message_log(usr) + /obj/screen/pai/image_take name = "Take Image" icon_state = "take_picture" + required_software = "photography module" /obj/screen/pai/image_take/Click() - if(..()) + if(!..()) return - if(issilicon(usr)) - var/mob/living/silicon/ai/pAI = usr - pAI.aicamera.toggle_camera_mode(usr) + var/mob/living/silicon/pai/pAI = usr + pAI.aicamera.toggle_camera_mode(usr) /obj/screen/pai/image_view name = "View Images" icon_state = "view_images" + required_software = "photography module" /obj/screen/pai/image_view/Click() - if(..()) + if(!..()) return - if(issilicon(usr)) - var/mob/living/silicon/ai/pAI = usr - pAI.aicamera.viewpictures(usr) + var/mob/living/silicon/pai/pAI = usr + pAI.aicamera.viewpictures(usr) -/datum/hud/pai/New(mob/owner) +/obj/screen/pai/radio + name = "radio" + icon = 'icons/mob/screen_cyborg.dmi' + icon_state = "radio" + +/obj/screen/pai/radio/Click() + if(!..()) + return + var/mob/living/silicon/pai/pAI = usr + pAI.radio.interact(usr) + +/datum/hud/pai/New(mob/living/silicon/pai/owner) ..() var/obj/screen/using @@ -123,12 +207,52 @@ using.screen_loc = ui_borg_language_menu static_inventory += using -//Take image +// Host Monitor + using = new /obj/screen/pai/host_monitor() + using.screen_loc = ui_pai_host_monitor + static_inventory += using + +// Crew Manifest + using = new /obj/screen/pai/crew_manifest() + using.screen_loc = ui_pai_crew_manifest + static_inventory += using + +// Laws + using = new /obj/screen/pai/state_laws() + using.screen_loc = ui_pai_state_laws + static_inventory += using + +// PDA message + using = new /obj/screen/pai/pda_msg_send() + using.screen_loc = ui_pai_pda_send + static_inventory += using + +// PDA log + using = new /obj/screen/pai/pda_msg_show() + using.screen_loc = ui_pai_pda_log + static_inventory += using + +// Take image using = new /obj/screen/pai/image_take() using.screen_loc = ui_pai_take_picture static_inventory += using -//View images +// View images using = new /obj/screen/pai/image_view() using.screen_loc = ui_pai_view_images - static_inventory += using \ No newline at end of file + static_inventory += using + +// Radio + using = new /obj/screen/pai/radio() + using.screen_loc = ui_borg_radio + static_inventory += using + + update_software_buttons() + +/datum/hud/pai/proc/update_software_buttons() + var/mob/living/silicon/pai/owner = mymob + for(var/obj/screen/pai/button in static_inventory) + if(button.required_software) + button.color = owner.software.Find(button.required_software) ? null : "#808080" + +#undef PAI_MISSING_SOFTWARE_MESSAGE diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index c6c9949431b..588af8e41a0 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -213,7 +213,6 @@ GLOBAL_LIST_EMPTY(radial_menus) choices_icons.Cut() choices_values.Cut() current_page = 1 - QDEL_NULL(custom_check_callback) /datum/radial_menu/proc/element_chosen(choice_id,mob/user) selected_choice = choices_values[choice_id] @@ -278,7 +277,9 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/Destroy() Reset() hide() + QDEL_NULL(custom_check_callback) . = ..() + /* Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen) Choices should be a list where list keys are movables or text used for element names and return value @@ -307,4 +308,4 @@ GLOBAL_LIST_EMPTY(radial_menus) var/answer = menu.selected_choice qdel(menu) GLOB.radial_menus -= uniqueid - return answer \ No newline at end of file + return answer diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm new file mode 100644 index 00000000000..0b5e8dc3561 --- /dev/null +++ b/code/_onclick/hud/radial_persistent.dm @@ -0,0 +1,76 @@ +/* + A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked +*/ + +/obj/screen/radial/persistent/center + name = "Close Menu" + icon_state = "radial_center" + +/obj/screen/radial/persistent/center/Click(location, control, params) + if(usr.client == parent.current_user) + parent.element_chosen(null,usr) + +/obj/screen/radial/persistent/center/MouseEntered(location, control, params) + . = ..() + icon_state = "radial_center_focus" + +/obj/screen/radial/persistent/center/MouseExited(location, control, params) + . = ..() + icon_state = "radial_center" + + + +/datum/radial_menu/persistent + var/uniqueid + var/datum/callback/select_proc_callback + +/datum/radial_menu/persistent/New() + close_button = new /obj/screen/radial/persistent/center + close_button.parent = src + + +/datum/radial_menu/persistent/element_chosen(choice_id,mob/user) + select_proc_callback.Invoke(choices_values[choice_id]) + + +/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips) + if(!newchoices.len) + return + Reset() + set_choices(newchoices,tooltips) + +/datum/radial_menu/persistent/Destroy() + QDEL_NULL(select_proc_callback) + GLOB.radial_menus -= uniqueid + Reset() + hide() + . = ..() + +/* + Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen). + Choices should be a list where list keys are movables or text used for element names and return value + and list values are movables/icons/images used for element icons + Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument + Clicking the center button will return a choice of null +*/ +/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE) + if(!user || !anchor || !length(choices) || !select_proc) + return + if(!uniqueid) + uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" + + if(GLOB.radial_menus[uniqueid]) + return + + var/datum/radial_menu/persistent/menu = new + menu.uniqueid = uniqueid + GLOB.radial_menus[uniqueid] = menu + if(radius) + menu.radius = radius + menu.select_proc_callback = select_proc + menu.anchor = anchor + menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud + menu.set_choices(choices, tooltips) + menu.show_to(user) + return menu + diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 4d5914c970a..5bfed594767 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -1,4 +1,7 @@ -/mob/dead/observer/DblClickOn(var/atom/A, var/params) +/mob/dead/observer/DblClickOn(atom/A, params) + if(check_click_intercept(params, A)) + return + if(can_reenter_corpse && mind && mind.current) if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) diff --git a/code/_onclick/pai.dm b/code/_onclick/pai.dm index 01b6c8421be..06c1d9dfdfe 100644 --- a/code/_onclick/pai.dm +++ b/code/_onclick/pai.dm @@ -2,5 +2,5 @@ ..() if(aicamera.in_camera_mode) //pAI picture taking aicamera.camera_mode_off() - aicamera.captureimage(A, usr) + aicamera.captureimage(A, usr, null, aicamera.picture_size_x, aicamera.picture_size_y) return diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 4bcd6466784..ee4e05e7429 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -462,6 +462,9 @@ /datum/config_entry/string/default_view config_entry_value = "15x15" +/datum/config_entry/string/default_view_square + config_entry_value = "15x15" + /datum/config_entry/flag/log_pictures /datum/config_entry/flag/picture_logging_camera diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index ccbe8dc61ca..462ba609448 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(dbcore) wait = 1 MINUTES init_order = INIT_ORDER_DBCORE var/const/FAILED_DB_CONNECTION_CUTOFF = 5 + var/failed_connection_timeout = 0 var/schema_mismatch = 0 var/db_minor = 0 @@ -64,7 +65,11 @@ SUBSYSTEM_DEF(dbcore) if(IsConnected()) return TRUE - if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect anymore. + if(failed_connection_timeout <= world.time) //it's been more than 5 seconds since we failed to connect, reset the counter + failed_connections = 0 + + if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for 5 seconds. + failed_connection_timeout = world.time + 50 return FALSE if(!CONFIG_GET(flag/sql_enabled)) @@ -323,13 +328,15 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table if(!async) start_time = REALTIMEOFDAY Close() - query = connection.BeginQuery(sql) - if(!async) - timed_out = !query.WaitForCompletion() - else - in_progress = TRUE - UNTIL(query.IsComplete()) - in_progress = FALSE + timed_out = run_query(async) + if(query.GetErrorCode() == 2006) //2006 is the return code for "MySQL server has gone away" time-out error, meaning the connection has been lost to the server (if it's still alive) + log_sql("Executing query encountered returned a lost database connection (2006).") + SSdbcore.Disconnect() + if(SSdbcore.Connect()) //connection was restablished, reattempt the query + log_sql("Connection restablished") + timed_out = run_query(async) + else + log_sql("Executing query failed to restablish database connection.") skip_next_is_complete = TRUE var/error = QDELETED(query) ? "Query object deleted!" : query.GetError() last_error = error @@ -343,6 +350,15 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table log_query_debug("Query used: [sql]") slow_query_check() +/datum/DBQuery/proc/run_query(async) + query = connection.BeginQuery(sql) + if(!async) + . = !query.WaitForCompletion() + else + in_progress = TRUE + UNTIL(query.IsComplete()) + in_progress = FALSE + /datum/DBQuery/proc/slow_query_check() message_admins("HEY! A database query timed out. Did the server just hang? \[YES\]|\[NO\]") diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index e332384528e..8c2e2d341ac 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -55,7 +55,7 @@ SUBSYSTEM_DEF(economy) return ..() /datum/controller/subsystem/economy/fire(resumed = 0) - boring_eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. + boring_eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. boring_sci_payout() // Payout based on slimes. boring_secmedsrv_payout() // Payout based on crew safety, health, and mood. boring_civ_payout() // Payout based on ??? Profit diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index ed6de7f1683..d59dd2b0625 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -228,7 +228,7 @@ SUBSYSTEM_DEF(job) * fills var "assigned_role" for all ready players. * This proc must not have any side effect besides of modifying "assigned_role". **/ -/datum/controller/subsystem/job/proc/DivideOccupations() +/datum/controller/subsystem/job/proc/DivideOccupations(list/required_jobs) //Setup new player list and get the jobs list JobDebug("Running DO") @@ -241,14 +241,14 @@ SUBSYSTEM_DEF(job) //Get the players who are ready for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.ready == PLAYER_READY_TO_PLAY && player.mind && !player.mind.assigned_role) + if(player.ready == PLAYER_READY_TO_PLAY && player.has_valid_preferences() && player.mind && !player.mind.assigned_role) unassigned += player initial_players_to_assign = unassigned.len JobDebug("DO, Len: [unassigned.len]") if(unassigned.len == 0) - return TRUE + return validate_required_jobs(required_jobs) //Scale number of open security officer slots to population setup_officer_positions() @@ -269,7 +269,7 @@ SUBSYSTEM_DEF(job) //People who wants to be the overflow role, sure, go on. JobDebug("DO, Running Overflow Check 1") var/datum/job/overflow = GetJob(SSjob.overflow_role) - var/list/overflow_candidates = FindOccupationCandidates(overflow, 3) + var/list/overflow_candidates = FindOccupationCandidates(overflow, JP_LOW) JobDebug("AC1, Candidates: [overflow_candidates.len]") for(var/mob/dead/new_player/player in overflow_candidates) JobDebug("AC1 pass, Player: [player]") @@ -354,7 +354,26 @@ SUBSYSTEM_DEF(job) if(!GiveRandomJob(player)) if(!AssignRole(player, SSjob.overflow_role)) //If everything is already filled, make them an assistant return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll - return TRUE + + return validate_required_jobs(required_jobs) + +/datum/controller/subsystem/job/proc/validate_required_jobs(list/required_jobs) + if(!required_jobs.len) + return TRUE + for(var/required_group in required_jobs) + var/group_ok = TRUE + for(var/rank in required_group) + var/datum/job/J = GetJob(rank) + if(!J) + SSticker.mode.setup_error = "Invalid job [rank] in gamemode required jobs." + return FALSE + if(J.current_positions < required_group[rank]) + group_ok = FALSE + break + if(group_ok) + return TRUE + SSticker.mode.setup_error = "Required jobs not present." + return FALSE //We couldn't find a job from prefs for this guy. /datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 1d4697b65f1..8b28bd066a3 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -23,6 +23,7 @@ SUBSYSTEM_DEF(persistence) LoadPhotoPersistence() if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() + LoadRandomizedRecipes() return ..() /datum/controller/subsystem/persistence/proc/LoadPoly() @@ -146,6 +147,7 @@ SUBSYSTEM_DEF(persistence) SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. if(CONFIG_GET(flag/use_antag_rep)) CollectAntagReputation() + SaveRandomizedRecipes() /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") @@ -282,3 +284,46 @@ SUBSYSTEM_DEF(persistence) fdel(FILE_ANTAG_REP) text2file(json_encode(antag_rep), FILE_ANTAG_REP) + +/datum/controller/subsystem/persistence/proc/LoadRandomizedRecipes() + var/json_file = file("data/RandomizedChemRecipes.json") + var/json + if(fexists(json_file)) + json = json_decode(file2text(json_file)) + + for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) + var/datum/chemical_reaction/randomized/R = new randomized_type + var/loaded = FALSE + if(R.persistent && json) + var/list/recipe_data = json[R.id] + if(recipe_data) + var/creation_time = text2num(recipe_data["timestamp"]) + if((daysSince(creation_time) <= R.persistence_period) && R.LoadOldRecipe(recipe_data)) + loaded = TRUE + if(!loaded) //We do not have information for whatever reason, just generate new one + R.GenerateRecipe() + + if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future. + add_chemical_reaction(R) + +/datum/controller/subsystem/persistence/proc/SaveRandomizedRecipes() + var/json_file = file("data/RandomizedChemRecipes.json") + var/list/file_data = list() + + //asert globchems done + for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) + var/datum/chemical_reaction/randomized/R = randomized_type + R = get_chemical_reaction(initial(R.id)) //ew, would be nice to add some simple tracking + if(R && R.persistent && R.id) + var/recipe_data = list() + recipe_data["timestamp"] = world.realtime + recipe_data["required_reagents"] = R.required_reagents + recipe_data["required_catalysts"] = R.required_catalysts + recipe_data["required_temp"] = R.required_temp + recipe_data["is_cold_recipe"] = R.is_cold_recipe + recipe_data["results"] = R.results + recipe_data["required_container"] = "[R.required_container]" + file_data["[R.id]"] = recipe_data + + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) \ No newline at end of file diff --git a/code/controllers/subsystem/religion.dm b/code/controllers/subsystem/religion.dm deleted file mode 100644 index 4360cfa1c60..00000000000 --- a/code/controllers/subsystem/religion.dm +++ /dev/null @@ -1,11 +0,0 @@ -SUBSYSTEM_DEF(religion) - name = "Religion" - flags = SS_NO_FIRE|SS_NO_INIT - - var/religion - var/deity - var/bible_name - var/bible_icon_state - var/bible_item_state - var/holy_weapon_type - var/holy_armor_type \ No newline at end of file diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 958c250c96c..63925d4a587 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(server_maint) var/cmob = C.mob if (!isnewplayer(cmob) || !SSticker.queued_players.Find(cmob)) log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.clicking here to reconnect") + to_chat(C, "You have been inactive for more than [DisplayTimeText(afk_period)] and have been disconnected.You may reconnect via the button in the file menu or by clicking here to reconnect.") QDEL_IN(C, 1) //to ensure they get our message before getting disconnected continue diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 7be3f82d151..bf79cbda345 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -155,7 +155,7 @@ SUBSYSTEM_DEF(throwing) /datum/thrownthing/proc/hitcheck() for (var/thing in get_turf(thrownthing)) var/atom/movable/AM = thing - if (AM == thrownthing) + if (AM == thrownthing || (AM == thrower && !ismob(thrownthing))) continue if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1)) finalize(hit=TRUE, target=AM) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 775bdb0485e..06735301bdb 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -117,9 +117,20 @@ SUBSYSTEM_DEF(ticker) if(!GLOB.syndicate_code_phrase) - GLOB.syndicate_code_phrase = generate_code_phrase() + GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE) + + var/codewords = jointext(GLOB.syndicate_code_phrase, "|") + var/regex/codeword_match = new("([codewords])", "ig") + + GLOB.syndicate_code_phrase_regex = codeword_match + if(!GLOB.syndicate_code_response) - GLOB.syndicate_code_response = generate_code_phrase() + GLOB.syndicate_code_response = generate_code_phrase(return_list=TRUE) + + var/codewords = jointext(GLOB.syndicate_code_response, "|") + var/regex/codeword_match = new("([codewords])", "ig") + + GLOB.syndicate_code_response_regex = codeword_match start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) if(CONFIG_GET(flag/randomize_shift_time)) @@ -230,7 +241,7 @@ SUBSYSTEM_DEF(ticker) var/can_continue = 0 can_continue = src.mode.pre_setup() //Choose antagonists CHECK_TICK - can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs + can_continue = can_continue && SSjob.DivideOccupations(mode.required_jobs) //Distribute jobs CHECK_TICK if(!GLOB.Debug2) @@ -412,7 +423,7 @@ SUBSYSTEM_DEF(ticker) queued_players.len = 0 queue_delay = 0 return - + queue_delay++ var/mob/dead/new_player/next_in_line = queued_players[1] diff --git a/code/datums/action.dm b/code/datums/action.dm index a4bf9562502..40237c1b25b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -199,11 +199,16 @@ /datum/action/item_action/toggle_firemode name = "Toggle Firemode" -/datum/action/item_action/rcl +/datum/action/item_action/rcl_col name = "Change Cable Color" icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "rcl_rainbow" +/datum/action/item_action/rcl_gui + name = "Toggle Fast Wiring Gui" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "rcl_gui" + /datum/action/item_action/startchainsaw name = "Pull The Starting Cord" diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 6d49d532100..2eb131684df 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -43,7 +43,7 @@ /datum/brain_trauma/special/imaginary_friend/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) friend.key = C.key diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 612af133926..416d1061461 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -23,7 +23,7 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) stranger_backseat.key = C.key diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 9b03284513a..a1ac6c0b028 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -1,12 +1,14 @@ /datum/component/anti_magic var/magic = FALSE var/holy = FALSE + var/psychic = FALSE + var/allowed_slots = ITEM_SLOT_BACK|ITEM_SLOT_MASK|ITEM_SLOT_NECK|ITEM_SLOT_BELT|ITEM_SLOT_ID|ITEM_SLOT_EARS|ITEM_SLOT_EYES|ITEM_SLOT_GLOVES|ITEM_SLOT_HEAD|ITEM_SLOT_FEET|ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_POCKET var/charges = INFINITY var/blocks_self = TRUE var/datum/callback/reaction var/datum/callback/expire -/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire) +/datum/component/anti_magic/Initialize(_magic = FALSE, _holy = FALSE, _psychic = FALSE, _allowed_slots, _charges, _blocks_self = TRUE, datum/callback/_reaction, datum/callback/_expire) if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) @@ -17,6 +19,9 @@ magic = _magic holy = _holy + psychic = _psychic + if(_allowed_slots) + allowed_slots = _allowed_slots if(!isnull(_charges)) charges = _charges blocks_self = _blocks_self @@ -24,7 +29,7 @@ expire = _expire /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) - if(slot == SLOT_IN_BACKPACK) + if(!CHECK_BITFIELD(allowed_slots, slotdefine2slotbit(slot))) UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC) return RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE) @@ -32,13 +37,12 @@ /datum/component/anti_magic/proc/on_drop(datum/source, mob/user) UnregisterSignal(user, COMSIG_MOB_RECEIVE_MAGIC) -/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, major, self, list/protection_sources) - if(((_magic && magic) || (_holy && holy)) && (!self || blocks_self)) +/datum/component/anti_magic/proc/protect(datum/source, mob/user, _magic, _holy, _psychic, chargecost, self, list/protection_sources) + if(((_magic && magic) || (_holy && holy) || (_psychic && psychic)) && (!self || blocks_self)) protection_sources += parent - reaction?.Invoke(user, major) - if(major) - charges-- - if(charges <= 0) - expire?.Invoke(user) + reaction?.Invoke(user, chargecost) + charges -= chargecost + if(charges <= 0) + expire?.Invoke(user) return COMPONENT_BLOCK_MAGIC diff --git a/code/datums/components/bane.dm b/code/datums/components/bane.dm new file mode 100644 index 00000000000..aac56d099e5 --- /dev/null +++ b/code/datums/components/bane.dm @@ -0,0 +1,45 @@ +/datum/component/bane + dupe_mode = COMPONENT_DUPE_ALLOWED + + var/mobtype + var/speciestype + var/damage_multiplier + +/datum/component/bane/Initialize(mobtype, damage_multiplier=1) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + if(ispath(mobtype, /mob/living)) + src.mobtype = mobtype + else if(ispath(mobtype, /datum/species)) + speciestype = mobtype + else + return COMPONENT_INCOMPATIBLE + + src.damage_multiplier = damage_multiplier + +/datum/component/bane/RegisterWithParent() + if(speciestype) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/speciesCheck) + else + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/mobCheck) + +/datum/component/bane/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK) + +/datum/component/bane/proc/speciesCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!is_species(target, speciestype)) + return + activate(source, target, user) + +/datum/component/bane/proc/mobCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, mobtype)) + return + activate(source, target, user) + +/datum/component/bane/proc/activate(obj/item/source, mob/living/target, mob/attacker) + if(attacker.a_intent != INTENT_HARM) + return + + var/extra_damage = max(0, source.force * damage_multiplier) + target.apply_damage(extra_damage, source.damtype, attacker.zone_selected) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm new file mode 100644 index 00000000000..1122b7b3960 --- /dev/null +++ b/code/datums/components/fantasy/_fantasy.dm @@ -0,0 +1,140 @@ +/datum/component/fantasy + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + var/quality + + var/canFail + var/announce + + var/originalName + var/list/affixes + var/list/appliedComponents + + var/static/list/affixListing + +/datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.quality = quality || randomQuality() + src.canFail = canFail + src.announce = announce + + src.affixes = affixes + appliedComponents = list() + randomAffixes() + +/datum/component/fantasy/Destroy() + unmodify() + affixes = null + return ..() + +/datum/component/fantasy/RegisterWithParent() + var/obj/item/master = parent + originalName = master.name + modify() + +/datum/component/fantasy/UnregisterFromParent() + unmodify() + +/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments) + unmodify() + if(newComp) + quality += newComp.quality + canFail = newComp.canFail + announce = newComp.announce + else + arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given + quality += arguments[1] + canFail = arguments[4] || canFail + announce = arguments[5] || announce + modify() + +/datum/component/fantasy/proc/randomQuality() + var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0) + if(prob(50)) + quality = -quality + return quality + +/datum/component/fantasy/proc/randomAffixes(force) + if(!affixListing) + affixListing = list() + for(var/T in subtypesof(/datum/fantasy_affix)) + var/datum/fantasy_affix/affix = new T + affixListing[affix] = affix.weight + + if(length(affixes)) + if(!force) + return + affixes = list() + + var/alignment + if(quality >= 0) + alignment |= AFFIX_GOOD + if(quality <= 0) + alignment |= AFFIX_EVIL + + var/usedSlots = NONE + for(var/i in 1 to max(1, abs(quality))) // We want at least 1 affix applied + var/datum/fantasy_affix/affix = pickweight(affixListing) + if(affix.placement & usedSlots) + continue + if(!(affix.alignment & alignment)) + continue + if(!affix.validate(src)) + continue + affixes += affix + usedSlots |= affix.placement + +/datum/component/fantasy/proc/modify() + var/obj/item/master = parent + + master.force = max(0, master.force + quality) + master.throwforce = max(0, master.throwforce + quality) + master.armor = master.armor.modifyAllRatings(quality) + + var/newName = originalName + for(var/i in affixes) + var/datum/fantasy_affix/affix = i + newName = affix.apply(src, newName) + + if(quality != 0) + newName = "[newName] [quality > 0 ? "+" : ""][quality]" + + if(canFail && prob((quality - 9)*10)) + var/turf/place = get_turf(parent) + place.visible_message("[parent] violently glows blue for a while, then evaporates.") + master.burn() + return + else if(announce) + announce() + + master.name = newName + +/datum/component/fantasy/proc/unmodify() + var/obj/item/master = parent + + for(var/i in affixes) + var/datum/fantasy_affix/affix = i + affix.remove(src) + for(var/i in appliedComponents) + qdel(i) + + master.force = max(0, master.force - quality) + master.throwforce = max(0, master.throwforce - quality) + master.armor = master.armor.modifyAllRatings(-quality) + + master.name = originalName + +/datum/component/fantasy/proc/announce() + var/turf/location = get_turf(parent) + var/span + var/effect_description + if(quality >= 0) + span = "" + effect_description = "shimmering golden glow" + else + span = "" + effect_description = "mottled black glow" + + location.visible_message("[span][originalName] is covered by a [effect_description] and then transforms into [parent]!") diff --git a/code/datums/components/fantasy/affix.dm b/code/datums/components/fantasy/affix.dm new file mode 100644 index 00000000000..ad1f44ce4d8 --- /dev/null +++ b/code/datums/components/fantasy/affix.dm @@ -0,0 +1,13 @@ +/datum/fantasy_affix + var/placement // A bitflag of "slots" this affix takes up, for example pre/suffix + var/alignment + var/weight = 10 + +// For those occasional affixes which only make sense in certain circumstances +/datum/fantasy_affix/proc/validate(datum/component/fantasy/comp) + return TRUE + +/datum/fantasy_affix/proc/apply(datum/component/fantasy/comp, newName) + return newName + +/datum/fantasy_affix/proc/remove(datum/component/fantasy/comp) diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm new file mode 100644 index 00000000000..702ec9329af --- /dev/null +++ b/code/datums/components/fantasy/prefixes.dm @@ -0,0 +1,68 @@ +/datum/fantasy_affix/cosmetic_prefixes + placement = AFFIX_PREFIX + alignment = AFFIX_GOOD | AFFIX_EVIL + + var/list/goodPrefixes + var/list/badPrefixes + +/datum/fantasy_affix/cosmetic_prefixes/New() + goodPrefixes = list( + "greater", + "major", + "blessed", + "superior", + "empowered", + "honed", + "true", + "glorious", + "robust", + ) + badPrefixes = list( + "lesser", + "minor", + "blighted", + "inferior", + "enfeebled", + "rusted", + "unsteady", + "tragic", + "gimped", + "cursed", + ) + + weight = (length(goodPrefixes) + length(badPrefixes)) * 10 + +/datum/fantasy_affix/cosmetic_prefixes/apply(datum/component/fantasy/comp, newName) + if(comp.quality > 0 || (comp.quality == 0 && prob(50))) + return "[pick(goodPrefixes)] [newName]" + else + return "[pick(badPrefixes)] [newName]" + +/datum/fantasy_affix/tactical + placement = AFFIX_PREFIX + alignment = AFFIX_GOOD + weight = 1 // Very powerful, no one should have such power + +/datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName) + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/tactical) + return "tactical [newName]" + +/datum/fantasy_affix/pyromantic + placement = AFFIX_PREFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName) + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10)) + return "pyromantic [newName]" + +/datum/fantasy_affix/vampiric + placement = AFFIX_PREFIX + alignment = AFFIX_GOOD + weight = 5 + +/datum/fantasy_affix/vampiric/apply(datum/component/fantasy/comp, newName) + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/lifesteal, comp.quality) + return "vampiric [newName]" \ No newline at end of file diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm new file mode 100644 index 00000000000..55da967714a --- /dev/null +++ b/code/datums/components/fantasy/suffixes.dm @@ -0,0 +1,169 @@ +/datum/fantasy_affix/cosmetic_suffixes + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD | AFFIX_EVIL + + var/list/goodSuffixes + var/list/badSuffixes + +/datum/fantasy_affix/cosmetic_suffixes/New() + goodSuffixes = list( + "dexterity", + "constitution", + "intelligence", + "wisdom", + "charisma", + "the forest", + "the hills", + "the plains", + "the sea", + "the sun", + "the moon", + "the void", + "the world", + "many secrets", + "many tales", + "many colors", + "rending", + "sundering", + "the night", + "the day", + ) + badSuffixes = list( + "draining", + "burden", + "discomfort", + "awkwardness", + "poor hygiene", + "timidity", + ) + + weight = (length(goodSuffixes) + length(badSuffixes)) * 10 + +/datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName) + if(comp.quality > 0 || (comp.quality == 0 && prob(50))) + return "[newName] of [pick(goodSuffixes)]" + else + return "[newName] of [pick(badSuffixes)]" + +//////////// Good suffixes +/datum/fantasy_affix/bane + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/bane/apply(datum/component/fantasy/comp, newName) + . = ..() + // This is set up to be easy to add to these lists as I expect it will need modifications + var/static/list/possible_mobtypes + if(!possible_mobtypes) + // The base list of allowed mob/species types + possible_mobtypes = typecacheof(list( + /mob/living/simple_animal, + /mob/living/carbon, + /datum/species, + )) + // Some particular types to disallow if they're too broad/abstract + possible_mobtypes -= list( + /mob/living/simple_animal/hostile, + ) + // Some types to remove them and their subtypes + possible_mobtypes -= typecacheof(list( + /mob/living/carbon/human/species, + )) + + var/mob/picked_mobtype = pick(possible_mobtypes) + // This works even with the species picks since we're only accessing the name + + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/bane, picked_mobtype) + return "[newName] of [initial(picked_mobtype.name)] slaying" + +/datum/fantasy_affix/summoning + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + weight = 5 + +/datum/fantasy_affix/summoning/apply(datum/component/fantasy/comp, newName) + . = ..() + // This is set up to be easy to add to these lists as I expect it will need modifications + var/static/list/possible_mobtypes + if(!possible_mobtypes) + // The base list of allowed mob/species types + possible_mobtypes = typecacheof(list( + /mob/living/simple_animal, + /mob/living/carbon, + /datum/species, + )) + // Some particular types to disallow if they're too broad/abstract + possible_mobtypes -= list( + /mob/living/simple_animal/hostile, + ) + // Some types to remove them and their subtypes + possible_mobtypes -= typecacheof(list( + /mob/living/carbon/human/species, + /mob/living/simple_animal/hostile/megafauna, + )) + + var/mob/picked_mobtype = pick(possible_mobtypes) + // This works even with the species picks since we're only accessing the name + + var/obj/item/master = comp.parent + var/max_mobs = max(CEILING(comp.quality/2, 1), 1) + var/spawn_delay = 300 - 30 * comp.quality + comp.appliedComponents += master.AddComponent(/datum/component/summoning, list(picked_mobtype), 100, max_mobs, spawn_delay) + return "[newName] of [initial(picked_mobtype.name)] summoning" + +/datum/fantasy_affix/shrapnel + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/shrapnel/validate(datum/component/fantasy/comp) + if(isgun(comp.parent)) + return TRUE + return FALSE + +/datum/fantasy_affix/shrapnel/apply(datum/component/fantasy/comp, newName) + . = ..() + // higher means more likely + var/list/weighted_projectile_types = list(/obj/item/projectile/meteor = 1, + /obj/item/projectile/energy/nuclear_particle = 1, + /obj/item/projectile/beam/pulse = 1, + /obj/item/projectile/bullet/honker = 15, + /obj/item/projectile/temp = 15, + /obj/item/projectile/ion = 15, + /obj/item/projectile/magic/door = 15, + /obj/item/projectile/magic/locker = 15, + /obj/item/projectile/magic/fetch = 15, + /obj/item/projectile/beam/emitter = 15, + /obj/item/projectile/magic/flying = 15, + /obj/item/projectile/energy/net = 15, + /obj/item/projectile/bullet/incendiary/c9mm = 15, + /obj/item/projectile/temp/hot = 15, + /obj/item/projectile/beam/disabler = 15) + + var/obj/item/projectile/picked_projectiletype = pickweight(weighted_projectile_types) + + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/shrapnel, picked_projectiletype) + return "[newName] of [initial(picked_projectiletype.name)] shrapnel" + +/datum/fantasy_affix/strength + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/strength/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/knockback, CEILING(comp.quality/2, 1), FLOOR(comp.quality/10, 1)) + return "[newName] of strength" + +//////////// Bad suffixes + +/datum/fantasy_affix/fool + placement = AFFIX_SUFFIX + alignment = AFFIX_EVIL + +/datum/fantasy_affix/fool/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + comp.appliedComponents += master.AddComponent(/datum/component/squeak/bikehorn) + return "[newName] of the fool" \ No newline at end of file diff --git a/code/datums/components/igniter.dm b/code/datums/components/igniter.dm new file mode 100644 index 00000000000..7177cb0378b --- /dev/null +++ b/code/datums/components/igniter.dm @@ -0,0 +1,36 @@ +/datum/component/igniter + var/fire_stacks + +/datum/component/igniter/Initialize(fire_stacks=1) + if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent)) + return COMPONENT_INCOMPATIBLE + + src.fire_stacks = fire_stacks + +/datum/component/igniter/RegisterWithParent() + if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + else if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack) + else if(ishostile(parent)) + RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget) + +/datum/component/igniter/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + do_igniter(target) + +/datum/component/igniter/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target) + do_igniter(target) + +/datum/component/igniter/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + do_igniter(target) + +/datum/component/igniter/proc/do_igniter(atom/target) + if(isliving(target)) + var/mob/living/L = target + L.adjust_fire_stacks(fire_stacks) + L.IgniteMob() \ No newline at end of file diff --git a/code/datums/components/knockback.dm b/code/datums/components/knockback.dm new file mode 100644 index 00000000000..12a4ae89556 --- /dev/null +++ b/code/datums/components/knockback.dm @@ -0,0 +1,44 @@ +/datum/component/knockback + var/throw_distance + var/throw_anchored + +/datum/component/knockback/Initialize(throw_distance=1, throw_anchored=FALSE) + if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent)) + return COMPONENT_INCOMPATIBLE + + src.throw_distance = throw_distance + src.throw_anchored = throw_anchored + +/datum/component/knockback/RegisterWithParent() + if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + else if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack) + else if(ishostile(parent)) + RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget) + +/datum/component/knockback/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + do_knockback(target, user, get_dir(source, target)) + +/datum/component/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target) + do_knockback(target, attacker, get_dir(attacker, target)) + +/datum/component/knockback/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + do_knockback(target, null, angle2dir(Angle)) + +/datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir) + if(!ismovableatom(target) || throw_dir == null) + return + var/atom/movable/throwee = target + if(throwee.anchored && !throw_anchored) + return + if(throw_distance < 0) + throw_dir = turn(throw_dir, 180) + throw_distance *= -1 + var/atom/throw_target = get_edge_target_turf(throwee, throw_dir) + throwee.safe_throw_at(throw_target, throw_distance, 1, thrower) \ No newline at end of file diff --git a/code/datums/components/lifesteal.dm b/code/datums/components/lifesteal.dm new file mode 100644 index 00000000000..eaa7f973eaa --- /dev/null +++ b/code/datums/components/lifesteal.dm @@ -0,0 +1,38 @@ +/datum/component/lifesteal + var/flat_heal // heals a constant amount every time a hit occurs + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/datum/component/lifesteal/Initialize(flat_heal=0) + if(!isitem(parent) && !ishostile(parent) && !isgun(parent)) + return COMPONENT_INCOMPATIBLE + + src.flat_heal = flat_heal + +/datum/component/lifesteal/RegisterWithParent() + if(isgun(parent)) + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + else if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack) + else if(ishostile(parent)) + RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget) + +/datum/component/lifesteal/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/lifesteal/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + do_lifesteal(user, target) + +/datum/component/lifesteal/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target) + do_lifesteal(attacker, target) + +/datum/component/lifesteal/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + do_lifesteal(firer, target) + +/datum/component/lifesteal/proc/do_lifesteal(atom/heal_target, atom/damage_target) + if(isliving(heal_target) && isliving(damage_target)) + var/mob/living/healing = heal_target + var/mob/living/damaging = damage_target + if(damaging.stat != DEAD) + healing.heal_ordered_damage(flat_heal, damage_heal_order) \ No newline at end of file diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index bbdbb7dc662..c27b9ce0d60 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -47,14 +47,10 @@ if(icon_state) lock_icon_state = icon_state generate_lock_visuals() - var/mob/M = parent - LAZYOR(M.mousemove_intercept_objects, src) START_PROCESSING(SSfastprocess, src) /datum/component/lockon_aiming/Destroy() - var/mob/M = parent clear_visuals() - LAZYREMOVE(M.mousemove_intercept_objects, src) STOP_PROCESSING(SSfastprocess, src) return ..() @@ -120,27 +116,6 @@ return LAZYREMOVE(immune_weakrefs, A.weak_reference) -/datum/component/lockon_aiming/onMouseMove(object,location,control,params) - var/mob/M = parent - if(!istype(M) || !M.client) - return - var/datum/position/P = mouse_absolute_datum_map_position_from_client(M.client) - if(!P) - return - var/turf/T = P.return_turf() - LAZYINITLIST(last_location) - if(length(last_location) == 3 && last_location[1] == T.x && last_location[2] == T.y && last_location[3] == T.z) - return //Same turf, don't bother. - if(last_location) - last_location.Cut() - else - last_location = list() - last_location.len = 3 - last_location[1] = T.x - last_location[2] = T.y - last_location[3] = T.z - autolock() - /datum/component/lockon_aiming/process() if(update_disabled) return diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 172fb236ca6..96b7f70c953 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -249,6 +249,8 @@ /datum/component/mood/proc/add_event(datum/source, category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger. var/datum/mood_event/the_event + if(!istext(category)) + category = REF(category) if(mood_events[category]) the_event = mood_events[category] if(the_event.type != type) @@ -267,6 +269,8 @@ addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) /datum/component/mood/proc/clear_event(datum/source, category) + if(!istext(category)) + category = REF(category) var/datum/mood_event/event = mood_events[category] if(!event) return 0 diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index a4c14871e01..767d93f6700 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -56,6 +56,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_HEAR, .proc/on_hear) RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype) RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal) + RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal) /datum/component/nanites/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_HAS_NANITES, @@ -77,7 +78,8 @@ COMSIG_LIVING_MINOR_SHOCK, COMSIG_MOVABLE_HEAR, COMSIG_SPECIES_GAIN, - COMSIG_NANITE_SIGNAL)) + COMSIG_NANITE_SIGNAL, + COMSIG_NANITE_COMM_SIGNAL)) /datum/component/nanites/Destroy() STOP_PROCESSING(SSnanites, src) @@ -205,6 +207,12 @@ var/datum/nanite_program/NP = X NP.receive_signal(code, source) +/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") + for(var/X in programs) + if(istype(X, /datum/nanite_program/triggered/comm)) + var/datum/nanite_program/triggered/comm/NP = X + NP.receive_comm_signal(comm_code, comm_message, comm_source) + /datum/component/nanites/proc/check_viable_biotype() if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes)) qdel(src) //bodytype no longer sustains nanites diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index 488ccf29580..1a34763046a 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -46,7 +46,7 @@ return // No decay if formaldehyde in corpse or when the corpse is charred - if(C.reagents.has_reagent("formaldehyde", 15) || HAS_TRAIT(C, TRAIT_HUSK)) + if(C.reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 15) || HAS_TRAIT(C, TRAIT_HUSK)) return // Also no decay if corpse chilled or not organic/undead diff --git a/code/datums/components/shrapnel.dm b/code/datums/components/shrapnel.dm new file mode 100644 index 00000000000..1b09fd5f77a --- /dev/null +++ b/code/datums/components/shrapnel.dm @@ -0,0 +1,38 @@ +/datum/component/shrapnel + var/projectile_type + var/radius // shoots a projectile for every turf on this radius from the hit target + var/override_projectile_range + +/datum/component/shrapnel/Initialize(projectile_type, radius=1, override_projectile_range) + if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent)) + return COMPONENT_INCOMPATIBLE + + src.projectile_type = projectile_type + src.radius = radius + src.override_projectile_range = override_projectile_range + +/datum/component/shrapnel/RegisterWithParent() + if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + +/datum/component/shrapnel/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + do_shrapnel(firer, target) + +/datum/component/shrapnel/proc/do_shrapnel(mob/firer, atom/target) + if(radius < 1) + return + var/turf/target_turf = get_turf(target) + for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target)) + var/obj/item/projectile/P = new projectile_type(target_turf) + + //Shooting Code: + P.range = radius+1 + if(override_projectile_range) + P.range = override_projectile_range + P.preparePixelProjectile(shootat_turf, target) + P.firer = firer // don't hit ourself that would be really annoying + P.permutated += target // don't hit the target we hit already with the flak + P.fire() \ No newline at end of file diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index f858f415ab2..dbaf8dabd2f 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -6,7 +6,7 @@ var/max_mobs = 5 var/spawn_text = "emerges from" var/list/faction = list("mining") - + /datum/component/spawner/Initialize(_mob_types, _spawn_time, _faction, _spawn_text, _max_mobs) @@ -20,13 +20,13 @@ spawn_text=_spawn_text if(_max_mobs) max_mobs=_max_mobs - + RegisterSignal(parent, list(COMSIG_PARENT_QDELETED), .proc/stop_spawning) START_PROCESSING(SSprocessing, src) /datum/component/spawner/process() try_spawn_mob() - + /datum/component/spawner/proc/stop_spawning(force, hint) STOP_PROCESSING(SSprocessing, src) @@ -36,7 +36,7 @@ spawned_mobs = null /datum/component/spawner/proc/try_spawn_mob() - var/atom/P = parent + var/atom/P = parent if(spawned_mobs.len >= max_mobs) return 0 if(spawn_delay > world.time) @@ -44,7 +44,7 @@ spawn_delay = world.time + spawn_time var/chosen_mob_type = pick(mob_types) var/mob/living/simple_animal/L = new chosen_mob_type(P.loc) - L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) + L.flags_1 |= (P.flags_1 & ADMIN_SPAWNED_1) spawned_mobs += L L.nest = src L.faction = src.faction diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index baa9d86b299..6a39c41c424 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -52,7 +52,7 @@ else steps++ -/datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM) +/datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM) if(isitem(AM)) var/obj/item/I = AM if(I.item_flags & ABSTRACT) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 29cad9f80ac..5eee8ec50e4 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -56,13 +56,16 @@ /datum/component/stationloving/proc/in_bounds() var/static/list/allowed_shuttles = typecacheof(list(/area/shuttle/syndicate, /area/shuttle/escape, /area/shuttle/pod_1, /area/shuttle/pod_2, /area/shuttle/pod_3, /area/shuttle/pod_4)) + var/static/list/disallowed_centcom_areas = typecacheof(list(/area/abductor_ship, /area/fabric_of_reality, /area/awaymission/errorroom)) var/turf/T = get_turf(parent) if (!T) return FALSE var/area/A = T.loc - if(istype(A, /area/fabric_of_reality)) // Obviously terrible, just for test merging - return FALSE - if (is_station_level(T.z) || is_centcom_level(T.z)) + if (is_station_level(T.z)) + return TRUE + if (is_centcom_level(T.z)) + if (is_type_in_typecache(A, disallowed_centcom_areas)) + return FALSE return TRUE if (is_reserved_level(T.z)) if (is_type_in_typecache(A, allowed_shuttles)) diff --git a/code/datums/components/storage/concrete/implant.dm b/code/datums/components/storage/concrete/implant.dm index 0348d340ae1..95a929494df 100644 --- a/code/datums/components/storage/concrete/implant.dm +++ b/code/datums/components/storage/concrete/implant.dm @@ -9,7 +9,7 @@ /datum/component/storage/concrete/implant/Initialize() . = ..() - cant_hold = typecacheof(list(/obj/item/disk/nuclear)) + set_holdable(null, list(/obj/item/disk/nuclear)) /datum/component/storage/concrete/implant/InheritComponent(datum/component/storage/concrete/implant/I, original) if(!istype(I)) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index bc71885c2f7..1a4fae7b0bc 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -17,6 +17,7 @@ /datum/component/storage/concrete/pockets/small max_items = 1 + max_w_class = WEIGHT_CLASS_SMALL attack_hand_interact = FALSE /datum/component/storage/concrete/pockets/tiny @@ -24,7 +25,15 @@ max_w_class = WEIGHT_CLASS_TINY attack_hand_interact = FALSE -/datum/component/storage/concrete/pockets/small/detective +/datum/component/storage/concrete/pockets/small/fedora/Initialize() + . = ..() + var/static/list/exception_cache = typecacheof(list( + /obj/item/katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, + /obj/item/energy_katana, /obj/item/gun/ballistic/automatic/tommygun + )) + exception_hold = exception_cache + +/datum/component/storage/concrete/pockets/small/fedora/detective attack_hand_interact = TRUE // so the detectives would discover pockets in their hats /datum/component/storage/concrete/pockets/shoes @@ -34,24 +43,26 @@ /datum/component/storage/concrete/pockets/shoes/Initialize() . = ..() - cant_hold = typecacheof(list(/obj/item/screwdriver/power)) //Must be specifically called out since normal screwdrivers can fit but not the wrench form of the drill - can_hold = typecacheof(list( + set_holdable(list( /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, /obj/item/firing_pin - )) + ), + list(/obj/item/screwdriver/power) + ) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() . = ..() - cant_hold = typecacheof(list(/obj/item/screwdriver/power)) //Must be specifically called out since normal screwdrivers can fit but not the wrench form of the drill - can_hold = typecacheof(list( + set_holdable(list( /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/bikehorn)) + /obj/item/firing_pin, /obj/item/bikehorn), + list(/obj/item/screwdriver/power) + ) /datum/component/storage/concrete/pockets/pocketprotector max_items = 3 @@ -61,12 +72,13 @@ /datum/component/storage/concrete/pockets/pocketprotector/Initialize() original_parent = parent . = ..() - can_hold = typecacheof(list( //Same items as a PDA + set_holdable(list( //Same items as a PDA /obj/item/pen, /obj/item/toy/crayon, /obj/item/lipstick, /obj/item/flashlight/pen, - /obj/item/clothing/mask/cigarette)) + /obj/item/clothing/mask/cigarette) + ) /datum/component/storage/concrete/pockets/pocketprotector/real_location() // if the component is reparented to a jumpsuit, the items still go in the protector @@ -78,5 +90,5 @@ /datum/component/storage/concrete/pockets/small/helmet/Initialize() . = ..() - can_hold = typecacheof(list(/obj/item/reagent_containers/glass/bottle, - /obj/item/ammo_box/a762)) \ No newline at end of file + set_holdable(list(/obj/item/reagent_containers/glass/bottle, + /obj/item/ammo_box/a762)) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 9b4d6019f84..480b204e0c3 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -14,8 +14,11 @@ dupe_mode = COMPONENT_DUPE_UNIQUE var/datum/component/storage/concrete/master //If not null, all actions act on master and this is just an access point. - var/list/can_hold //if this is set, only things in this typecache will fit. - var/list/cant_hold //if this is set, anything in this typecache will not be able to fit. + var/list/can_hold //if this is set, only items, and their children, will fit + var/list/cant_hold //if this is set, items, and their children, won't fit + var/list/exception_hold //if set, these items will be the exception to the max size of object that can fit. + + var/can_hold_description var/list/mob/is_using //lazy list of mobs looking at the contents of this storage. @@ -81,6 +84,8 @@ RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all) RegisterSignal(parent, COMSIG_TRY_STORAGE_RETURN_INVENTORY, .proc/signal_return_inv) + RegisterSignal(parent, COMSIG_TOPIC, .proc/topic_handle) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) @@ -114,6 +119,24 @@ /datum/component/storage/PreTransfer() update_actions() +/datum/component/storage/proc/set_holdable(can_hold_list, cant_hold_list) + can_hold_description = generate_hold_desc(can_hold_list) + + if (can_hold_list != null) + can_hold = typecacheof(can_hold_list) + + if (cant_hold_list != null) + cant_hold = typecacheof(cant_hold_list) + +/datum/component/storage/proc/generate_hold_desc(can_hold_list) + var/list/desc = list() + + for(var/valid_type in can_hold_list) + var/obj/item/valid_item = valid_type + desc += "\a [initial(valid_item.name)]" + + return "\n\t[desc.Join("\n\t")]" + /datum/component/storage/proc/update_actions() QDEL_NULL(modeswitch_action) if(!isitem(parent) || !allow_quick_gather) @@ -501,6 +524,13 @@ interface |= return_inv(recursive) return TRUE +/datum/component/storage/proc/topic_handle(datum/source, user, href_list) + if(href_list["show_valid_pocket_items"]) + handle_show_valid_items(source, user) + +/datum/component/storage/proc/handle_show_valid_items(datum/source, user) + to_chat(user, "[source] can hold: [can_hold_description]") + /datum/component/storage/proc/mousedrop_onto(datum/source, atom/over_object, mob/M) set waitfor = FALSE . = COMPONENT_NO_MOUSEDROP @@ -576,7 +606,7 @@ if(!stop_messages) to_chat(M, "[host] cannot hold [I]!") return FALSE - if(I.w_class > max_w_class) + if(I.w_class > max_w_class && !is_type_in_typecache(I, exception_hold)) if(!stop_messages) to_chat(M, "[I] is too big for [host]!") return FALSE diff --git a/code/datums/components/summoning.dm b/code/datums/components/summoning.dm new file mode 100644 index 00000000000..2eaceb257ed --- /dev/null +++ b/code/datums/components/summoning.dm @@ -0,0 +1,68 @@ +/datum/component/summoning + var/list/mob_types = list() + var/spawn_chance // chance for the mob to spawn on hit in percent + var/max_mobs + var/spawn_delay // delay in spawning between mobs (deciseconds) + var/spawn_text + var/spawn_sound + var/list/faction + + var/last_spawned_time = 0 + var/list/spawned_mobs = list() + +/datum/component/summoning/Initialize(mob_types, spawn_chance=100, max_mobs=3, spawn_delay=100, spawn_text="appears out of nowhere", spawn_sound='sound/magic/summon_magic.ogg', faction) + if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent)) + return COMPONENT_INCOMPATIBLE + + src.mob_types = mob_types + src.spawn_chance = spawn_chance + src.max_mobs = max_mobs + src.spawn_delay = spawn_delay + src.spawn_text = spawn_text + src.spawn_sound = spawn_sound + src.faction = faction + +/datum/component/summoning/RegisterWithParent() + if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc + RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit) + else if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack) + else if(ishostile(parent)) + RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget) + +/datum/component/summoning/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT)) + +/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + do_spawn_mob(get_turf(target), user) + +/datum/component/summoning/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target) + do_spawn_mob(get_turf(target), attacker) + +/datum/component/summoning/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle) + do_spawn_mob(get_turf(target), firer) + +/datum/component/summoning/proc/do_spawn_mob(atom/spawn_location, summoner) + if(spawned_mobs.len >= max_mobs) + return 0 + if(last_spawned_time > world.time) + return 0 + if(!prob(spawn_chance)) + return 0 + last_spawned_time = world.time + spawn_delay + var/chosen_mob_type = pick(mob_types) + var/mob/living/simple_animal/L = new chosen_mob_type(spawn_location) + if(ishostile(L)) + var/mob/living/simple_animal/hostile/H = L + H.friends += summoner // do not attack our summon boy + spawned_mobs += L + if(faction != null) + L.faction = faction + RegisterSignal(L, COMSIG_MOB_DEATH, .proc/on_spawned_death) // so we can remove them from the list, etc (for mobs with corpses) + playsound(spawn_location,spawn_sound, 50, 1) + spawn_location.visible_message("[L] [spawn_text].") + +/datum/component/summoning/proc/on_spawned_death(mob/killed, gibbed) + spawned_mobs -= killed \ No newline at end of file diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm new file mode 100644 index 00000000000..d7f035b449d --- /dev/null +++ b/code/datums/components/tactical.dm @@ -0,0 +1,34 @@ +/datum/component/tactical + var/allowed_slot + +/datum/component/tactical/Initialize(allowed_slot) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.allowed_slot = allowed_slot + +/datum/component/tactical/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/modify) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unmodify) + +/datum/component/tactical/UnregisterFromParent() + unmodify() + +/datum/component/fantasy/Destroy() + unmodify() + return ..() + +/datum/component/tactical/proc/modify(obj/item/source, mob/user, slot) + if(allowed_slot && slot != allowed_slot) + unmodify() + return + + var/obj/item/master = parent + var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) + I.copy_overlays(master) + I.override = TRUE + source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) + I.layer = ABOVE_MOB_LAYER + +/datum/component/tactical/proc/unmodify(obj/item/source, mob/user) + user.remove_alt_appearance("sneaking_mission") \ No newline at end of file diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm new file mode 100644 index 00000000000..faa6182208a --- /dev/null +++ b/code/datums/components/tether.dm @@ -0,0 +1,37 @@ +/datum/component/tether + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/atom/tether_target + var/max_dist + var/tether_name + +/datum/component/tether/Initialize(atom/tether_target, max_dist = 4, tether_name) + if(!isliving(parent) || !istype(tether_target) || !tether_target.loc) + return COMPONENT_INCOMPATIBLE + src.tether_target = tether_target + src.max_dist = max_dist + if (ispath(tether_name, /atom)) + var/atom/tmp = tether_name + src.tether_name = initial(tmp.name) + else + src.tether_name = tether_name + RegisterSignal(parent, list(COMSIG_MOVABLE_PRE_MOVE), .proc/checkTether) + +/datum/component/tether/proc/checkTether(mob/mover, newloc) + if (get_dist(mover,newloc) > max_dist) + to_chat(mover, "The [tether_name] runs out of slack and prevents you from moving!") + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + + var/atom/blocker + out: + for(var/turf/T in getline(tether_target,newloc)) + if (T.density) + blocker = T + break out + for(var/a in T) + var/atom/A = a + if(A.density && A != mover && A != tether_target) + blocker = A + break out + if (blocker) + to_chat(mover, "The [tether_name] catches on [blocker] and prevents you from moving!") + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 45243014dda..8257a9e34f5 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -78,4 +78,4 @@ /datum/component/thermite/proc/attackby_react(datum/source, obj/item/thing, mob/user, params) if(thing.is_hot()) - thermite_melt(user) \ No newline at end of file + thermite_melt(user) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 714b72a85f1..07083b6b29f 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -43,13 +43,14 @@ GLOBAL_LIST_EMPTY(uplinks) RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant) else if(istype(parent, /obj/item/pda)) RegisterSignal(parent, COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone) + RegisterSignal(parent, COMSIG_PDA_CHECK_DETONATE, .proc/check_detonate) else if(istype(parent, /obj/item/radio)) RegisterSignal(parent, COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency) else if(istype(parent, /obj/item/pen)) RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation) GLOB.uplinks += src - uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) + uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted) if(_owner) owner = _owner @@ -251,6 +252,9 @@ GLOBAL_LIST_EMPTY(uplinks) master.mode = 0 return COMPONENT_STOP_RINGTONE_CHANGE +/datum/component/uplink/proc/check_detonate() + return COMPONENT_PDA_NO_DETONATE + // Radio signal responses /datum/component/uplink/proc/new_frequency(datum/source, list/arguments) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 4fde3987c7b..bb6d271b450 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -105,7 +105,6 @@ .manifest td, th {border:1px solid [monochrome?"black":"#DEF; background-color:white; color:black"]; padding:.25em} .manifest th {height: 2em; [monochrome?"border-top-width: 3px":"background-color: #48C; color:white"]} .manifest tr.head th { [monochrome?"border-top-width: 1px":"background-color: #488;"] } - .manifest td:first-child {text-align:right} .manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: #DEF"]} @@ -255,7 +254,7 @@ M.fields["alg_d"] = "No allergies have been detected in this patient." M.fields["cdi"] = "None" M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = "No notes." + M.fields["notes"] = H.get_trait_string(medical) medical += M //Security Record diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 14bf95d9904..111675dbfcd 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -19,6 +19,10 @@ var/list/cached_vars #endif +/datum/Topic(href, href_list[]) + ..() + SEND_SIGNAL(src, COMSIG_TOPIC, usr, href_list) + // Default implementation of clean-up code. // This should be overridden to remove all references pointing to the object being destroyed. // Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE. @@ -158,4 +162,4 @@ if(!istype(returned, /datum)) qdel(D) else - return returned \ No newline at end of file + return returned diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 9ff4a5a2587..00074a3267b 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -935,21 +935,25 @@ if(A.reagents) var/chosen_id - var/list/reagent_options = sortList(GLOB.chemical_reagents_list) - switch(alert(usr, "Choose a method.", "Add Reagents", "Enter ID", "Choose ID")) - if("Enter ID") + switch(alert(usr, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky")) + if("Search") var/valid_id while(!valid_id) - chosen_id = stripped_input(usr, "Enter the ID of the reagent you want to add.") - if(!chosen_id) //Get me out of here! + chosen_id = input(usr, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text + if(isnull(chosen_id)) //Get me out of here! break - for(var/ID in reagent_options) - if(ID == chosen_id) - valid_id = 1 + if (!ispath(text2path(chosen_id))) + chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) + if (ispath(chosen_id)) + valid_id = TRUE + else + valid_id = TRUE if(!valid_id) to_chat(usr, "A reagent with that ID doesn't exist!") - if("Choose ID") - chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in reagent_options + if("Choose from a list") + chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) + if("I'm feeling lucky") + chosen_id = pick(subtypesof(/datum/reagent)) if(chosen_id) var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num if(amount) @@ -1402,4 +1406,3 @@ H.remove_quirk(T) else H.add_quirk(T,TRUE) - diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 5e3f061ef1d..3f969244a09 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -103,7 +103,7 @@ if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread) return - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + if(affected_mob.reagents.has_reagent(/datum/reagent/medicine/spaceacillin) || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) return var/spread_range = 2 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 469495ffee0..3330951df48 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -34,10 +34,10 @@ // The order goes from easy to cure to hard to cure. var/static/list/advance_cures = list( - "sodiumchloride", "sugar", "orangejuice", - "spaceacillin", "salglu_solution", "ethanol", - "leporazine", "synaptizine", "lipolicide", - "silver", "gold" + /datum/reagent/consumable/sodiumchloride, /datum/reagent/consumable/sugar, /datum/reagent/consumable/orangejuice, + /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/consumable/ethanol, + /datum/reagent/medicine/leporazine, /datum/reagent/medicine/synaptizine, /datum/reagent/toxin/lipolicide, + /datum/reagent/silver, /datum/reagent/gold ) /* diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 81cdad8042b..7583a621b17 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -138,7 +138,7 @@ Bonus var/get_damage = rand(15,21) * power M.adjustOxyLoss(get_damage) if(paralysis) - M.reagents.add_reagent_list(list("pancuronium" = 3, "sodium_thiopental" = 3)) + M.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) return 1 /datum/symptom/asphyxiation/proc/Asphyxiate_death(mob/living/M, datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index f1c179658cd..b7a482a0f70 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -156,7 +156,7 @@ Bonus M.adjust_fire_stacks(get_stacks) M.take_overall_damage(burn = get_stacks / 2, required_status = BODYPART_ORGANIC) if(chems) - M.reagents.add_reagent("clf3", 2 * power) + M.reagents.add_reagent(/datum/reagent/clf3, 2 * power) return 1 /datum/symptom/alkali/proc/Alkali_fire_stage_5(mob/living/M, datum/disease/advance/A) @@ -164,5 +164,5 @@ Bonus M.adjust_fire_stacks(get_stacks) M.take_overall_damage(burn = get_stacks, required_status = BODYPART_ORGANIC) if(chems) - M.reagents.add_reagent_list(list("napalm" = 4 * power, "clf3" = 4 * power)) + M.reagents.add_reagent_list(list(/datum/reagent/napalm = 4 * power, /datum/reagent/clf3 = 4 * power)) return 1 diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index e81f45d5eaa..2c4429be292 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -57,7 +57,7 @@ Bonus var/get_damage = rand(15,25) * power M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC) if(pain) - M.adjustStaminaLoss(get_damage) + M.adjustStaminaLoss(get_damage * 2) if(bleed) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -124,7 +124,7 @@ Bonus var/get_damage = rand(6,10) M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC) if(chems) - M.reagents.add_reagent_list(list("heparin" = 2, "lipolicide" = 2)) + M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) if(zombie) - M.reagents.add_reagent("romerol", 1) - return 1 \ No newline at end of file + M.reagents.add_reagent(/datum/reagent/romerol, 1) + return 1 diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 39306b4b944..21b7c037cfa 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -118,7 +118,7 @@ /datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power) for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins! - M.reagents.remove_reagent(R.id, actual_power) + M.reagents.remove_reagent(R.type, actual_power) if(food_conversion) M.adjust_nutrition(0.3) if(prob(2)) @@ -311,11 +311,11 @@ if(M.fire_stacks < 0) M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0) . += power - if(M.reagents.has_reagent("holywater")) - M.reagents.remove_reagent("holywater", 0.5 * absorption_coeff) + if(M.reagents.has_reagent(/datum/reagent/water/holywater)) + M.reagents.remove_reagent(/datum/reagent/water/holywater, 0.5 * absorption_coeff) . += power * 0.75 - else if(M.reagents.has_reagent("water")) - M.reagents.remove_reagent("water", 0.5 * absorption_coeff) + else if(M.reagents.has_reagent(/datum/reagent/water)) + M.reagents.remove_reagent(/datum/reagent/water, 0.5 * absorption_coeff) . += power * 0.5 /datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) @@ -374,7 +374,7 @@ gases = environment.gases if(gases["plasma"] && gases["plasma"][MOLES] > gases["plasma"][GAS_META][META_GAS_MOLES_VISIBLE]) //if there's enough plasma in the air to see . += power * 0.5 - if(M.reagents.has_reagent("plasma")) + if(M.reagents.has_reagent(/datum/reagent/toxin/plasma)) . += power * 0.75 /datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 8d7cc5ed708..0c17fa17705 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -44,10 +44,10 @@ if(A.stage >= 4) M.drowsyness = max(0, M.drowsyness - 2) - if(M.reagents.has_reagent("mindbreaker")) - M.reagents.remove_reagent("mindbreaker", 5) - if(M.reagents.has_reagent("histamine")) - M.reagents.remove_reagent("histamine", 5) + if(M.reagents.has_reagent(/datum/reagent/toxin/mindbreaker)) + M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) + if(M.reagents.has_reagent(/datum/reagent/toxin/histamine)) + M.reagents.remove_reagent(/datum/reagent/toxin/histamine, 5) M.hallucination = max(0, M.hallucination - 10) if(A.stage >= 5) diff --git a/code/datums/diseases/anxiety.dm b/code/datums/diseases/anxiety.dm index 2d96157bb08..20ecceb224c 100644 --- a/code/datums/diseases/anxiety.dm +++ b/code/datums/diseases/anxiety.dm @@ -5,7 +5,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Ethanol" - cures = list("ethanol") + cures = list(/datum/reagent/consumable/ethanol) agent = "Excess Lepidopticides" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate butterflies." diff --git a/code/datums/diseases/beesease.dm b/code/datums/diseases/beesease.dm index ab64fd515c6..edd6f151c9e 100644 --- a/code/datums/diseases/beesease.dm +++ b/code/datums/diseases/beesease.dm @@ -5,7 +5,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Sugar" - cures = list("sugar") + cures = list(/datum/reagent/consumable/sugar) agent = "Apidae Infection" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated subject will regurgitate bees." diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 0a345017633..fc4c057ce5c 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -4,7 +4,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mannitol" - cures = list("mannitol") + cures = list(/datum/reagent/medicine/mannitol) agent = "Cryptococcus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 15//higher chance to cure, since two reagents are required diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 96e2d0344e0..b93ae4ec12e 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -2,7 +2,7 @@ name = "The Cold" max_stages = 3 cure_text = "Rest & Spaceacillin" - cures = list("spaceacillin") + cures = list(/datum/reagent/medicine/spaceacillin) agent = "XY-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) permeability_mod = 0.5 diff --git a/code/datums/diseases/cold9.dm b/code/datums/diseases/cold9.dm index da5e67a4fb8..eea3147107f 100644 --- a/code/datums/diseases/cold9.dm +++ b/code/datums/diseases/cold9.dm @@ -4,7 +4,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Common Cold Anti-bodies & Spaceacillin" - cures = list("spaceacillin") + cures = list(/datum/reagent/medicine/spaceacillin) agent = "ICE9-rhinovirus" viable_mobtypes = list(/mob/living/carbon/human) desc = "If left untreated the subject will slow, as if partly frozen." diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index 2b668e11599..70d10bc7de8 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -8,7 +8,7 @@ viable_mobtypes = list(/mob/living/carbon/human) desc = @"If left untreated the subject will [REDACTED]!" severity = "Dangerous!" - cures = list("rezadone") + cures = list(/datum/reagent/medicine/rezadone) disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS process_dead = TRUE diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 267dd711a31..972a7f4e187 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -4,7 +4,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Mutadone" - cures = list("mutadone") + cures = list(/datum/reagent/medicine/mutadone) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE agent = "S4E1 retrovirus" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm index add60c73f19..70bcc67d210 100644 --- a/code/datums/diseases/fake_gbs.dm +++ b/code/datums/diseases/fake_gbs.dm @@ -4,7 +4,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" - cures = list("synaptizine","sulfur") + cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/sulfur) agent = "Gravitokinetic Bipotential SADS-" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) desc = "If left untreated death will occur." diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 96a36be1538..916e56373fa 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -3,7 +3,7 @@ max_stages = 3 spread_text = "Airborne" cure_text = "Spaceacillin" - cures = list("spaceacillin") + cures = list(/datum/reagent/medicine/spaceacillin) cure_chance = 10 agent = "H13N1 flu virion" viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm index 9577ca43d09..1557ddfbd8d 100644 --- a/code/datums/diseases/fluspanish.dm +++ b/code/datums/diseases/fluspanish.dm @@ -3,7 +3,7 @@ max_stages = 3 spread_text = "Airborne" cure_text = "Spaceacillin & Anti-bodies to the common flu" - cures = list("spaceacillin") + cures = list(/datum/reagent/medicine/spaceacillin) cure_chance = 10 agent = "1nqu1s1t10n flu virion" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 6ae1eb01a26..a1a87ba1a54 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -8,7 +8,7 @@ viable_mobtypes = list(/mob/living/carbon/human) stage_prob = 1 disease_flags = CURABLE - cures = list("sodiumchloride", "mutadone") + cures = list(/datum/reagent/consumable/sodiumchloride, /datum/reagent/medicine/mutadone) /datum/disease/gastrolosis/stage_act() ..() diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 0487b1c815f..8a6eab6048f 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -4,7 +4,7 @@ spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" - cures = list("synaptizine","sulfur") + cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/sulfur) cure_chance = 15//higher chance to cure, since two reagents are required agent = "Gravitokinetic Bipotential SADS+" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index f126e18bf04..e2cbb8e5440 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -58,7 +58,7 @@ H.visible_message("[H] clutches at [H.p_their()] chest as if [H.p_their()] heart is stopping!") H.adjustStaminaLoss(60) H.set_heartattack(TRUE) - H.reagents.add_reagent("corazone", 3) // To give the victim a final chance to shock their heart before losing consciousness + H.reagents.add_reagent(/datum/reagent/medicine/corazone, 3) // To give the victim a final chance to shock their heart before losing consciousness cure() else cure() diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm index 7c5f05c440e..cb00f571aae 100644 --- a/code/datums/diseases/magnitis.dm +++ b/code/datums/diseases/magnitis.dm @@ -3,7 +3,7 @@ max_stages = 4 spread_text = "Airborne" cure_text = "Iron" - cures = list("iron") + cures = list(/datum/reagent/iron) agent = "Fukkos Miracos" viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index d9c4b324f63..68e962055aa 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -5,7 +5,7 @@ spread_flags = DISEASE_SPREAD_SPECIAL disease_flags = CURABLE cure_text = "Holy Water." - cures = list("holywater") + cures = list(/datum/reagent/water/holywater) cure_chance = 20 agent = "Avian Vengence" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 64f453cd48a..a43b2f582bf 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -3,7 +3,7 @@ max_stages = 4 spread_text = "Airborne" cure_text = "Banana products, especially banana bread." - cures = list("banana") + cures = list(/datum/reagent/consumable/banana) cure_chance = 75 agent = "H0NI<42 Virus" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 47365b3a752..b1cf149600a 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -17,7 +17,7 @@ ..() agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" if(prob(40)) - cures = list("mutadone") + cures = list(/datum/reagent/medicine/mutadone) else restcure = 1 diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 51abd1f47ac..035a506d24d 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -93,7 +93,7 @@ /datum/disease/transformation/jungle_fever name = "Jungle Fever" cure_text = "Death." - cures = list("adminordrazine") + cures = list(/datum/reagent/medicine/adminordrazine) spread_text = "Monkey Bites" spread_flags = DISEASE_SPREAD_SPECIAL viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human) @@ -120,7 +120,7 @@ if(affected_mob.mind && !is_monkey(affected_mob.mind)) add_monkey(affected_mob.mind) if(ishuman(affected_mob)) - var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) M.ventcrawler = VENTCRAWLER_ALWAYS @@ -156,7 +156,7 @@ name = "Robotic Transformation" cure_text = "An injection of copper." - cures = list("copper") + cures = list(/datum/reagent/copper) cure_chance = 5 agent = "R2D2 Nanomachines" desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." @@ -189,7 +189,7 @@ name = "Xenomorph Transformation" cure_text = "Spaceacillin & Glycerol" - cures = list("spaceacillin", "glycerol") + cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol) cure_chance = 5 agent = "Rip-LEY Alien Microbes" desc = "This disease changes the victim into a xenomorph." @@ -218,7 +218,7 @@ /datum/disease/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" - cures = list("frostoil") + cures = list(/datum/reagent/consumable/frostoil) cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." @@ -247,7 +247,7 @@ /datum/disease/transformation/corgi name = "The Barkening" cure_text = "Death" - cures = list("adminordrazine") + cures = list(/datum/reagent/medicine/adminordrazine) agent = "Fell Doge Majicks" desc = "This disease transforms the victim into a corgi." severity = DISEASE_SEVERITY_BIOHAZARD @@ -271,8 +271,8 @@ /datum/disease/transformation/morph name = "Gluttony's Blessing" - cure_text = "nothing" - cures = list("adminordrazine") + cure_text = /datum/reagent/consumable/nothing + cures = list(/datum/reagent/medicine/adminordrazine) agent = "Gluttony's Blessing" desc = "A 'gift' from somewhere terrible." stage_prob = 20 @@ -289,7 +289,7 @@ /datum/disease/transformation/gondola name = "Gondola Transformation" cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help - cures = list("condensedcapsaicin") //beats the hippie crap right out of your system + cures = list(/datum/reagent/consumable/condensedcapsaicin) //beats the hippie crap right out of your system cure_chance = 80 stage_prob = 5 agent = "Tranquility" @@ -310,17 +310,17 @@ if (prob(5)) affected_mob.emote("smile") if (prob(20)) - affected_mob.reagents.add_reagent_list(list("pax" = 5)) + affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) if(3) if (prob(5)) affected_mob.emote("smile") if (prob(20)) - affected_mob.reagents.add_reagent_list(list("pax" = 5)) + affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) if(4) if (prob(5)) affected_mob.emote("smile") if (prob(20)) - affected_mob.reagents.add_reagent_list(list("pax" = 5)) + affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) if (prob(2)) to_chat(affected_mob, "You let go of what you were holding.") var/obj/item/I = affected_mob.get_active_held_item() diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 0b0a6b7387e..6f3376b661c 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -4,7 +4,7 @@ max_stages = 5 spread_text = "Airborne" cure_text = "Spaceacillin & Perfluorodecalin" - cures = list("spaceacillin", "perfluorodecalin") + cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/perfluorodecalin) agent = "Fungal Tubercle bacillus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index b2880463800..244cc819d8a 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -3,7 +3,7 @@ max_stages = 4 spread_text = "Airborne" cure_text = "The Manly Dorf" - cures = list("manlydorf") + cures = list(/datum/reagent/consumable/ethanol/manly_dorf) cure_chance = 100 agent = "Rincewindus Vulgaris" viable_mobtypes = list(/mob/living/carbon/human) diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm deleted file mode 100644 index 3e43905f1fe..00000000000 --- a/code/datums/helper_datums/topic_input.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/topic_input - var/href - var/list/href_list - -/datum/topic_input/New(thref,list/thref_list) - href = thref - href_list = thref_list.Copy() - return - -/datum/topic_input/proc/get(i) - return listgetindex(href_list,i) - -/datum/topic_input/proc/getAndLocate(i) - var/t = get(i) - if(t) - t = locate(t) - if (istext(t)) - t = null - return t || null - -/datum/topic_input/proc/getNum(i) - var/t = get(i) - if(t) - t = text2num(t) - return isnum(t) ? t : null - -/datum/topic_input/proc/getObj(i) - var/t = getAndLocate(i) - return isobj(t) ? t : null - -/datum/topic_input/proc/getMob(i) - var/t = getAndLocate(i) - return ismob(t) ? t : null - -/datum/topic_input/proc/getTurf(i) - var/t = getAndLocate(i) - return isturf(t) ? t : null - -/datum/topic_input/proc/getAtom(i) - return getType(i, /atom) - -/datum/topic_input/proc/getArea(i) - var/t = getAndLocate(i) - return isarea(t) ? t : null - -/datum/topic_input/proc/getStr(i)//params should always be text, but... - var/t = get(i) - return istext(t) ? t : null - -/datum/topic_input/proc/getType(i,type) - var/t = getAndLocate(i) - return istype(t,type) ? t : null - -/datum/topic_input/proc/getPath(i) - var/t = get(i) - if(t) - t = text2path(t) - return ispath(t) ? t : null - -/datum/topic_input/proc/getList(i) - var/t = getAndLocate(i) - return islist(t) ? t : null diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index b84133faf79..14854279f45 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -42,4 +42,4 @@ mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1) mid_length = 10 end_sound = 'sound/machines/microwave/microwave-end.ogg' - volume = 90 + volume = 90 \ No newline at end of file diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index fb8acbe2e49..ed3471c79bf 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -10,7 +10,8 @@ help_verb = /mob/living/carbon/human/proc/CQC_help block_chance = 75 var/just_a_cook = FALSE - + var/old_grab_state = null + /datum/martial_art/cqc/under_siege name = "Close Quarters Cooking" just_a_cook = TRUE @@ -18,7 +19,7 @@ /datum/martial_art/cqc/proc/drop_restraining() restraining = FALSE -/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) +/datum/martial_art/cqc/can_use(mob/living/carbon/human/H) //this is used to make chef CQC only work in kitchen var/area/A = get_area(H) if(just_a_cook && !(istype(A, /area/crew_quarters/kitchen))) return FALSE @@ -120,22 +121,21 @@ return TRUE /datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A==D) - return FALSE //prevents grabbing yourself - if(A.a_intent == INTENT_GRAB) + if(A.a_intent == INTENT_GRAB && A!=D && can_use(A)) // A!=D prevents grabbing yourself add_to_streak("G",D) - if(check_streak(A,D)) //doing combos is prioritized over upgrading grabs + if(check_streak(A,D)) //if a combo is made no grab upgrade is done return TRUE + old_grab_state = A.grab_state D.grabbedby(A, 1) - if(A.grab_state == GRAB_PASSIVE) + if(old_grab_state == GRAB_PASSIVE) D.drop_all_held_items() A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent log_combat(A, D, "grabbed", addition="aggressively") D.visible_message("[A] violently grabs [D]!", \ "[A] violently grabs you!") + return TRUE else - D.grabbedby(A, 1) - return TRUE + return FALSE /datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index a6a5bbe4a5d..781e59af08d 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -12,29 +12,30 @@ no_guns = TRUE allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/sleeping_carp_help + var/old_grab_state = null /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,WRIST_WRENCH_COMBO)) streak = "" wristWrench(A,D) - return 1 + return TRUE if(findtext(streak,BACK_KICK_COMBO)) streak = "" backKick(A,D) - return 1 + return TRUE if(findtext(streak,STOMACH_KNEE_COMBO)) streak = "" kneeStomach(A,D) - return 1 + return TRUE if(findtext(streak,HEAD_KICK_COMBO)) streak = "" headKick(A,D) - return 1 + return TRUE if(findtext(streak,ELBOW_DROP_COMBO)) streak = "" elbowDrop(A,D) - return 1 - return 0 + return TRUE + return FALSE /datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D.stat && !D.IsStun() && !D.IsParalyzed()) @@ -47,7 +48,7 @@ D.dropItemToGround(D.get_active_held_item()) D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) D.Stun(60) - return 1 + return TRUE return basic_hit(A,D) @@ -61,7 +62,7 @@ step_to(D,get_step(D,D.dir),1) D.Paralyze(80) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) - return 1 + return TRUE else log_combat(A, D, "missed a back-kick (Sleeping Carp) on") D.visible_message("[A] tries to kick [D] in the back, but misses!", \ @@ -78,7 +79,7 @@ D.losebreath += 3 D.Stun(40) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -91,7 +92,7 @@ D.drop_all_held_items() playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) D.Stun(80) - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -104,31 +105,30 @@ D.death() //FINISH HIM! D.apply_damage(50, A.dna.species.attack_type, BODY_ZONE_CHEST) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1) - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A==D) - return 0 //prevents grabbing yourself - if(A.a_intent == INTENT_GRAB) + if(A.a_intent == INTENT_GRAB && A!=D) // A!=D prevents grabbing yourself add_to_streak("G",D) - if(check_streak(A,D)) //doing combos is prioritized over upgrading grabs - return 1 + if(check_streak(A,D)) //if a combo is made no grab upgrade is done + return TRUE + old_grab_state = A.grab_state D.grabbedby(A, 1) - if(A.grab_state == GRAB_PASSIVE) + if(old_grab_state == GRAB_PASSIVE) D.drop_all_held_items() A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent log_combat(A, D, "grabbed", addition="aggressively") D.visible_message("[A] violently grabs [D]!", \ "[A] violently grabs you!") + return TRUE else - D.grabbedby(A, 1) - return 1 + return FALSE /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) if(check_streak(A,D)) - return 1 + return TRUE A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams") D.visible_message("[A] [atk_verb] [D]!", \ @@ -139,13 +139,13 @@ D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") D.Paralyze(80) log_combat(A, D, "[atk_verb] (Sleeping Carp)") - return 1 + return TRUE /datum/martial_art/the_sleeping_carp/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("D",D) if(check_streak(A,D)) - return 1 + return TRUE return ..() /mob/living/carbon/human/proc/sleeping_carp_help() @@ -234,4 +234,4 @@ /obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(wielded) return ..() - return 0 + return FALSE diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index 5a9880bb5d7..4e20b2f5b06 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -5,19 +5,24 @@ /datum/mood_event/quality_nice description = "That drink wasn't bad at all.\n" mood_change = 1 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/quality_good description = "That drink was pretty good.\n" mood_change = 2 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/quality_verygood description = "That drink was great!\n" mood_change = 3 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/quality_fantastic description = "That drink was amazing!\n" mood_change = 4 - timeout = 1200 + timeout = 2 MINUTES + +/datum/mood_event/amazingtaste + description = "Amazing taste!\n" + mood_change = 50 + timeout = 10 MINUTES diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 6e86fd02c6a..aa4d89d799c 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -5,16 +5,16 @@ /datum/mood_event/smoked description = "I have had a smoke recently.\n" mood_change = 2 - timeout = 3600 + timeout = 6 MINUTES /datum/mood_event/wrong_brand description = "I hate that brand of cigarettes.\n" mood_change = -2 - timeout = 3600 + timeout = 6 MINUTES /datum/mood_event/overdose mood_change = -8 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/overdose/add_effects(drug_name) description = "I think I took a bit too much of that [drug_name]\n" @@ -50,11 +50,11 @@ /datum/mood_event/happiness_drug_good_od description = "YES! YES!! YES!!!\n" mood_change = 100 - timeout = 300 + timeout = 30 SECONDS special_screen_obj = "mood_happiness_good" /datum/mood_event/happiness_drug_bad_od description = "NO! NO!! NO!!!\n" mood_change = -100 - timeout = 300 + timeout = 30 SECONDS special_screen_obj = "mood_happiness_bad" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index fae7eaecd4a..daca0678052 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -17,7 +17,7 @@ /datum/mood_event/burnt_thumb description = "I shouldn't play with lighters...\n" mood_change = -1 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/cold description = "It's way too cold in here.\n" @@ -30,42 +30,42 @@ /datum/mood_event/creampie description = "I've been creamed. Tastes like pie flavor.\n" mood_change = -2 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/slipped description = "I slipped. I should be more careful next time...\n" mood_change = -2 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/eye_stab description = "I used to be an adventurer like you, until I took a screwdriver to the eye.\n" mood_change = -4 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/delam //SM delamination description = "Those God damn engineers can't do anything right...\n" mood_change = -2 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/depression description = "I feel sad for no particular reason.\n" mood_change = -9 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord description = "I can't even end it all!\n" mood_change = -10 - timeout = 600 + timeout = 60 SECONDS /datum/mood_event/dismembered description = "AHH! I WAS USING THAT LIMB!\n" mood_change = -8 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap.\n" mood_change = -3 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/embedded description = "Pull it out!\n" @@ -74,7 +74,7 @@ /datum/mood_event/table description = "Someone threw me on a table!\n" mood_change = -2 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/table/add_effects() if(ishuman(owner)) @@ -99,7 +99,7 @@ /datum/mood_event/epilepsy //Only when the mutation causes a seizure description = "I should have paid attention to the epilepsy warning.\n" mood_change = -3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/nyctophobia description = "It sure is dark around here...\n" @@ -112,7 +112,7 @@ /datum/mood_event/healsbadman description = "I feel like I'm held together by flimsy string, and could fall apart at any moment!\n" mood_change = -4 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!\n" @@ -121,27 +121,27 @@ /datum/mood_event/vomit description = "I just threw up. Gross.\n" mood_change = -2 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/vomitself description = "I just threw up all over myself. This is disgusting.\n" mood_change = -4 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/painful_medicine description = "Medicine may be good for me but right now it stings like hell.\n" mood_change = -5 - timeout = 600 + timeout = 60 SECONDS /datum/mood_event/spooked description = "The rattling of those bones...It still haunts me.\n" mood_change = -4 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/loud_gong description = "That loud gong noise really hurt my ears!\n" mood_change = -3 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/notcreeping description = "The voices are not happy, and they painfully contort my thoughts into getting back on task.\n" @@ -164,7 +164,7 @@ /datum/mood_event/sapped description = "Some unexplainable sadness is consuming me...\n" mood_change = -15 - timeout = 900 + timeout = 90 SECONDS /datum/mood_event/back_pain description = "Bags never sit right on my back, this hurts like hell!\n" @@ -173,7 +173,7 @@ /datum/mood_event/sad_empath description = "Someone seems upset...\n" mood_change = -2 - timeout = 600 + timeout = 60 SECONDS /datum/mood_event/sad_empath/add_effects(mob/sadtarget) description = "[sadtarget.name] seems upset...\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 3bfa390fdbc..f9e7097ace2 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,12 +1,12 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/betterhug description = "Someone was very nice to me.\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/betterhug/add_effects(mob/friend) description = "[friend.name] was very nice to me.\n" @@ -14,7 +14,7 @@ /datum/mood_event/besthug description = "Someone is great to be around, they make me feel so happy!\n" mood_change = 5 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/besthug/add_effects(mob/friend) description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!\n" @@ -22,27 +22,27 @@ /datum/mood_event/arcade description = "I beat the arcade game!\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/blessing description = "I've been blessed.\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/book_nerd description = "I have recently read a book.\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/exercise description = "Working out releases those endorphins!\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/pet_animal description = "Animals are adorable! I can't stop petting them!\n" mood_change = 3 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/pet_animal/add_effects(mob/animal) description = "\The [animal.name] is adorable! I can't stop petting [animal.p_them()]!\n" @@ -50,12 +50,12 @@ /datum/mood_event/honk description = "Maybe clowns aren't so bad after all. Honk!\n" mood_change = 2 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/perform_cpr description = "It feels good to save a life.\n" mood_change = 6 - timeout = 3000 + timeout = 5 MINUTES /datum/mood_event/oblivious description = "What a lovely day.\n" @@ -64,7 +64,7 @@ /datum/mood_event/jolly description = "I feel happy for no particular reason.\n" mood_change = 6 - timeout = 1200 + timeout = 2 MINUTES /datum/mood_event/focused description = "I have a goal, and I will reach it, whatever it takes!\n" //Used for syndies, nukeops etc so they can focus on their goals @@ -81,7 +81,7 @@ /datum/mood_event/creeping description = "The voices have released their hooks on my mind! I feel free again!\n" //creeps get it when they are around their obsession mood_change = 18 - timeout = 30 + timeout = 3 SECONDS hidden = TRUE /datum/mood_event/revolution @@ -101,7 +101,7 @@ /datum/mood_event/goodmusic description = "There is something soothing about this music.\n" mood_change = 3 - timeout = 600 + timeout = 60 SECONDS /datum/mood_event/chemical_euphoria description = "Heh...hehehe...hehe...\n" @@ -110,16 +110,17 @@ /datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/religiously_comforted description = "You are comforted by the presence of a holy person.\n" mood_change = 3 + timeout = 5 MINUTES /datum/mood_event/clownshoes description = "The shoes are a clown's legacy, I never want to take them off!\n" diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 914763225d0..2b97d3181ad 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -70,22 +70,22 @@ /datum/mood_event/favorite_food description = "I really enjoyed eating that.\n" mood_change = 3 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/gross_food description = "I really didn't like that food.\n" mood_change = -2 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/disgusting_food description = "That food was disgusting!\n" mood_change = -4 - timeout = 2400 + timeout = 4 MINUTES /datum/mood_event/nice_shower description = "I have recently had a nice shower.\n" mood_change = 2 - timeout = 1800 + timeout = 3 MINUTES /datum/mood_event/fresh_laundry description = "There's nothing like the feeling of a freshly laundered jumpsuit.\n" diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 42c3f979011..cc79ec42fc6 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -97,9 +97,6 @@ /datum/mutation/human/proc/on_ranged_attack(atom/target) return -/datum/mutation/human/proc/on_move(new_loc) - return - /datum/mutation/human/proc/on_life() return diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index f49c847f42d..ffd7d77b282 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -59,7 +59,7 @@ /obj/effect/proc_holder/spell/targeted/mindread/cast(list/targets, mob/living/carbon/human/user = usr) for(var/mob/living/M in targets) - if(istype(usr.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat) || istype(M.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) + if(usr.anti_magic_check(FALSE, FALSE, TRUE, 0) || M.anti_magic_check(FALSE, FALSE, TRUE, 0)) to_chat(usr, "As you reach out with your mind, you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") return if(M.stat == DEAD) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index f37c87ad557..b3cee91681b 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -177,11 +177,11 @@ /datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner) if(..()) return - . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) /datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner) if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src))) - . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) /datum/mutation/human/glow name = "Glowy" diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index d8ee7728a78..a6fd5cab3ec 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -13,11 +13,12 @@ if(..()) return owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move) /datum/mutation/human/chameleon/on_life() owner.alpha = max(0, owner.alpha - 25) -/datum/mutation/human/chameleon/on_move() +/datum/mutation/human/chameleon/proc/on_move() owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY /datum/mutation/human/chameleon/on_attack_hand(atom/target, proximity) @@ -29,3 +30,4 @@ if(..()) return owner.alpha = 255 + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 68165af956b..bd84b7efaed 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -164,3 +164,78 @@ types += chameleon_extras listclearnulls(types) return types + +/datum/outfit/proc/get_json_data() + . = list() + .["outfit_type"] = type + .["name"] = name + .["uniform"] = uniform + .["suit"] = suit + .["toggle_helmet"] = toggle_helmet + .["back"] = back + .["belt"] = belt + .["gloves"] = gloves + .["shoes"] = shoes + .["head"] = head + .["mask"] = mask + .["neck"] = neck + .["ears"] = ears + .["glasses"] = glasses + .["id"] = id + .["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 + .["accessory"] = accessory + +/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"]) + toggle_helmet = outfit_data["toggle_helmet"] + 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"]) + neck = text2path(outfit_data["neck"]) + ears = text2path(outfit_data["ears"]) + glasses = text2path(outfit_data["glasses"]) + id = text2path(outfit_data["id"]) + 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 = 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 + accessory = text2path(outfit_data["accessory"]) + return TRUE \ No newline at end of file diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 5fb777f9c57..949e63dc6a7 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -9,7 +9,9 @@ var/can_contaminate /datum/radiation_wave/New(atom/_source, dir, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE) - source = _source + + source = "[_source] \[[REF(_source)]\]" + master_turf = get_turf(_source) move_dir = dir diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index ae7d846e938..0cd636bfeb8 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -34,7 +34,7 @@ * */ /datum/recipe - var/list/reagents_list // example: = list("berryjuice" = 5) // do not list same reagent twice + var/list/reagents_list // example: = list(/datum/reagent/consumable/berryjuice = 5) // do not list same reagent twice var/list/items // example: =list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo var/result //example: = /obj/item/reagent_containers/food/snacks/donut var/time = 100 // 1/10 part of second @@ -88,7 +88,7 @@ var/obj/result_obj = new result(container) for (var/obj/O in (container.contents-result_obj)) if (O.reagents) - O.reagents.del_reagent("nutriment") + O.reagents.del_reagent(/datum/reagent/consumable/nutriment) O.reagents.update_total() O.reagents.trans_to(result_obj, O.reagents.total_volume) qdel(O) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 4325050931f..f36190073e5 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -152,6 +152,10 @@ port_id = "pirate" can_be_bought = FALSE +/datum/map_template/shuttle/hunter + port_id = "hunter" + can_be_bought = FALSE + /datum/map_template/shuttle/ruin //For random shuttles in ruins port_id = "ruin" can_be_bought = FALSE @@ -558,6 +562,14 @@ suffix = "default" name = "pirate ship (Default)" +/datum/map_template/shuttle/hunter/space_cop + suffix = "space_cop" + name = "Police Spacevan" + +/datum/map_template/shuttle/hunter/russian + suffix = "russian" + name = "Russian Cargo Ship" + /datum/map_template/shuttle/ruin/caravan_victim suffix = "caravan_victim" name = "Small Freighter" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 22836e51f05..8337fe0b39c 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -487,7 +487,7 @@ else owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.") var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc) - var/list/chems = list("bicaridine", "perfluorodecalin", "kelotane", "antitoxin") + var/list/chems = list(/datum/reagent/medicine/bicaridine, /datum/reagent/medicine/perfluorodecalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/antitoxin) healSnake.poison_type = pick(chems) healSnake.name = "Asclepius's Snake" healSnake.real_name = "Asclepius's Snake" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f6d6d038d41..1e9ce27c4f2 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -228,7 +228,7 @@ /datum/status_effect/belligerent/proc/do_movement_toggle(force_damage) var/number_legs = owner.get_num_legs(FALSE) - if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check(major = FALSE) && number_legs) + if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check(chargecost = 0) && number_legs) if(force_damage || owner.m_intent != MOVE_INTENT_WALK) if(GLOB.ratvar_awakens) owner.Paralyze(20) @@ -321,7 +321,7 @@ if(owner.confused) owner.confused = 0 severity = 0 - else if(!owner.anti_magic_check(major = FALSE) && owner.stat != DEAD && severity) + else if(!owner.anti_magic_check(chargecost = 0) && owner.stat != DEAD && severity) var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT) if(is_eligible_servant(owner)) @@ -354,7 +354,7 @@ /datum/status_effect/cultghost/tick() if(owner.reagents) - owner.reagents.del_reagent("holywater") //can't be deconverted + owner.reagents.del_reagent(/datum/reagent/water/holywater) //can't be deconverted /datum/status_effect/crusher_mark id = "crusher_mark" diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index e73293617f9..ff1ccc15b60 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -8,12 +8,14 @@ mob_trait = TRAIT_ALCOHOL_TOLERANCE gain_text = "You feel like you could drink a whole keg!" lose_text = "You don't feel as resistant to alcohol anymore. Somehow." + medical_record_text = "Patient demonstrates a high tolerance for alcohol." /datum/quirk/apathetic name = "Apathetic" desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess." value = 1 mood_quirk = TRUE + medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it." /datum/quirk/apathetic/add() GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) @@ -42,6 +44,7 @@ mob_trait = TRAIT_EMPATH gain_text = "You feel in tune with those around you." lose_text = "You feel isolated from others." + medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed." /datum/quirk/freerunning name = "Freerunning" @@ -50,6 +53,7 @@ mob_trait = TRAIT_FREERUNNING gain_text = "You feel lithe on your feet!" lose_text = "You feel clumsy again." + medical_record_text = "Patient scored highly on cardio tests." /datum/quirk/friendly name = "Friendly" @@ -59,6 +63,7 @@ gain_text = "You want to hug someone." lose_text = "You no longer feel compelled to hug others." mood_quirk = TRUE + medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case." /datum/quirk/jolly name = "Jolly" @@ -66,6 +71,7 @@ value = 1 mob_trait = TRAIT_JOLLY mood_quirk = TRUE + medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest." /datum/quirk/jolly/on_process() if(prob(0.05)) @@ -78,6 +84,7 @@ mob_trait = TRAIT_LIGHT_STEP gain_text = "You walk with a little more litheness." lose_text = "You start tromping around like a barbarian." + medical_record_text = "Patient's dexterity belies a strong capacity for stealth." /datum/quirk/musician name = "Musician" @@ -86,6 +93,7 @@ mob_trait = TRAIT_MUSICIAN gain_text = "You know everything about musical instruments." lose_text = "You forget how musical instruments work." + medical_record_text = "Patient brain scans show a highly-developed auditory pathway." /datum/quirk/musician/on_spawn() var/mob/living/carbon/human/H = quirk_holder @@ -101,6 +109,7 @@ mob_trait = TRAIT_NIGHT_VISION gain_text = "The shadows seem a little less dark." lose_text = "Everything seems a little darker." + medical_record_text = "Patient's eyes show above-average acclimation to darkness." /datum/quirk/night_vision/on_spawn() var/mob/living/carbon/human/H = quirk_holder @@ -116,6 +125,7 @@ mob_trait = TRAIT_PHOTOGRAPHER gain_text = "You know everything about photography." lose_text = "You forget how photo cameras work." + medical_record_text = "Patient mentions photography as a stress-relieving hobby." /datum/quirk/photographer/on_spawn() var/mob/living/carbon/human/H = quirk_holder @@ -129,12 +139,14 @@ desc = "You know your body well, and can accurately assess the extent of your wounds." value = 2 mob_trait = TRAIT_SELF_AWARE + medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis." /datum/quirk/skittish name = "Skittish" desc = "You can conceal yourself in danger. Ctrl-shift-click a closed locker to jump into it, as long as you have access." value = 2 mob_trait = TRAIT_SKITTISH + medical_record_text = "Patient demonstrates a high aversion to danger and has described hiding in containers out of fear." /datum/quirk/spiritual name = "Spiritual" @@ -143,23 +155,13 @@ mob_trait = TRAIT_SPIRITUAL gain_text = "You have faith in a higher power." lose_text = "You lose faith!" + medical_record_text = "Patient reports a belief in a higher power." /datum/quirk/spiritual/on_spawn() var/mob/living/carbon/human/H = quirk_holder H.equip_to_slot_or_del(new /obj/item/storage/fancy/candle_box(H), SLOT_IN_BACKPACK) H.equip_to_slot_or_del(new /obj/item/storage/box/matches(H), SLOT_IN_BACKPACK) -/datum/quirk/spiritual/on_process() - var/comforted = FALSE - for(var/mob/living/L in oview(5, quirk_holder)) - if(L.mind && L.mind.isholy && L.stat == CONSCIOUS) - comforted = TRUE - break - if(comforted) - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted) - else - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "religious_comfort") - /datum/quirk/tagger name = "Tagger" desc = "You're an experienced artist. While drawing graffiti, you can get twice as many uses out of drawing supplies." @@ -167,6 +169,7 @@ mob_trait = TRAIT_TAGGER gain_text = "You know how to tag walls efficiently." lose_text = "You forget how to tag walls properly." + medical_record_text = "Patient was recently seen for possible paint huffing incident." /datum/quirk/tagger/on_spawn() var/mob/living/carbon/human/H = quirk_holder @@ -182,6 +185,7 @@ mob_trait = TRAIT_VORACIOUS gain_text = "You feel HONGRY." lose_text = "You no longer feel HONGRY." + medical_record_text = "Patient demonstrates a disturbing capacity for eating." /datum/quirk/neet name = "NEET" @@ -191,6 +195,7 @@ gain_text = "You feel useless to society." lose_text = "You no longer feel useless to society." mood_quirk = TRUE + medical_record_text = "Patient continues to qualify for welfare and has made no efforts to improve hygiene." /datum/quirk/neet/on_spawn() var/mob/living/carbon/human/H = quirk_holder diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 1ce0d5c5e7e..0a070743fd7 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -7,6 +7,7 @@ mood_quirk = TRUE gain_text = "Your back REALLY hurts!" lose_text = "Your back feels better." + medical_record_text = "Patient scans indicate severe and chronic back pain." /datum/quirk/badback/on_process() var/mob/living/carbon/human/H = quirk_holder @@ -37,7 +38,7 @@ value = -4 gain_text = "You can't see anything." lose_text = "You miraculously gain back your vision." - medical_record_text = "Subject has permanent blindness." + medical_record_text = "Patient has permanent blindness." /datum/quirk/blindness/add() quirk_holder.become_blind(ROUNDSTART_TRAIT) @@ -67,7 +68,7 @@ mob_trait = TRAIT_DEAF gain_text = "You can't hear anything." lose_text = "You're able to hear again!" - medical_record_text = "Subject's cochlear nerve is incurably damaged." + medical_record_text = "Patient's cochlear nerve is incurably damaged." /datum/quirk/depression name = "Depression" @@ -76,7 +77,7 @@ value = -1 gain_text = "You start feeling depressed." lose_text = "You no longer feel depressed." //if only it were that easy! - medical_record_text = "Patient has a severe mood disorder causing them to experience sudden moments of sadness." + medical_record_text = "Patient has a severe mood disorder, causing them to experience acute episodes of depression." mood_quirk = TRUE /datum/quirk/depression/on_process() @@ -90,6 +91,7 @@ mood_quirk = TRUE var/obj/item/heirloom var/where + medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom." /datum/quirk/family_heirloom/on_spawn() var/mob/living/carbon/human/H = quirk_holder @@ -214,6 +216,7 @@ value = -1 gain_text = "You seem to make a big deal out of everything." lose_text = "You don't seem to make a big deal out of everything anymore." + medical_record_text = "Patient demonstrates a high level of emotional volatility." /datum/quirk/hypersensitive/add() GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) @@ -233,6 +236,7 @@ mob_trait = TRAIT_LIGHT_DRINKER gain_text = "Just the thought of drinking alcohol makes your head spin." lose_text = "You're no longer severely affected by alcohol." + medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" /datum/quirk/nearsighted //t. errorage name = "Nearsighted" @@ -256,6 +260,7 @@ name = "Nyctophobia" desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread." value = -1 + medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)" /datum/quirk/nyctophobia/on_process() var/mob/living/carbon/human/H = quirk_holder @@ -333,6 +338,7 @@ desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" value = -1 var/slot_string = "limb" + medical_record_text = "During physical examination, patient was found to have a prosthetic limb." /datum/quirk/prosthetic_limb/on_spawn() var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) @@ -370,7 +376,7 @@ medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." /datum/quirk/insanity/on_process() - if(quirk_holder.reagents.has_reagent("mindbreaker")) + if(quirk_holder.reagents.has_reagent(/datum/reagent/toxin/mindbreaker)) quirk_holder.hallucination = 0 return if(prob(2)) //we'll all be mad soon enough @@ -385,14 +391,6 @@ to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.") -/datum/quirk/obstructive - name = "Physically Obstructive" - desc = "You somehow manage to always be in the way. You can't swap places with other people." - value = -1 - mob_trait = TRAIT_NOMOBSWAP - gain_text = "You feel like you're in the way." - lose_text = "You feel less like you're in the way." - /datum/quirk/social_anxiety name = "Social Anxiety" desc = "Talking to people is very difficult for you, and you often stutter or even lock up." @@ -427,7 +425,7 @@ gain_text = "You suddenly feel the craving for drugs." lose_text = "You feel like you should kick your drug habit." medical_record_text = "Patient has a history of hard drugs." - var/drug_list = list("crank", "krokodil", "morphine", "happiness", "methamphetamine") //List of possible IDs + var/drug_list = list(/datum/reagent/drug/crank, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine) //List of possible IDs var/reagent_id //ID picked from list var/datum/reagent/reagent_type //If this is defined, reagent_id will be unused and the defined reagent type will be instead. var/datum/reagent/reagent_instance diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index f16f2b37417..66ac13905bb 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -16,6 +16,7 @@ value = 0 gain_text = "You feel repulsion at the idea of eating meat." lose_text = "You feel like eating meat isn't that bad." + medical_record_text = "Patient reports a vegetarian diet." /datum/quirk/vegetarian/add() var/mob/living/carbon/human/H = quirk_holder @@ -38,6 +39,7 @@ value = 0 gain_text = "You feel an intense craving for pineapple." lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." + medical_record_text = "Patient demonstrates a pathological love of pineapple." /datum/quirk/pineapple_liker/add() var/mob/living/carbon/human/H = quirk_holder @@ -56,6 +58,7 @@ value = 0 gain_text = "You find yourself pondering what kind of idiot actually enjoys pineapples..." lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." + medical_record_text = "Patient is correct to think that pineapple is disgusting." /datum/quirk/pineapple_hater/add() var/mob/living/carbon/human/H = quirk_holder @@ -74,6 +77,7 @@ value = 0 gain_text = "You start craving something that tastes strange." lose_text = "You feel like eating normal food again." + medical_record_text = "Patient demonstrates irregular nutrition preferences." /datum/quirk/deviant_tastes/add() var/mob/living/carbon/human/H = quirk_holder @@ -96,6 +100,7 @@ gain_text = "You feel like you have to stay clean." lose_text = "You no longer feel the need to always be clean." mood_quirk = TRUE + medical_record_text = "While waiting for the exam to begin, patient cleaned the examination room." /datum/quirk/neat/on_process() var/mob/living/carbon/human/H = quirk_holder diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 92cc1770b36..2fcccf26631 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -22,16 +22,19 @@ holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) + else + holder.visible_message("[icon2html(B, viewers(holder))] Nothing happens.") if(WIRE_UNBOLT) holder.visible_message("[icon2html(B, viewers(holder))] The bolts spin in place for a moment.") if(WIRE_DELAY) if(B.delayedbig) - holder.visible_message("[icon2html(B, viewers(holder))] The bomb has already been delayed.") + holder.visible_message("[icon2html(B, viewers(holder))] Nothing happens.") else holder.visible_message("[icon2html(B, viewers(holder))] The bomb chirps.") playsound(B, 'sound/machines/chime.ogg', 30, 1) B.detonation_timer += 300 - B.delayedbig = TRUE + if(B.active) + B.delayedbig = TRUE if(WIRE_PROCEED) holder.visible_message("[icon2html(B, viewers(holder))] The bomb buzzes ominously!") playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) @@ -43,7 +46,7 @@ else if(seconds >= 11) // Both to prevent negative timers and to have a little mercy. B.detonation_timer = world.time + 100 if(WIRE_ACTIVATE) - if(!B.active && !B.defused) + if(!B.active) holder.visible_message("[icon2html(B, viewers(holder))] You hear the bomb start ticking!") B.activate() B.update_icon() @@ -58,15 +61,10 @@ var/obj/machinery/syndicatebomb/B = holder switch(wire) if(WIRE_BOOM) - if(mend) - B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. - else - if(B.active) - holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") - B.explode_now = TRUE - tell_admins(B) - else - B.defused = TRUE + if(!mend && B.active) + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") + B.explode_now = TRUE + tell_admins(B) if(WIRE_UNBOLT) if(!mend && B.anchored) holder.visible_message("[icon2html(B, viewers(holder))] The bolts lift out of the ground!") @@ -81,7 +79,8 @@ if(!mend && B.active) holder.visible_message("[icon2html(B, viewers(holder))] The timer stops! The bomb has been defused!") B.active = FALSE - B.defused = TRUE + B.delayedlittle = FALSE + B.delayedbig = FALSE B.update_icon() /datum/wires/syndicatebomb/proc/tell_admins(obj/machinery/syndicatebomb/B) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d11fd39a4ef..b4155617795 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -336,12 +336,12 @@ //returns the mob's dna info as a list, to be inserted in an object's blood_DNA list /mob/living/proc/get_blood_dna_list() - if(get_blood_id() != "blood") + if(get_blood_id() != /datum/reagent/blood) return return list("ANIMAL DNA" = "Y-") /mob/living/carbon/get_blood_dna_list() - if(get_blood_id() != "blood") + if(get_blood_id() != /datum/reagent/blood) return var/list/blood_dna = list() if(dna) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e9c370154cb..bed96e11d9d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -223,8 +223,10 @@ if(!newloc.Enter(src, src.loc)) return + if (SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE) + return + // Past this is the point of no return - SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) var/atom/oldloc = loc var/area/oldarea = get_area(oldloc) var/area/newarea = get_area(newloc) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 70c04cb008f..ef9b710d7b0 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -9,15 +9,13 @@ required_enemies = 1 // how many of each type are required recommended_enemies = 3 reroll_friendly = 1 + announce_span = "Traitors and Changelings" + announce_text = "There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!" var/list/possible_changelings = list() var/list/changelings = list() var/const/changeling_amount = 1 //hard limit on changelings if scaling is turned off -/datum/game_mode/traitor/changeling/announce() - to_chat(world, "The current game mode is - Traitor+Changeling!") - to_chat(world, "There are alien creatures on the station along with some syndicate operatives out for their own gain! Do not let the changelings or the traitors succeed!") - /datum/game_mode/traitor/changeling/can_start() if(!..()) return 0 diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 2a37142a7a0..b1a8b364d97 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -8,7 +8,7 @@ spray_range = 1 stream_range = 1 volume = 30 - list_reagents = list("lube" = 30) + list_reagents = list(/datum/reagent/lube = 30) //COMBAT CLOWN SHOES //Clown shoes with combat stats and noslip. Of course they still squeak. @@ -166,7 +166,7 @@ customfoodfilling = FALSE seed = null tastes = list("explosives" = 10) - list_reagents = list("vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) /obj/item/grown/bananapeel/bombanana desc = "A peel from a banana. Why is it beeping?" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 87132f7df37..affc7c4f2e6 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -25,6 +25,7 @@ var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist var/list/protected_jobs = list() // Jobs that can't be traitors because + var/list/required_jobs = list() // alternative required job groups eg list(list(cap=1),list(hos=1,sec=2)) translates to one captain OR one hos and two secmans var/required_players = 0 var/maximum_players = -1 // -1 is no maximum, positive numbers limit the selection of a mode on overstaffed stations var/required_enemies = 0 @@ -359,7 +360,7 @@ // Ultimate randomizing code right here for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.client && player.ready == PLAYER_READY_TO_PLAY) + if(player.client && player.ready == PLAYER_READY_TO_PLAY && player.has_valid_preferences()) players += player // Shuffling, the players list is now ping-independent!!! @@ -394,24 +395,6 @@ drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie - while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates - if(drafted.len > 0) - applicant = pick(drafted) - if(applicant) - candidates += applicant - drafted.Remove(applicant) - - else // Not enough scrubs, ABORT ABORT ABORT - break - - if(restricted_jobs) - for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist - for(var/job in restricted_jobs) - if(player.assigned_role == job) - drafted -= player - - drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie - while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates if(drafted.len > 0) applicant = pick(drafted) diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index 5b87693ef32..45cbe960e0c 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -15,6 +15,9 @@ restricted_jobs = list("Cyborg", "AI") + announce_span = "Monkey" + announce_text = "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!" + var/carriers_to_make = 1 var/list/carriers = list() @@ -45,11 +48,6 @@ return FALSE return TRUE - -/datum/game_mode/monkey/announce() - to_chat(world, "The current game mode is - Monkey!") - to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!") - /datum/game_mode/monkey/post_setup() for(var/datum/mind/carriermind in carriers) var/datum/antagonist/monkey/M = add_monkey_leader(carriermind, monkey_team) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 5b6b2778892..4b1cc2cd443 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -137,6 +137,7 @@ command_radio = TRUE /datum/outfit/syndicate/no_crystals + name = "Syndicate Operative - Reinforcement" tc = 0 /datum/outfit/syndicate/post_equip(mob/living/carbon/human/H) @@ -146,7 +147,7 @@ if(command_radio) R.command = TRUE - if(tc) + if(ispath(uplink_type, /obj/item/uplink/nuclear) || tc) // /obj/item/uplink/nuclear understands 0 tc var/obj/item/U = new uplink_type(H, H.key, tc) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 4f0c1df5a20..23924107fa9 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -14,12 +14,13 @@ antag_flag = ROLE_REV false_report_weight = 10 restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present required_players = 30 required_enemies = 2 recommended_enemies = 3 enemy_minimum_age = 14 - announce_span = "danger" + announce_span = "Revolution" announce_text = "Some crewmembers are attempting a coup!\n\ Revolutionaries: Expand your cause and overthrow the heads of staff by execution or otherwise.\n\ Crew: Prevent the revolutionaries from taking over the station." @@ -31,14 +32,6 @@ var/list/datum/mind/headrev_candidates = list() var/end_when_heads_dead = TRUE -/////////////////////////// -//Announces the game type// -/////////////////////////// -/datum/game_mode/revolution/announce() - to_chat(world, "The current game mode is - Revolution!") - to_chat(world, "Some crewmembers are attempting to start a revolution!\nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.\nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).") - - /////////////////////////////////////////////////////////////////////////////// //Gets the round setup, cancelling if there's not enough players at the start// /////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a53aac68f55..4ad2f852a52 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -17,10 +17,10 @@ var/list/available_chems var/controls_inside = FALSE var/list/possible_chems = list( - list("epinephrine", "morphine", "perfluorodecalin", "bicaridine", "kelotane"), - list("oculine","inacusiate"), - list("antitoxin", "mutadone", "mannitol", "pen_acid", "salbutamol"), - list("omnizine") + list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/morphine, /datum/reagent/medicine/perfluorodecalin, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/kelotane), + list(/datum/reagent/medicine/oculine,/datum/reagent/medicine/inacusiate), + list(/datum/reagent/medicine/antitoxin, /datum/reagent/medicine/mutadone, /datum/reagent/medicine/mannitol, /datum/reagent/medicine/salbutamol, /datum/reagent/medicine/pen_acid), + list(/datum/reagent/medicine/omnizine) ) var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning @@ -142,6 +142,8 @@ ui.open() /obj/machinery/sleeper/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user))) + return if(state_open) close_machine() else @@ -166,7 +168,7 @@ data["chems"] = list() for(var/chem in available_chems) var/datum/reagent/R = GLOB.chemical_reagents_list[chem] - data["chems"] += list(list("name" = R.name, "id" = R.id, "allowed" = chem_allowed(chem))) + data["chems"] += list(list("name" = R.name, "id" = R.type, "allowed" = chem_allowed(chem))) data["occupant"] = list() var/mob/living/mob_occupant = occupant @@ -213,10 +215,10 @@ open_machine() . = TRUE if("inject") - var/chem = params["chem"] - if(!is_operational() || !mob_occupant) + var/chem = text2path(params["chem"]) + if(!is_operational() || !mob_occupant || isnull(chem)) return - if(mob_occupant.health < min_health && chem != "epinephrine") + if(mob_occupant.health < min_health && chem != /datum/reagent/medicine/epinephrine) return if(inject_chem(chem, usr)) . = TRUE @@ -239,7 +241,7 @@ if(!mob_occupant || !mob_occupant.reagents) return var/amount = mob_occupant.reagents.get_reagent_amount(chem) + 10 <= 20 * efficiency - var/occ_health = mob_occupant.health > min_health || chem == "epinephrine" + var/occ_health = mob_occupant.health > min_health || chem == /datum/reagent/medicine/epinephrine return amount && occ_health /obj/machinery/sleeper/proc/reset_chem_buttons() @@ -274,7 +276,7 @@ desc = "A large cryogenics unit built from brass. Its surface is pleasantly cool the touch." icon_state = "sleeper_clockwork" enter_message = "You hear the gentle hum and click of machinery, and are lulled into a sense of peace." - possible_chems = list(list("epinephrine", "salbutamol", "bicaridine", "kelotane", "oculine", "inacusiate", "mannitol")) + possible_chems = list(list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/salbutamol, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, /datum/reagent/medicine/mannitol)) /obj/machinery/sleeper/clockwork/process() if(occupant && isliving(occupant)) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index c537150ec59..ebe68f10e92 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -147,6 +147,10 @@ Class Procs: else STOP_PROCESSING(SSfastprocess, src) dropContents() + if(length(component_parts)) + for(var/atom/A in component_parts) + qdel(A) + component_parts.Cut() return ..() /obj/machinery/proc/locate_machinery() @@ -348,6 +352,7 @@ Class Procs: spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) + component_parts.Cut() qdel(src) /obj/machinery/proc/spawn_frame(disassembled) diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index ce4aa0c5920..35aa8f7746f 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -130,7 +130,7 @@ /obj/machinery/aug_manipulator/AltClick(mob/living/user) ..() - if(!user.canUseTopic(src)) + if(!user.canUseTopic(src, !issilicon(user))) return else eject_part(user) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index b2324d0cae6..36393fb2e6b 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -90,7 +90,7 @@ /obj/machinery/computer/apc_control/Topic(href, href_list) if(..()) return - if(!usr || !usr.canUseTopic(src) || stat || QDELETED(src)) + if(!usr || !usr.canUseTopic(src, !issilicon(usr)) || stat || QDELETED(src)) return if(href_list["authenticate"]) var/obj/item/card/id/ID = usr.get_idcard(TRUE) @@ -139,7 +139,7 @@ if(href_list["name_filter"]) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) var/new_filter = stripped_input(usr, "What name are you looking for?", name) - if(!src || !usr || !usr.canUseTopic(src) || stat || QDELETED(src)) + if(!src || !usr || !usr.canUseTopic(src, !issilicon(usr)) || stat || QDELETED(src)) return log_activity("changed name filter to \"[new_filter]\"") playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) @@ -147,7 +147,7 @@ if(href_list["above_filter"]) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) var/new_filter = input(usr, "Enter a percentage from 1-100 to sort by (greater than).", name) as null|num - if(!src || !usr || !usr.canUseTopic(src) || stat || QDELETED(src)) + if(!src || !usr || !usr.canUseTopic(src, !issilicon(usr)) || stat || QDELETED(src)) return log_activity("changed greater than charge filter to \"[new_filter]\"") if(new_filter) @@ -157,7 +157,7 @@ if(href_list["below_filter"]) playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) var/new_filter = input(usr, "Enter a percentage from 1-100 to sort by (lesser than).", name) as null|num - if(!src || !usr || !usr.canUseTopic(src) || stat || QDELETED(src)) + if(!src || !usr || !usr.canUseTopic(src, !issilicon(usr)) || stat || QDELETED(src)) return log_activity("changed lesser than charge filter to \"[new_filter]\"") if(new_filter) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index db2192789c4..965c64cd268 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -43,16 +43,10 @@ . = ..() GLOB.shuttle_caller_list += src -/obj/machinery/computer/communications/process() - if(..()) - var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE - var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE - updateDialog(machine_user_autoupdate,ai_autoupdate) - /obj/machinery/computer/communications/Topic(href, href_list) if(..()) return - if(!usr.canUseTopic(src)) + if(!usr.canUseTopic(src, !issilicon(usr))) return if(!is_station_level(z) && !is_reserved_level(z)) //Can only use in transit and on SS13 to_chat(usr, "Unable to establish a connection: \black You're too far away from the station!") @@ -580,8 +574,6 @@ popup.set_content(dat) popup.open() - popup.set_content(dat) - popup.open() /obj/machinery/computer/communications/proc/get_javascript_header(form_id) var/dat = {" + + + + + + + + + Beaker panel + + + + + Spawn grenade + + Grenade type: + + Normal + Voice analyzer + Signaler + + + Timer: + + + + Mode + + Inclusive + Exclusive + Recognizer + Voice sensor + + Name or phrase: + + + + Frequency: + + Code: + + + +note: beakers recommended, other containers may have issues + + + "} + for (var/i in 1 to 2 ) + dat += {" + + + Container [i]: + + + Container type + + + + + + Spawn + + + + Import + + + + Export + + + + + + + + Add + + + + + + + "} + + dat += {" + + + +