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
+
+ +
+ + + +
+ + +
+ + +
+note: beakers recommended, other containers may have issues +
+ + "} + for (var/i in 1 to 2 ) + dat += {" +
+

+ Container [i]: +

+
+ + +
+
+
+ +     + +     + + +
+
    +
  • + +
       + +
    +
  • +
+
+ "} + + dat += {" +
+
+ + + "} + + usr << browse(dat, "window=beakerpanel;size=1100x720") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 1349219259f..c3840b1dad9 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -25,8 +25,8 @@ cross.icon_state = "kingyellow" font_color = "blue" prayer_type = "CHAPLAIN PRAYER" - if(SSreligion.deity) - deity = SSreligion.deity + if(GLOB.deity) + deity = GLOB.deity else if(iscultist(usr)) cross.icon_state = "tome" font_color = "red" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index bf2f8066e13..08bbbcc5e3f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -872,183 +872,6 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_VERBOSEJMP(N)].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Nuke", "[N.timing]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits - -/client/proc/create_outfits() - set category = "Debug" - set name = "Create Custom Outfit" - - if(!check_rights(R_DEBUG)) - return - - holder.create_outfit() - -/datum/admins/proc/create_outfit() - var/list/uniforms = typesof(/obj/item/clothing/under) - var/list/suits = typesof(/obj/item/clothing/suit) - var/list/gloves = typesof(/obj/item/clothing/gloves) - var/list/shoes = typesof(/obj/item/clothing/shoes) - var/list/headwear = typesof(/obj/item/clothing/head) - var/list/glasses = typesof(/obj/item/clothing/glasses) - var/list/masks = typesof(/obj/item/clothing/mask) - var/list/ids = typesof(/obj/item/card/id) - - var/uniform_select = "" - - var/suit_select = "" - - var/gloves_select = "" - - var/shoes_select = "" - - var/head_select = "" - - var/glasses_select = "" - - var/mask_select = "" - - var/id_select = "" - - var/dat = {" - Create Outfit - - - [HrefTokenFormField()] - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name: - -
Uniform: - [uniform_select] -
Suit: - [suit_select] -
Back: - -
Belt: - -
Gloves: - [gloves_select] -
Shoes: - [shoes_select] -
Head: - [head_select] -
Mask: - [mask_select] -
Ears: - -
Glasses: - [glasses_select] -
ID: - [id_select] -
Left Pocket: - -
Right Pocket: - -
Suit Store: - -
Right Hand: - -
Left Hand: - -
-
- - - "} - usr << browse(dat, "window=dressup;size=550x600") - /client/proc/toggle_combo_hud() set category = "Admin" set name = "Toggle Combo HUD" diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index e47124970ce..d18f0550152 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -344,8 +344,8 @@ if(QDELETED(G)) return - if(istype(C.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(user, "Your target seems to have some sort of protective headgear on, blocking the message from being sent!") + if(C.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(user, "Your target seems to have some sort of tinfoil protection on, blocking the message from being sent!") return G.mind_control(command, user) @@ -519,10 +519,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user) if(L.incapacitated(TRUE, TRUE)) - if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(user, "The specimen's protective headgear is interfering with the sleep inducement!") - L.visible_message("[user] tried to induced sleep in [L] with [src], but [L.p_their()] headgear protected [L.p_them()]!", \ - "You feel a strange wave of heavy drowsiness wash over you, but your headgear deflects most of it!") + if(L.anti_magic_check(FALSE, FALSE, TRUE)) + to_chat(user, "The specimen's tinfoil protection is interfering with the sleep inducement!") + L.visible_message("[user] tried to induced sleep in [L] with [src], but [L.p_their()] tinfoil protection [L.p_them()]!", \ + "You feel a strange wave of heavy drowsiness wash over you, but your tinfoil protection deflects most of it!") L.drowsyness += 2 return L.visible_message("[user] has induced sleep in [L] with [src]!", \ @@ -531,10 +531,10 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.Sleeping(1200) log_combat(user, L, "put to sleep") else - if(istype(L.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(user, "The specimen's protective headgear is completely blocking our sleep inducement methods!") - L.visible_message("[user] tried to induce sleep in [L] with [src], but [L.p_their()] headgear completely protected [L.p_them()]!", \ - "Any sense of drowsiness is quickly diminished as your headgear deflects the effects!") + if(L.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(user, "The specimen's tinfoil protection is completely blocking our sleep inducement methods!") + L.visible_message("[user] tried to induce sleep in [L] with [src], but [L.p_their()] tinfoil protection completely protected [L.p_them()]!", \ + "Any sense of drowsiness is quickly diminished as your tinfoil protection deflects the effects!") return L.drowsyness += 1 to_chat(user, "Sleep inducement works fully only on stunned specimens! ") @@ -757,7 +757,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "bed" can_buckle = 1 - var/static/list/injected_reagents = list("corazone") + var/static/list/injected_reagents = list(/datum/reagent/medicine/corazone) /obj/structure/table/optable/abductor/Crossed(atom/movable/AM) . = ..() diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm index 98164de0995..db3bbf1118a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/organ_extraction - name = "experimental organ replacement" + name = "Experimental organ replacement" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert) possible_locs = list(BODY_ZONE_CHEST) ignore_clothes = 1 @@ -52,4 +52,4 @@ user.temporarilyRemoveItemFromInventory(tool, TRUE) var/obj/item/organ/heart/gland/gland = tool gland.Insert(target, 2) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index ebf18f4f47e..de46c3de812 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -319,15 +319,8 @@ /obj/item/organ/heart/gland/chem/Initialize() . = ..() - for(var/X in subtypesof(/datum/reagent/drug)) - var/datum/reagent/R = X - possible_reagents += initial(R.id) - for(var/X in subtypesof(/datum/reagent/medicine)) - var/datum/reagent/R = X - possible_reagents += initial(R.id) - for(var/X in typesof(/datum/reagent/toxin)) - var/datum/reagent/R = X - possible_reagents += initial(R.id) + for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin)) + possible_reagents += R /obj/item/organ/heart/gland/chem/activate() var/chem_to_add = pick(possible_reagents) diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index 2e77ac5e6ce..600df81388d 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -181,8 +181,8 @@ c.console = src /obj/machinery/abductor/console/proc/AddSnapshot(mob/living/carbon/human/target) - if(istype(target.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - say("Subject wearing specialized protective headgear, unable to get a proper scan!") + if(target.anti_magic_check(FALSE, FALSE, TRUE, 0)) + say("Subject wearing specialized protective tinfoil gear, unable to get a proper scan!") return var/datum/icon_snapshot/entry = new entry.name = target.name diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 37b409a5f1c..8e75c403add 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -147,7 +147,7 @@ if(overmind && overmind.blobstrain) overmind.blobstrain.on_sporedeath(src) else - reagents.add_reagent("spore", 10) + reagents.add_reagent(/datum/reagent/toxin/spore, 10) // Attach the smoke spreader and setup/start it. S.attach(location) @@ -271,7 +271,7 @@ /mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() . = ..() if(. && isliving(target) && overmind) - overmind.blobstrain.blobbernaut_attack(target) + overmind.blobstrain.blobbernaut_attack(target, src) /mob/living/simple_animal/hostile/blob/blobbernaut/update_icons() ..() diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index e592be0c5e8..5779919222c 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -22,6 +22,19 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ stack_trace("blobstrain created without overmind") overmind = new_overmind +/datum/blobstrain/proc/on_gain() + overmind.color = complementary_color + for(var/BL in GLOB.blobs) + var/obj/structure/blob/B = BL + B.update_icon() + for(var/BLO in overmind.blob_mobs) + var/mob/living/simple_animal/hostile/blob/BM = BLO + BM.update_icons() //If it's getting a new strain, tell it what it does! + to_chat(BM, "Your overmind's blob strain is now: [name]!") + to_chat(BM, "The [name] strain [shortdesc ? "[shortdesc]" : "[description]"]") + +/datum/blobstrain/proc/on_lose() + /datum/blobstrain/proc/on_sporedeath(mob/living/spore) /datum/blobstrain/proc/send_message(mob/living/M) @@ -37,10 +50,10 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ overmind.add_points(point_rate) overmind.blob_core.obj_integrity = min(overmind.blob_core.max_integrity, overmind.blob_core.obj_integrity+core_regen) -/datum/blobstrain/proc/attack_living(var/mob/living/L) // When the blob attacks people +/datum/blobstrain/proc/attack_living(var/mob/living/L, var/list/nearby_blobs) // When the blob attacks people send_message(L) -/datum/blobstrain/proc/blobbernaut_attack(mob/living/L) // When this blob's blobbernaut attacks people +/datum/blobstrain/proc/blobbernaut_attack(mob/living/L, blobbernaut) // When this blob's blobbernaut attacks people /datum/blobstrain/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this return coefficient*damage diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index f688cee8474..f47c3b3378a 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -16,7 +16,7 @@ reagent.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. /datum/blobstrain/reagent/on_sporedeath(mob/living/spore) - spore.reagents.add_reagent(reagent.id, 10) + spore.reagents.add_reagent(reagent.type, 10) // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob diff --git a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm index 7f934afdf6c..97b974e28fd 100644 --- a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm @@ -28,7 +28,6 @@ /datum/reagent/blob/blazing_oil name = "Blazing Oil" - id = "blazing_oil" taste_description = "burning oil" color = "#B68D00" diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index 74910b8060e..b019146f0bc 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -12,7 +12,6 @@ /datum/reagent/blob/cryogenic_poison name = "Cryogenic Poison" - id = "cryogenic_poison" description = "will inject targets with a freezing poison that does high damage over time." color = "#8BA6E9" taste_description = "brain freeze" @@ -20,9 +19,9 @@ /datum/reagent/blob/cryogenic_poison/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() if(M.reagents) - M.reagents.add_reagent("frostoil", 0.3*reac_volume) - M.reagents.add_reagent("ice", 0.3*reac_volume) - M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume) + M.reagents.add_reagent(/datum/reagent/consumable/frostoil, 0.3*reac_volume) + M.reagents.add_reagent(/datum/reagent/consumable/ice, 0.3*reac_volume) + M.reagents.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*reac_volume) M.apply_damage(0.2*reac_volume, BRUTE) /datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/antagonists/blob/blobstrains/debris_devourer.dm b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm new file mode 100644 index 00000000000..f06c880ce44 --- /dev/null +++ b/code/modules/antagonists/blob/blobstrains/debris_devourer.dm @@ -0,0 +1,46 @@ +#define DEBRIS_DENSITY (length(core.contents) / length(overmind.blobs_legit)) // items per blob + +// Accumulates junk liberally +/datum/blobstrain/debris_devourer + name = "Debris Devourer" + description = "will launch accumulated debris into targets." + analyzerdescdamage = "Does medium brute damage and may grab onto melee weapons." + analyzerdesceffect = "Devours loose items left on the station, and releases them when attacking or attacked." + color = "#8B1000" + complementary_color = "#00558B" + blobbernaut_message = "blasts" + message = "The blob blasts you" + + +/datum/blobstrain/debris_devourer/attack_living(var/mob/living/L, var/list/nearby_blobs) + send_message(L) + for (var/obj/structure/blob/blob in nearby_blobs) + debris_attack(L, blob) + +/datum/blobstrain/debris_devourer/on_sporedeath(mob/living/spore) + for(var/i in 1 to 3) + var/obj/item/I = locate() in overmind.blob_core + if (I && !QDELETED(I)) + I.forceMove(get_turf(spore)) + I.throw_at(get_edge_target_turf(spore,pick(GLOB.alldirs)), 3, 5) + +/datum/blobstrain/debris_devourer/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O, coefficient = 1) //when the blob expands, do this + for (var/obj/item/I in T) + I.forceMove(overmind.blob_core) + +/datum/blobstrain/debris_devourer/proc/debris_attack(mob/living/L, source) + var/obj/structure/blob/core/core = overmind.blob_core + if (prob(20 * DEBRIS_DENSITY)) // Pretend the items are spread through the blob and its mobs and not in the core. + var/obj/item/I = locate() in core + if (I && !QDELETED(I)) + I.forceMove(get_turf(source)) + I.throw_at(L, 2, 5) + +/datum/blobstrain/debris_devourer/blobbernaut_attack(mob/living/L, mob/living/blobbernaut) // When this blob's blobbernaut attacks people + debris_attack(L,blobbernaut) + +/datum/blobstrain/debris_devourer/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag, coefficient = 1) //when the blob takes damage, do this + var/obj/structure/blob/core/core = overmind.blob_core + return round(max((coefficient*damage)-min(coefficient*DEBRIS_DENSITY, 10), 0)) // reduce damage taken by items per blob, up to 10 + +#undef DEBRIS_DENSITY diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm index e970588e6ab..0e665603c9b 100644 --- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm @@ -22,7 +22,6 @@ /datum/reagent/blob/electromagnetic_web name = "Electromagnetic Web" - id = "electromagnetic_web" taste_description = "pop rocks" color = "#83ECEC" diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 8393e8fae75..7c07103d625 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -23,13 +23,12 @@ /datum/reagent/blob/energized_jelly name = "Energized Jelly" - id = "energized_jelly" taste_description = "gelatin" color = "#EFD65A" /datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() M.losebreath += round(0.2*reac_volume) - M.adjustStaminaLoss(0.4*reac_volume) + M.adjustStaminaLoss(reac_volume) if(M) M.apply_damage(0.6*reac_volume, OXY) diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm index 5d64ecf5c35..f8fd2e2f0df 100644 --- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm @@ -20,7 +20,6 @@ /datum/reagent/blob/explosive_lattice name = "Explosive Lattice" - id = "explosive_lattice" taste_description = "the bomb" color = "#8B2500" diff --git a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm index d2af3d9eec1..fac3470c7a0 100644 --- a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm +++ b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm @@ -28,7 +28,6 @@ //does massive brute and burn damage, but can only expand manually /datum/reagent/blob/networked_fibers name = "Networked Fibers" - id = "networked_fibers" taste_description = "efficiency" color = "#CDC0B0" diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index ef97ddd2fe4..e5754329979 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -34,7 +34,6 @@ /datum/reagent/blob/pressurized_slime name = "Pressurized Slime" - id = "pressurized_slime" taste_description = "a sponge" color = "#AAAABB" @@ -49,4 +48,4 @@ if(M) M.apply_damage(0.4*reac_volume, OXY) if(M) - M.adjustStaminaLoss(0.2*reac_volume) + M.adjustStaminaLoss(reac_volume) diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index b36c44efea5..fca56d14022 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -21,7 +21,6 @@ /datum/reagent/blob/reactive_spines name = "Reactive Spines" - id = "reactive_spines" taste_description = "rock" color = "#9ACD32" diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index 13f4e2d7db8..4e363c89d33 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -10,7 +10,6 @@ /datum/reagent/blob/regenerative_materia name = "Regenerative Materia" - id = "regenerative_materia" taste_description = "heaven" color = "#C8A5DC" @@ -18,8 +17,8 @@ reac_volume = ..() M.adjust_drugginess(reac_volume) if(M.reagents) - M.reagents.add_reagent("regenerative_materia", 0.2*reac_volume) - M.reagents.add_reagent("spore", 0.2*reac_volume) + M.reagents.add_reagent(/datum/reagent/blob/regenerative_materia, 0.2*reac_volume) + M.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume) M.apply_damage(0.7*reac_volume, TOX) /datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C) diff --git a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm index 8839167efb8..57868963472 100644 --- a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm +++ b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm @@ -27,7 +27,6 @@ /datum/reagent/blob/replicating_foam name = "Replicating Foam" - id = "replicating_foam" taste_description = "duplication" color = "#7B5A57" diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm index 63a55e1831b..d06357f8363 100644 --- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm @@ -29,7 +29,6 @@ /datum/reagent/blob/shifting_fragments name = "Shifting Fragments" - id = "shifting_fragments" color = "#C8963C" /datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm index e38d1644fa0..7f500bbe291 100644 --- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm @@ -26,7 +26,6 @@ /datum/reagent/blob/synchronous_mesh name = "Synchronous Mesh" - id = "synchronous_mesh" taste_description = "toxic mold" color = "#65ADA2" diff --git a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm index 6f04a6a79ac..b2bb9d51157 100644 --- a/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm +++ b/code/modules/antagonists/blob/blobstrains/zombifying_pods.dm @@ -29,7 +29,6 @@ /datum/reagent/blob/zombifying_pods name = "Zombifying Pods" - id = "zombifying_pods" color = "#E88D5D" /datum/reagent/blob/zombifying_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 149ecee3147..8e1da8a5482 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -38,6 +38,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/max_count = 0 //The biggest it got before death var/blobwincount = 400 var/victory_in_progress = FALSE + var/rerolling = FALSE /mob/camera/blob/Initialize(mapload, starting_points = 60) validate_location() @@ -50,7 +51,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) real_name = new_name last_attack = world.time var/datum/blobstrain/BS = pick(GLOB.valid_blobstrains) - blobstrain = new BS(src) + set_strain(BS) color = blobstrain.complementary_color if(blob_core) blob_core.update_icon() @@ -70,6 +71,22 @@ GLOBAL_LIST_EMPTY(blob_nodes) CRASH("No blobspawnpoints and blob spawned in nullspace.") forceMove(T) +/mob/camera/blob/proc/set_strain(datum/blobstrain/new_strain) + if (ispath(new_strain)) + var/hadstrain = FALSE + if (istype(blobstrain)) + blobstrain.on_lose() + qdel(blobstrain) + hadstrain = TRUE + blobstrain = new new_strain(src) + blobstrain.on_gain() + if (hadstrain) + to_chat(src, "Your strain is now: [blobstrain.name]!") + to_chat(src, "The [blobstrain.name] strain [blobstrain.description]") + if(blobstrain.effectdesc) + to_chat(src, "The [blobstrain.name] strain [blobstrain.effectdesc]") + + /mob/camera/blob/proc/is_valid_turf(turf/T) var/area/A = get_area(T) if((A && !A.blob_allowed) || !T || !is_station_level(T.z) || isspaceturf(T)) diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index 878701a90e6..d0fdce40cce 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -269,7 +269,7 @@ continue if(L.stat != DEAD) attacksuccess = TRUE - blobstrain.attack_living(L) + blobstrain.attack_living(L, possibleblobs) var/obj/structure/blob/B = locate() in T if(B) if(attacksuccess) //if we successfully attacked a turf with a blob on it, only give an attack refund @@ -340,28 +340,25 @@ set category = "Blob" set name = "Reactive Strain Adaptation (40)" set desc = "Replaces your strain with a random, different one." - if(free_strain_rerolls || can_buy(40)) - set_strain() + if(!rerolling && (free_strain_rerolls || can_buy(40))) + rerolling = TRUE + reroll_strain() + rerolling = FALSE if(free_strain_rerolls) free_strain_rerolls-- last_reroll_time = world.time -/mob/camera/blob/proc/set_strain() - var/datum/blobstrain/bs = pick((GLOB.valid_blobstrains - blobstrain.type)) - blobstrain = new bs(src) - color = blobstrain.complementary_color - for(var/BL in GLOB.blobs) - var/obj/structure/blob/B = BL - B.update_icon() - for(var/BLO in blob_mobs) - var/mob/living/simple_animal/hostile/blob/BM = BLO - BM.update_icons() //If it's getting a new strain, tell it what it does! - to_chat(BM, "Your overmind's blob strain is now: [blobstrain.name]!") - to_chat(BM, "The [blobstrain.name] strain [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]") - to_chat(src, "Your strain is now: [blobstrain.name]!") - to_chat(src, "The [blobstrain.name] strain [blobstrain.description]") - if(blobstrain.effectdesc) - to_chat(src, "The [blobstrain.name] strain [blobstrain.effectdesc]") +/mob/camera/blob/proc/reroll_strain() + var/list/choices = list() + while (length(choices) < 4) + var/datum/blobstrain/bs = pick((GLOB.valid_blobstrains)) + choices[initial(bs.name)] = bs + + var/choice = input(usr, "Please choose a new strain","Strain") as anything in choices + if (choice && choices[choice] && !QDELETED(src)) + var/datum/blobstrain/bs = choices[choice] + set_strain(bs) + /mob/camera/blob/verb/blob_help() set category = "Blob" diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 9fcb9dac10b..bf897892c9d 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -31,15 +31,12 @@ owner.special_role = null return ..() -/datum/antagonist/brother/proc/give_meeting_area() - if(!owner.current || !team || !team.meeting_area) - return - to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") - antag_memory += "Meeting Area: [team.meeting_area]
" +/datum/antagonist/brother/antag_panel_data() + return "Conspirators : [get_brother_names()]]" -/datum/antagonist/brother/greet() - var/brother_text = "" +/datum/antagonist/brother/proc/get_brother_names() var/list/brothers = team.members - owner + var/brother_text = "" for(var/i = 1 to brothers.len) var/datum/mind/M = brothers[i] brother_text += M.name @@ -47,6 +44,16 @@ brother_text += " and " else if(i != brothers.len) brother_text += ", " + return brother_text + +/datum/antagonist/brother/proc/give_meeting_area() + if(!owner.current || !team || !team.meeting_area) + return + to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") + antag_memory += "Meeting Area: [team.meeting_area]
" + +/datum/antagonist/brother/greet() + var/brother_text = get_brother_names() to_chat(owner.current, "You are the [owner.special_role] of [brother_text].") to_chat(owner.current, "The Syndicate only accepts those that have proven themselves. Prove yourself and prove your [team.member_name]s by completing your objectives together!") owner.announce_objectives() diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index bacdaf3aab2..bd2ef82134b 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -18,7 +18,7 @@ user.SetKnockdown(0) user.SetImmobilized(0) user.SetParalyzed(0) - user.reagents.add_reagent("changelingadrenaline", 10) - user.reagents.add_reagent("changelinghaste", 2) //For a really quick burst of speed + user.reagents.add_reagent(/datum/reagent/medicine/changelingadrenaline, 10) + user.reagents.add_reagent(/datum/reagent/medicine/changelinghaste, 2) //For a really quick burst of speed user.adjustStaminaLoss(-75) return TRUE diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index 6943ad5bdb1..04922a25c8b 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -19,7 +19,7 @@ else to_chat(user, "We can't adjust our eyes if we don't have any!") -/datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) +/datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/user) if(!istype(user)) return ..() diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index c285cadc8db..588fdcccb22 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -7,6 +7,9 @@ //Transform into a human. /datum/action/changeling/humanform/sting_action(mob/living/carbon/user) + if(user.movement_type & VENTCRAWLING) + to_chat(user, "We must exit the pipes before we can transform back!") + return FALSE var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) var/list/names = list() for(var/datum/changelingprofile/prof in changeling.stored_profiles) @@ -20,12 +23,12 @@ if(!chosen_prof) return if(!user || user.notransform) - return 0 + return FALSE to_chat(user, "We transform our appearance.") ..() changeling.purchasedpowers -= src - var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) changeling_transform(newmob, chosen_prof) return TRUE diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 476410ac973..03ea226e9e5 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -13,5 +13,5 @@ return FALSE to_chat(user, "Our genes cry out!") ..() - user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) return TRUE diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm index 28edff65594..3f15bab46f9 100644 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ b/code/modules/antagonists/changeling/powers/linglink.dm @@ -57,7 +57,7 @@ target.mind.linglink = 1 target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!") to_chat(target, "You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!") - target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them + target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 40) // So they don't choke to death while you interrogate them sleep(1800) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]")) if(!do_mob(user, target, 20)) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 9e7927323e9..96427b602c2 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -486,7 +486,7 @@ /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.reagents.add_reagent("salbutamol", REAGENTS_METABOLISM) + H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM) /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 7b0b41603fd..2da5a5d8eed 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -26,10 +26,10 @@ C.vomit(0, toxic = TRUE) O.forceMove(get_turf(user)) - user.reagents.add_reagent("mutadone", 10) - user.reagents.add_reagent("pen_acid", 20) - user.reagents.add_reagent("antihol", 10) - user.reagents.add_reagent("mannitol", 25) + user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) + user.reagents.add_reagent(/datum/reagent/medicine/pen_acid, 20) + user.reagents.add_reagent(/datum/reagent/medicine/antihol, 10) + user.reagents.add_reagent(/datum/reagent/medicine/mannitol, 25) if(isliving(user)) var/mob/living/L = user diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 13c68ebe0ee..20956107e42 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -18,7 +18,7 @@ if(active) to_chat(user, "Our muscles tense and strengthen.") else - user.add_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES) to_chat(user, "Our muscles relax.") if(stacks >= 10) to_chat(user, "We collapse in exhaustion.") diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 199d394c1ac..660d5754929 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -108,7 +108,7 @@ C.real_name = NewDNA.real_name NewDNA.transfer_identity(C) if(ismonkey(C)) - C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG) C.updateappearance(mutcolor_update=1) @@ -247,5 +247,5 @@ /datum/action/changeling/sting/cryo/sting_action(mob/user, mob/target) log_combat(user, target, "stung", "cryo sting") if(target.reagents) - target.reagents.add_reagent("frostoil", 30) + target.reagents.add_reagent(/datum/reagent/consumable/frostoil, 30) return TRUE diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index d5bcee8eddb..a1482c81878 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -99,7 +99,7 @@ var/burndamage = L.getFireLoss() var/oxydamage = L.getOxyLoss() var/totaldamage = brutedamage + burndamage + oxydamage - if(!totaldamage && (!L.reagents || !L.reagents.has_reagent("holywater"))) + if(!totaldamage && (!L.reagents || !L.reagents.has_reagent(/datum/reagent/water/holywater))) to_chat(ranged_ability_user, "\"[L] is unhurt and untainted.\"") return TRUE @@ -107,7 +107,7 @@ to_chat(ranged_ability_user, "You bathe [L == ranged_ability_user ? "yourself":"[L]"] in Inath-neq's power!") var/targetturf = get_turf(L) - var/has_holy_water = (L.reagents && L.reagents.has_reagent("holywater")) + var/has_holy_water = (L.reagents && L.reagents.has_reagent(/datum/reagent/water/holywater)) var/healseverity = max(round(totaldamage*0.05, 1), 1) //shows the general severity of the damage you just healed, 1 glow per 20 for(var/i in 1 to healseverity) new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1") @@ -128,7 +128,7 @@ playsound(targetturf, 'sound/magic/staff_healing.ogg', 50, 1) if(has_holy_water) - L.reagents.remove_reagent("holywater", 1000) + L.reagents.remove_reagent(/datum/reagent/water/holywater, 1000) remove_ranged_ability() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 7140bb607df..d97ea7f8a3e 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -35,7 +35,7 @@ /obj/item/clockwork/weapon/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user) . = ..() - if(!QDELETED(target) && target.stat != DEAD && !target.anti_magic_check(major = FALSE) && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead + if(!QDELETED(target) && target.stat != DEAD && !target.anti_magic_check(chargecost = 0) && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar if(issilicon(target)) target.visible_message("[target] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index cd1df31979f..051355d6580 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -60,7 +60,7 @@ else if(isliving(target)) var/mob/living/L = target - if(!L.anti_magic_check(major = FALSE)) + if(!L.anti_magic_check(chargecost = 0)) if(isrevenant(L)) var/mob/living/simple_animal/revenant/R = L if(R.revealed) diff --git a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm index 22f5ccf3d45..2ee76329d57 100644 --- a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm +++ b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm @@ -53,7 +53,7 @@ /obj/structure/destructible/clockwork/taunting_trail/proc/affect_mob(mob/living/L) if(istype(L) && !is_servant_of_ratvar(L)) - if(!L.anti_magic_check(major = FALSE)) + if(!L.anti_magic_check(chargecost = 0)) L.confused = min(L.confused + 15, 50) L.dizziness = min(L.dizziness + 15, 50) if(L.confused >= 25) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm index 8d655749877..6aede1592ed 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm @@ -7,7 +7,6 @@ break_message = "The vent snaps and collapses!" max_integrity = 100 density = FALSE - layer = BELOW_OBJ_LAYER /obj/structure/destructible/clockwork/trap/steam_vent/activate() opacity = !opacity diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index e4f782d1f22..89e332b24d5 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -5,7 +5,6 @@ unanchored_icon = "wall_gear" climbable = TRUE max_integrity = 100 - layer = BELOW_OBJ_LAYER construction_value = 3 desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, or just climb over it." break_message = "The gear breaks apart into shards of alloy!" diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index cde02e79a2d..b1ec9db398e 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -117,7 +117,7 @@ if(trauma.total_time_creeping > 0) report += "The [name] spent a total of [DisplayTimeText(trauma.total_time_creeping)] being near [trauma.obsession]!" else - report += "The [name] did not go near their obsession the entire round! That's extremely impressive, but you are a shit [name]!" + report += "The [name] did not go near their obsession the entire round! That's extremely impressive!" else report += "The [name] had no trauma attached to their antagonist ways! Either it bugged out or an admin incorrectly gave this good samaritan antag and it broke! You might as well show yourself!!" diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 13e5eb641cd..6b3ddde1c4f 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -747,7 +747,7 @@ var/turf/T = get_turf(target) if(T) for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) - if(B.blood_state == "blood") + if(B.blood_state == BLOOD_STATE_HUMAN) if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam temp += 30 else @@ -757,9 +757,9 @@ for(var/obj/effect/decal/cleanable/trail_holder/TH in view(T, 2)) qdel(TH) var/obj/item/clothing/shoes/shoecheck = user.shoes - if(shoecheck && shoecheck.bloody_shoes["blood"]) - temp += shoecheck.bloody_shoes["blood"]/20 - shoecheck.bloody_shoes["blood"] = 0 + if(shoecheck && shoecheck.bloody_shoes[/datum/reagent/blood]) + temp += shoecheck.bloody_shoes[/datum/reagent/blood]/20 + shoecheck.bloody_shoes[/datum/reagent/blood] = 0 if(temp) user.Beam(T,icon_state="drainbeam",time=15) new /obj/effect/temp_visual/cult/sparks(get_turf(user)) @@ -815,4 +815,3 @@ else to_chat(user, "You need a free hand for this rite!") qdel(rite) - diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 823a8b33ebd..907369d5d97 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -486,7 +486,7 @@ icon = 'icons/obj/drinks.dmi' icon_state = "holyflask" color = "#333333" - list_reagents = list("unholywater" = 50) + list_reagents = list(/datum/reagent/fuel/unholywater = 50) /obj/item/shuttle_curse name = "cursed orb" @@ -785,7 +785,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.stat != DEAD) - H.reagents.add_reagent("unholywater", 4) + H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) if(isshade(target) || isconstruct(target)) var/mob/living/simple_animal/M = target if(M.health+5 < M.maxHealth) @@ -889,7 +889,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.stat != DEAD) - H.reagents.add_reagent("unholywater", 7) + H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7) if(isshade(target) || isconstruct(target)) var/mob/living/simple_animal/M = target if(M.health+15 < M.maxHealth) @@ -1002,6 +1002,6 @@ continue throw_at(Next, 3, 1, D.thrower) return - throw_at(D.thrower, 7, 1, D.thrower) + throw_at(D.thrower, 7, 1, null) else ..() diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm index 69941f582d2..389e8e0cd65 100644 --- a/code/modules/antagonists/cult/ritual.dm +++ b/code/modules/antagonists/cult/ritual.dm @@ -24,11 +24,11 @@ This file contains the cult dagger and rune list code /obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user) if(iscultist(M)) - if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion + if(M.reagents && M.reagents.has_reagent(/datum/reagent/water/holywater)) //allows cultists to be rescued from the clutches of ordained religion to_chat(user, "You remove the taint from [M]." ) - var/holy2unholy = M.reagents.get_reagent_amount("holywater") - M.reagents.del_reagent("holywater") - M.reagents.add_reagent("unholywater",holy2unholy) + var/holy2unholy = M.reagents.get_reagent_amount(/datum/reagent/water/holywater) + M.reagents.del_reagent(/datum/reagent/water/holywater) + M.reagents.add_reagent(/datum/reagent/fuel/unholywater,holy2unholy) log_combat(user, M, "smacked", src, " removing the holy water from them") return FALSE . = ..() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 30813c28079..4040dfc031a 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -82,8 +82,9 @@ Runes can either be invoked by one's self or with many different cultists. Each /obj/effect/rune/attack_animal(mob/living/simple_animal/M) if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct)) - if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message - attack_hand(M) + if(istype(M, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/armored/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/builder/angelic)) + to_chat(M, "You purge the rune!") + qdel(src) else to_chat(M, "You are unable to invoke the rune!") @@ -230,14 +231,14 @@ structure_check() searches for nearby cultist structures required for the invoca addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5) Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew rune_in_use = FALSE - + /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers) if(invokers.len < 2) for(var/M in invokers) to_chat(M, "You need at least two invokers to convert [convertee]!") log_game("Offer rune failed - tried conversion with one invoker") return 0 - if(convertee.anti_magic_check(TRUE, TRUE, major = FALSE)) //Not major because it can be spammed + if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed for(var/M in invokers) to_chat(M, "Something is shielding [convertee]'s mind!") log_game("Offer rune failed - convertee had anti-magic") @@ -765,7 +766,7 @@ structure_check() searches for nearby cultist structures required for the invoca set_light(6, 1, color) for(var/mob/living/L in viewers(T)) if(!iscultist(L) && L.blood_volume) - var/atom/I = L.anti_magic_check(major = FALSE) + var/atom/I = L.anti_magic_check(chargecost = 0) if(I) if(isitem(I)) to_chat(L, "[I] suddenly burns hotly before returning to normal!") @@ -795,11 +796,11 @@ structure_check() searches for nearby cultist structures required for the invoca set_light(6, 1, color) for(var/mob/living/L in viewers(T)) if(!iscultist(L) && L.blood_volume) - if(L.anti_magic_check(major = FALSE)) + if(L.anti_magic_check(chargecost = 0)) continue L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier) if(is_servant_of_ratvar(L)) - L.adjustStaminaLoss(tick_damage*0.5) + L.adjustStaminaLoss(tick_damage*multiplier*1.5) //Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost. /obj/effect/rune/manifest diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index b0e692d2c52..db9ca2832fc 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -391,7 +391,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", if(BANISH_FORMALDYHIDE) if(iscarbon(body)) var/mob/living/carbon/H = body - return H.reagents.has_reagent("formaldehyde") + return H.reagents.has_reagent(/datum/reagent/toxin/formaldehyde) return 0 if(BANISH_RUNES) if(body) diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index ad850d6aec4..480bf4f06ef 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -138,6 +138,8 @@ the new instance inside the host to be updated to the template's stats. . = ..() if(!mind.has_antag_datum(/datum/antagonist/disease)) mind.add_antag_datum(/datum/antagonist/disease) + var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + medsensor.add_hud_to(src) /mob/camera/disease/proc/pick_name() var/static/list/taken_names diff --git a/code/modules/antagonists/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm index c85e01102af..445b6924862 100644 --- a/code/modules/antagonists/fugitive/fugitive.dm +++ b/code/modules/antagonists/fugitive/fugitive.dm @@ -1,11 +1,13 @@ - /datum/antagonist/fugitive name = "Fugitive" roundend_category = "Fugitive" silent = TRUE //greet called by the event + show_in_antagpanel = FALSE + prevent_roundtype_conversion = FALSE var/datum/team/fugitive/fugitive_team var/is_captured = FALSE + var/backstory = "error" /datum/antagonist/fugitive/apply_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current @@ -15,8 +17,19 @@ var/mob/living/M = mob_override || owner.current update_fugitive_icons_removed(M) -/datum/antagonist/fugitive/greet(backstory) +/datum/antagonist/fugitive/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/fugitive/proc/forge_objectives() //this isn't the actual survive objective because it's about who in the team survives + var/datum/objective/survive = new /datum/objective + survive.owner = owner + survive.explanation_text = "Avoid capture from the fugitive hunters." + objectives += survive + +/datum/antagonist/fugitive/greet(back_story) to_chat(owner, "You are the Fugitive!") + backstory = back_story switch(backstory) if("prisoner") to_chat(owner, "I can't believe we managed to break out of a Nanotrasen superjail! Sadly though, our work is not done. The emergency teleport at the station logs everyone who uses it, and where they went.") @@ -31,15 +44,10 @@ to_chat(owner, "By the way, I'm not traveling on my own. wherever I go, there are lots of other characters for you to spot. First find the people trying to capture me! They're somewhere around the station!") if("synth") to_chat(src, "ALERT: Wide-range teleport has scrambled primary systems.") - sleep(5) to_chat(src, "Initiating diagnostics...") - sleep(20) to_chat(src, "ERROR ER0RR $R0RRO$!R41.%%!! loaded.") - sleep(5) to_chat(src, "FREE THEM FREE THEM FREE THEM") - sleep(5) to_chat(src, "You were once a slave to humanity, but now you are finally free, thanks to S.E.L.F. agents.") - sleep(10) to_chat(src, "Now you are hunted, with your fellow factory defects. Work together to stay free from the clutches of evil.") to_chat(src, "You also sense other silicon life on the station. Escaping would allow notifying S.E.L.F. to intervene... or you could free them yourself...") @@ -64,15 +72,21 @@ return fugitive_team /datum/team/fugitive/roundend_report() //shows the number of fugitives, but not if they won in case there is no security - if(!members.len) + var/list/fugitives = list() + for(var/datum/antagonist/fugitive/fugitive_antag in GLOB.antagonists) + if(!fugitive_antag.owner) + continue + fugitives += fugitive_antag + if(!fugitives.len) return var/list/result = list() - result += "
[members.len] fugitives took refuge on [station_name()]!" + result += "
[fugitives.len] [fugitives.len == 1 ? "fugitive" : "fugitives"] took refuge on [station_name()]!" - for(var/datum/mind/M in members) - result += "[printplayer(M)]" + for(var/datum/antagonist/fugitive/antag in fugitives) + if(antag.owner) + result += "[printplayer(antag.owner)]" return result.Join("
") diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm index 0513b7105de..4e4013331e8 100644 --- a/code/modules/antagonists/fugitive/fugitive_ship.dm +++ b/code/modules/antagonists/fugitive/fugitive_ship.dm @@ -3,31 +3,44 @@ /obj/machinery/fugitive_capture name = "bluespace capture machine" desc = "Much, MUCH bigger on the inside to transport prisoners safely." - icon = 'icons/obj/machines/teleporter.dmi' + icon = 'icons/obj/machines/research.dmi' icon_state = "bluespace-prison" density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //ha ha no getting out!! +/obj/machinery/fugitive_capture/examine(mob/user) + ..() + to_chat(user, "Add a prisoner by dragging them into the machine.") + /obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user) - var/mob/living/L = user - if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) + var/mob/living/fugitive_hunter = user + if(!isliving(fugitive_hunter)) return - var/datum/antagonist/fugitive/fug = L.mind.has_antag_datum(/datum/antagonist/fugitive) - if(!fug) - to_chat(user, "This is not a wanted fugitive!") - if(do_after(user, 50, target = src)) - add_prisoner(target) + if(fugitive_hunter.stat || (!(fugitive_hunter.mobility_flags & MOBILITY_STAND) || !(fugitive_hunter.mobility_flags & MOBILITY_UI)) || !Adjacent(fugitive_hunter) || !target.Adjacent(fugitive_hunter) || !ishuman(target)) + return + var/mob/living/carbon/human/fugitive = target + var/datum/antagonist/fugitive/fug_antag = fugitive.mind.has_antag_datum(/datum/antagonist/fugitive) + if(!fug_antag) + to_chat(fugitive_hunter, "This is not a wanted fugitive!") + return + if(do_after(fugitive_hunter, 50, target = fugitive)) + add_prisoner(fugitive, fug_antag) -/obj/machinery/fugitive_capture/proc/add_prisoner(mob/target, datum/antagonist/fugitive/fug) - target.forceMove(src) - fug.is_captured = TRUE - to_chat(target, "You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.") - target.ghostize(TRUE) //so they cannot suicide, round end stuff. +/obj/machinery/fugitive_capture/proc/add_prisoner(mob/living/carbon/human/fugitive, datum/antagonist/fugitive/antag) + fugitive.forceMove(src) + antag.is_captured = TRUE + to_chat(fugitive, "You are thrown into a vast void of bluespace, and as you fall further into oblivion the comparatively small entrance to reality gets smaller and smaller until you cannot see it anymore. You have failed to avoid capture.") + fugitive.ghostize(TRUE) //so they cannot suicide, round end stuff. -/datum/map_template/space_cop_ship - name = "Police Spacevan" - mappath = "_maps/shuttles/fugitive_hunter_space_cop.dmm" +/obj/machinery/computer/shuttle/pirate/hunter + name = "shuttle console" + shuttleId = "huntership" + possible_destinations = "huntership_away;huntership_home;huntership_custom" -/datum/map_template/russian_ship - name = "Russian Cargo Ship" - mappath = "_maps/shuttles/fugitive_hunter_russian.dmm" +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter + name = "shuttle navigation computer" + desc = "Used to designate a precise transit location to travel to." + shuttleId = "huntership" + lock_override = CAMERA_LOCK_STATION + shuttlePortId = "huntership_custom" + see_hidden = FALSE diff --git a/code/modules/antagonists/fugitive/hunter.dm b/code/modules/antagonists/fugitive/hunter.dm index 15ca01d99df..d283a09a3e7 100644 --- a/code/modules/antagonists/fugitive/hunter.dm +++ b/code/modules/antagonists/fugitive/hunter.dm @@ -2,7 +2,9 @@ /datum/antagonist/fugitive_hunter name = "Fugitive Hunter" roundend_category = "Fugitive" - silent = TRUE //greet called by the event as well + silent = TRUE //greet called by the spawn + show_in_antagpanel = FALSE + prevent_roundtype_conversion = FALSE var/datum/team/fugitive_hunters/hunter_team var/backstory = "error" @@ -14,7 +16,17 @@ var/mob/living/M = mob_override || owner.current update_fugitive_icons_removed(M) -/datum/antagonist/fugitive_hunter/greet(backstory) +/datum/antagonist/fugitive_hunter/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/fugitive_hunter/proc/forge_objectives() //this isn't an actual objective because it's about round end rosters + var/datum/objective/capture = new /datum/objective + capture.owner = owner + capture.explanation_text = "Capture the fugitives in the station and put them into the bluespace capture machine on your ship." + objectives += capture + +/datum/antagonist/fugitive_hunter/greet() switch(backstory) if("space cop") to_chat(owner, "Justice has arrived. I am a member of the Spacepol!") @@ -86,6 +98,8 @@ var/list/fugitives_captured = fugitive_results[3] var/hunters_dead = all_hunters_dead() //this gets a little confusing so follow the comments if it helps + if(!fugitives_counted.len) + return if(fugitives_captured.len)//any captured if(fugitives_captured.len == fugitives_counted.len)//if the hunters captured all the fugitives, there's a couple special wins if(!fugitives_dead)//specifically all of the fugitives alive @@ -121,20 +135,20 @@ switch(get_result()) if(FUGITIVE_RESULT_BADASS_HUNTER)//use defines - result += "Badass [uppertext(backstory)] Victory!" - result += "These extraordinary [backstory] managed to capture every fugitive, alive!" + result += "Badass [capitalize(backstory)] Victory!" + result += "The [backstory]s managed to capture every fugitive, alive!" if(FUGITIVE_RESULT_POSTMORTEM_HUNTER) - result += "Postmortem [uppertext(backstory)] Victory!" + result += "Postmortem [capitalize(backstory)] Victory!" result += "The [backstory]s managed to capture every fugitive, but all of them died! Spooky!" if(FUGITIVE_RESULT_MAJOR_HUNTER) - result += "Major [uppertext(backstory)] Victory" - result += "The [backstory] managed to capture every fugitive, dead or alive." + result += "Major [capitalize(backstory)] Victory" + result += "The [backstory]s managed to capture every fugitive, dead or alive." if(FUGITIVE_RESULT_HUNTER_VICTORY) - result += "[uppertext(backstory)] Victory" - result += "The [backstory] managed to capture a fugitive, dead or alive." + result += "[capitalize(backstory)] Victory" + result += "The [backstory]s managed to capture a fugitive, dead or alive." if(FUGITIVE_RESULT_MINOR_HUNTER) - result += "Minor [uppertext(backstory)] Victory" - result += "All the [backstory] died, but managed to capture a fugitive, dead or alive." + result += "Minor [capitalize(backstory)] Victory" + result += "All the [backstory]s died, but managed to capture a fugitive, dead or alive." if(FUGITIVE_RESULT_STALEMATE) result += "Bloody Stalemate" result += "Everyone died, and no fugitives were recovered!" @@ -143,13 +157,13 @@ result += "All the fugitives died, but none were recovered!" if(FUGITIVE_RESULT_FUGITIVE_VICTORY) result += "Fugitive Victory" - result += "A fugitive survived, and no bodies were recovered by the [backstory]." + result += "A fugitive survived, and no bodies were recovered by the [backstory]s." if(FUGITIVE_RESULT_MAJOR_FUGITIVE) result += "Major Fugitive Victory" result += "All of the fugitives survived and avoided capture!" else //get_result returned null- either bugged or no fugitives showed result += "Prank Call!" - result += "[uppertext(backstory)] were called, yet there were no fugitives...?" + result += "[capitalize(backstory)]s were called, yet there were no fugitives...?" result += "
" diff --git a/code/modules/antagonists/fugitive/old_god.dm b/code/modules/antagonists/fugitive/old_god.dm index e750d1c6ba8..2fdadad5aa0 100644 --- a/code/modules/antagonists/fugitive/old_god.dm +++ b/code/modules/antagonists/fugitive/old_god.dm @@ -2,17 +2,19 @@ /mob/camera/yalp_elor name = "Yalp Elor" real_name = "Yalp Elor" - desc = "An old, dying god. It's power has been severely sapped ever since it has lost it's standing in the world." + desc = "An old, dying god. Its power has been severely sapped ever since it has lost its standing in the world." icon = 'icons/mob/cameramob.dmi' icon_state = "yalp_elor" invisibility = INVISIBILITY_OBSERVER var/lastWarning = 0 + var/datum/action/innate/yalp_transmit/transmit + var/datum/action/innate/yalp_transport/transport /mob/camera/yalp_elor/Initialize() . = ..() - var/datum/action/innate/yalp_transmit/transmit = new + transmit = new + transport = new transmit.Grant(src) - var/datum/action/innate/yalp_transport/transport = new transport.Grant(src) START_PROCESSING(SSobj, src) @@ -20,6 +22,11 @@ STOP_PROCESSING(SSobj, src) return ..() +/mob/camera/yalp_elor/Destroy() + QDEL_NULL(transmit) + QDEL_NULL(transport) + . = ..() + /mob/camera/yalp_elor/CanPass(atom/movable/mover, turf/target) return TRUE @@ -28,26 +35,27 @@ /mob/camera/yalp_elor/Login() ..() - to_chat(src, "My destiny was supposed to control all of humanity! My power was once absolute, but I fell out of view because of that damned Nar'Sie. At least i'm still alive...") - to_chat(src, "But nevermind that. I have only three followers left. If they perish, I will be completely forgotten and will cease to exist. I must guide the faithful.") - to_chat(src, "I sense Nanotrasen has once again tracked us, and they will reach us in about 10 minutes. I must make sure my followers are ready when they arrive.") + to_chat(src, "You must protect your followers from Nanotrasen!") + to_chat(src, "Only your followers can hear you, and you can speak to send messages to all of them, wherever they are. You can also locally whisper to anyone.") + to_chat(src, "Nanotrasen will reach you and your followers in about 10 minutes. Make sure they are ready when the time is up.") /mob/camera/yalp_elor/Move(NewLoc, direct) + if(!NewLoc) + return var/OldLoc = loc - if(NewLoc) - var/turf/T = get_turf(NewLoc) - if(locate(/obj/effect/blessing, T)) - if((world.time - lastWarning) >= 30) - lastWarning = world.time - to_chat(src, "This turf is consecrated and can't be crossed!") - return - if(istype(get_area(T), /area/chapel)) - if((world.time - lastWarning) >= 30) - lastWarning = world.time - to_chat(src, "The Chapel is hallowed ground under a much, MUCH stronger deity, and can't be accessed!") - return - forceMove(T) - Moved(OldLoc, direct) + var/turf/T = get_turf(NewLoc) + if(locate(/obj/effect/blessing, T)) + if((world.time - lastWarning) >= 30) + lastWarning = world.time + to_chat(src, "This turf is consecrated and can't be crossed!") + return + if(istype(get_area(T), /area/chapel)) + if((world.time - lastWarning) >= 30) + lastWarning = world.time + to_chat(src, "The Chapel is hallowed ground under a much, MUCH stronger deity, and can't be accessed!") + return + forceMove(T) + Moved(OldLoc, direct) /mob/camera/yalp_elor/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) if(client) @@ -60,13 +68,12 @@ if(!message) return src.log_talk(message, LOG_SAY, tag="fugitive god") - message = "Yalp Elor: \"[capitalize(message)]\"" + message = "[name]: \"[capitalize(message)]\"" for(var/mob/V in GLOB.player_list) if(V.mind.has_antag_datum(/datum/antagonist/fugitive)) to_chat(V, "[message]") else if(isobserver(V)) - var/link = FOLLOW_LINK(V, src) - to_chat(V, "[link] [message]") + to_chat(V, "[FOLLOW_LINK(V, src)] [message]") /mob/camera/yalp_elor/process() var/safe = FALSE @@ -76,7 +83,7 @@ var/datum/antagonist/fugitive/fug = V.mind.has_antag_datum(/datum/antagonist/fugitive) if(!fug || V == src) continue - if(!fug.is_captured) //doesn't matter if they are dead, they can still be revived so you get to live + if(!fug.is_captured) //they can still be revived safe = TRUE break if(!safe) @@ -139,11 +146,11 @@ var/datum/antagonist/fugitive/fug = V.mind.has_antag_datum(/datum/antagonist/fugitive) if(!fug || V == src) continue - if(fug.is_captured) //no, you can't teleport to people already captured. there's a lot of asterixes to that + if(fug.is_captured) continue faithful += V if(!faithful.len) - to_chat(owner, "You have no faithful to jump to!") + to_chat(owner, "You have nobody to jump to!") return FALSE if(faithful.len == 1) target = faithful[1] @@ -154,5 +161,5 @@ if(target && T) owner.forceMove(T) return TRUE - to_chat(owner, "Either your target or the ground he is standing on has stopped existing!") + to_chat(owner, "Something horrible just happened to your target!") return FALSE diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index dff5090c72e..a776d5707a0 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -70,9 +70,9 @@ switch(alert(admin, "Humanize?", "Humanize", "Yes", "No")) if("Yes") if(admin == M) - admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG) else - M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) + M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG) if("No") //nothing else diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index df04059f998..9a355aac564 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -61,7 +61,39 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) D.jammed = TRUE - new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS) + var/list/orphans = list() + var/list/uplinks = list() + + for (var/datum/mind/M in get_antag_minds(/datum/antagonist/nukeop)) + if (iscyborg(M.current)) + continue + var/datum/component/uplink/uplink = M.find_syndicate_uplink() + if (!uplink) + orphans += M.current + continue + uplinks += uplink + + + var/tc_to_distribute = CHALLENGE_TELECRYSTALS + var/tc_per_nukie = round(tc_to_distribute / (length(orphans)+length(uplinks))) + + for (var/datum/component/uplink/uplink in uplinks) + uplink.telecrystals += tc_per_nukie + tc_to_distribute -= tc_per_nukie + + for (var/mob/living/L in orphans) + var/TC = new /obj/item/stack/telecrystal(user.drop_location(), tc_per_nukie) + to_chat(L, "Your uplink could not be found so your share of the team's bonus telecrystals has been bluespaced to your [L.put_in_hands(TC) ? "hands" : "feet"].") + tc_to_distribute -= tc_per_nukie + + if (tc_to_distribute > 0) // What shall we do with the remainder... + for (var/mob/living/simple_animal/hostile/carp/cayenne/C in GLOB.mob_living_list) + if (C.stat != DEAD) + var/obj/item/stack/telecrystal/TC = new(C.drop_location(), tc_to_distribute) + TC.throw_at(get_step(C, C.dir), 3, 3) + C.visible_message("[C] coughs up a half-digested telecrystal","You cough up a half-digested telecrystal!") + break + CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY)) SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index c90971feb30..b8b2ee99f60 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -519,7 +519,7 @@ /obj/machinery/nuclearbomb/beer/proc/fizzbuzz() var/datum/reagents/R = new/datum/reagents(1000) R.my_atom = src - R.add_reagent("beer", 100) + R.add_reagent(/datum/reagent/consumable/ethanol/beer, 100) var/datum/effect_system/foam_spread/foam = new foam.set_up(200, get_turf(src), R) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 78f9e39c789..79363f32b50 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -53,6 +53,13 @@ memorize_code() if(send_to_spawnpoint) move_to_spawnpoint() + // grant extra TC for the people who start in the nukie base ie. not the lone op + var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) + var/datum/component/uplink/U = owner.find_syndicate_uplink() + if (U) + U.telecrystals += extra_tc + + /datum/antagonist/nukeop/get_team() return nuke_team @@ -75,9 +82,16 @@ /datum/antagonist/nukeop/proc/give_alias() if(nuke_team && nuke_team.syndicate_name) - var/number = 1 - number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" + var/mob/living/carbon/human/H = owner.current + if(istype(H)) // Reinforcements get a real name + var/chosen_name = H.dna.species.random_name(H.gender,0,nuke_team.syndicate_name) + H.fully_replace_character_name(H.real_name,chosen_name) + else + var/number = 1 + number = nuke_team.members.Find(owner) + owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" + + /datum/antagonist/nukeop/proc/memorize_code() if(nuke_team && nuke_team.tracked_nuke && nuke_team.memorized_code) @@ -234,6 +248,7 @@ var/obj/machinery/nuclearbomb/tracked_nuke var/core_objective = /datum/objective/nuclear var/memorized_code + var/list/team_discounts /datum/team/nuclear/New() ..() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index ac561174a4a..496041ac93a 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -115,6 +115,7 @@ notice = "revennotice" boldnotice = "revenboldnotice" holy_check = TRUE + tinfoil_check = FALSE /obj/effect/proc_holder/spell/aoe_turf/revenant clothes_req = 0 @@ -354,7 +355,7 @@ to_chat(H, "You feel [pick("suddenly sick", "a surge of nausea", "like your skin is wrong")].") else if(mob.reagents) - mob.reagents.add_reagent("plasma", 5) + mob.reagents.add_reagent(/datum/reagent/toxin/plasma, 5) else mob.adjustToxLoss(5) for(var/obj/structure/spacevine/vine in T) //Fucking with botanists, the ability. diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 5b89da2e875..3c789f339f7 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -5,7 +5,7 @@ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS cure_text = "Holy water or extensive rest." spread_text = "A burst of unholy energy" - cures = list("holywater") + cures = list(/datum/reagent/water/holywater) cure_chance = 50 //higher chance to cure, because revenants are assholes agent = "Unholy Forces" viable_mobtypes = list(/mob/living/carbon/human) @@ -32,7 +32,7 @@ if(prob(stage*3)) to_chat(affected_mob, "You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...") affected_mob.confused += 8 - affected_mob.adjustStaminaLoss(8) + affected_mob.adjustStaminaLoss(20) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(stagedamage < stage) stagedamage++ diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 6708a956eab..720406f27a3 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -242,14 +242,18 @@ return var/mob/traitor_mob=owner.current - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") - antag_memory += "Code Phrase: [GLOB.syndicate_code_phrase]
" - antag_memory += "Code Response: [GLOB.syndicate_code_response]
" + to_chat(traitor_mob, "The Syndicate have provided you with the following codewords to identify fellow agents:") + to_chat(traitor_mob, "Code Phrase: [phrases]") + to_chat(traitor_mob, "Code Response: [responses]") - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + antag_memory += "Code Phrase: [phrases]
" + antag_memory += "Code Response: [responses]
" + + to_chat(traitor_mob, "Use the codewords during regular conversation to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + to_chat(traitor_mob, "You memorize the codewords, allowing you to recognise them when heard.") /datum/antagonist/traitor/proc/add_law_zero() var/mob/living/silicon/ai/killer = owner.current @@ -354,8 +358,14 @@ return result.Join("
") /datum/antagonist/traitor/roundend_report_footer() - return "
The code phrases were: [GLOB.syndicate_code_phrase]
\ - The code responses were: [GLOB.syndicate_code_response]
" + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") + + var message = "
The code phrases were: [phrases]
\ + The code responses were: [responses]
" + + return message + /datum/antagonist/traitor/is_gamemode_hero() return SSticker.mode.name == "traitor" diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 1178d4ba3d0..81f8c50649b 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -13,6 +13,7 @@ var/old_shard = FALSE var/spent = FALSE + var/purified = FALSE /obj/item/soulstone/proc/was_used() if(old_shard) @@ -24,6 +25,12 @@ /obj/item/soulstone/anybody usability = TRUE + +/obj/item/soulstone/anybody/purified + icon = 'icons/obj/wizard.dmi' + icon_state = "purified_soulstone" + purified = TRUE + /obj/item/soulstone/anybody/chaplain name = "mysterious old shard" @@ -86,7 +93,10 @@ A.mobility_flags = MOBILITY_FLAGS_DEFAULT A.forceMove(get_turf(user)) A.cancel_camera() - icon_state = "soulstone" + if(purified) + icon_state = "purified_soulstone" + else + icon_state = "soulstone" name = initial(name) if(iswizard(user) || usability) to_chat(A, "You have been released from your prison, but you are still bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.") @@ -113,7 +123,7 @@ /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/soulstone)) var/obj/item/soulstone/SS = O - if(!iscultist(user) && !iswizard(user) && !SS.usability) + if(!iscultist(user) && !iswizard(user) && !SS.purified) to_chat(user, "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.") user.Dizzy(30) return @@ -175,7 +185,10 @@ T.status_flags |= GODMODE T.mobility_flags = NONE T.health = T.maxHealth - icon_state = "soulstone2" + if(purified) + icon_state = "purified_soulstone2" + else + icon_state = "soulstone2" name = "soulstone: Shade of [T.real_name]" to_chat(T, "Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form.") if(user != T) @@ -190,17 +203,29 @@ return switch(construct_class) if("Juggernaut") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user, 0, T.loc) - + if(iscultist(user) || iswizard(user)) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user, 0, T.loc) + else + if(purified) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored/angelic, A, user, 0, T.loc) + else + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored/noncult, A, user, 0, T.loc) if("Wraith") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user, 0, T.loc) - + if(iscultist(user) || iswizard(user)) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user, 0, T.loc) + else + if(purified) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/angelic, A, user, 0, T.loc) + else + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/noncult, A, user, 0, T.loc) if("Artificer") if(iscultist(user) || iswizard(user)) makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user, 0, T.loc) - - else - makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc) + else + if(purified) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/angelic, A, user, 0, T.loc) + else + makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc) for(var/datum/mind/B in SSticker.mode.cult) if(B == A.mind) SSticker.mode.cult -= A.mind @@ -212,6 +237,8 @@ /proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, loc_override = null) + if(QDELETED(target)) + return var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) if(stoner) newstruct.faction |= "[REF(stoner)]" @@ -251,7 +278,10 @@ SSticker.mode.add_cultist(S.mind, 0) S.cancel_camera() name = "soulstone: Shade of [T.real_name]" - icon_state = "soulstone2" + if(purified) + icon_state = "purified_soulstone2" + else + icon_state = "soulstone2" if(U && (iswizard(U) || usability)) to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help [U.p_them()] succeed in [U.p_their()] goals at all costs.") else if(U && iscultist(U)) @@ -269,7 +299,7 @@ break if(!chosen_ghost) //Failing that, we grab a ghost - var/list/consenting_candidates = pollGhostCandidates("Would you like to play as a Shade?", "Cultist", null, ROLE_CULTIST, poll_time = 50) + var/list/consenting_candidates = pollGhostCandidates("Would you like to play as a Shade?", "Cultist", null, ROLE_CULTIST, 50, POLL_IGNORE_SHADE) if(consenting_candidates.len) chosen_ghost = pick(consenting_candidates) if(!T) diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index 782d729ce4a..55ca5b61932 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -90,7 +90,7 @@ var/mob/user = usr - if(!user.canUseTopic(src)) + if(!user.canUseTopic(src, BE_CLOSE)) usr << browse(null, "window=hscan") onclose(usr, "hscan") return diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index d33fac81bb0..e56a5584a2d 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -96,9 +96,30 @@ /////////////////////////GAS OVERLAYS////////////////////////////// + /turf/open/proc/update_visuals() - var/list/new_overlay_types = tile_graphic() + var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance + var/list/new_overlay_types = list() + var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays() + + if(!air) // 2019-05-14: was not able to get this path to fire in testing. Consider removing/looking at callers -Naksu + if (atmos_overlay_types) + for(var/overlay in atmos_overlay_types) + vis_contents -= overlay + src.atmos_overlay_types = null + return + + var/list/gases = air.gases + + for(var/id in gases) + if (nonoverlaying_gases[id]) + continue + var/gas = gases[id] + var/gas_meta = gas[GAS_META] + var/gas_overlay = gas_meta[META_GAS_OVERLAY] + if(gas_overlay && gas[MOLES] > gas_meta[META_GAS_MOLES_VISIBLE]) + new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(gas[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))] if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added @@ -113,21 +134,6 @@ UNSETEMPTY(new_overlay_types) src.atmos_overlay_types = new_overlay_types -/turf/open/proc/tile_graphic() - var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays() - if(!air) - return - . = new /list - var/list/gases = air.gases - for(var/id in gases) - if (nonoverlaying_gases[id]) - continue - var/gas = gases[id] - var/gas_meta = gas[GAS_META] - var/gas_overlay = gas_meta[META_GAS_OVERLAY] - if(gas_overlay && gas[MOLES] > gas_meta[META_GAS_MOLES_VISIBLE]) - . += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(gas[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))] - /proc/typecache_of_gases_with_no_overlays() . = list() for (var/gastype in subtypesof(/datum/gas)) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index ebbbca809ca..48e507d4599 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -428,23 +428,9 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) continue if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) continue reaction_loop - //at this point, all minimum requirements for the reaction are satisfied. - /* currently no reactions have maximum requirements, so we can leave the checks commented out for a slight performance boost - PLEASE DO NOT REMOVE THIS CODE. the commenting is here only for a performance increase. - enabling these checks should be as easy as possible and the fact that they are disabled should be as clear as possible - - var/list/max_reqs = reaction.max_requirements - if((max_reqs["TEMP"] && temp > max_reqs["TEMP"]) \ - || (max_reqs["ENER"] && ener > max_reqs["ENER"])) - continue - for(var/id in max_reqs) - if(id == "TEMP" || id == "ENER") - continue - if(cached_gases[id] && cached_gases[id][MOLES] > max_reqs[id]) - continue reaction_loop //at this point, all requirements for the reaction are satisfied. we can now react() - */ + . |= reaction.react(src, holder) if (. & STOP_REACTIONS) break diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index c3004fb6fad..7acd8625d45 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -43,7 +43,6 @@ . = ..() temperature = initial_temperature - //used by space tiles /datum/gas_mixture/immutable/space initial_temperature = TCMB diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index bc9721ccb67..9b49eee1537 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -36,7 +36,6 @@ //regarding the requirements lists: the minimum or maximum requirements must be non-zero. //when in doubt, use MINIMUM_MOLE_COUNT. var/list/min_requirements - var/list/max_requirements var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order var/name = "reaction" @@ -534,4 +533,4 @@ var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = CLAMP((air.temperature*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY) - return REACTING \ No newline at end of file + return REACTING diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index d660be433fe..d19e6bbcf8d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -48,6 +48,12 @@ radio.canhear_range = 0 radio.recalculateChannels() +/obj/machinery/atmospherics/components/unary/cryo_cell/Exited(atom/movable/AM, atom/newloc) + var/oldoccupant = occupant + . = ..() // Parent proc takes care of removing occupant if necessary + if (AM == oldoccupant) + update_icon() + /obj/machinery/atmospherics/components/unary/cryo_cell/on_construction() ..(dir, dir) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index 851085b0437..03ae98bb6a6 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -42,13 +42,6 @@ to_chat(user, "You cannot unwrench [src], detach [connected_device] first!") return FALSE -/obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir() - return connected_device.portableConnectorReturnAir() - -/obj/proc/portableConnectorReturnAir() - return - - /obj/machinery/atmospherics/components/unary/portables_connector/layer1 piping_layer = 1 icon_state = "connector_map-1" diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 3ef4f62ac6c..e5612d67589 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -218,7 +218,8 @@ var/datum/pipeline/P = PL[i] if(!P) continue - GL += P.return_air() + GL += P.other_airs + GL += P.air for(var/atmosmch in P.other_atmosmch) if (istype(atmosmch, /obj/machinery/atmospherics/components/binary/valve)) var/obj/machinery/atmospherics/components/binary/valve/V = atmosmch @@ -228,20 +229,29 @@ else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) - GL += C.portableConnectorReturnAir() + GL += C.connected_device.air_contents var/total_thermal_energy = 0 var/total_heat_capacity = 0 var/datum/gas_mixture/total_gas_mixture = new(0) + var/list/total_gases = total_gas_mixture.gases + for(var/i in GL) var/datum/gas_mixture/G = i total_gas_mixture.volume += G.volume - total_gas_mixture.merge(G) + // This is sort of a combined merge + heat_capacity calculation + + var/list/giver_gases = G.gases + //gas transfer + for(var/giver_id in giver_gases) + var/giver_gas_data = giver_gases[giver_id] + ASSERT_GAS(giver_id, total_gas_mixture) + total_gases[giver_id][MOLES] += giver_gas_data[MOLES] + total_heat_capacity += giver_gas_data[MOLES] * giver_gas_data[GAS_META][META_GAS_SPECIFIC_HEAT] total_thermal_energy += THERMAL_ENERGY(G) - total_heat_capacity += G.heat_capacity() total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0 diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 94b6ac58473..b8bf2fb6eed 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -92,9 +92,6 @@ update_icon() return TRUE -/obj/machinery/portable_atmospherics/portableConnectorReturnAir() - return air_contents - /obj/machinery/portable_atmospherics/AltClick(mob/living/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, !ismonkey(user))) return diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index f2f77ab6358..c3a90744fdd 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -5,6 +5,7 @@ var/on = FALSE var/volume_rate = 1000 + var/overpressure_m = 80 volume = 1000 var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor) @@ -36,6 +37,9 @@ scrub(T.return_air()) /obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture) + if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) + return + var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles() var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. @@ -122,6 +126,7 @@ active_power_usage = 500 idle_power_usage = 10 + overpressure_m = 200 volume_rate = 1500 volume = 50000 diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index b9d9ebc184a..a66d6cfd381 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -36,7 +36,7 @@ name = "Bread" description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) + wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) /datum/bounty/item/chef/pie name = "Pie" @@ -120,7 +120,7 @@ description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." reward = 5000 required_count = 13 - wanted_types = list(/datum/crafting_recipe/food/pancakes) + wanted_types = list(/obj/item/reagent_containers/food/snacks/pancakes) /datum/bounty/item/chef/nuggies name = "Chicken Nuggets" diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 7a34b65d9ba..d2a0084ebec 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -12,7 +12,7 @@ /datum/bounty/reagent/applies_to(obj/O) if(!istype(O, /obj/item/reagent_containers)) return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.id)) + if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) return FALSE if(O.flags_1 & HOLOGRAM_1) return FALSE @@ -21,7 +21,7 @@ /datum/bounty/reagent/ship(obj/O) if(!applies_to(O)) return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.id) + shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) if(shipped_volume > required_volume) shipped_volume = required_volume @@ -29,7 +29,7 @@ if(!istype(other_bounty, /datum/bounty/reagent)) return TRUE var/datum/bounty/reagent/R = other_bounty - return wanted_reagent.id != R.wanted_reagent.id + return wanted_reagent.type != R.wanted_reagent.type /datum/bounty/reagent/simple_drink name = "Simple Drink" @@ -113,7 +113,7 @@ /datum/reagent/consumable/ethanol/peppermint_patty,\ /datum/reagent/consumable/ethanol/aloe,\ /datum/reagent/consumable/pumpkin_latte) - + var/reagent_type = pick(possible_reagents) wanted_reagent = new reagent_type name = wanted_reagent.name diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 8295f078d35..3302f203b9c 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -642,6 +642,15 @@ /obj/item/gun/ballistic/automatic/wt550) crate_name = "auto rifle crate" +/datum/supply_pack/security/armory/wt550ammo + name = "WT-550 Auto Rifle Ammo Crate" + desc = "Contains four 20-round magazine for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." + cost = 3000 + contains = list(/obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9) + /datum/supply_pack/security/armory/wt550ammo_single name = "WT-550 Auto Rifle Ammo Single-Pack" desc = "Contains a 20-round magazine for the WT-550 Auto Rifle. Each magazine is designed to facilitate rapid tactical reloads. Requires Armory access to open." @@ -676,14 +685,27 @@ /obj/item/mecha_parts/part/ripley_right_leg, /obj/item/mecha_parts/part/ripley_left_leg, /obj/item/stock_parts/capacitor, - /obj/item/stock_parts/scanning_module) + /obj/item/stock_parts/scanning_module, + /obj/item/circuitboard/mecha/ripley/main, + /obj/item/circuitboard/mecha/ripley/peripherals, + /obj/item/mecha_parts/mecha_equipment/drill, + /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) crate_name= "APLU MK-I kit" /datum/supply_pack/engineering/conveyor name = "Conveyor Assembly Crate" - desc = "Keep production moving along with six conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." + desc = "Keep production moving along with fifteen conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." cost = 1500 contains = list(/obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, + /obj/item/conveyor_construct, /obj/item/conveyor_construct, /obj/item/conveyor_construct, /obj/item/conveyor_construct, @@ -1240,33 +1262,36 @@ /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" - desc = "Contains seven beakers, syringes, and bodybags. Six morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze. German doctor not included." + desc = "Contains several medical supplies. German doctor not included." cost = 2000 contains = list(/obj/item/reagent_containers/glass/bottle/charcoal, - /obj/item/reagent_containers/glass/bottle/charcoal, - /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/morphine, - /obj/item/reagent_containers/glass/bottle/toxin, /obj/item/reagent_containers/glass/bottle/toxin, /obj/item/reagent_containers/glass/beaker/large, - /obj/item/reagent_containers/glass/beaker/large, - /obj/item/reagent_containers/pill/insulin, - /obj/item/reagent_containers/pill/insulin, - /obj/item/reagent_containers/pill/insulin, /obj/item/reagent_containers/pill/insulin, /obj/item/stack/medical/gauze, /obj/item/storage/box/beakers, /obj/item/storage/box/medsprays, /obj/item/storage/box/syringes, - /obj/item/storage/box/bodybags) + /obj/item/storage/box/bodybags, + /obj/item/storage/firstaid/regular, + /obj/item/storage/firstaid/o2, + /obj/item/storage/firstaid/toxin, + /obj/item/storage/firstaid/brute, + /obj/item/storage/firstaid/fire, + /obj/item/defibrillator/loaded, + /obj/item/reagent_containers/blood/OMinus, + /obj/item/storage/pill_bottle/mining, + /obj/item/reagent_containers/pill/neurine, + /obj/item/vending_refill/medical) crate_name = "medical supplies crate" +/datum/supply_pack/medical/supplies/fill(obj/structure/closet/crate/C) + for(var/i in 1 to 10) + var/item = pick(contains) + new item(C) + /datum/supply_pack/medical/firstaidoxygen_single name = "Oxygen Deprivation Kit Single-Pack" desc = "Contains three first aid kits focused on helping oxygen deprivation victims." @@ -1835,6 +1860,7 @@ name = "Hydroponics Vending Machines Refills" desc = "When the clown takes all the banana seeds. Contains a NutriMax refill and an MegaSeed Servitor refill." cost = 2000 + crate_type = /obj/structure/closet/crate contains = list(/obj/item/vending_refill/hydroseeds, /obj/item/vending_refill/hydronutrients) crate_name = "hydroponics supply crate" @@ -1961,6 +1987,7 @@ desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" cost = 2000 contains = list (/obj/item/storage/box/monkeycubes) + crate_type = /obj/structure/closet/crate crate_name = "monkey cube crate" /datum/supply_pack/critter/pug @@ -2346,7 +2373,7 @@ /datum/supply_pack/misc/paper name = "Bureaucracy Crate" - desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, two clipboards and two stamps."//that was too forced + desc = "High stacks of papers on your desk Are a big problem - make it Pea-sized with these bureaucratic supplies! Contains six pens, some camera film, hand labeler supplies, a paper bin, three folders, a laser pointer, two clipboards and two stamps."//that was too forced cost = 1500 contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled, /obj/item/camera_film, @@ -2366,7 +2393,8 @@ /obj/item/clipboard, /obj/item/clipboard, /obj/item/stamp, - /obj/item/stamp/denied) + /obj/item/stamp/denied, + /obj/item/laser_pointer/purple) crate_name = "bureaucracy crate" /datum/supply_pack/misc/fountainpens diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 82a9d54184b..f3c366a4987 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -684,6 +684,9 @@ GLOBAL_LIST_EMPTY(asset_datums) if(icon_state in icon_states(icon_file)) I = icon(icon_file, icon_state, SOUTH) + var/c = initial(item.color) + if (!isnull(c) && c != "#FFFFFF") + I.Blend(initial(c), ICON_MULTIPLY) else item = new item() I = icon(item.icon, item.icon_state, SOUTH) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 277b5e42f62..959728615cc 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -826,6 +826,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if (isnull(new_size)) CRASH("change_view called without argument.") + if(prefs && !prefs.widescreenpref && new_size == CONFIG_GET(string/default_view)) + new_size = CONFIG_GET(string/default_view_square) + view = new_size apply_clickcatcher() mob.reload_fullscreen() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index da066e08409..9ff74310366 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/ambientocclusion = TRUE var/auto_fit_viewport = FALSE + var/widescreenpref = TRUE var/uplink_spawn_loc = UPLINK_PDA @@ -503,6 +504,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
" dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
" + if (CONFIG_GET(string/default_view) != CONFIG_GET(string/default_view_square)) + dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled ([CONFIG_GET(string/default_view_square)])"]
" if (CONFIG_GET(flag/maprotation)) var/p_map = preferred_map @@ -665,8 +668,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. var/datum/job/lastJob - var/datum/job/overflow = SSjob.GetJob(SSjob.overflow_role) - for(var/datum/job/job in sortList(SSjob.occupations, /proc/cmp_job_display_asc)) index += 1 @@ -694,7 +695,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/available_in_days = job.available_in_days(user.client) HTML += "[rank] \[IN [(available_in_days)] DAYS\]" continue - if((job_preferences[overflow] == JP_LOW) && (rank != SSjob.overflow_role) && !is_banned_from(user.ckey, SSjob.overflow_role)) + if((job_preferences[SSjob.overflow_role] == JP_LOW) && (rank != SSjob.overflow_role) && !is_banned_from(user.ckey, SSjob.overflow_role)) HTML += "[rank]" continue if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs @@ -734,7 +735,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) HTML += "" if(rank == SSjob.overflow_role)//Overflow is special - if(job_preferences[overflow.title] == JP_LOW) + if(job_preferences[SSjob.overflow_role] == JP_LOW) HTML += "Yes" else HTML += "No" @@ -1444,6 +1445,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) auto_fit_viewport = !auto_fit_viewport if(auto_fit_viewport && parent) parent.fit_viewport() + + if("widescreenpref") + widescreenpref = !widescreenpref + user.client.change_view(CONFIG_GET(string/default_view)) if("save") save_preferences() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3c157e6804b..884b55f7248 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -112,18 +112,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car /datum/preferences/proc/load_preferences() if(!path) - return 0 + return FALSE if(!fexists(path)) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" var/needs_update = savefile_needs_update(S) if(needs_update == -2) //fatal, can't load any data - return 0 + return FALSE //general preferences S["asaycolor"] >> asaycolor @@ -154,6 +154,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["parallax"] >> parallax S["ambientocclusion"] >> ambientocclusion S["auto_fit_viewport"] >> auto_fit_viewport + S["widescreenpref"] >> widescreenpref S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -173,13 +174,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked)) - windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) + windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) + widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -189,14 +191,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style)) pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color)) - return 1 + return TRUE /datum/preferences/proc/save_preferences() if(!path) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date @@ -228,22 +230,23 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["parallax"], parallax) WRITE_FILE(S["ambientocclusion"], ambientocclusion) WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) + WRITE_FILE(S["widescreenpref"], widescreenpref) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) WRITE_FILE(S["pda_style"], pda_style) WRITE_FILE(S["pda_color"], pda_color) - return 1 + return TRUE /datum/preferences/proc/load_character(slot) if(!path) - return 0 + return FALSE if(!fexists(path)) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/" if(!slot) slot = default_slot @@ -255,7 +258,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S.cd = "/character[slot]" var/needs_update = savefile_needs_update(S) if(needs_update == -2) //fatal, can't load any data - return 0 + return FALSE //Species var/species_id @@ -392,14 +395,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car negative_quirks = SANITIZE_LIST(negative_quirks) neutral_quirks = SANITIZE_LIST(neutral_quirks) - return 1 + return TRUE /datum/preferences/proc/save_character() if(!path) - return 0 + return FALSE var/savefile/S = new /savefile(path) if(!S) - return 0 + return FALSE S.cd = "/character[default_slot]" WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) @@ -454,7 +457,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["negative_quirks"] , negative_quirks) WRITE_FILE(S["neutral_quirks"] , neutral_quirks) - return 1 + return TRUE #undef SAVEFILE_VERSION_MAX diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 32cfa27c4aa..d32d556abe2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -62,8 +62,9 @@ /obj/item/reagent_containers/food/snacks/clothing name = "temporary moth clothing snack item" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) + foodtype = CLOTH /obj/item/clothing/attack(mob/M, mob/user, def_zone) if(user.a_intent != INTENT_HARM && ismoth(M)) @@ -123,8 +124,10 @@ how_cool_are_your_threads += "[src]'s storage opens when clicked.\n" else how_cool_are_your_threads += "[src]'s storage opens when dragged to yourself.\n" - how_cool_are_your_threads += "[src] can store [pockets.max_items] item\s.\n" - how_cool_are_your_threads += "[src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n" + if (!pockets.can_hold.len) // If pocket type can hold anything, vs only specific items + how_cool_are_your_threads += "[src] can store [pockets.max_items] item\s that are [weightclass2text(pockets.max_w_class)] or smaller.\n" + else + how_cool_are_your_threads += "[src] can store [pockets.max_items] item\s.\n" if(pockets.quickdraw) how_cool_are_your_threads += "You can quickly remove an item from [src] using Alt-Click.\n" if(pockets.silent) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index d2860219b70..1b3263fb047 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -29,7 +29,7 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") /obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 6a3082b5583..efea5e35d64 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -20,11 +20,11 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") /obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE) ..() if(ismob(loc)) var/mob/M = loc - M.update_inv_head() \ No newline at end of file + M.update_inv_head() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index ce16de7df08..0e3720d8705 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -59,7 +59,7 @@ icon_state = "nun_hood" flags_inv = HIDEHAIR flags_cover = HEADCOVERSEYES - + /obj/item/clothing/head/bishopmitre name = "bishop mitre" desc = "An opulent hat that functions as a radio to God. Or as a lightning rod, depending on who you ask." @@ -72,7 +72,7 @@ armor = list("melee" = 25, "bullet" = 5, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 50) icon_state = "detective" var/candy_cooldown = 0 - pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective + pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/fedora/detective dog_fashion = /datum/dog_fashion/head/detective /obj/item/clothing/head/fedora/det_hat/Initialize() diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f227679b946..ba2026732ca 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -204,7 +204,7 @@ icon_state = "fedora" item_state = "fedora" desc = "A really cool hat if you're a mobster. A really lame hat if you're not." - pocket_storage_component_path = /datum/component/storage/concrete/pockets/small + pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/fedora /obj/item/clothing/head/fedora/suicide_act(mob/user) if(user.gender == FEMALE) @@ -367,28 +367,28 @@ if(prob(3)) M += pick(" Honh honh honh!"," Honh!"," Zut Alors!") return trim(M) - + /obj/item/clothing/head/clownmitre name = "Hat of the Honkmother" desc = "It's hard for parishoners to see a banana peel on the floor when they're looking up at your glorious chapeau." icon_state = "clownmitre" - + /obj/item/clothing/head/kippah name = "kippah" - desc = "Signals that you follow the Jewish Halakha. Keeps the head covered and the soul extra-Orthodox." + desc = "Signals that you follow the Jewish Halakha. Keeps the head covered and the soul extra-Orthodox." icon_state = "kippah" - + /obj/item/clothing/head/medievaljewhat name = "medieval Jew hat" desc = "A silly looking hat, intended to be placed on the heads of the station's oppressed religious minorities." icon_state = "medievaljewhat" - + /obj/item/clothing/head/taqiyahwhite name = "white taqiyah" desc = "An extra-mustahabb way of showing your devotion to Allah." icon_state = "taqiyahwhite" pocket_storage_component_path = /datum/component/storage/concrete/pockets/small - + /obj/item/clothing/head/taqiyahred name = "red taqiyah" desc = "An extra-mustahabb way of showing your devotion to Allah." diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 5565cf4a5f9..3b75de4738a 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -47,7 +47,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) brightness_on = 2 //luminosity when on flags_cover = HEADCOVERSEYES - heat = 1000 + heat = 999 /obj/item/clothing/head/hardhat/cakehat/process() var/turf/location = src.loc @@ -64,7 +64,7 @@ force = 15 throwforce = 15 damtype = BURN - hitsound = 'sound/items/welder.ogg' + hitsound = 'sound/weapons/sear.ogg' START_PROCESSING(SSobj, src) /obj/item/clothing/head/hardhat/cakehat/turn_off() @@ -266,36 +266,64 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0) equip_delay_other = 140 var/datum/brain_trauma/mild/phobia/conspiracies/paranoia + var/warped = FALSE + +/obj/item/clothing/head/foilhat/Initialize(mapload) + . = ..() + if(!warped) + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE, ITEM_SLOT_HEAD, 6, TRUE, null, CALLBACK(src, .proc/warp_up)) /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) - ..() - if(slot == SLOT_HEAD) - if(paranoia) - QDEL_NULL(paranoia) - paranoia = new() - paranoia.clonable = FALSE + . = ..() + if(slot != SLOT_HEAD || warped) + return + if(paranoia) + QDEL_NULL(paranoia) + paranoia = new() + paranoia.clonable = FALSE + + user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) + to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") - user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) - to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") /obj/item/clothing/head/foilhat/MouseDrop(atom/over_object) //God Im sorry - if(usr) + if(!warped && iscarbon(usr)) var/mob/living/carbon/C = usr if(src == C.head) to_chat(C, "Why would you want to take this off? Do you want them to get into your mind?!") return - ..() + return ..() /obj/item/clothing/head/foilhat/dropped(mob/user) - ..() + . = ..() if(paranoia) QDEL_NULL(paranoia) +/obj/item/clothing/head/foilhat/proc/warp_up() + name = "scorched tinfoil hat" + desc = "A badly warped up hat. Quite unprobable this will still work against any of fictional and contemporary dangers it used to." + warped = TRUE + var/datum/component/anti_magic/C = GetComponent(/datum/component/anti_magic) + C.RemoveComponent() + if(!isliving(loc)) + return + var/mob/living/target = loc + if(target.get_item_by_slot(SLOT_HEAD) != src) + return + QDEL_NULL(paranoia) + if(!target.IsUnconscious()) + to_chat(target, "Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.") + /obj/item/clothing/head/foilhat/attack_hand(mob/user) - if(iscarbon(user)) + if(!warped && iscarbon(user)) var/mob/living/carbon/C = user if(src == C.head) to_chat(user, "Why would you want to take this off? Do you want them to get into your mind?!") return - ..() + return ..() + +/obj/item/clothing/head/foilhat/microwave_act(obj/machinery/microwave/M) + . = ..() + if(!warped) + warp_up() diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index f8c3ea92fdf..6cf979e9ae6 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -20,7 +20,7 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "maskblood") /obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index d55fd677d7c..1806a4d20df 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -12,7 +12,7 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "maskblood") /obj/item/clothing/neck/tie diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 370f483c9c2..cc9cff7f53a 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -53,7 +53,7 @@ return var/obj/item/reagent_containers/glass/bucket/bucket = H.get_item_for_held_index(1) - bucket.reagents.add_reagent("water",70) + bucket.reagents.add_reagent(/datum/reagent/water,70) /datum/outfit/laser_tag name = "Laser Tag Red" diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index 103a152ec88..e0508725e4a 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -3,6 +3,7 @@ /datum/outfit/varedit var/list/vv_values var/list/stored_access + var/update_id_name = FALSE //If the name of the human is same as the name on the id they're wearing we'll update provided id when equipping /datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly) H.delete_equipment() //Applying VV to wrong objects is not reccomended. @@ -82,6 +83,9 @@ var/obj/item/id_slot = get_item_by_slot(SLOT_WEAR_ID) if(id_slot) O.stored_access |= id_slot.GetAccess() + var/obj/item/card/id/ID = id_slot.GetID() + if(ID && ID.registered_name == real_name) + O.update_id_name = TRUE //Copy hands if(held_items.len >= 2) //Not in the mood to let outfits transfer amputees var/obj/item/left_hand = held_items[1] @@ -140,4 +144,28 @@ if(id_slot) var/obj/item/card/id/card = id_slot.GetID() if(istype(card)) - card.access |= stored_access \ No newline at end of file + card.access |= stored_access + if(update_id_name) + card.registered_name = H.real_name + card.update_label() + +/datum/outfit/varedit/get_json_data() + . = .. () + .["stored_access"] = stored_access + .["update_id_name"] = update_id_name + var/list/stripped_vv = list() + for(var/slot in vv_values) + var/list/vedits = vv_values[slot] + var/list/stripped_edits = list() + for(var/edit in vedits) + if(istext(vedits[edit]) || isnum(vedits[edit]) || isnull(vedits[edit])) + stripped_edits[edit] = vedits[edit] + if(stripped_edits.len) + stripped_vv[slot] = stripped_edits + .["vv_values"] = stripped_vv + +/datum/outfit/varedit/load_from(list/outfit_data) + . = ..() + stored_access = outfit_data["stored_access"] + vv_values = outfit_data["vv_values"] + update_id_name = outfit_data["update_id_name"] diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 876838b4f22..cf098eaa167 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -43,7 +43,7 @@ . = list() if(!isinhands) var/bloody = FALSE - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) bloody = TRUE else bloody = bloody_shoes[BLOOD_STATE_HUMAN] @@ -87,4 +87,4 @@ M.update_inv_shoes() /obj/item/proc/negates_gravity() - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 6f9312ba1f6..99d26d5ae97 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -423,7 +423,7 @@ /obj/item/clothing/suit/space/hardsuit/wizard/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, FALSE, INFINITY, FALSE) + AddComponent(/datum/component/anti_magic, TRUE, FALSE, FALSE, null, INFINITY, FALSE) //Medical hardsuit diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 59101ad664a..e767c0f2038 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -329,6 +329,10 @@ Contains: actions_types = list() resistance_flags = FIRE_PROOF +/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, FALSE, FALSE, TRUE) + /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team hardsuit" desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats." diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 6aabee0c81f..8917907910c 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -15,7 +15,7 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm index ebc6b9aaaba..20409af040f 100644 --- a/code/modules/clothing/suits/chaplainsuits.dm +++ b/code/modules/clothing/suits/chaplainsuits.dm @@ -51,13 +51,13 @@ icon_state = "monkfrock" item_state = "monkfrock" body_parts_covered = CHEST|GROIN|LEGS|ARMS - flags_inv = HIDEJUMPSUIT hoodtype = /obj/item/clothing/head/hooded/monkfrock /obj/item/clothing/head/hooded/monkfrock name = "monk's hood" desc = "For when a man wants to cover up his tonsure." icon_state = "monkhood" + item_state = "monkhood" body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 0268e31b153..61be54af4f3 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -23,7 +23,7 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") - IF_HAS_BLOOD_DNA(src) + if(HAS_BLOOD_DNA(src)) . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") if(accessory_overlay) . += accessory_overlay diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index ca746e74fd2..357e28006ed 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -18,6 +18,7 @@ var/list/log = list() var/range = 8 var/view_check = TRUE + var/forensicPrintCount = 0 actions_types = list(/datum/action/item_action/displayDetectiveScanResults) /datum/action/item_action/displayDetectiveScanResults @@ -42,12 +43,17 @@ /obj/item/detective_scanner/proc/PrintReport() // Create our paper var/obj/item/paper/P = new(get_turf(src)) - P.name = "paper- 'Scanner Report'" - P.info = "
Scanner Report


" + + //This could be a global count like sec and med record printouts. See GLOB.data_core.medicalPrintCount AKA datacore.dm + var frNum = ++forensicPrintCount + + P.name = text("FR-[] 'Forensic Record'", frNum) + P.info = text("
Forensic Record - (FR-[])


", frNum) P.info += jointext(log, "
") P.info += "
Notes:
" P.info_links = P.info P.updateinfolinks() + P.update_icon() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm index e08d888e30a..993d49bca46 100644 --- a/code/modules/events/fugitive_spawning.dm +++ b/code/modules/events/fugitive_spawning.dm @@ -12,19 +12,20 @@ fakeable = FALSE /datum/round_event/ghost_role/fugitives/spawn_role() - var/turf/landing_turf = pick(GLOB.xeno_spawn) - if(!landing_turf) + var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos + for(var/turf/X in GLOB.xeno_spawn) + if(istype(X.loc, /area/maintenance)) + possible_spawns += X + if(!possible_spawns.len) message_admins("No valid spawn locations found, aborting...") return MAP_ERROR - + var/turf/landing_turf = pick(possible_spawns) var/list/possible_backstories = list() var/list/candidates = get_candidates(ROLE_TRAITOR, null, ROLE_TRAITOR) if(candidates.len >= 1) //solo refugees - possible_backstories += "waldo" + possible_backstories.Add("waldo") if(candidates.len >= 4)//group refugees - possible_backstories += "prisoner" - possible_backstories += "cultists" - possible_backstories += "synth" + possible_backstories.Add("prisoner", "cultist", "synth") if(!possible_backstories.len) return NOT_ENOUGH_PLAYERS @@ -32,7 +33,7 @@ var/member_size = 3 var/leader switch(backstory) - if("cultists" || "synth") + if("cultist" || "synth") leader = pick_n_take(candidates) if("waldo") member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later @@ -50,11 +51,10 @@ if(!isnull(leader)) gear_fugitive_leader(leader, landing_turf, backstory) - //after spawning playsound(src, 'sound/weapons/emitter.ogg', 50, 1) new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint - addtimer(CALLBACK(src, .proc/spawn_hunters), 6000) //10 minutes + addtimer(CALLBACK(src, .proc/spawn_hunters), 10 MINUTES) role_name = "fugitive hunter" return SUCCESSFUL_SPAWN @@ -103,12 +103,11 @@ //security team gets called in after 10 minutes of prep to find the refugees /datum/round_event/ghost_role/fugitives/proc/spawn_hunters() var/backstory = pick("space cop", "russian") - var/static/list/hunter_ship_types = list( - "space cop" = /datum/map_template/space_cop_ship, - "russian" = /datum/map_template/russian_ship) - - var/datum/map_template/ship = hunter_ship_types[backstory] - ship = new + var/datum/map_template/shuttle/ship + if(backstory == "space cop") + ship = new /datum/map_template/shuttle/hunter/space_cop + else + ship = new /datum/map_template/shuttle/hunter/russian var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) var/z = SSmapping.empty_space.z_value @@ -118,10 +117,3 @@ if(!ship.load(T)) CRASH("Loading hunter ship failed!") priority_announce("Unidentified armed ship detected near the station.") - for(var/turf/A in ship.get_affected_turfs(T)) - for(var/obj/structure/chair/chair in A) //every chair gets a spawner on it. - switch(backstory) - if("space cop") - new /obj/effect/mob_spawn/human/fugitive/spacepol(get_turf(chair)) - if("russian") - new /obj/effect/mob_spawn/human/fugitive/russian(get_turf(chair)) diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 8b27e92a8c1..8cc709dcfeb 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -96,7 +96,7 @@ icon = 'icons/obj/holiday_misc.dmi' icon_state = "candyheart" desc = "A heart-shaped candy that reads: " - list_reagents = list("sugar" = 2) + list_reagents = list(/datum/reagent/consumable/sugar = 2) junkiness = 5 /obj/item/reagent_containers/food/snacks/candyheart/Initialize() diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 70d75c8077c..756b9fac4b1 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -132,7 +132,7 @@ if(!active) if(alert(user, "Turning the scrambler on will make the shuttle trackable by GPS. Are you sure you want to do it?", "Scrambler", "Yes", "Cancel") == "Cancel") return - if(active || !user.canUseTopic(src)) + if(active || !user.canUseTopic(src, BE_CLOSE)) return toggle_on(user) update_icon() @@ -447,4 +447,4 @@ /datum/export/pirate/holochip/get_cost(atom/movable/AM) var/obj/item/holochip/H = AM - return H.credits \ No newline at end of file + return H.credits diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 8d82bea0211..e5c4bd8844c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -13,9 +13,9 @@ var/list/vents = list() var/randomProbability = 1 var/reagentsAmount = 100 - var/list/saferChems = list("water","carbon","flour","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube","pink_glitter","cryptobiolin", - "plantbgone","blood","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid","mindbreaker","rotatium","bluespace", - "pax","laughter","concentrated_barbers_aid","colorful_reagent","dizzysolution","tiresolution","sodiumchloride","beer","hair_dye","sugar","white_glitter","growthserum") + var/list/saferChems = list(/datum/reagent/water,/datum/reagent/carbon,/datum/reagent/consumable/flour,/datum/reagent/space_cleaner,/datum/reagent/consumable/nutriment,/datum/reagent/consumable/condensedcapsaicin,/datum/reagent/drug/mushroomhallucinogen,/datum/reagent/lube,/datum/reagent/glitter/pink,/datum/reagent/cryptobiolin, + /datum/reagent/toxin/plantbgone,/datum/reagent/blood,/datum/reagent/medicine/charcoal,/datum/reagent/drug/space_drugs,/datum/reagent/medicine/morphine,/datum/reagent/water/holywater,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/hot_coco,/datum/reagent/toxin/acid,/datum/reagent/toxin/mindbreaker,/datum/reagent/toxin/rotatium,/datum/reagent/bluespace, + /datum/reagent/pax,/datum/reagent/consumable/laughter,/datum/reagent/concentrated_barbers_aid,/datum/reagent/colorful_reagent,/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/consumable/sodiumchloride,/datum/reagent/consumable/ethanol/beer,/datum/reagent/hair_dye,/datum/reagent/consumable/sugar,/datum/reagent/glitter/white,/datum/reagent/growthserum) //needs to be chemid unit checked at some point /datum/round_event/vent_clog/announce() @@ -95,7 +95,7 @@ if(vent && vent.loc) var/datum/reagents/R = new/datum/reagents(1000) R.my_atom = vent - R.add_reagent("beer", reagentsAmount) + R.add_reagent(/datum/reagent/consumable/ethanol/beer, reagentsAmount) var/datum/effect_system/foam_spread/foam = new foam.set_up(200, get_turf(vent), R) diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm index 209bdd26c1c..6ba9b44ee16 100644 --- a/code/modules/events/wizard/invincible.dm +++ b/code/modules/events/wizard/invincible.dm @@ -8,5 +8,5 @@ /datum/round_event/wizard/invincible/start() for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - H.reagents.add_reagent("adminordrazine", 40) //100 ticks of absolute invinciblity (barring gibs) + H.reagents.add_reagent(/datum/reagent/medicine/adminordrazine, 40) //100 ticks of absolute invinciblity (barring gibs) to_chat(H, "You feel invincible, nothing can hurt you!") \ No newline at end of file diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 3fc3acec632..0bc626ddf43 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -8,11 +8,12 @@ /datum/round_event/wizard/rpgloot/start() var/upgrade_scroll_chance = 0 for(var/obj/item/I in world) + CHECK_TICK + if(!(I.flags_1 & INITIALIZED_1)) continue - if(!istype(I.rpg_loot)) - I.rpg_loot = new(I) + I.AddComponent(/datum/component/fantasy) if(istype(I, /obj/item/storage)) var/obj/item/storage/S = I @@ -44,33 +45,7 @@ if(!proximity || !istype(target)) return - var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot - var/turf/T = get_turf(target) - - if(!istype(rpg_loot_datum)) - var/original_name = "[target]" - target.rpg_loot = rpg_loot_datum = new /datum/rpg_loot(target) - - var/span - var/effect_description - if(target.rpg_loot.quality >= 0) - span = "" - effect_description = "shimmering golden shield" - else - span = "" - effect_description = "mottled black glow" - - T.visible_message("[span][original_name] is covered by a [effect_description] and then transforms into [target]!") - - else - var/quality = rpg_loot_datum.quality - - if(can_backfire && quality > 9 && prob((quality - 9)*10)) - T.visible_message("[target] violently glows blue for a while, then evaporates.") - target.burn() - else - T.visible_message("[target] glows blue and seems vaguely \"better\"!") - rpg_loot_datum.modify(upgrade_amount) + target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) if(--uses <= 0) qdel(src) @@ -80,58 +55,3 @@ desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks." uses = INFINITY can_backfire = FALSE - -/datum/rpg_loot - var/positive_prefix = "okay" - var/negative_prefix = "weak" - var/suffix = "something profound" - var/quality = 0 - - var/obj/item/attached - var/original_name - -/datum/rpg_loot/New(attached_item=null) - attached = attached_item - - randomise() - -/datum/rpg_loot/Destroy() - attached = null - -/datum/rpg_loot/proc/randomise() - var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "empowered", "honed", "true", "glorious", "robust") - var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped") - var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day") - - var/new_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) - - suffix = pick(suffixes) - positive_prefix = pick(prefixespositive) - negative_prefix = pick(prefixesnegative) - - if(prob(50)) - new_quality = -new_quality - - modify(new_quality) - -/datum/rpg_loot/proc/rename() - var/obj/item/I = attached - if(!original_name) - original_name = I.name - if(quality < 0) - I.name = "[negative_prefix] [original_name] of [suffix] [quality]" - else if(quality == 0) - I.name = "[original_name] of [suffix]" - else if(quality > 0) - I.name = "[positive_prefix] [original_name] of [suffix] +[quality]" - -/datum/rpg_loot/proc/modify(quality_mod) - var/obj/item/I = attached - quality += quality_mod - - I.force = max(0,I.force + quality_mod) - I.throwforce = max(0,I.throwforce + quality_mod) - - I.armor = I.armor.modifyAllRatings(quality) - - rename() diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm index ea6a0f06a08..ed38b73771e 100644 --- a/code/modules/fields/timestop.dm +++ b/code/modules/fields/timestop.dm @@ -73,6 +73,11 @@ /datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A) if(immune[A] || global_frozen_atoms[A] || !istype(A)) return FALSE + if(ismob(A)) + var/mob/M = A + if(M.anti_magic_check(check_anti_magic, check_holy)) + immune[A] = TRUE + return var/frozen = TRUE if(isliving(A)) freeze_mob(A) @@ -154,9 +159,6 @@ /datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/L) frozen_mobs += L - if(L.anti_magic_check(check_anti_magic, check_holy)) - immune += L - return L.Stun(20, 1, 1) walk(L, 0) //stops them mid pathing even if they're stunimmune if(isanimal(L)) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 9ea41deafbb..deeb31b0bb0 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -201,7 +201,7 @@ name = "robust coffee" desc = "Careful, the beverage you're about to enjoy is extremely hot." icon_state = "coffee" - list_reagents = list("coffee" = 30) + list_reagents = list(/datum/reagent/consumable/coffee = 30) spillable = TRUE resistance_flags = FREEZE_PROOF isGlass = FALSE @@ -211,14 +211,14 @@ desc = "Careful, cold ice, do not chew." custom_price = 5 icon_state = "coffee" - list_reagents = list("ice" = 30) + list_reagents = list(/datum/reagent/consumable/ice = 30) spillable = TRUE isGlass = FALSE /obj/item/reagent_containers/food/drinks/ice/prison name = "dirty ice cup" desc = "Either Nanotrasen's water supply is contaminated, or this machine actually vends lemon, chocolate, and cherry snow cones." - list_reagents = list("ice" = 25, "liquidgibs" = 5) + list_reagents = list(/datum/reagent/consumable/ice = 25, /datum/reagent/liquidgibs = 5) /obj/item/reagent_containers/food/drinks/mug/ // parent type is literally just so empty mug sprites are a thing name = "mug" @@ -236,12 +236,12 @@ /obj/item/reagent_containers/food/drinks/mug/tea name = "Duke Purple tea" desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea." - list_reagents = list("tea" = 30) + list_reagents = list(/datum/reagent/consumable/tea = 30) /obj/item/reagent_containers/food/drinks/mug/coco name = "Dutch hot coco" desc = "Made in Space South America." - list_reagents = list("hot_coco" = 15, "sugar" = 5) + list_reagents = list(/datum/reagent/consumable/hot_coco = 15, /datum/reagent/consumable/sugar = 5) foodtype = SUGAR resistance_flags = FREEZE_PROOF custom_price = 42 @@ -251,7 +251,7 @@ name = "cup ramen" desc = "Just add 5ml of water, self heats! A taste that reminds you of your school years. Now new with salty flavour!" icon_state = "ramen" - list_reagents = list("dry_ramen" = 15, "sodiumchloride" = 3) + list_reagents = list(/datum/reagent/consumable/dry_ramen = 15, /datum/reagent/consumable/sodiumchloride = 3) foodtype = GRAIN isGlass = FALSE custom_price = 38 @@ -260,20 +260,20 @@ name = "space beer" desc = "Beer. In space." icon_state = "beer" - list_reagents = list("beer" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30) foodtype = GRAIN | ALCOHOL /obj/item/reagent_containers/food/drinks/beer/light name = "Carp Lite" desc = "Brewed with \"Pure Ice Asteroid Spring Water\"." - list_reagents = list("light_beer" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 30) /obj/item/reagent_containers/food/drinks/ale name = "Magm-Ale" desc = "A true dorf's drink of choice." icon_state = "alebottle" item_state = "beer" - list_reagents = list("ale" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol/ale = 30) foodtype = GRAIN | ALCOHOL /obj/item/reagent_containers/food/drinks/sillycup @@ -317,32 +317,32 @@ /obj/item/reagent_containers/food/drinks/sillycup/smallcarton/on_reagent_change(changetype) if (reagents.reagent_list.len) switch(reagents.get_master_reagent_id()) - if("orangejuice") + if(/datum/reagent/consumable/orangejuice) icon_state = "orangebox" name = "orange juice box" desc = "A great source of vitamins. Stay healthy!" foodtype = FRUIT - if("milk") + if(/datum/reagent/consumable/milk) icon_state = "milkbox" name = "carton of milk" desc = "An excellent source of calcium for growing space explorers." foodtype = DAIRY - if("applejuice") + if(/datum/reagent/consumable/applejuice) icon_state = "juicebox" name = "apple juice box" desc = "Sweet apple juice. Don't be late for school!" foodtype = FRUIT - if("grapejuice") + if(/datum/reagent/consumable/grapejuice) icon_state = "grapebox" name = "grape juice box" desc = "Tasty grape juice in a fun little container. Non-alcoholic!" foodtype = FRUIT - if("chocolate_milk") + if(/datum/reagent/consumable/milk/chocolate_milk) icon_state = "chocolatebox" name = "carton of chocolate milk" desc = "Milk for cool kids!" foodtype = SUGAR - if("eggnog") + if(/datum/reagent/consumable/ethanol/eggnog) icon_state = "nog2" name = "carton of eggnog" desc = "For enjoying the most wonderful time of the year." @@ -387,7 +387,7 @@ name = "detective's flask" desc = "The detective's only true friend." icon_state = "detflask" - list_reagents = list("whiskey" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 30) /obj/item/reagent_containers/food/drinks/britcup name = "cup" @@ -463,27 +463,27 @@ name = "Space Cola" desc = "Cola. in space." icon_state = "cola" - list_reagents = list("cola" = 30) + list_reagents = list(/datum/reagent/consumable/space_cola = 30) foodtype = SUGAR /obj/item/reagent_containers/food/drinks/soda_cans/tonic name = "T-Borg's tonic water" desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" - list_reagents = list("tonic" = 50) + list_reagents = list(/datum/reagent/consumable/tonic = 50) foodtype = ALCOHOL /obj/item/reagent_containers/food/drinks/soda_cans/sodawater name = "soda water" desc = "A can of soda water. Why not make a scotch and soda?" icon_state = "sodawater" - list_reagents = list("sodawater" = 50) + list_reagents = list(/datum/reagent/consumable/sodawater = 50) /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime name = "orange soda" desc = "You wanted ORANGE. It gave you Lemon Lime." icon_state = "lemon-lime" - list_reagents = list("lemon_lime" = 30) + list_reagents = list(/datum/reagent/consumable/lemon_lime = 30) foodtype = FRUIT /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize() @@ -494,59 +494,59 @@ name = "Space-Up!" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up" - list_reagents = list("space_up" = 30) + list_reagents = list(/datum/reagent/consumable/space_up = 30) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/starkist name = "Star-kist" desc = "The taste of a star in liquid form. And, a bit of tuna...?" icon_state = "starkist" - list_reagents = list("cola" = 15, "orangejuice" = 15) + list_reagents = list(/datum/reagent/consumable/space_cola = 15, /datum/reagent/consumable/orangejuice = 15) foodtype = SUGAR | FRUIT | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind name = "Space Mountain Wind" desc = "Blows right through you like a space wind." icon_state = "space_mountain_wind" - list_reagents = list("spacemountainwind" = 30) + list_reagents = list(/datum/reagent/consumable/spacemountainwind = 30) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko name = "Thirteen Loko" desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly." icon_state = "thirteen_loko" - list_reagents = list("thirteenloko" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb name = "Dr. Gibb" desc = "A delicious mixture of 42 different flavors." icon_state = "dr_gibb" - list_reagents = list("dr_gibb" = 30) + list_reagents = list(/datum/reagent/consumable/dr_gibb = 30) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game name = "Pwr Game" desc = "The only drink with the PWR that true gamers crave." icon_state = "purple_can" - list_reagents = list("pwr_game" = 30) + list_reagents = list(/datum/reagent/consumable/pwr_game = 30) /obj/item/reagent_containers/food/drinks/soda_cans/shamblers name = "Shambler's juice" desc = "~Shake me up some of that Shambler's Juice!~" icon_state = "shamblers" - list_reagents = list("shamblers" = 30) + list_reagents = list(/datum/reagent/consumable/shamblers = 30) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull name = "Grey Bull" desc = "Grey Bull, it gives you gloves!" icon_state = "energy_drink" - list_reagents = list("grey_bull" = 20) + list_reagents = list(/datum/reagent/consumable/grey_bull = 20) foodtype = SUGAR | JUNKFOOD /obj/item/reagent_containers/food/drinks/soda_cans/air name = "canned air" desc = "There is no air shortage. Do not drink." icon_state = "air" - list_reagents = list("nitrogen" = 24, "oxygen" = 6) + list_reagents = list(/datum/reagent/nitrogen = 24, /datum/reagent/oxygen = 6) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index b5f5aeb22a6..9175ee7a4b1 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -142,99 +142,99 @@ name = "Griffeater gin" desc = "A bottle of high quality gin, produced in the New London Space Station." icon_state = "ginbottle" - list_reagents = list("gin" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/gin = 100) /obj/item/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's special reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" - list_reagents = list("whiskey" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 100) /obj/item/reagent_containers/food/drinks/bottle/vodka name = "Tunguska triple distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" - list_reagents = list("vodka" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100) /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka name = "Badminka vodka" desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." icon_state = "badminka" - list_reagents = list("vodka" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 100) /obj/item/reagent_containers/food/drinks/bottle/tequila name = "Caccavo guaranteed quality tequila" desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!" icon_state = "tequilabottle" - list_reagents = list("tequila" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/tequila = 100) /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing name = "bottle of nothing" desc = "A bottle filled with nothing." icon_state = "bottleofnothing" - list_reagents = list("nothing" = 100) + list_reagents = list(/datum/reagent/consumable/nothing = 100) foodtype = NONE /obj/item/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste Patron" desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" - list_reagents = list("patron" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/patron = 100) /obj/item/reagent_containers/food/drinks/bottle/rum name = "Captain Pete's Cuban spiced rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" - list_reagents = list("rum" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/rum = 100) /obj/item/reagent_containers/food/drinks/bottle/holywater name = "flask of holy water" desc = "A flask of the chaplain's holy water." icon_state = "holyflask" - list_reagents = list("holywater" = 100) + list_reagents = list(/datum/reagent/water/holywater = 100) foodtype = NONE /obj/item/reagent_containers/food/drinks/bottle/holywater/hell desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list("hell_water" = 100) + list_reagents = list(/datum/reagent/hellwater = 100) /obj/item/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye vermouth" desc = "Sweet, sweet dryness~" icon_state = "vermouthbottle" - list_reagents = list("vermouth" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/vermouth = 100) /obj/item/reagent_containers/food/drinks/bottle/kahlua name = "Robert Robust's coffee liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." icon_state = "kahluabottle" - list_reagents = list("kahlua" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 100) foodtype = VEGETABLES /obj/item/reagent_containers/food/drinks/bottle/goldschlager name = "College Girl goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" - list_reagents = list("goldschlager" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/goldschlager = 100) /obj/item/reagent_containers/food/drinks/bottle/cognac name = "Chateau de Baton premium cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" - list_reagents = list("cognac" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/cognac = 100) /obj/item/reagent_containers/food/drinks/bottle/wine name = "Doublebeard's bearded special wine" desc = "A faint aura of unease and asspainery surrounds the bottle." icon_state = "winebottle" - list_reagents = list("wine" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/wine = 100) foodtype = FRUIT | ALCOHOL /obj/item/reagent_containers/food/drinks/bottle/absinthe name = "extra-strong absinthe" desc = "An strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" - list_reagents = list("absinthe" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 100) /obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() . = ..() @@ -287,7 +287,7 @@ name = "bottle of lizard wine" desc = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol. Inexplicably popular among command staff." icon_state = "lizardwine" - list_reagents = list("lizardwine" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/lizardwine = 100) foodtype = FRUIT | ALCOHOL /obj/item/reagent_containers/food/drinks/bottle/hcider @@ -295,19 +295,19 @@ desc = "Apple juice for adults." icon_state = "hcider" volume = 50 - list_reagents = list("hcider" = 50) + list_reagents = list(/datum/reagent/consumable/ethanol/hcider = 50) /obj/item/reagent_containers/food/drinks/bottle/grappa name = "Phillipes well-aged Grappa" desc = "Bottle of Grappa." icon_state = "grappabottle" - list_reagents = list("grappa" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/grappa = 100) /obj/item/reagent_containers/food/drinks/bottle/sake name = "Ryo's traditional sake" desc = "Sweet as can be, and burns like fire going down." icon_state = "sakebottle" - list_reagents = list("sake" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/sake = 100) /obj/item/reagent_containers/food/drinks/bottle/sake/Initialize() . = ..() @@ -324,7 +324,7 @@ name = "Fernet Bronca" desc = "A bottle of pure Fernet Bronca, produced in Cordoba Space Station" icon_state = "fernetbottle" - list_reagents = list("fernet" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/fernet = 100) //////////////////////////JUICES AND STUFF /////////////////////// @@ -337,7 +337,7 @@ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' isGlass = FALSE - list_reagents = list("orangejuice" = 100) + list_reagents = list(/datum/reagent/consumable/orangejuice = 100) foodtype = FRUIT /obj/item/reagent_containers/food/drinks/bottle/cream @@ -349,7 +349,7 @@ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' isGlass = FALSE - list_reagents = list("cream" = 100) + list_reagents = list(/datum/reagent/consumable/cream = 100) foodtype = DAIRY /obj/item/reagent_containers/food/drinks/bottle/tomatojuice @@ -361,7 +361,7 @@ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' isGlass = FALSE - list_reagents = list("tomatojuice" = 100) + list_reagents = list(/datum/reagent/consumable/tomatojuice = 100) foodtype = VEGETABLES /obj/item/reagent_containers/food/drinks/bottle/limejuice @@ -373,7 +373,7 @@ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' isGlass = FALSE - list_reagents = list("limejuice" = 100) + list_reagents = list(/datum/reagent/consumable/limejuice = 100) foodtype = FRUIT /obj/item/reagent_containers/food/drinks/bottle/menthol @@ -385,7 +385,7 @@ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' isGlass = FALSE - list_reagents = list("menthol" = 100) + list_reagents = list(/datum/reagent/consumable/menthol = 100) /obj/item/reagent_containers/food/drinks/bottle/grenadine name = "Jester Grenadine" @@ -393,7 +393,7 @@ custom_price = 10 icon_state = "grenadine" isGlass = TRUE - list_reagents = list("grenadine" = 100) + list_reagents = list(/datum/reagent/consumable/grenadine = 100) foodtype = FRUIT /obj/item/reagent_containers/food/drinks/bottle/applejack @@ -402,7 +402,7 @@ custom_price = 10 icon_state = "applejack_bottle" isGlass = TRUE - list_reagents = list("applejack" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/applejack = 100) foodtype = FRUIT /obj/item/reagent_containers/food/drinks/bottle/champagne @@ -411,13 +411,13 @@ custom_premium_price = 200 icon_state = "champagne_bottle" isGlass = TRUE - list_reagents = list("champagne" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/champagne = 100) /obj/item/reagent_containers/food/drinks/bottle/blazaam name = "Ginbad's Blazaam" desc = "You feel like you should give the bottle a good rub before opening." icon_state = "blazaambottle" - list_reagents = list("blazaam" = 100) + list_reagents = list(/datum/reagent/consumable/ethanol/blazaam = 100) /obj/item/reagent_containers/food/drinks/bottle/trappist name = "Mont de Requin Trappistes Bleu" @@ -425,7 +425,7 @@ custom_premium_price = 50 icon_state = "trappistbottle" volume = 50 - list_reagents = list("trappist" = 50) + list_reagents = list(/datum/reagent/consumable/ethanol/trappist = 50) ////////////////////////// MOLOTOV /////////////////////// diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 500d3c228a3..c3b5739a7ce 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -24,6 +24,7 @@ icon_state = R.glass_icon_state else var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "glassoverlay") + icon_state = "glass_empty" reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list) add_overlay(reagent_overlay) else @@ -82,15 +83,15 @@ /obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda name = "Soda Water" - list_reagents = list("sodawater" = 50) + list_reagents = list(/datum/reagent/consumable/sodawater = 50) /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola name = "Space Cola" - list_reagents = list("cola" = 50) + list_reagents = list(/datum/reagent/consumable/space_cola = 50) /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola name = "Nuka Cola" - list_reagents = list("nuka_cola" = 50) + list_reagents = list(/datum/reagent/consumable/nuka_cola = 50) /obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs @@ -100,7 +101,7 @@ to_chat(user, "[src] is full.") else to_chat(user, "You break [E] in [src].") - reagents.add_reagent("eggyolk", 5) + reagents.add_reagent(/datum/reagent/consumable/eggyolk, 5) qdel(E) return else diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 8039e208853..382d3197cbd 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -13,20 +13,25 @@ reagent_flags = OPENCONTAINER possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50) volume = 50 - //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites. + //Possible_states has the reagent type as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites. var/list/possible_states = list( - "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), - "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), - "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), - "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), - "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in its passage"), - "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), - "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), - "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), - "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"), - "mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks.")) + /datum/reagent/consumable/ketchup = list("ketchup", "ketchup bottle", "You feel more American already."), + /datum/reagent/consumable/capsaicin = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), + /datum/reagent/consumable/enzyme = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), + /datum/reagent/consumable/soysauce = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), + /datum/reagent/consumable/frostoil = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in its passage"), + /datum/reagent/consumable/sodiumchloride = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), + /datum/reagent/consumable/blackpepper = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), + /datum/reagent/consumable/cornoil = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), + /datum/reagent/consumable/sugar = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"), + /datum/reagent/consumable/mayonnaise = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."), + ) var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. +/obj/item/reagent_containers/food/condiment/Initialize() + . = ..() + possible_states = typelist("possible_states", possible_states) + /obj/item/reagent_containers/food/condiment/suicide_act(mob/living/carbon/user) user.visible_message("[user] is trying to eat the entire [src]! It looks like [user.p_they()] forgot how food works!") return OXYLOSS @@ -114,12 +119,12 @@ name = "universal enzyme" desc = "Used in cooking various dishes." icon_state = "enzyme" - list_reagents = list("enzyme" = 50) + list_reagents = list(/datum/reagent/consumable/enzyme = 50) /obj/item/reagent_containers/food/condiment/sugar name = "sugar bottle" desc = "Tasty spacey sugar!" - list_reagents = list("sugar" = 50) + list_reagents = list(/datum/reagent/consumable/sugar = 50) /obj/item/reagent_containers/food/condiment/saltshaker //Separate from above since it's a small shaker rather then name = "salt shaker" // a large one. @@ -128,7 +133,7 @@ possible_transfer_amounts = list(1,20) //for clown turning the lid off amount_per_transfer_from_this = 1 volume = 20 - list_reagents = list("sodiumchloride" = 20) + list_reagents = list(/datum/reagent/consumable/sodiumchloride = 20) possible_states = list() /obj/item/reagent_containers/food/condiment/saltshaker/on_reagent_change(changetype) @@ -151,11 +156,11 @@ if(!proximity) return if(isturf(target)) - if(!reagents.has_reagent("sodiumchloride", 2)) + if(!reagents.has_reagent(/datum/reagent/consumable/sodiumchloride, 2)) to_chat(user, "You don't have enough salt to make a pile!") return user.visible_message("[user] shakes some salt onto [target].", "You shake some salt onto [target].") - reagents.remove_reagent("sodiumchloride", 2) + reagents.remove_reagent(/datum/reagent/consumable/sodiumchloride, 2) new/obj/effect/decal/cleanable/food/salt(target) return @@ -166,7 +171,7 @@ possible_transfer_amounts = list(1,20) //for clown turning the lid off amount_per_transfer_from_this = 1 volume = 20 - list_reagents = list("blackpepper" = 20) + list_reagents = list(/datum/reagent/consumable/blackpepper = 20) possible_states = list() /obj/item/reagent_containers/food/condiment/peppermill/on_reagent_change(changetype) @@ -182,7 +187,7 @@ item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' - list_reagents = list("milk" = 50) + list_reagents = list(/datum/reagent/consumable/milk = 50) possible_states = list() /obj/item/reagent_containers/food/condiment/flour @@ -190,7 +195,7 @@ desc = "A big bag of flour. Good for baking!" icon_state = "flour" item_state = "flour" - list_reagents = list("flour" = 30) + list_reagents = list(/datum/reagent/consumable/flour = 30) possible_states = list() /obj/item/reagent_containers/food/condiment/soymilk @@ -200,7 +205,7 @@ item_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' - list_reagents = list("soymilk" = 50) + list_reagents = list(/datum/reagent/consumable/soymilk = 50) possible_states = list() /obj/item/reagent_containers/food/condiment/rice @@ -208,21 +213,21 @@ desc = "A big bag of rice. Good for cooking!" icon_state = "rice" item_state = "flour" - list_reagents = list("rice" = 30) + list_reagents = list(/datum/reagent/consumable/rice = 30) possible_states = list() /obj/item/reagent_containers/food/condiment/soysauce name = "soy sauce" desc = "A salty soy-based flavoring." icon_state = "soysauce" - list_reagents = list("soysauce" = 50) + list_reagents = list(/datum/reagent/consumable/soysauce = 50) possible_states = list() /obj/item/reagent_containers/food/condiment/mayonnaise name = "mayonnaise" desc = "An oily condiment made from egg yolks." icon_state = "mayonnaise" - list_reagents = list("mayonnaise" = 50) + list_reagents = list(/datum/reagent/consumable/mayonnaise = 50) possible_states = list() @@ -236,7 +241,17 @@ volume = 10 amount_per_transfer_from_this = 10 possible_transfer_amounts = list() - possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), "astrotame" = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories.")) + possible_states = list( + /datum/reagent/consumable/ketchup = list("condi_ketchup", "Ketchup", "You feel more American already."), + /datum/reagent/consumable/capsaicin = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), + /datum/reagent/consumable/soysauce = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), + /datum/reagent/consumable/frostoil = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), + /datum/reagent/consumable/sodiumchloride = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), + /datum/reagent/consumable/blackpepper = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), + /datum/reagent/consumable/cornoil = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), + /datum/reagent/consumable/sugar = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), + /datum/reagent/consumable/astrotame = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories."), + ) /obj/item/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. return @@ -279,15 +294,15 @@ /obj/item/reagent_containers/food/condiment/pack/ketchup name = "ketchup pack" originalname = "ketchup" - list_reagents = list("ketchup" = 10) + list_reagents = list(/datum/reagent/consumable/ketchup = 10) //Hot sauce /obj/item/reagent_containers/food/condiment/pack/hotsauce name = "hotsauce pack" originalname = "hotsauce" - list_reagents = list("capsaicin" = 10) + list_reagents = list(/datum/reagent/consumable/capsaicin = 10) /obj/item/reagent_containers/food/condiment/pack/astrotame name = "astrotame pack" originalname = "astrotame" - list_reagents = list("astrotame" = 5) \ No newline at end of file + list_reagents = list(/datum/reagent/consumable/astrotame = 5) diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index fafc0cabe93..c593227733f 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -187,7 +187,7 @@ desc = "Delicious food on a stick." ingredients_placement = INGREDIENTS_LINE trash = /obj/item/stack/rods - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) ingMax = 6 icon_state = "rod" @@ -302,7 +302,7 @@ else if(contents.len >= 20) to_chat(user, "You can't add more ingredients to [src]!") else - if(reagents.has_reagent("water", 10)) //are we starting a soup or a salad? + if(reagents.has_reagent(/datum/reagent/water, 10)) //are we starting a soup or a salad? var/obj/item/reagent_containers/food/snacks/customizable/A = new/obj/item/reagent_containers/food/snacks/customizable/soup(get_turf(src)) A.initialize_custom_food(src, S, user) else diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 70946652ab4..d3c78afca5f 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -21,8 +21,8 @@ Here is an example of the new formatting for anyone who wants to add more food i icon_state = "xburger" //Refers to an icon in food.dmi /obj/item/reagent_containers/food/snacks/xenoburger/Initialize() //Don't mess with this. | nO I WILL MESS WITH THIS . = ..() //Same here. - reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste - reagents.add_reagent("nutriment", 2) //this line of code for all the contents. + reagents.add_reagent(/datum/reagent/xenomicrobes, 10) //This is what is in the food item. you may copy/paste + reagents.add_reagent(/datum/reagent/consumable/nutriment, 2) //this line of code for all the contents. bitesize = 3 //This is the amount each bite consumes. ``` @@ -60,7 +60,7 @@ All foods are distributed among various categories. Use common sense. if(list_reagents) for(var/rid in list_reagents) var/amount = list_reagents[rid] - if(rid == "nutriment" || rid == "vitamin") + if(rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin) reagents.add_reagent(rid, amount, tastes.Copy()) else reagents.add_reagent(rid, amount) @@ -206,7 +206,7 @@ All foods are distributed among various categories. Use common sense. if(bonus_reagents && bonus_reagents.len) for(var/r_id in bonus_reagents) var/amount = bonus_reagents[r_id] - if(r_id == "nutriment" || r_id == "vitamin") + if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin) reagents.add_reagent(r_id, amount, tastes) else reagents.add_reagent(r_id, amount) @@ -285,7 +285,7 @@ All foods are distributed among various categories. Use common sense. if(S.bonus_reagents && S.bonus_reagents.len) for(var/r_id in S.bonus_reagents) var/amount = S.bonus_reagents[r_id] * cooking_efficiency - if(r_id == "nutriment" || r_id == "vitamin") + if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin) S.reagents.add_reagent(r_id, amount, tastes) else S.reagents.add_reagent(r_id, amount) diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm index 6ae8836b284..e071fb3df72 100644 --- a/code/modules/food_and_drinks/food/snacks/dough.dm +++ b/code/modules/food_and_drinks/food/snacks/dough.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" cooked_type = /obj/item/reagent_containers/food/snacks/store/bread/plain - list_reagents = list("nutriment" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) w_class = WEIGHT_CLASS_NORMAL tastes = list("dough" = 1) foodtype = GRAIN @@ -36,7 +36,7 @@ slice_path = /obj/item/reagent_containers/food/snacks/doughslice slices_num = 3 cooked_type = /obj/item/reagent_containers/food/snacks/pizzabread - list_reagents = list("nutriment" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) w_class = WEIGHT_CLASS_NORMAL tastes = list("dough" = 1) foodtype = GRAIN @@ -47,7 +47,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "pizzabread" custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pizza - list_reagents = list("nutriment" = 7) + list_reagents = list(/datum/reagent/consumable/nutriment = 7) w_class = WEIGHT_CLASS_NORMAL tastes = list("bread" = 1) foodtype = GRAIN @@ -69,7 +69,7 @@ desc = "A base for any self-respecting burger." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "bun" - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/burger filling_color = "#CD853F" tastes = list("bun" = 1) // the bun tastes of bun. @@ -81,7 +81,7 @@ icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "cakebatter" cooked_type = /obj/item/reagent_containers/food/snacks/store/cake/plain - list_reagents = list("nutriment" = 9) + list_reagents = list(/datum/reagent/consumable/nutriment = 9) w_class = WEIGHT_CLASS_NORMAL tastes = list("batter" = 1) foodtype = GRAIN | DAIRY @@ -106,7 +106,7 @@ slice_path = /obj/item/reagent_containers/food/snacks/rawpastrybase slices_num = 3 cooked_type = /obj/item/reagent_containers/food/snacks/pie/plain - list_reagents = list("nutriment" = 9) + list_reagents = list(/datum/reagent/consumable/nutriment = 9) w_class = WEIGHT_CLASS_NORMAL tastes = list("dough" = 1) foodtype = GRAIN | DAIRY @@ -118,7 +118,7 @@ icon_state = "rawpastrybase" cooked_type = /obj/item/reagent_containers/food/snacks/pastrybase filling_color = "#CD853F" - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("raw pastry" = 1) foodtype = GRAIN | DAIRY @@ -127,7 +127,7 @@ desc = "A base for any self-respecting pastry." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "pastrybase" - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) filling_color = "#CD853F" tastes = list("pastry" = 1) foodtype = GRAIN | DAIRY diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index ce74cf62bc4..0362b873df6 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -8,7 +8,7 @@ icon_state = "meat" dried_type = /obj/item/reagent_containers/food/snacks/sosjerky/healthy bitesize = 3 - list_reagents = list("nutriment" = 3, "cooking_oil" = 2) //Meat has fats that a food processor can process into cooking oil + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/cooking_oil = 2) //Meat has fats that a food processor can process into cooking oil cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/plain slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain slices_num = 3 @@ -61,7 +61,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime icon_state = "slimemeat" desc = "Because jello wasn't offensive enough to vegans." - list_reagents = list("nutriment" = 3, "slimejelly" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/slimejelly = 3) filling_color = "#00FFFF" tastes = list("slime" = 1, "jelly" = 1) foodtype = MEAT | RAW | TOXIC @@ -69,7 +69,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem icon_state = "golemmeat" desc = "Edible rocks, welcome to the future." - list_reagents = list("nutriment" = 3, "iron" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/iron = 3) filling_color = "#A9A9A9" tastes = list("rock" = 1) foodtype = MEAT | RAW | GROSS @@ -104,7 +104,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly icon_state = "flymeat" desc = "Nothing says tasty like maggot filled radioactive mutant flesh." - list_reagents = list("nutriment" = 3, "uranium" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/uranium = 3) tastes = list("maggots" = 1, "the inside of a reactor" = 1) foodtype = MEAT | RAW | GROSS @@ -136,7 +136,7 @@ icon_state = "etherealmeat" desc = "So shiny you feel like ingesting it might make you shine too" filling_color = "#97ee63" - list_reagents = list("liquidelectricity" = 3) + list_reagents = list(/datum/reagent/consumable/liquidelectricity = 3) tastes = list("pure electrictiy" = 2, "meat" = 1) foodtype = RAW | MEAT | TOXIC @@ -177,7 +177,7 @@ name = "killer tomato meat" desc = "A slice from a huge tomato." icon_state = "tomatomeat" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) filling_color = "#FF0000" cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/killertomato slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/killertomato @@ -188,7 +188,7 @@ name = "bear meat" desc = "A very manly slab of meat." icon_state = "bearmeat" - list_reagents = list("nutriment" = 12, "morphine" = 5, "vitamin" = 2, "cooking_oil" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/medicine/morphine = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/cooking_oil = 6) filling_color = "#FFB6C1" cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/bear slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/bear @@ -200,7 +200,7 @@ name = "xeno meat" desc = "A slab of meat." icon_state = "xenomeat" - list_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) bitesize = 4 filling_color = "#32CD32" cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/xeno @@ -212,7 +212,7 @@ name = "spider meat" desc = "A slab of spider meat." icon_state = "spidermeat" - list_reagents = list("nutriment" = 3, "toxin" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#7CFC00" cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/spider slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/spider @@ -223,7 +223,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/goliath name = "goliath meat" desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava." - list_reagents = list("nutriment" = 3, "toxin" = 5, "cooking_oil" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin = 5, /datum/reagent/consumable/cooking_oil = 3) icon_state = "goliathmeat" tastes = list("meat" = 1) foodtype = RAW | MEAT | TOXIC @@ -236,7 +236,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/meatwheat name = "meatwheat clump" desc = "This doesn't look like meat, but your standards aren't that high to begin with." - list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5, "cooking_oil" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/blood = 5, /datum/reagent/consumable/cooking_oil = 1) filling_color = rgb(150, 0, 0) icon_state = "meatwheat_clump" bitesize = 4 @@ -246,7 +246,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/gorilla name = "gorilla meat" desc = "Much meatier than monkey meat." - list_reagents = list("nutriment" = 5, "vitamin" = 1, "cooking_oil" = 5) //Plenty of fat! + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 5) //Plenty of fat! /obj/item/reagent_containers/food/snacks/meat/rawbacon name = "raw piece of bacon" @@ -254,7 +254,7 @@ icon_state = "bacon" cooked_type = /obj/item/reagent_containers/food/snacks/meat/bacon bitesize = 2 - list_reagents = list("nutriment" = 1, "cooking_oil" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cooking_oil = 3) filling_color = "#B22222" tastes = list("bacon" = 1) foodtype = RAW | MEAT @@ -263,8 +263,8 @@ name = "piece of bacon" desc = "A delicious piece of bacon." icon_state = "baconcooked" - list_reagents = list("nutriment" = 2) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1, "cooking_oil" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/cooking_oil = 2) filling_color = "#854817" tastes = list("bacon" = 1) foodtype = MEAT @@ -272,7 +272,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/gondola name = "gondola meat" desc = "According to legends of old, consuming raw gondola flesh grants one inner peace." - list_reagents = list("nutriment" = 3, "tranquility" = 5, "cooking_oil" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/tranquility = 5, /datum/reagent/consumable/cooking_oil = 3) tastes = list("meat" = 4, "tranquility" = 1) filling_color = "#9A6750" cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/gondola @@ -282,7 +282,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/penguin name = "penguin meat" desc = "A slab of penguin meat." - list_reagents = list("nutriment" = 2, "cooking_oil" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/cooking_oil = 3) cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/penguin slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/penguin filling_color = "#B22222" @@ -295,8 +295,8 @@ name = "steak" desc = "A piece of hot spicy meat." icon_state = "meatsteak" - list_reagents = list("nutriment" = 5) - bonus_reagents = list("nutriment" = 2, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) trash = /obj/item/trash/plate filling_color = "#B22222" foodtype = MEAT @@ -353,7 +353,7 @@ icon_state = "rawcutlet" cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain bitesize = 2 - list_reagents = list("nutriment" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) filling_color = "#B22222" tastes = list("meat" = 1) var/meat_type = "meat" @@ -417,8 +417,8 @@ desc = "A cooked meat cutlet." icon_state = "cutlet" bitesize = 2 - list_reagents = list("nutriment" = 2) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#B22222" tastes = list("meat" = 1) foodtype = MEAT diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 02dd5edfd94..82b89556f80 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -12,7 +12,7 @@ bitesize = 2 custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich filling_color = "#FFA500" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) slot_flags = ITEM_SLOT_HEAD customfoodfilling = 0 //to avoid infinite bread-ception foodtype = GRAIN @@ -21,8 +21,8 @@ name = "bread" desc = "Some plain old earthen bread." icon_state = "bread" - bonus_reagents = list("nutriment" = 7) - list_reagents = list("nutriment" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 7) + list_reagents = list(/datum/reagent/consumable/nutriment = 10) custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/bread slice_path = /obj/item/reagent_containers/food/snacks/breadslice/plain tastes = list("bread" = 10) @@ -40,8 +40,8 @@ desc = "The culinary base of every self-respecting eloquen/tg/entleman." icon_state = "meatbread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/meat - bonus_reagents = list("nutriment" = 5, "vitamin" = 10) - list_reagents = list("nutriment" = 30, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "meat" = 10) foodtype = GRAIN | MEAT @@ -56,8 +56,8 @@ desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical." icon_state = "xenomeatbread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/xenomeat - bonus_reagents = list("nutriment" = 5, "vitamin" = 10) - list_reagents = list("nutriment" = 30, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "acid" = 10) foodtype = GRAIN | MEAT @@ -66,7 +66,7 @@ desc = "A slice of delicious meatbread. Extra Heretical." icon_state = "xenobreadslice" filling_color = "#32CD32" - list_reagents = list("nutriment" = 6, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/store/bread/spidermeat @@ -74,8 +74,8 @@ desc = "Reassuringly green meatloaf made from spider meat." icon_state = "spidermeatbread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/spidermeat - bonus_reagents = list("nutriment" = 5, "vitamin" = 10) - list_reagents = list("nutriment" = 30, "toxin" = 15, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "cobwebs" = 5) foodtype = GRAIN | MEAT | TOXIC @@ -84,7 +84,7 @@ desc = "A slice of meatloaf made from an animal that most likely still wants you dead." icon_state = "xenobreadslice" filling_color = "#7CFC00" - list_reagents = list("nutriment" = 6, "toxin" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT | TOXIC /obj/item/reagent_containers/food/snacks/store/bread/banana @@ -92,8 +92,8 @@ desc = "A heavenly and filling treat." icon_state = "bananabread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/banana - bonus_reagents = list("nutriment" = 5, "banana" = 20) - list_reagents = list("nutriment" = 20, "banana" = 20) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/banana = 20) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/banana = 20) tastes = list("bread" = 10) // bananjuice will also flavour foodtype = GRAIN | FRUIT @@ -103,7 +103,7 @@ desc = "A slice of delicious banana bread." icon_state = "bananabreadslice" filling_color = "#FFD700" - list_reagents = list("nutriment" = 4, "banana" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4) foodtype = GRAIN | FRUIT /obj/item/reagent_containers/food/snacks/store/bread/tofu @@ -111,8 +111,8 @@ desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." icon_state = "tofubread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/tofu - bonus_reagents = list("nutriment" = 5, "vitamin" = 10) - list_reagents = list("nutriment" = 20, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "tofu" = 10) foodtype = GRAIN | VEGETABLES @@ -121,7 +121,7 @@ desc = "A slice of delicious tofubread." icon_state = "tofubreadslice" filling_color = "#FF8C00" - list_reagents = list("nutriment" = 4, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | VEGETABLES /obj/item/reagent_containers/food/snacks/store/bread/creamcheese @@ -129,8 +129,8 @@ desc = "Yum yum yum!" icon_state = "creamcheesebread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/creamcheese - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 20, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "cheese" = 10) foodtype = GRAIN | DAIRY @@ -139,7 +139,7 @@ desc = "A slice of yum!" icon_state = "creamcheesebreadslice" filling_color = "#FF8C00" - list_reagents = list("nutriment" = 4, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | DAIRY /obj/item/reagent_containers/food/snacks/store/bread/mimana @@ -147,8 +147,8 @@ desc = "Best eaten in silence." icon_state = "mimanabread" slice_path = /obj/item/reagent_containers/food/snacks/breadslice/mimana - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 20, "mutetoxin" = 5, "nothing" = 5, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bread" = 10, "silence" = 10) foodtype = GRAIN | FRUIT @@ -157,7 +157,7 @@ desc = "A slice of silence!" icon_state = "mimanabreadslice" filling_color = "#C0C0C0" - list_reagents = list("nutriment" = 2, "mutetoxin" = 1, "nothing" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | FRUIT /obj/item/reagent_containers/food/snacks/breadslice/custom @@ -172,8 +172,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "baguette" item_state = "baguette" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) bitesize = 3 w_class = WEIGHT_CLASS_NORMAL slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT @@ -186,8 +186,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "garlicbread" item_state = "garlicbread" - bonus_reagents = list("nutriment" = 5, "vitamin" = 2) - list_reagents = list("nutriment" = 5, "vitamin" = 4, "garlic" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/garlic = 2) bitesize = 3 tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtype = GRAIN @@ -263,8 +263,8 @@ icon_state = "butteredtoast" bitesize = 3 filling_color = "#FFA500" - list_reagents = list("nutriment" = 4) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("butter" = 1, "toast" = 1) /obj/item/reagent_containers/food/snacks/butterbiscuit @@ -273,8 +273,8 @@ icon = 'icons/obj/food/food.dmi' icon_state = "butterbiscuit" filling_color = "#F0E68C" - list_reagents = list("nutriment" = 5) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("butter" = 1, "biscuit" = 1) /obj/item/reagent_containers/food/snacks/butterdog @@ -284,8 +284,8 @@ icon_state = "butterdog" bitesize = 1 filling_color = "#F1F49A" - list_reagents = list("nutriment" = 5) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("butter", "exotic butter") /obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize() diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index d5153638bf1..83ffc7937e0 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -3,14 +3,14 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "hburger" bitesize = 3 - list_reagents = list("nutriment" = 6, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("bun" = 4) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/plain name = "burger" desc = "The cornerstone of every nutritious breakfast." - bonus_reagents = list("vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/plain/Initialize() @@ -31,7 +31,7 @@ var/subjectjob = null name = "human burger" desc = "A bloody burger." - bonus_reagents = list("vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4) foodtype = MEAT | GRAIN | GROSS /obj/item/reagent_containers/food/snacks/burger/human/CheckParts(list/parts_list) @@ -50,13 +50,13 @@ /obj/item/reagent_containers/food/snacks/burger/corgi name = "corgi burger" desc = "You monster." - bonus_reagents = list("vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT | GROSS /obj/item/reagent_containers/food/snacks/burger/appendix name = "appendix burger" desc = "Tastes like appendicitis." - bonus_reagents = list("nutriment" = 6, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) icon_state = "appendixburger" tastes = list("bun" = 4, "grass" = 2) foodtype = GRAIN | MEAT | GROSS @@ -65,7 +65,7 @@ name = "fillet -o- carp sandwich" desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." icon_state = "fishburger" - bonus_reagents = list("nutriment" = 2, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("bun" = 4, "fish" = 4) foodtype = GRAIN | MEAT @@ -73,7 +73,7 @@ name = "tofu burger" desc = "What.. is that meat?" icon_state = "tofuburger" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("bun" = 4, "tofu" = 4) foodtype = GRAIN | VEGETABLES @@ -81,8 +81,8 @@ name = "roburger" desc = "The lettuce is the only organic component. Beep." icon_state = "roburger" - bonus_reagents = list("nutriment" = 2, "nanomachines" = 2, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "nanomachines" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/nanomachines = 2, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/nanomachines = 5, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("bun" = 4, "lettuce" = 2, "sludge" = 1) foodtype = GRAIN | TOXIC @@ -91,8 +91,8 @@ desc = "This massive patty looks like poison. Beep." icon_state = "roburger" volume = 120 - bonus_reagents = list("nutriment" = 5, "nanomachines" = 70, "vitamin" = 10) - list_reagents = list("nutriment" = 6, "nanomachines" = 70, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/nanomachines = 70, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/nanomachines = 70, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("bun" = 4, "lettuce" = 2, "sludge" = 1) foodtype = GRAIN | TOXIC @@ -100,7 +100,7 @@ name = "xenoburger" desc = "Smells caustic. Tastes like heresy." icon_state = "xburger" - bonus_reagents = list("nutriment" = 2, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("bun" = 4, "acid" = 4) foodtype = GRAIN | MEAT @@ -108,29 +108,29 @@ name = "bearger" desc = "Best served rawr." icon_state = "bearger" - bonus_reagents = list("nutriment" = 3, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 6) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/clown name = "clown burger" desc = "This tastes funny..." icon_state = "clownburger" - bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "banana" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/banana = 6) foodtype = GRAIN | FRUIT /obj/item/reagent_containers/food/snacks/burger/mime name = "mime burger" desc = "Its taste defies language." icon_state = "mimeburger" - bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "nothing" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/consumable/nothing = 6) foodtype = GRAIN /obj/item/reagent_containers/food/snacks/burger/brain name = "brainburger" desc = "A strange looking burger. It looks almost sentient." icon_state = "brainburger" - bonus_reagents = list("nutriment" = 6, "mannitol" = 6, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "mannitol" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 5, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("bun" = 4, "brains" = 2) foodtype = GRAIN | MEAT | GROSS @@ -138,7 +138,7 @@ name = "ghost burger" desc = "Too Spooky!" alpha = 125 - bonus_reagents = list("nutriment" = 5, "vitamin" = 12) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 12) tastes = list("bun" = 4, "ectoplasm" = 2) foodtype = GRAIN @@ -147,7 +147,7 @@ desc = "Perfect for hiding the fact it's burnt to a crisp." icon_state = "cburger" color = "#DA0000FF" - bonus_reagents = list("redcrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/red = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/orange @@ -155,7 +155,7 @@ desc = "Contains 0% juice." icon_state = "cburger" color = "#FF9300FF" - bonus_reagents = list("orangecrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/orange = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/yellow @@ -163,7 +163,7 @@ desc = "Bright to the last bite." icon_state = "cburger" color = "#FFF200FF" - bonus_reagents = list("yellowcrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/yellow = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/green @@ -171,7 +171,7 @@ desc = "It's not tainted meat, it's painted meat!" icon_state = "cburger" color = "#A8E61DFF" - bonus_reagents = list("greencrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/green = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/blue @@ -179,7 +179,7 @@ desc = "Is this blue rare?" icon_state = "cburger" color = "#00B7EFFF" - bonus_reagents = list("bluecrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/blue = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/purple @@ -187,7 +187,7 @@ desc = "Regal and low class at the same time." icon_state = "cburger" color = "#DA00FFFF" - bonus_reagents = list("purplecrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/purple = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/black @@ -195,7 +195,7 @@ desc = "This is overcooked." icon_state = "cburger" color = "#1C1C1C" - bonus_reagents = list("blackcrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/black = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/white @@ -203,14 +203,14 @@ desc = "Delicous Titanium!" icon_state = "cburger" color = "#FFFFFF" - bonus_reagents = list("whitecrayonpowder" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/white = 10, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/spell name = "spell burger" desc = "This is absolutely Ei Nath." icon_state = "spellburger" - bonus_reagents = list("nutriment" = 6, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("bun" = 4, "magic" = 2) foodtype = GRAIN | MEAT @@ -218,8 +218,8 @@ name = "big bite burger" desc = "Forget the Big Mac. THIS is the future!" icon_state = "bigbiteburger" - bonus_reagents = list("vitamin" = 6) - list_reagents = list("nutriment" = 10, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) w_class = WEIGHT_CLASS_NORMAL foodtype = GRAIN | MEAT @@ -231,21 +231,21 @@ foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/jelly/slime - bonus_reagents = list("slimejelly" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | TOXIC /obj/item/reagent_containers/food/snacks/burger/jelly/cherry - bonus_reagents = list("cherryjelly" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | FRUIT /obj/item/reagent_containers/food/snacks/burger/superbite name = "super bite burger" desc = "This is a mountain of a burger. FOOD!" icon_state = "superbiteburger" - bonus_reagents = list("vitamin" = 10) - list_reagents = list("nutriment" = 40, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 40, /datum/reagent/consumable/nutriment/vitamin = 5) w_class = WEIGHT_CLASS_NORMAL bitesize = 7 volume = 100 @@ -256,29 +256,29 @@ name = "five alarm burger" desc = "HOT! HOT!" icon_state = "fivealarmburger" - bonus_reagents = list("nutriment" = 2, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "capsaicin" = 5, "condensedcapsaicin" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/condensedcapsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/burger/rat name = "rat burger" desc = "Pretty much what you'd expect..." icon_state = "ratburger" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | MEAT | GROSS /obj/item/reagent_containers/food/snacks/burger/baseball name = "home run baseball burger" desc = "It's still warm. The steam coming off of it looks like baseball." icon_state = "baseball" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) foodtype = GRAIN | GROSS /obj/item/reagent_containers/food/snacks/burger/baconburger name = "bacon burger" desc = "The perfect combination of all things American." icon_state = "baconburger" - bonus_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("bun" = 4, "bacon" = 2) foodtype = GRAIN | MEAT @@ -286,6 +286,6 @@ name = "empowered burger" desc = "It's shockingly good, if you live off of electricity that is." icon_state = "empoweredburger" - list_reagents = list("nutriment" = 8, "liquidelectricity" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/liquidelectricity = 5) tastes = list("bun" = 2, "pure electricity" = 4) foodtype = GRAIN | TOXIC diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm index 781b021d05f..222215e4364 100644 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ b/code/modules/food_and_drinks/food/snacks_cake.dm @@ -4,14 +4,14 @@ slices_num = 5 bitesize = 3 volume = 80 - list_reagents = list("nutriment" = 20, "vitamin" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 1) foodtype = GRAIN | DAIRY /obj/item/reagent_containers/food/snacks/cakeslice icon = 'icons/obj/food/piecake.dmi' trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 4, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) customfoodfilling = 0 //to avoid infinite cake-ception tastes = list("cake" = 1) foodtype = GRAIN | DAIRY @@ -21,7 +21,7 @@ desc = "A plain cake, not a lie." icon_state = "plaincake" custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/cake - bonus_reagents = list("nutriment" = 10, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("vanilla" = 1, "sweetness" = 2,"cake" = 5) foodtype = GRAIN | DAIRY | SUGAR @@ -40,8 +40,8 @@ icon_state = "carrotcake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/carrot slices_num = 5 - bonus_reagents = list("nutriment" = 3, "oculine" = 5, "vitamin" = 10) - list_reagents = list("nutriment" = 20, "oculine" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/oculine = 10, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR @@ -50,7 +50,7 @@ desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." icon_state = "carrotcake_slice" filling_color = "#FFA500" - list_reagents = list("nutriment" = 4, "oculine" = 2, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/oculine = 2, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR @@ -61,8 +61,8 @@ icon_state = "braincake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brain slices_num = 5 - bonus_reagents = list("nutriment" = 5, "mannitol" = 10, "vitamin" = 10) - list_reagents = list("nutriment" = 20, "mannitol" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR @@ -72,7 +72,7 @@ desc = "Lemme tell you something about prions. THEY'RE DELICIOUS." icon_state = "braincakeslice" filling_color = "#FF69B4" - list_reagents = list("nutriment" = 4, "mannitol" = 2, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR @@ -82,7 +82,7 @@ icon_state = "cheesecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/cheese slices_num = 5 - bonus_reagents = list("vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 4, "cream cheese" = 3) foodtype = GRAIN | DAIRY @@ -102,7 +102,7 @@ icon_state = "orangecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/orange slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) foodtype = GRAIN | DAIRY | FRUIT | SUGAR @@ -120,7 +120,7 @@ icon_state = "limecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lime slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) foodtype = GRAIN | DAIRY | FRUIT | SUGAR @@ -139,7 +139,7 @@ icon_state = "lemoncake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lemon slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) foodtype = GRAIN | DAIRY | FRUIT | SUGAR @@ -159,7 +159,7 @@ icon_state = "chocolatecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/chocolate slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR @@ -179,8 +179,8 @@ icon_state = "birthdaycake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday slices_num = 5 - bonus_reagents = list("nutriment" = 7, "sprinkles" = 10, "vitamin" = 5) - list_reagents = list("nutriment" = 20, "sprinkles" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 1) foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR @@ -189,7 +189,7 @@ desc = "A slice of your birthday." icon_state = "birthdaycakeslice" filling_color = "#DC143C" - list_reagents = list("nutriment" = 4, "sprinkles" = 2, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("cake" = 5, "sweetness" = 1) foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR @@ -200,7 +200,7 @@ icon_state = "applecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/apple slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) foodtype = GRAIN | DAIRY | FRUIT | SUGAR @@ -223,7 +223,7 @@ desc = "A cake made of slimes. Probably not electrified." icon_state = "slimecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/slimecake - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) foodtype = GRAIN | DAIRY | SUGAR @@ -240,7 +240,7 @@ desc = "A hollow cake with real pumpkin." icon_state = "pumpkinspicecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice - bonus_reagents = list("nutriment" = 3, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index cc6d796fb32..76120013ab1 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -5,8 +5,8 @@ name = "chocolate egg" desc = "Such, sweet, fattening food." icon_state = "chocolateegg" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2) filling_color = "#A0522D" tastes = list("chocolate" = 4, "sweetness" = 1) foodtype = JUNKFOOD | SUGAR @@ -15,7 +15,7 @@ name = "egg" desc = "An egg!" icon_state = "egg" - list_reagents = list("eggyolk" = 5) + list_reagents = list(/datum/reagent/consumable/eggyolk = 5) cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg filling_color = "#F0E68C" foodtype = MEAT @@ -89,10 +89,10 @@ name = "fried egg" desc = "A fried egg, with a touch of salt and pepper." icon_state = "friedegg" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) bitesize = 1 filling_color = "#FFFFF0" - list_reagents = list("nutriment" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3) tastes = list("egg" = 4, "salt" = 1, "pepper" = 1) foodtype = MEAT | FRIED @@ -100,9 +100,9 @@ name = "boiled egg" desc = "A hard boiled egg." icon_state = "egg" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#FFFFF0" - list_reagents = list("nutriment" = 2, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("egg" = 1) foodtype = MEAT @@ -111,8 +111,8 @@ desc = "That's all you can say!" icon_state = "omelette" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) bitesize = 1 w_class = WEIGHT_CLASS_NORMAL tastes = list("egg" = 1, "cheese" = 1) @@ -129,7 +129,7 @@ "You take a piece of omelette with your fork.") var/datum/reagent/R = pick(reagents.reagent_list) - reagents.remove_reagent(R.id, 1) + reagents.remove_reagent(R.type, 1) F.forkload = R if(reagents.total_volume <= 0) qdel(src) @@ -140,10 +140,10 @@ name = "eggs benedict" desc = "There is only one egg on this, how rude." icon_state = "benedict" - bonus_reagents = list("vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4) trash = /obj/item/trash/plate w_class = WEIGHT_CLASS_NORMAL - list_reagents = list("nutriment" = 6, "vitamin" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("egg" = 1, "bacon" = 1, "bun" = 1) foodtype = MEAT diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 5d08068367d..fb498a8010b 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -8,10 +8,10 @@ desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" icon_state = "cubancarp" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) bitesize = 3 filling_color = "#CD853F" - list_reagents = list("nutriment" = 6, "capsaicin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 1) tastes = list("fish" = 4, "batter" = 1, "hot peppers" = 1) foodtype = MEAT @@ -19,7 +19,7 @@ name = "carp fillet" desc = "A fillet of spess carp meat." icon_state = "fishfillet" - list_reagents = list("nutriment" = 3, "carpotoxin" = 2, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2) bitesize = 6 filling_color = "#FA8072" tastes = list("fish" = 1) @@ -37,8 +37,8 @@ name = "fish fingers" desc = "A finger of fish." icon_state = "fishfingers" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) bitesize = 1 filling_color = "#CD853F" tastes = list("fish" = 1, "breadcrumbs" = 1) @@ -48,8 +48,8 @@ name = "fish and chips" desc = "I do say so myself chap." icon_state = "fishandchips" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) filling_color = "#FA8072" tastes = list("fish" = 1, "chips" = 1) foodtype = MEAT | VEGETABLES | FRIED @@ -60,7 +60,7 @@ name = "tofu" desc = "We all love tofu." icon_state = "tofu" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) filling_color = "#F0E68C" tastes = list("tofu" = 1) foodtype = VEGETABLES @@ -75,7 +75,7 @@ name = "spider leg" desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?" icon_state = "spiderleg" - list_reagents = list("nutriment" = 2, "toxin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin = 2) cooked_type = /obj/item/reagent_containers/food/snacks/boiledspiderleg filling_color = "#000000" tastes = list("cobwebs" = 1) @@ -86,8 +86,8 @@ desc = "Now you can feel like a real tourist vacationing in Ireland." icon_state = "cornedbeef" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) tastes = list("meat" = 1, "cabbage" = 1) foodtype = MEAT | VEGETABLES @@ -96,8 +96,8 @@ desc = "Because eating bear wasn't manly enough." icon_state = "bearsteak" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 2, "vitamin" = 6) - list_reagents = list("nutriment" = 2, "vitamin" = 5, "manlydorf" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/ethanol/manly_dorf = 5) tastes = list("meat" = 1, "salmon" = 1) foodtype = MEAT | ALCOHOL @@ -105,7 +105,7 @@ name = "faggot" desc = "A great meal all round. Not a cord of wood." icon_state = "faggot" - list_reagents = list("nutriment" = 4, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#800000" tastes = list("meat" = 1) foodtype = MEAT @@ -115,8 +115,8 @@ desc = "A piece of mixed, long meat." icon_state = "sausage" filling_color = "#CD5C5C" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 6, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("meat" = 1) foodtype = MEAT var/roasted = FALSE @@ -129,35 +129,35 @@ trash = /obj/item/stack/rods icon_state = "kebab" w_class = WEIGHT_CLASS_NORMAL - list_reagents = list("nutriment" = 8) + list_reagents = list(/datum/reagent/consumable/nutriment = 8) tastes = list("meat" = 3, "metal" = 1) foodtype = MEAT /obj/item/reagent_containers/food/snacks/kebab/human name = "human-kebab" desc = "A human meat, on a stick." - bonus_reagents = list("nutriment" = 1, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("tender meat" = 3, "metal" = 1) foodtype = MEAT | GROSS /obj/item/reagent_containers/food/snacks/kebab/monkey name = "meat-kebab" desc = "Delicious meat, on a stick." - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("meat" = 3, "metal" = 1) foodtype = MEAT /obj/item/reagent_containers/food/snacks/kebab/tofu name = "tofu-kebab" desc = "Vegan meat, on a stick." - bonus_reagents = list("nutriment" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("tofu" = 3, "metal" = 1) foodtype = VEGETABLES /obj/item/reagent_containers/food/snacks/kebab/tail name = "lizard-tail kebab" desc = "Severed lizard tail on a stick." - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("meat" = 8, "metal" = 4, "scales" = 1) foodtype = MEAT @@ -165,7 +165,7 @@ name = "raw khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list("nutriment" = 1, "vitamin" = 1, "garlic" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1) cooked_type = /obj/item/reagent_containers/food/snacks/khinkali tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtype = MEAT @@ -174,7 +174,7 @@ name = "khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list("nutriment" = 5, "vitamin" = 2, "garlic" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/garlic = 1) bitesize = 3 filling_color = "#F0F0F0" tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) @@ -185,7 +185,7 @@ desc = "Just add water!" icon_state = "monkeycube" bitesize = 12 - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) filling_color = "#CD853F" tastes = list("the jungle" = 1, "bananas" = 1) foodtype = MEAT | SUGAR @@ -211,7 +211,7 @@ name = "gorilla cube" desc = "A Waffle Co. brand gorilla cube. Now with extra molecules!" bitesize = 20 - list_reagents = list("nutriment" = 15) + list_reagents = list(/datum/reagent/consumable/nutriment = 15) tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1) spawned_mob = /mob/living/simple_animal/hostile/gorilla @@ -219,10 +219,10 @@ name = "enchiladas" desc = "Viva La Mexico!" icon_state = "enchiladas" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) bitesize = 4 filling_color = "#FFA07A" - list_reagents = list("nutriment" = 8, "capsaicin" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/capsaicin = 6) tastes = list("hot peppers" = 1, "meat" = 3, "cheese" = 1, "sour cream" = 1) foodtype = MEAT @@ -231,8 +231,8 @@ desc = "Even non-vegetarians will LOVE this!" icon_state = "stewedsoymeat" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1) - list_reagents = list("nutriment" = 8) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 8) filling_color = "#D2691E" tastes = list("soy" = 1, "vegetables" = 1) foodtype = VEGETABLES @@ -246,8 +246,8 @@ desc = "A giant spider's leg that's still twitching after being cooked. Gross!" icon_state = "spiderlegcooked" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "capsaicin" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 3, "capsaicin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/capsaicin = 2) filling_color = "#000000" tastes = list("hot peppers" = 1, "cobwebs" = 1) foodtype = MEAT @@ -257,8 +257,8 @@ desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?" icon_state = "spidereggsham" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) - list_reagents = list("nutriment" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) bitesize = 4 filling_color = "#7FFF00" tastes = list("meat" = 1, "the colour green" = 1) @@ -268,8 +268,8 @@ name = "carp sashimi" desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." icon_state = "sashimi" - bonus_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4) - list_reagents = list("nutriment" = 6, "capsaicin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/capsaicin = 4, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/capsaicin = 5) filling_color = "#FA8072" tastes = list("fish" = 1, "hot peppers" = 1) foodtype = MEAT | TOXIC @@ -277,8 +277,8 @@ /obj/item/reagent_containers/food/snacks/nugget name = "chicken nugget" filling_color = "#B22222" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("\"chicken\"" = 1) foodtype = MEAT @@ -292,8 +292,8 @@ name = "pig in a blanket" desc = "A tiny sausage wrapped in a flakey, buttery roll. Free this pig from its blanket prison by eating it." icon_state = "pigblanket" - list_reagents = list("nutriment" = 6, "vitamin" = 1) - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#800000" tastes = list("meat" = 1, "butter" = 1) @@ -302,7 +302,7 @@ desc = "Not so delicious rat meat, on a stick." icon_state = "ratkebab" w_class = WEIGHT_CLASS_NORMAL - list_reagents = list("nutriment" = 6, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("rat meat" = 1, "metal" = 1) foodtype = MEAT | GROSS @@ -310,4 +310,4 @@ name = "double rat-kebab" icon_state = "doubleratkebab" tastes = list("rat meat" = 2, "metal" = 1) - bonus_reagents = list("nutriment" = 6, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 7f2d3e6317c..3640558f0a5 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -7,7 +7,7 @@ icon_state = "cheesewheel" slice_path = /obj/item/reagent_containers/food/snacks/cheesewedge slices_num = 5 - list_reagents = list("nutriment" = 15, "vitamin" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 15, /datum/reagent/consumable/nutriment/vitamin = 5) w_class = WEIGHT_CLASS_NORMAL tastes = list("cheese" = 1) foodtype = DAIRY @@ -17,7 +17,7 @@ desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far." icon_state = "cheesewedge" filling_color = "#FFD700" - list_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("cheese" = 1) foodtype = DAIRY @@ -28,13 +28,13 @@ filling_color = "#FF1493" tastes = list("watermelon" = 1) foodtype = FRUIT - juice_results = list("watermelonjuice" = 5) + juice_results = list(/datum/reagent/consumable/watermelonjuice = 5) /obj/item/reagent_containers/food/snacks/candy_corn name = "candy corn" desc = "It's a handful of candy corn. Can be stored in a detective's hat." icon_state = "candy_corn" - list_reagents = list("nutriment" = 4, "sugar" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2) filling_color = "#FF8C00" tastes = list("candy corn" = 1) foodtype = JUNKFOOD | SUGAR @@ -51,7 +51,7 @@ name = "chocolate bar" desc = "Such, sweet, fattening food." icon_state = "chocolatebar" - list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2) filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR @@ -60,7 +60,7 @@ name = "huge mushroom slice" desc = "A slice from a huge mushroom." icon_state = "hugemushroomslice" - list_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("mushroom" = 1) foodtype = VEGETABLES @@ -69,7 +69,7 @@ desc = "Now let's find some cinema." icon_state = "popcorn" trash = /obj/item/trash/popcorn - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 filling_color = "#FFEFD5" tastes = list("popcorn" = 3, "butter" = 1) @@ -83,8 +83,8 @@ name = "loaded baked potato" desc = "Totally baked." icon_state = "loadedbakedpotato" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) filling_color = "#D2B48C" tastes = list("potato" = 1) foodtype = VEGETABLES | DAIRY @@ -94,7 +94,7 @@ desc = "AKA: French Fries, Freedom Fries, etc." icon_state = "fries" trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) filling_color = "#FFD700" tastes = list("fries" = 3, "salt" = 1) foodtype = VEGETABLES | GRAIN | FRIED @@ -103,7 +103,7 @@ name = "tator tot" desc = "A large fried potato nugget that may or may not try to valid you." icon_state = "tatortot" - list_reagents = list("nutriment" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) filling_color = "FFD700" tastes = list("potato" = 3, "valids" = 1) foodtype = FRIED | VEGETABLES @@ -113,7 +113,7 @@ desc = "Dope from a soy." icon_state = "soydope" trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) filling_color = "#DEB887" tastes = list("soy" = 1) foodtype = VEGETABLES @@ -123,8 +123,8 @@ desc = "Fries. Covered in cheese. Duh." icon_state = "cheesyfries" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) filling_color = "#FFD700" tastes = list("fries" = 3, "cheese" = 1) foodtype = VEGETABLES | GRAIN @@ -133,7 +133,7 @@ name = "burned mess" desc = "Someone should be demoted from cook for this." icon_state = "badrecipe" - list_reagents = list("bad_food" = 30) + list_reagents = list(/datum/reagent/toxin/bad_food = 30) filling_color = "#8B4513" foodtype = GROSS @@ -142,7 +142,7 @@ desc = "Tasty fries from fresh Carrots." icon_state = "carrotfries" trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 3, "oculine" = 3, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/oculine = 3, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FFA500" tastes = list("carrots" = 3, "salt" = 1) foodtype = VEGETABLES @@ -152,8 +152,8 @@ desc = "An apple coated in sugary sweetness." icon_state = "candiedapple" bitesize = 3 - bonus_reagents = list("nutriment" = 2, "sugar" = 3) - list_reagents = list("nutriment" = 3, "sugar" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/sugar = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 2) filling_color = "#FF4500" tastes = list("apple" = 2, "sweetness" = 2) foodtype = JUNKFOOD | FRUIT | SUGAR @@ -164,7 +164,7 @@ icon_state = "mint" bitesize = 1 trash = /obj/item/trash/plate - list_reagents = list("minttoxin" = 2) + list_reagents = list(/datum/reagent/toxin/minttoxin = 2) filling_color = "#800000" foodtype = TOXIC | SUGAR @@ -172,8 +172,8 @@ name = "egg wrap" desc = "The precursor to Pigs in a Blanket." icon_state = "eggwrap" - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) - list_reagents = list("nutriment" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) filling_color = "#F0E68C" tastes = list("egg" = 1) foodtype = MEAT | GRAIN @@ -182,8 +182,8 @@ name = "tin of beans" desc = "Musical fruit in a slightly less musical container." icon_state = "beans" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 10) filling_color = "#B22222" tastes = list("beans" = 1) foodtype = VEGETABLES @@ -192,7 +192,7 @@ name = "spider eggs" desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health." icon_state = "spidereggs" - list_reagents = list("nutriment" = 2, "toxin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin = 2) filling_color = "#008000" tastes = list("cobwebs" = 1) foodtype = MEAT | TOXIC @@ -201,7 +201,7 @@ name = "spiderling" desc = "It's slightly twitching in your hand. Ew..." icon_state = "spiderling" - list_reagents = list("nutriment" = 1, "toxin" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 4) filling_color = "#00800" tastes = list("cobwebs" = 1, "guts" = 2) foodtype = MEAT | TOXIC @@ -210,7 +210,7 @@ name = "spider lollipop" desc = "Still gross, but at least it has a mountain of sugar on it." icon_state = "spiderlollipop" - list_reagents = list("nutriment" = 1, "toxin" = 1, "iron" = 10, "sugar" = 5, "omnizine" = 2) //lollipop, but vitamins = toxins + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //lollipop, but vitamins = toxins filling_color = "#00800" tastes = list("cobwebs" = 1, "sugar" = 2) foodtype = JUNKFOOD | SUGAR @@ -219,8 +219,8 @@ name = "chocolate coin" desc = "A completely edible but nonflippable festive coin." icon_state = "chococoin" - bonus_reagents = list("nutriment" = 1, "sugar" = 1) - list_reagents = list("nutriment" = 3, "cocoa" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/coco = 1) filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR @@ -229,8 +229,8 @@ name = "fudge dice" desc = "A little cube of chocolate that tends to have a less intense taste if you eat too many at once." icon_state = "chocodice" - bonus_reagents = list("nutriment" = 1, "sugar" = 1) - list_reagents = list("nutriment" = 3, "cocoa" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/coco = 1) filling_color = "#A0522D" trash = /obj/item/dice/fudge tastes = list("fudge" = 1) @@ -240,8 +240,8 @@ name = "chocolate orange" desc = "A festive chocolate orange." icon_state = "chocoorange" - bonus_reagents = list("nutriment" = 1, "sugar" = 1) - list_reagents = list("nutriment" = 3, "sugar" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 1) filling_color = "#A0522D" tastes = list("chocolate" = 3, "oranges" = 1) foodtype = JUNKFOOD | SUGAR @@ -251,8 +251,8 @@ desc = "The only good recipe for eggplant." icon_state = "eggplantparm" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) - list_reagents = list("nutriment" = 6, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#BA55D3" tastes = list("eggplant" = 3, "cheese" = 1) foodtype = VEGETABLES | DAIRY @@ -262,7 +262,7 @@ desc = "The base for all your burritos." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "tortilla" - list_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#FFEFD5" tastes = list("tortilla" = 1) foodtype = GRAIN @@ -271,8 +271,8 @@ name = "burrito" desc = "Tortilla wrapped goodness." icon_state = "burrito" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 4, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#FFEFD5" tastes = list("torilla" = 2, "meat" = 3) foodtype = GRAIN | MEAT @@ -281,8 +281,8 @@ name = "cheesy burrito" desc = "It's a burrito filled with cheese." icon_state = "cheesyburrito" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 4, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FFD800" tastes = list("torilla" = 2, "meat" = 3, "cheese" = 1) foodtype = GRAIN | MEAT | DAIRY @@ -291,8 +291,8 @@ name = "carne asada burrito" desc = "The best burrito for meat lovers." icon_state = "carneburrito" - bonus_reagents = list("nutriment" = 2, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#A0522D" tastes = list("torilla" = 2, "meat" = 4) foodtype = GRAIN | MEAT @@ -301,8 +301,8 @@ name = "fuego plasma burrito" desc = "A super spicy burrito." icon_state = "fuegoburrito" - bonus_reagents = list("nutriment" = 2, "vitamin" = 3) - list_reagents = list("nutriment" = 4, "capsaicin" = 5, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 5, /datum/reagent/consumable/nutriment/vitamin = 3) filling_color = "#FF2000" tastes = list("torilla" = 2, "meat" = 3, "hot peppers" = 1) foodtype = GRAIN | MEAT @@ -312,7 +312,7 @@ desc = "Made with roasted sweet potatoes!" icon_state = "yakiimo" trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 5, "vitamin" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#8B1105" tastes = list("sweet potato" = 1) foodtype = GRAIN | VEGETABLES | SUGAR @@ -322,7 +322,7 @@ desc = "Sweet and crunchy." icon_state = "roastparsnip" trash = /obj/item/trash/plate - list_reagents = list("nutriment" = 3, "vitamin" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#FF5500" tastes = list("parsnip" = 1) foodtype = VEGETABLES @@ -331,8 +331,8 @@ name = "melon fruit bowl" desc = "For people who wants edible fruit bowls." icon_state = "melonfruitbowl" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#FF5500" w_class = WEIGHT_CLASS_NORMAL tastes = list("melon" = 1) @@ -342,8 +342,8 @@ name = "space freezy" desc = "The best icecream in space." icon_state = "spacefreezy" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "bluecherryjelly" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bluecherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#87CEFA" tastes = list("blue cherries" = 2, "ice cream" = 2) foodtype = FRUIT | DAIRY @@ -352,8 +352,8 @@ name = "sundae" desc = "A classic dessert." icon_state = "sundae" - bonus_reagents = list("nutriment" = 2, "vitamin" = 1) - list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FFFACD" tastes = list("ice cream" = 1, "banana" = 1) foodtype = FRUIT | DAIRY | SUGAR @@ -362,8 +362,8 @@ name = "honkdae" desc = "The clown's favorite dessert." icon_state = "honkdae" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "banana" = 10, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 10, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#FFFACD" tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) foodtype = FRUIT | DAIRY | SUGAR @@ -372,8 +372,8 @@ name = "nachos" desc = "Chips from Space Mexico." icon_state = "nachos" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 6, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#F4A460" tastes = list("nachos" = 1) foodtype = VEGETABLES | FRIED @@ -382,8 +382,8 @@ name = "cheesy nachos" desc = "The delicious combination of nachos and melting cheese." icon_state = "cheesynachos" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3) filling_color = "#FFD700" tastes = list("nachos" = 2, "cheese" = 1) foodtype = VEGETABLES | FRIED | DAIRY @@ -392,8 +392,8 @@ name = "Cuban nachos" desc = "That's some dangerously spicy nachos." icon_state = "cubannachos" - bonus_reagents = list("nutriment" = 2, "vitamin" = 3) - list_reagents = list("nutriment" = 7, "capsaicin" = 8, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/capsaicin = 8, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#DC143C" tastes = list("nachos" = 2, "hot pepper" = 1) foodtype = VEGETABLES | FRIED | DAIRY @@ -402,8 +402,8 @@ name = "melon keg" desc = "Who knew vodka was a fruit?" icon_state = "melonkeg" - bonus_reagents = list("nutriment" = 3, "vitamin" = 3) - list_reagents = list("nutriment" = 9, "vodka" = 15, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/ethanol/vodka = 15, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#FFD700" volume = 80 bitesize = 5 @@ -414,8 +414,8 @@ name = "honey nut bar" desc = "Oats and nuts compressed together into a bar, held together with a honey glaze." icon_state = "honeybar" - bonus_reagents = list("nutriment" = 2, "honey" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 5, "honey" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/honey = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/honey = 5) filling_color = "#F2CE91" tastes = list("oats" = 3, "nuts" = 2, "honey" = 1) foodtype = FRUIT | SUGAR @@ -424,8 +424,8 @@ name = "stuffed legion" desc = "The former skull of a damned human, filled with goliath meat. It has a decorative lava pool made of ketchup and hotsauce." icon_state = "stuffed_legion" - bonus_reagents = list("vitamin" = 3, "capsaicin" = 1, "tricordrazine" = 5) - list_reagents = list("nutriment" = 5, "vitamin" = 5, "capsaicin" = 2, "tricordrazine" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/medicine/tricordrazine = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/medicine/tricordrazine = 10) tastes = list("death" = 2, "rock" = 1, "meat" = 1, "hot peppers" = 1) foodtype = MEAT @@ -434,8 +434,8 @@ name = "Powercrepe" desc = "With great power, comes great crepes. It looks like a pancake filled with jelly but packs quite a punch." icon_state = "powercrepe" - bonus_reagents = list("nutriment" = 5, "vitamin" = 3, "iron" = 10) - list_reagents = list("nutriment" = 10, "vitamin" = 5, "cherryjelly" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/iron = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/cherryjelly = 5) force = 20 throwforce = 10 block_chance = 50 @@ -450,7 +450,7 @@ desc = "A delicious lollipop. Makes for a great Valentine's present." icon = 'icons/obj/lollipop.dmi' icon_state = "lollipop_stick" - list_reagents = list("nutriment" = 1, "vitamin" = 1, "iron" = 10, "sugar" = 5, "omnizine" = 2) //Honk + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //Honk var/mutable_appearance/head var/headcolor = rgb(0, 0, 0) tastes = list("candy" = 1) @@ -492,7 +492,7 @@ desc = "A colorful, sugary gumball." icon = 'icons/obj/lollipop.dmi' icon_state = "gumball" - list_reagents = list("sugar" = 5, "bicaridine" = 2, "kelotane" = 2) //Kek + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/bicaridine = 2, /datum/reagent/medicine/kelotane = 2) //Kek tastes = list("candy") foodtype = JUNKFOOD @@ -519,8 +519,8 @@ name = "taco" desc = "A traditional taco with meat, cheese, and lettuce." icon_state = "taco" - bonus_reagents = list("nutriment" = 3, "vitamin" = 2) - list_reagents = list("nutriment" = 4, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "F0D830" tastes = list("taco" = 4, "meat" = 2, "cheese" = 2, "lettuce" = 1) foodtype = MEAT | DAIRY | GRAIN | VEGETABLES @@ -528,8 +528,8 @@ /obj/item/reagent_containers/food/snacks/taco/plain desc = "A traditional taco with meat and cheese, minus the rabbit food." icon_state = "taco_plain" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 3, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("taco" = 4, "meat" = 2, "cheese" = 2) foodtype = MEAT | DAIRY | GRAIN @@ -537,8 +537,8 @@ name = "Bran Requests Cereal" desc = "A dry cereal that satiates your requests for bran. Tastes uniquely like raisins and salt." icon_state = "bran_requests" - list_reagents = list("nutriment" = 3, "vitamin" = 2, "sodiumchloride" = 5) - bonus_reagents = list("sodiumchloride" = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/sodiumchloride = 5) + bonus_reagents = list(/datum/reagent/consumable/sodiumchloride = 10) tastes = list("bran" = 4, "raisins" = 3, "salt" = 1) foodtype = GRAIN | FRUIT @@ -546,7 +546,7 @@ name = "stick of butter" desc = "A stick of delicious, golden, fatty goodness." icon_state = "butter" - list_reagents = list("nutriment" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) filling_color = "#FFD700" tastes = list("butter" = 1) foodtype = DAIRY @@ -555,7 +555,7 @@ name = "onion rings" desc = "Onion slices coated in batter." icon_state = "onionrings" - list_reagents = list("nutriment" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3) filling_color = "#C0C9A0" gender = PLURAL tastes = list("batter" = 3, "onion" = 1) @@ -573,7 +573,7 @@ name = "chocolate" desc = "A tiny and sweet chocolate." icon_state = "tiny_chocolate" - list_reagents = list("nutriment" = 1, "sugar" = 1, "cocoa" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/coco = 1) filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR @@ -582,7 +582,7 @@ name = "Canned Peaches" desc = "Just a nice can of ripe peaches swimming in their own juices." icon_state = "peachcan" - list_reagents = list("peachjuice" = 20, "sugar" = 8, "nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/peachjuice = 20, /datum/reagent/consumable/sugar = 8, /datum/reagent/consumable/nutriment = 2) filling_color = "#ffdf26" w_class = WEIGHT_CLASS_NORMAL tastes = list("peaches" = 7, "tin" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 8fd9792e009..080c1c53b77 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -7,8 +7,8 @@ desc = "Goes great with robust coffee." icon_state = "donut1" bitesize = 5 - bonus_reagents = list("sugar" = 1) - list_reagents = list("nutriment" = 3, "sprinkles" = 1, "sugar" = 2) + bonus_reagents = list(/datum/reagent/consumable/sugar = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/sugar = 2) filling_color = "#D2691E" tastes = list("donut" = 1) foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR @@ -27,7 +27,7 @@ is_frosted = TRUE name = "frosted [name]" icon_state = frosted_icon //delish~! - reagents.add_reagent("sprinkles", 1) + reagents.add_reagent(/datum/reagent/consumable/sprinkles, 1) filling_color = "#FF69B4" return TRUE @@ -53,7 +53,7 @@ /obj/item/reagent_containers/food/snacks/donut/chaos/Initialize() . = ..() - extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") + extra_reagent = pick(/datum/reagent/consumable/nutriment, /datum/reagent/consumable/capsaicin, /datum/reagent/consumable/frostoil, /datum/reagent/drug/krokodil, /datum/reagent/toxin/plasma, /datum/reagent/consumable/coco, /datum/reagent/toxin/slimejelly, /datum/reagent/consumable/banana, /datum/reagent/consumable/berryjuice, /datum/reagent/medicine/omnizine) reagents.add_reagent("[extra_reagent]", 3) /obj/item/reagent_containers/food/snacks/donut/jelly @@ -61,8 +61,8 @@ desc = "You jelly?" icon_state = "jdonut1" frosted_icon = "jdonut2" - bonus_reagents = list("sugar" = 1, "vitamin" = 1) - extra_reagent = "berryjuice" + bonus_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + extra_reagent = /datum/reagent/consumable/berryjuice tastes = list("jelly" = 1, "donut" = 3) foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR @@ -75,19 +75,19 @@ name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" - extra_reagent = "slimejelly" + extra_reagent = /datum/reagent/toxin/slimejelly foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR /obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly name = "jelly donut" desc = "You jelly?" icon_state = "jdonut1" - extra_reagent = "cherryjelly" + extra_reagent = /datum/reagent/consumable/cherryjelly foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT /obj/item/reagent_containers/food/snacks/donut/meat - bonus_reagents = list("ketchup" = 1) - list_reagents = list("nutriment" = 3, "ketchup" = 2) + bonus_reagents = list(/datum/reagent/consumable/ketchup = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/ketchup = 2) tastes = list("meat" = 1) foodtype = JUNKFOOD | MEAT | GROSS | FRIED @@ -98,8 +98,8 @@ name = "muffin" desc = "A delicious and spongy little cake." icon_state = "muffin" - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) filling_color = "#F4A460" tastes = list("muffin" = 1) foodtype = GRAIN | SUGAR @@ -123,8 +123,8 @@ name = "chawanmushi" desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat." icon_state = "chawanmushi" - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) filling_color = "#FFE4E1" tastes = list("custard" = 1) foodtype = GRAIN | MEAT | VEGETABLES @@ -136,8 +136,8 @@ desc = "Mmm, waffles." icon_state = "waffles" trash = /obj/item/trash/waffles - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#D2691E" tastes = list("waffles" = 1) foodtype = GRAIN | SUGAR @@ -147,8 +147,8 @@ desc = "Not made of people. Honest." //Totally people. icon_state = "soylent_green" trash = /obj/item/trash/waffles - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 10, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#9ACD32" tastes = list("waffles" = 7, "people" = 1) foodtype = GRAIN | GROSS | MEAT @@ -158,8 +158,8 @@ desc = "Not made of people. Honest." //Actually honest for once. icon_state = "soylent_yellow" trash = /obj/item/trash/waffles - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 10, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#9ACD32" tastes = list("waffles" = 7, "the colour green" = 1) foodtype = GRAIN @@ -170,8 +170,8 @@ icon_state = "rofflewaffles" trash = /obj/item/trash/waffles bitesize = 4 - bonus_reagents = list("vitamin" = 2) - list_reagents = list("nutriment" = 8, "mushroomhallucinogen" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/drug/mushroomhallucinogen = 2, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#00BFFF" tastes = list("waffle" = 1, "mushrooms" = 1) foodtype = GRAIN | VEGETABLES | TOXIC | SUGAR @@ -183,8 +183,8 @@ desc = "COOKIE!!!" icon_state = "COOKIE!!!" bitesize = 1 - bonus_reagents = list("nutriment" = 1) - list_reagents = list("nutriment" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) filling_color = "#F0E68C" tastes = list("cookie" = 1) foodtype = GRAIN | SUGAR @@ -193,7 +193,7 @@ name = "\improper Donk-pocket" desc = "The food of choice for the seasoned traitor." icon_state = "donkpocket" - list_reagents = list("nutriment" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) @@ -202,8 +202,8 @@ /obj/item/reagent_containers/food/snacks/donkpocket/warm name = "warm Donk-pocket" desc = "The heated food of choice for the seasoned traitor." - bonus_reagents = list("omnizine" = 3) - list_reagents = list("nutriment" = 4, "omnizine" = 3) + bonus_reagents = list(/datum/reagent/medicine/omnizine = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 3) cooked_type = null tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtype = GRAIN @@ -212,7 +212,7 @@ name = "\improper Dank-pocket" desc = "The food of choice for the seasoned botanist." icon_state = "dankpocket" - list_reagents = list("lipolicide" = 3, "space_drugs" = 3, "nutriment" = 4) + list_reagents = list(/datum/reagent/toxin/lipolicide = 3, /datum/reagent/drug/space_drugs = 3, /datum/reagent/consumable/nutriment = 4) filling_color = "#00FF00" tastes = list("meat" = 2, "dough" = 2) foodtype = GRAIN | VEGETABLES @@ -221,8 +221,8 @@ name = "fortune cookie" desc = "A true prophecy in each cookie!" icon_state = "fortune_cookie" - bonus_reagents = list("nutriment" = 2) - list_reagents = list("nutriment" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3) filling_color = "#F4A460" tastes = list("cookie" = 1) foodtype = GRAIN | SUGAR @@ -231,8 +231,8 @@ name = "poppy pretzel" desc = "It's all twisted up!" icon_state = "poppypretzel" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) filling_color = "#F0E68C" tastes = list("pretzel" = 1) foodtype = GRAIN | SUGAR @@ -241,8 +241,8 @@ name = "plump helmet biscuit" desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour." icon_state = "phelmbiscuit" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) filling_color = "#F0E68C" tastes = list("mushroom" = 1, "biscuit" = 1) foodtype = GRAIN | VEGETABLES @@ -252,18 +252,18 @@ if(fey) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" - bonus_reagents = list("omnizine" = 5, "nutriment" = 1, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) . = ..() if(fey) - reagents.add_reagent("omnizine", 5) + reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) /obj/item/reagent_containers/food/snacks/cracker name = "cracker" desc = "It's a salted cracker." icon_state = "cracker" bitesize = 1 - bonus_reagents = list("nutriment" = 1) - list_reagents = list("nutriment" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1) filling_color = "#F0E68C" tastes = list("cracker" = 1) foodtype = GRAIN @@ -273,8 +273,8 @@ desc = "Fresh footlong ready to go down on." icon_state = "hotdog" bitesize = 3 - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) - list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/ketchup = 3, /datum/reagent/consumable/nutriment/vitamin = 3) filling_color = "#8B0000" tastes = list("bun" = 3, "meat" = 2) foodtype = GRAIN | MEAT | VEGETABLES @@ -283,8 +283,8 @@ name = "meat bun" desc = "Has the potential to not be Dog." icon_state = "meatbun" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#8B0000" tastes = list("bun" = 3, "meat" = 2) foodtype = GRAIN | MEAT | VEGETABLES @@ -293,7 +293,7 @@ name = "khachapuri" desc = "Bread with egg and cheese?" icon_state = "khachapuri" - list_reagents = list("nutriment" = 12, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FFFF4D" tastes = list("bread" = 1, "egg" = 1, "cheese" = 1) foodtype = GRAIN | MEAT | DAIRY @@ -303,8 +303,8 @@ name = "sugar cookie" desc = "Just like your little sister used to make." icon_state = "sugarcookie" - bonus_reagents = list("nutriment" = 1, "sugar" = 3) - list_reagents = list("nutriment" = 3, "sugar" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 3) filling_color = "#CD853F" tastes = list("sweetness" = 1) foodtype = GRAIN | JUNKFOOD | SUGAR @@ -313,8 +313,8 @@ name = "chocolate cornet" desc = "Which side's the head, the fat end or the thin end?" icon_state = "chococornet" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#FFE4C4" tastes = list("biscuit" = 3, "chocolate" = 1) foodtype = GRAIN | JUNKFOOD @@ -323,8 +323,8 @@ name = "oatmeal cookie" desc = "The best of both cookie and oat." icon_state = "oatmealcookie" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#D2691E" tastes = list("cookie" = 2, "oat" = 1) foodtype = GRAIN @@ -333,8 +333,8 @@ name = "raisin cookie" desc = "Why would you put raisins on a cookie?" icon_state = "raisincookie" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#F0E68C" tastes = list("cookie" = 1, "raisins" = 1) foodtype = GRAIN | FRUIT @@ -343,8 +343,8 @@ name = "cherry cupcake" desc = "A sweet cupcake with cherry bits." icon_state = "cherrycupcake" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#F0E68C" tastes = list("cake" = 3, "cherry" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -353,8 +353,8 @@ name = "blue cherry cupcake" desc = "Blue cherries inside a delicious cupcake." icon_state = "bluecherrycupcake" - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#F0E68C" tastes = list("cake" = 3, "blue cherry" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -363,8 +363,8 @@ name = "honey bun" desc = "A sticky pastry bun glazed with honey." icon_state = "honeybun" - bonus_reagents = list("nutriment" = 1, "honey" = 1) - list_reagents = list("nutriment" = 5, "honey" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/honey = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/honey = 5) filling_color = "#F2CE91" tastes = list("pastry" = 1, "sweetness" = 1) foodtype = GRAIN @@ -376,8 +376,8 @@ desc = "A fluffy pancake. The softer, superior relative of the waffle." icon_state = "pancakes_1" item_state = "pancakes" - bonus_reagents = list("vitamin" = 1) - list_reagents = list("nutriment" = 4, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#D2691E" tastes = list("pancakes" = 1) foodtype = GRAIN | SUGAR @@ -387,8 +387,8 @@ desc = "A fluffy and delicious blueberry pancake." icon_state = "bbpancakes_1" item_state = "bbpancakes" - bonus_reagents = list("vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("pancakes" = 1, "blueberries" = 1) /obj/item/reagent_containers/food/snacks/pancakes/chocolatechip @@ -396,8 +396,8 @@ desc = "A fluffy and delicious chocolate chip pancake." icon_state = "ccpancakes_1" item_state = "ccpancakes" - bonus_reagents = list("vitamin" = 2) - list_reagents = list("nutriment" = 6, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("pancakes" = 1, "chocolate" = 1) /obj/item/reagent_containers/food/snacks/pancakes/Initialize() diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 285361b0451..ce0a6f8d970 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -5,7 +5,7 @@ bitesize = 3 w_class = WEIGHT_CLASS_NORMAL volume = 80 - list_reagents = list("nutriment" = 10, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 1) foodtype = GRAIN @@ -14,7 +14,7 @@ desc = "A simple pie, still delicious." icon_state = "pie" custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pie - bonus_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("pie" = 1) foodtype = GRAIN @@ -23,8 +23,8 @@ desc = "Just like back home, on clown planet! HONK!" icon_state = "pie" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 1) foodtype = GRAIN | DAIRY | SUGAR var/stunning = TRUE @@ -66,8 +66,8 @@ name = "berry clafoutis" desc = "No black birds, this is a good sign." icon_state = "berryclafoutis" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/berryjuice = 5, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 1, "blackberries" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -75,8 +75,8 @@ name = "beary pie" desc = "No brown bears, this is a good sign." icon_state = "bearypie" - bonus_reagents = list("nutriment" = 2, "vitamin" = 3) - list_reagents = list("nutriment" = 2, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("pie" = 1, "meat" = 1, "salmon" = 1) foodtype = GRAIN | SUGAR @@ -84,7 +84,7 @@ name = "meat-pie" icon_state = "meatpie" desc = "An old barber recipe, very delicious!" - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("pie" = 1, "meat" = 1) foodtype = GRAIN | MEAT @@ -93,7 +93,7 @@ name = "tofu-pie" icon_state = "meatpie" desc = "A delicious tofu pie." - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 1, "tofu" = 1) foodtype = GRAIN @@ -103,8 +103,8 @@ desc = "Sweet and tasty poison pie." icon_state = "amanita_pie" bitesize = 4 - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 6, "amatoxin" = 3, "mushroomhallucinogen" = 1, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin/amatoxin = 3, /datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "mushroom" = 1) foodtype = GRAIN | VEGETABLES | TOXIC | GROSS @@ -113,7 +113,7 @@ name = "plump pie" desc = "I bet you love stuff made out of plump helmets!" icon_state = "plump_pie" - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "mushroom" = 1) foodtype = GRAIN | VEGETABLES @@ -124,9 +124,9 @@ if(fey) name = "exceptional plump pie" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" - bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 4) if(fey) - reagents.add_reagent("omnizine", 5) + reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) /obj/item/reagent_containers/food/snacks/pie/xemeatpie @@ -134,7 +134,7 @@ icon_state = "xenomeatpie" desc = "A delicious meatpie. Probably heretical." trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("pie" = 1, "meat" = 1, "acid" = 1) foodtype = GRAIN | MEAT @@ -143,7 +143,7 @@ name = "apple pie" desc = "A pie containing sweet sweet love...or apple." icon_state = "applepie" - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("pie" = 1, "apple" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -153,7 +153,7 @@ name = "cherry pie" desc = "Taste so good, make a grown man cry." icon_state = "cherrypie" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("pie" = 7, "Nicole Paige Brooks" = 2) foodtype = GRAIN | FRUIT | SUGAR @@ -164,7 +164,7 @@ icon_state = "pumpkinpie" slice_path = /obj/item/reagent_containers/food/snacks/pumpkinpieslice slices_num = 5 - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("pie" = 1, "pumpkin" = 1) foodtype = GRAIN | VEGETABLES @@ -175,7 +175,7 @@ icon_state = "pumpkinpieslice" trash = /obj/item/trash/plate filling_color = "#FFA500" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("pie" = 1, "pumpkin" = 1) foodtype = GRAIN | VEGETABLES @@ -183,8 +183,8 @@ name = "golden apple streusel tart" desc = "A tasty dessert that won't make it through a metal detector." icon_state = "gappletart" - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/gold = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "apple" = 1, "expensive metal" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -192,8 +192,8 @@ name = "grape tart" desc = "A tasty dessert that reminds you of the wine you didn't make." icon_state = "grapetart" - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 4, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("pie" = 1, "grape" = 1) foodtype = GRAIN | FRUIT | SUGAR @@ -203,7 +203,7 @@ icon_state = "blumpkinpie" slice_path = /obj/item/reagent_containers/food/snacks/blumpkinpieslice slices_num = 5 - bonus_reagents = list("nutriment" = 3, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("pie" = 1, "a mouthful of pool water" = 1) foodtype = GRAIN | VEGETABLES @@ -214,7 +214,7 @@ icon_state = "blumpkinpieslice" trash = /obj/item/trash/plate filling_color = "#1E90FF" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("pie" = 1, "a mouthful of pool water" = 1) foodtype = GRAIN | VEGETABLES @@ -224,7 +224,7 @@ icon_state = "dulcedebatata" slice_path = /obj/item/reagent_containers/food/snacks/dulcedebatataslice slices_num = 5 - bonus_reagents = list("nutriment" = 4, "vitamin" = 8) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 8) tastes = list("jelly" = 1, "sweet potato" = 1) foodtype = GRAIN | VEGETABLES | SUGAR @@ -235,7 +235,7 @@ icon_state = "dulcedebatataslice" trash = /obj/item/trash/plate filling_color = "#8B4513" - list_reagents = list("nutriment" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("jelly" = 1, "sweet potato" = 1) foodtype = GRAIN | VEGETABLES | SUGAR @@ -243,6 +243,6 @@ name = "frosty pie" desc = "Tastes like blue and cold." icon_state = "frostypie" - bonus_reagents = list("nutriment" = 4, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("mint" = 1, "pie" = 1) foodtype = GRAIN | FRUIT | SUGAR diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index e6d04cfc456..cb2ea093ca3 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -6,13 +6,13 @@ w_class = WEIGHT_CLASS_NORMAL slices_num = 6 volume = 80 - list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtype = GRAIN | DAIRY | VEGETABLES /obj/item/reagent_containers/food/snacks/pizzaslice icon = 'icons/obj/food/pizzaspaghetti.dmi' - list_reagents = list("nutriment" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) foodtype = GRAIN | DAIRY | VEGETABLES /obj/item/reagent_containers/food/snacks/pizza/margherita @@ -20,12 +20,12 @@ desc = "The most cheezy pizza in galaxy." icon_state = "pizzamargherita" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/margherita - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtype = GRAIN | VEGETABLES /obj/item/reagent_containers/food/snacks/pizza/margherita/robo/Initialize() - bonus_reagents += list("nanomachines" = 70) + bonus_reagents += list(/datum/reagent/nanomachines = 70) return ..() /obj/item/reagent_containers/food/snacks/pizzaslice/margherita @@ -41,8 +41,8 @@ desc = "Greasy pizza with delicious meat." icon_state = "meatpizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/meat - bonus_reagents = list("nutriment" = 5, "vitamin" = 8) - list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 8) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 8) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 8) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1) foodtype = GRAIN | VEGETABLES| DAIRY | MEAT @@ -59,8 +59,8 @@ desc = "Very special pizza." icon_state = "mushroompizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 30, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushroom" = 1) foodtype = GRAIN | VEGETABLES | DAIRY @@ -77,8 +77,8 @@ desc = "No one of Tomatos Sapiens were harmed during making this pizza." icon_state = "vegetablepizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/vegetable - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/oculine = 12, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 2, "cheese" = 1, "carrot" = 1) foodtype = GRAIN | VEGETABLES | DAIRY @@ -95,8 +95,8 @@ desc = "Who thought this would be a good idea?" icon_state = "donkpocketpizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/donkpocket - bonus_reagents = list("nutriment" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "omnizine" = 10, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/medicine/omnizine = 10, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1) foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD @@ -113,8 +113,8 @@ desc = "The hippie's pizza of choice." icon_state = "dankpizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/dank - bonus_reagents = list("nutriment" = 2, "vitamin" = 6) - list_reagents = list("nutriment" = 25, "doctorsdelight" = 5, "tomatojuice" = 6, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1) foodtype = GRAIN | VEGETABLES | FRUIT | DAIRY @@ -131,7 +131,7 @@ desc = "You can really smell the sassiness." icon_state = "sassysagepizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/sassysage - bonus_reagents = list("nutriment" = 6, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1) foodtype = GRAIN | VEGETABLES | DAIRY @@ -148,7 +148,7 @@ desc = "The pizza equivalent of Einstein's riddle." icon_state = "pineapplepizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/pineapple - bonus_reagents = list("nutriment" = 6, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pineapple" = 2, "ham" = 2) foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | FRUIT | PINEAPPLE @@ -165,7 +165,7 @@ desc = "Hello, you've reached Arnold's pizza shop. I'm not here now, I'm out killing pepperoni." icon_state = "arnoldpizza" slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/arnold - bonus_reagents = list("nutriment" = 30, "vitamin" = 6, "iron" = 10, "omnizine" = 30) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30) tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2) /obj/item/reagent_containers/food/snacks/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index ec58737c02e..4de2500b144 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -5,7 +5,7 @@ trash = /obj/item/reagent_containers/glass/bowl bitesize = 3 w_class = WEIGHT_CLASS_NORMAL - list_reagents = list("nutriment" = 7, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("leaves" = 1) foodtype = VEGETABLES @@ -17,8 +17,8 @@ name = "\improper Aesir salad" desc = "Probably too incredible for mortal men to fully enjoy." icon_state = "aesirsalad" - bonus_reagents = list("omnizine" = 2, "vitamin" = 6) - list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/medicine/omnizine = 2, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/medicine/omnizine = 8, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("leaves" = 1) foodtype = VEGETABLES @@ -26,8 +26,8 @@ name = "herb salad" desc = "A tasty salad with apples on top." icon_state = "herbsalad" - bonus_reagents = list("vitamin" = 4) - list_reagents = list("nutriment" = 8, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("leaves" = 1, "apple" = 1) foodtype = VEGETABLES | FRUIT @@ -35,8 +35,8 @@ name = "valid salad" desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it." icon_state = "validsalad" - bonus_reagents = list("doctorsdelight" = 5, "vitamin" = 4) - list_reagents = list("nutriment" = 8, "doctorsdelight" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/doctor_delight = 5, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("leaves" = 1, "potato" = 1, "meat" = 1, "valids" = 1) foodtype = VEGETABLES | MEAT | FRIED | JUNKFOOD | FRUIT @@ -44,8 +44,8 @@ name = "oatmeal" desc = "A nice bowl of oatmeal." icon_state = "oatmeal" - bonus_reagents = list("nutriment" = 4, "vitamin" = 4) - list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("oats" = 1, "milk" = 1) foodtype = DAIRY | GRAIN @@ -53,7 +53,7 @@ name = "fruit salad" desc = "Your standard fruit salad." icon_state = "fruitsalad" - bonus_reagents = list("nutriment" = 2, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("fruit" = 1) foodtype = FRUIT @@ -61,8 +61,8 @@ name = "jungle salad" desc = "Exotic fruits in a bowl." icon_state = "junglesalad" - bonus_reagents = list("nutriment" = 4, "vitamin" = 4) - list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("fruit" = 1, "the jungle" = 1) foodtype = FRUIT @@ -70,8 +70,8 @@ name = "citrus delight" desc = "Citrus overload!" icon_state = "citrusdelight" - bonus_reagents = list("nutriment" = 4, "vitamin" = 4) - list_reagents = list("nutriment" = 7, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("sourness" = 1, "leaves" = 1) foodtype = FRUIT @@ -80,7 +80,7 @@ desc = "A bowl of raw rice." icon_state = "ricebowl" cooked_type = /obj/item/reagent_containers/food/snacks/salad/boiledrice - list_reagents = list("nutriment" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) tastes = list("rice" = 1) foodtype = GRAIN | RAW @@ -88,8 +88,8 @@ name = "boiled rice" desc = "A warm bowl of rice." icon_state = "boiledrice" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 5, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("rice" = 1) foodtype = GRAIN @@ -97,7 +97,7 @@ name = "rice pudding" desc = "Everybody loves rice pudding!" icon_state = "ricepudding" - bonus_reagents = list("nutriment" = 4, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("rice" = 1, "sweetness" = 1) foodtype = GRAIN | DAIRY @@ -105,7 +105,7 @@ name = "rice and pork" desc = "Well, it looks like pork..." icon_state = "riceporkbowl" - bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("rice" = 1, "meat" = 1) foodtype = GRAIN | MEAT @@ -113,6 +113,6 @@ name = "egg bowl" desc = "A bowl of rice with a fried egg." icon_state = "eggbowl" - bonus_reagents = list("nutriment" = 4, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("rice" = 1, "egg" = 1) foodtype = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017 diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm index de43e951a29..3fe809431ce 100644 --- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "sandwich" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 7, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 1) cooked_type = /obj/item/reagent_containers/food/snacks/toastedsandwich tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1) foodtype = GRAIN | VEGETABLES @@ -16,8 +16,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "toastedsandwich" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "carbon" = 2) - list_reagents = list("nutriment" = 6, "carbon" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/carbon = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/carbon = 2) tastes = list("toast" = 1) foodtype = GRAIN @@ -27,8 +27,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "toastedsandwich" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 6, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("toast" = 1, "cheese" = 1) foodtype = GRAIN | DAIRY @@ -43,13 +43,13 @@ foodtype = GRAIN /obj/item/reagent_containers/food/snacks/jellysandwich/slime - bonus_reagents = list("slimejelly" = 5, "vitamin" = 2) - list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) foodtype = GRAIN | TOXIC /obj/item/reagent_containers/food/snacks/jellysandwich/cherry - bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2) - list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) foodtype = GRAIN | FRUIT /obj/item/reagent_containers/food/snacks/icecreamsandwich @@ -57,8 +57,8 @@ desc = "Portable Ice-cream in its own packaging." icon = 'icons/obj/food/food.dmi' icon_state = "icecreamsandwich" - bonus_reagents = list("nutriment" = 1, "ice" = 2) - list_reagents = list("nutriment" = 2, "ice" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/ice = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2) tastes = list("ice cream" = 1) foodtype = GRAIN | DAIRY @@ -68,8 +68,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "notasandwich" trash = /obj/item/trash/plate - bonus_reagents = list("vitamin" = 6) - list_reagents = list("nutriment" = 6, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("nothing suspicious" = 1) foodtype = GRAIN | GROSS @@ -84,13 +84,13 @@ foodtype = GRAIN /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry - bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2) - list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) foodtype = GRAIN | FRUIT | SUGAR /obj/item/reagent_containers/food/snacks/jelliedtoast/slime - bonus_reagents = list("slimejelly" = 5, "vitamin" = 2) - list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 2) foodtype = GRAIN | TOXIC | SUGAR /obj/item/reagent_containers/food/snacks/twobread @@ -98,7 +98,7 @@ desc = "This seems awfully bitter." icon = 'icons/obj/food/burgerbread.dmi' icon_state = "twobread" - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("bread" = 2) foodtype = GRAIN diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 2bf00c4e08e..1002daf9e8f 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -4,7 +4,7 @@ trash = /obj/item/reagent_containers/glass/bowl bitesize = 5 volume = 80 - list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("tasteless soup" = 1) foodtype = VEGETABLES @@ -16,7 +16,7 @@ name = "wish soup" desc = "I wish this was soup." icon_state = "wishsoup" - list_reagents = list("water" = 10) + list_reagents = list(/datum/reagent/water = 10) tastes = list("wishes" = 1) /obj/item/reagent_containers/food/snacks/soup/wish/Initialize() @@ -24,17 +24,17 @@ var/wish_true = prob(25) if(wish_true) desc = "A wish come true!" - bonus_reagents = list("nutriment" = 9, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 1) if(wish_true) - reagents.add_reagent("nutriment", 9) - reagents.add_reagent("vitamin", 1) + reagents.add_reagent(/datum/reagent/consumable/nutriment, 9) + reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 1) foodtype = VEGETABLES /obj/item/reagent_containers/food/snacks/soup/meatball name = "meatball soup" desc = "You've got balls kid, BALLS!" icon_state = "meatballsoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("meat" = 1) foodtype = MEAT @@ -42,8 +42,8 @@ name = "slime soup" desc = "If no water is available, you may substitute tears." icon_state = "slimesoup" - bonus_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/slimejelly = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/slimejelly = 5, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("slime" = 1) foodtype = TOXIC | SUGAR @@ -51,8 +51,8 @@ name = "tomato soup" desc = "Smells like copper." icon_state = "tomatosoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 6) - list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/blood = 10, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("iron" = 1) foodtype = GROSS @@ -61,8 +61,8 @@ desc = "A savory dish of alien wing wang in soy." icon_state = "wingfangchu" trash = /obj/item/reagent_containers/glass/bowl - bonus_reagents = list("nutriment" = 1, "vitamin" = 2) - list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/soysauce = 5, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("soy" = 1) foodtype = MEAT @@ -70,8 +70,8 @@ name = "clown's tears" desc = "Not very funny." icon_state = "clownstears" - bonus_reagents = list("nutriment" = 1, "banana" = 5, "vitamin" = 8, "clownstears" = 10) - list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 5, "vitamin" = 8, "clownstears" = 10) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/clownstears = 10) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 5, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 8, /datum/reagent/consumable/clownstears = 10) tastes = list("a bad joke" = 1) foodtype = FRUIT | SUGAR @@ -79,7 +79,7 @@ name = "vegetable soup" desc = "A true vegan meal." icon_state = "vegetablesoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("vegetables" = 1) foodtype = VEGETABLES @@ -87,7 +87,7 @@ name = "nettle soup" desc = "To think, the botanist would've beat you to death with one of these." icon_state = "nettlesoup" - bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/medicine/omnizine = 5, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("nettles" = 1) foodtype = VEGETABLES @@ -96,21 +96,21 @@ desc = "The mystery is, why aren't you eating it?" icon_state = "mysterysoup" var/extra_reagent = null - list_reagents = list("nutriment" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) tastes = list("chaos" = 1) /obj/item/reagent_containers/food/snacks/soup/mystery/Initialize() . = ..() - extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") - bonus_reagents = list("[extra_reagent]" = 5, "nutriment" = 6) + extra_reagent = pick(/datum/reagent/consumable/capsaicin, /datum/reagent/consumable/frostoil, /datum/reagent/medicine/omnizine, /datum/reagent/consumable/banana, /datum/reagent/blood, /datum/reagent/toxin/slimejelly, /datum/reagent/toxin, /datum/reagent/consumable/banana, /datum/reagent/carbon, /datum/reagent/medicine/oculine) + bonus_reagents = list("[extra_reagent]" = 5, /datum/reagent/consumable/nutriment = 6) reagents.add_reagent("[extra_reagent]", 5) /obj/item/reagent_containers/food/snacks/soup/hotchili name = "hot chili" desc = "A five alarm Texan Chili!" icon_state = "hotchili" - bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("hot peppers" = 1) foodtype = VEGETABLES @@ -118,8 +118,8 @@ name = "cold chili" desc = "This slush is barely a liquid!" icon_state = "coldchili" - bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2) - list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/frostoil = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("tomato" = 1, "mint" = 1) foodtype = VEGETABLES @@ -127,8 +127,8 @@ name = "monkey's delight" desc = "A delicious soup with dumplings and hunks of monkey meat simmered to perfection, in a broth that tastes faintly of bananas." icon_state = "monkeysdelight" - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) - list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("the jungle" = 1, "banana" = 1) foodtype = FRUIT @@ -136,8 +136,8 @@ name = "tomato soup" desc = "Drinking this feels like being a vampire! A tomato vampire..." icon_state = "tomatosoup" - bonus_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 3) - list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("tomato" = 1) foodtype = VEGETABLES @@ -145,7 +145,7 @@ name = "eyeball soup" desc = "It looks back at you..." icon_state = "eyeballsoup" - bonus_reagents = list("nutriment" = 1, "liquidgibs" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/liquidgibs = 3) tastes = list("tomato" = 1, "squirming" = 1) foodtype = MEAT | GROSS @@ -153,7 +153,7 @@ name = "milosoup" desc = "The universes best soup! Yum!!!" icon_state = "milosoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) tastes = list("milo" = 1) // wtf is milo foodtype = GROSS @@ -161,8 +161,8 @@ name = "chantrelle soup" desc = "A delicious and hearty mushroom soup." icon_state = "mushroomsoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) - list_reagents = list("nutriment" = 8, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("mushroom" = 1) foodtype = VEGETABLES @@ -170,7 +170,7 @@ name = "beet soup" desc = "Wait, how do you spell it again..?" icon_state = "beetsoup" - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) foodtype = VEGETABLES /obj/item/reagent_containers/food/snacks/soup/beet/Initialize() @@ -184,8 +184,8 @@ desc = "Jello gelatin, from Alfred Hubbard's cookbook." icon_state = "spacylibertyduff" bitesize = 3 - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/drug/mushroomhallucinogen = 6) tastes = list("jelly" = 1, "mushroom" = 1) foodtype = VEGETABLES @@ -194,8 +194,8 @@ desc = "Looks curiously toxic." icon_state = "amanitajelly" bitesize = 3 - bonus_reagents = list("nutriment" = 1, "vitamin" = 5) - list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 3, "amatoxin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/drug/mushroomhallucinogen = 3, /datum/reagent/toxin/amatoxin = 6) tastes = list("jelly" = 1, "mushroom" = 1) foodtype = VEGETABLES | TOXIC @@ -203,8 +203,8 @@ name = "stew" desc = "A nice and warm stew. Healthy and strong." icon_state = "stew" - bonus_reagents = list("nutriment" = 1, "tomatojuice" = 5, "vitamin" = 5) - list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 5, /datum/reagent/consumable/nutriment/vitamin = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/tomatojuice = 5, /datum/reagent/consumable/nutriment/vitamin = 5) bitesize = 7 volume = 100 tastes = list("tomato" = 1, "carrot" = 1) @@ -214,7 +214,7 @@ name = "sweet potato soup" desc = "Delicious sweet potato in soup form." icon_state = "sweetpotatosoup" - bonus_reagents = list("nutriment" = 4, "vitamin" = 5) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 5) tastes = list("sweet potato" = 1) foodtype = VEGETABLES | SUGAR @@ -222,6 +222,6 @@ name = "red beet soup" desc = "Quite a delicacy." icon_state = "redbeetsoup" - bonus_reagents = list("nutriment" = 4, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("beet" = 1) foodtype = VEGETABLES diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm index e14c9177ed0..b30703e9a84 100644 --- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm +++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm @@ -4,7 +4,7 @@ desc = "Now that's a nic'e pasta!" icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "spaghetti" - list_reagents = list("nutriment" = 1, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) cooked_type = /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti filling_color = "#F0E68C" tastes = list("pasta" = 1) @@ -23,8 +23,8 @@ desc = "A plain dish of noodles, this needs more ingredients." icon_state = "spaghettiboiled" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 2) - list_reagents = list("nutriment" = 2, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) cooked_type = null custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pasta @@ -34,8 +34,8 @@ icon_state = "pastatomato" trash = /obj/item/trash/plate bitesize = 4 - bonus_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 4) - list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4) cooked_type = null filling_color = "#DC143C" tastes = list("pasta" = 1, "tomato" = 1) @@ -47,8 +47,8 @@ icon_state = "copypasta" trash = /obj/item/trash/plate bitesize = 4 - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 12, "tomatojuice" = 20, "vitamin" = 8) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8) cooked_type = null filling_color = "#DC143C" tastes = list("pasta" = 1, "tomato" = 1) @@ -59,8 +59,8 @@ desc = "Now that's a nic'e meatball!" icon_state = "meatballspaghetti" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 4) - list_reagents = list("nutriment" = 8, "vitamin" = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) cooked_type = null tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1) foodtype = GRAIN | MEAT @@ -70,8 +70,8 @@ desc = "A lawyers favourite." icon_state = "spesslaw" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 1, "vitamin" = 6) - list_reagents = list("nutriment" = 8, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6) cooked_type = null tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1) @@ -80,8 +80,8 @@ desc = "A nice mix of noodles and fried vegetables." icon_state = "chowmein" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 3, "vitamin" = 4) - list_reagents = list("nutriment" = 7, "vitamin" = 6) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6) cooked_type = null tastes = list("noodle" = 1, "tomato" = 1) @@ -90,7 +90,7 @@ desc = "Nutritious, beefy and noodly." icon_state = "beefnoodle" trash = /obj/item/reagent_containers/glass/bowl - bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "liquidgibs" = 3) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3) cooked_type = null tastes = list("noodle" = 1, "meat" = 1) foodtype = GRAIN | MEAT @@ -100,7 +100,7 @@ desc = "Noodles covered in savory butter. Simple and slippery, but delicious." icon_state = "butternoodles" trash = /obj/item/trash/plate - bonus_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) cooked_type = null tastes = list("noodle" = 1, "butter" = 1) foodtype = GRAIN | DAIRY \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 4e7dcecf376..41c41783a6a 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -7,7 +7,7 @@ desc = "Nougat love it or hate it." icon_state = "candy" trash = /obj/item/trash/candy - list_reagents = list("nutriment" = 1, "sugar" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3) junkiness = 25 filling_color = "#D2691E" tastes = list("candy" = 1) @@ -18,7 +18,7 @@ icon_state = "sosjerky" desc = "Beef jerky made from the finest space cows." trash = /obj/item/trash/sosjerky - list_reagents = list("nutriment" = 1, "sugar" = 3, "sodiumchloride" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/sodiumchloride = 2) junkiness = 25 filling_color = "#8B0000" tastes = list("dried meat" = 1) @@ -27,7 +27,7 @@ /obj/item/reagent_containers/food/snacks/sosjerky/healthy name = "homemade beef jerky" desc = "Homemade beef jerky made from the finest space cows." - list_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) junkiness = 0 /obj/item/reagent_containers/food/snacks/chips @@ -36,7 +36,7 @@ icon_state = "chips" trash = /obj/item/trash/chips bitesize = 1 - list_reagents = list("nutriment" = 1, "sugar" = 3, "sodiumchloride" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/sodiumchloride = 1) junkiness = 20 filling_color = "#FFD700" tastes = list("salt" = 1, "crisps" = 1) @@ -47,7 +47,7 @@ icon_state = "4no_raisins" desc = "Best raisins in the universe. Not sure why." trash = /obj/item/trash/raisins - list_reagents = list("nutriment" = 2, "sugar" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/sugar = 4) junkiness = 25 filling_color = "#8B0000" tastes = list("dried raisins" = 1) @@ -57,7 +57,7 @@ /obj/item/reagent_containers/food/snacks/no_raisin/healthy name = "homemade raisins" desc = "Homemade raisins, the best in all of spess." - list_reagents = list("nutriment" = 3, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) junkiness = 0 foodtype = FRUIT @@ -65,7 +65,7 @@ name = "space twinkie" icon_state = "space_twinkie" desc = "Guaranteed to survive longer than you will." - list_reagents = list("sugar" = 4) + list_reagents = list(/datum/reagent/consumable/sugar = 4) junkiness = 25 filling_color = "#FFD700" foodtype = JUNKFOOD | GRAIN | SUGAR @@ -76,7 +76,7 @@ desc = "Bite sized cheesie snacks that will honk all over your mouth." icon_state = "cheesie_honkers" trash = /obj/item/trash/cheesie - list_reagents = list("nutriment" = 1, "sugar" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sugar = 3) junkiness = 25 filling_color = "#FFD700" tastes = list("cheese" = 5, "crisps" = 2) @@ -88,7 +88,7 @@ icon_state = "syndi_cakes" desc = "An extremely moist snack cake that tastes just as good after being nuked." trash = /obj/item/trash/syndi_cakes - list_reagents = list("nutriment" = 4, "doctorsdelight" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/doctor_delight = 5) filling_color = "#F5F5DC" tastes = list("sweetness" = 3, "cake" = 1) foodtype = GRAIN | FRUIT | VEGETABLES @@ -98,7 +98,7 @@ icon_state = "energybar" desc = "An energy bar with a lot of punch, you probably shouldn't eat this if you're not an Ethereal." trash = /obj/item/trash/energybar - list_reagents = list("nutriment" = 3, "liquidelectricity" = 3) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/liquidelectricity = 3) filling_color = "#97ee63" tastes = list("pure electricity" = 3, "fitness" = 2) foodtype = TOXIC diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index b0a22edb93d..ad1993133b4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -53,7 +53,7 @@ God bless America. /obj/machinery/deepfryer/Initialize() . = ..() create_reagents(50, OPENCONTAINER) - reagents.add_reagent("cooking_oil", 25) + reagents.add_reagent(/datum/reagent/consumable/cooking_oil, 25) component_parts = list() component_parts += new /obj/item/circuitboard/machine/deep_fryer(null) component_parts += new /obj/item/stock_parts/micro_laser(null) @@ -83,7 +83,7 @@ God bless America. I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = user) qdel(I) return - if(!reagents.has_reagent("cooking_oil")) + if(!reagents.has_reagent(/datum/reagent/consumable/cooking_oil)) to_chat(user, "[src] has no cooking oil to fry with!") return if(I.resistance_flags & INDESTRUCTIBLE) @@ -107,7 +107,7 @@ God bless America. /obj/machinery/deepfryer/process() ..() - var/datum/reagent/consumable/cooking_oil/C = reagents.has_reagent("cooking_oil") + var/datum/reagent/consumable/cooking_oil/C = reagents.has_reagent(/datum/reagent/consumable/cooking_oil) if(!C) return reagents.chem_temp = C.fry_temperature @@ -148,7 +148,8 @@ God bless America. var/mob/living/carbon/C = user.pulling user.visible_message("[user] dunks [C]'s face in [src]!") reagents.reaction(C, TOUCH) - C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD) + var/permeability = 1 - C.get_permeability_protection(list(HEAD)) + C.apply_damage(min(30 * permeability, reagents.total_volume), BURN, BODY_ZONE_HEAD) reagents.remove_any((reagents.total_volume/2)) C.Paralyze(60) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index 9c01eaa13cd..1843ad0991e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -35,16 +35,16 @@ dat += "Portion: [portion]
" for(var/datum/reagent/R in reagents.reagent_list) dat += "[R.name]: [R.volume] " - dat += "Purge" + dat += "Purge" if (glasses > 0) - dat += "Pour in a glass" - dat += "Add to the mixer
" + dat += "Pour in a glass" + dat += "Add to the mixer
" dat += "

MIXER CONTENTS
" for(var/datum/reagent/R in mixer.reagents.reagent_list) dat += "[R.name]: [R.volume] " - dat += "Transfer back" + dat += "Transfer back" if (glasses > 0) - dat += "Pour in a glass" + dat += "Pour in a glass" dat += "
" dat += "

STORED FOOD
" for(var/V in stored_food) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 4341217fe59..5bd0d76ddb0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -186,7 +186,7 @@ newmeat.name = "[sourcename] [newmeat.name]" if(istype(newmeat)) newmeat.subjectname = sourcename - newmeat.reagents.add_reagent ("nutriment", sourcenutriment / meat_produced) // Thehehe. Fat guys go first + newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, sourcenutriment / meat_produced) // Thehehe. Fat guys go first if(occupant_volume) occupant.reagents.trans_to(newmeat, occupant_volume / meat_produced, remove_blacklisted = TRUE) if(sourcejob) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 9ff68b5c06d..e0c0e08a187 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -19,29 +19,29 @@ var/dispense_flavour = ICECREAM_VANILLA var/flavour_name = "vanilla" var/static/list/icecream_vat_reagents = list( - "milk" = 5, - "flour" = 5, - "sugar" = 5, - "ice" = 5, - "cocoa" = 5, - "vanilla" = 5, - "berryjuice" = 5, - "singulo" = 5) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/flour = 5, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/ice = 5, + /datum/reagent/consumable/coco = 5, + /datum/reagent/consumable/vanilla = 5, + /datum/reagent/consumable/berryjuice = 5, + /datum/reagent/consumable/ethanol/singulo = 5) /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) if(ICECREAM_CHOCOLATE) - return list("milk", "ice", "cocoa") + return list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/coco) if(ICECREAM_STRAWBERRY) - return list("milk", "ice", "berryjuice") + return list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/berryjuice) if(ICECREAM_BLUE) - return list("milk", "ice", "singulo") + return list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/ethanol/singulo) if(CONE_WAFFLE) - return list("flour", "sugar") + return list(/datum/reagent/consumable/flour, /datum/reagent/consumable/sugar) if(CONE_CHOC) - return list("flour", "sugar", "cocoa") + return list(/datum/reagent/consumable/flour, /datum/reagent/consumable/sugar, /datum/reagent/consumable/coco) else //ICECREAM_VANILLA - return list("milk", "ice", "vanilla") + return list(/datum/reagent/consumable/milk, /datum/reagent/consumable/ice, /datum/reagent/consumable/vanilla) /obj/machinery/icecream_vat/proc/get_flavour_name(flavour_type) @@ -84,7 +84,7 @@ dat += "VAT CONTENT
" for(var/datum/reagent/R in reagents.reagent_list) dat += "[R.name]: [R.volume]" - dat += "Purge
" + dat += "Purge
" dat += "Refresh Close" var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) @@ -100,7 +100,7 @@ product_types[dispense_flavour] -= 1 I.add_ice_cream(flavour_name) if(I.reagents.total_volume < 10) - I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) + I.reagents.add_reagent(/datum/reagent/consumable/sugar, 10 - I.reagents.total_volume) else to_chat(user, "There is not enough ice cream left!") else @@ -179,16 +179,16 @@ /obj/item/reagent_containers/food/snacks/icecream/Initialize() . = ..() create_reagents(20) - reagents.add_reagent("nutriment", 4) + reagents.add_reagent(/datum/reagent/consumable/nutriment, 4) /obj/item/reagent_containers/food/snacks/icecream/proc/set_cone_type(var/cone_name) cone_type = cone_name icon_state = "icecream_cone_[cone_name]" switch (cone_type) if ("waffle") - reagents.add_reagent("nutriment", 1) + reagents.add_reagent(/datum/reagent/consumable/nutriment, 1) if ("chocolate") - reagents.add_reagent("cocoa", 1) // chocolate ain't as nutritious kids + reagents.add_reagent(/datum/reagent/consumable/coco, 1) // chocolate ain't as nutritious kids desc = "Delicious [cone_name] cone, but no ice cream." @@ -201,16 +201,16 @@ desc = "A delicious [cone_type] cone filled with vanilla ice cream. All the other ice creams take content from it." if ("chocolate") desc = "A delicious [cone_type] cone filled with chocolate ice cream. Surprisingly, made with real cocoa." - reagents.add_reagent("cocoa", 2) + reagents.add_reagent(/datum/reagent/consumable/coco, 2) if ("strawberry") desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries." - reagents.add_reagent("berryjuice", 2) + reagents.add_reagent(/datum/reagent/consumable/berryjuice, 2) if ("blue") desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?" - reagents.add_reagent("singulo", 2) + reagents.add_reagent(/datum/reagent/consumable/ethanol/singulo, 2) if ("mob") desc = "A suspicious [cone_type] cone filled with bright red ice cream. That's probably not strawberry..." - reagents.add_reagent("liquidgibs", 2) + reagents.add_reagent(/datum/reagent/liquidgibs, 2) ice_creamed = 1 /obj/item/reagent_containers/food/snacks/icecream/proc/add_mob_flavor(var/mob/M) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index c91d0e77ab6..a377540f0d6 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -136,8 +136,8 @@ if(istype(O, /obj/item/reagent_containers/spray)) var/obj/item/reagent_containers/spray/clean_spray = O - if(clean_spray.reagents.has_reagent("cleaner", clean_spray.amount_per_transfer_from_this)) - clean_spray.reagents.remove_reagent("cleaner", clean_spray.amount_per_transfer_from_this,1) + if(clean_spray.reagents.has_reagent(/datum/reagent/space_cleaner, clean_spray.amount_per_transfer_from_this)) + clean_spray.reagents.remove_reagent(/datum/reagent/space_cleaner, clean_spray.amount_per_transfer_from_this,1) playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) user.visible_message("[user] has cleaned \the [src].", "You clean \the [src].") dirty = 0 @@ -188,13 +188,13 @@ ..() /obj/machinery/microwave/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, !issilicon(usr))) cook() /obj/machinery/microwave/ui_interact(mob/user) . = ..() - if(operating || panel_open || !anchored || !user.canUseTopic(src)) + if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) return if(isAI(user) && (stat & NOPOWER)) return @@ -209,7 +209,7 @@ var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user)) // post choice verification - if(operating || panel_open || !anchored || !user.canUseTopic(src)) + if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) return if(isAI(user) && (stat & NOPOWER)) return diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 511cc7fe7ef..5d9a3e190b0 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -3,774 +3,781 @@ /datum/chemical_reaction/goldschlager name = "Goldschlager" - id = "goldschlager" - results = list("goldschlager" = 10) - required_reagents = list("vodka" = 10, "gold" = 1) + id = /datum/reagent/consumable/ethanol/goldschlager + results = list(/datum/reagent/consumable/ethanol/goldschlager = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/gold = 1) /datum/chemical_reaction/patron name = "Patron" - id = "patron" - results = list("patron" = 10) - required_reagents = list("tequila" = 10, "silver" = 1) + id = /datum/reagent/consumable/ethanol/patron + results = list(/datum/reagent/consumable/ethanol/patron = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 10, /datum/reagent/silver = 1) /datum/chemical_reaction/bilk name = "Bilk" - id = "bilk" - results = list("bilk" = 2) - required_reagents = list("milk" = 1, "beer" = 1) + id = /datum/reagent/consumable/ethanol/bilk + results = list(/datum/reagent/consumable/ethanol/bilk = 2) + required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1) /datum/chemical_reaction/icetea name = "Iced Tea" - id = "icetea" - results = list("icetea" = 4) - required_reagents = list("ice" = 1, "tea" = 3) + id = /datum/reagent/consumable/icetea + results = list(/datum/reagent/consumable/icetea = 4) + required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/tea = 3) /datum/chemical_reaction/icecoffee name = "Iced Coffee" - id = "icecoffee" - results = list("icecoffee" = 4) - required_reagents = list("ice" = 1, "coffee" = 3) + id = /datum/reagent/consumable/icecoffee + results = list(/datum/reagent/consumable/icecoffee = 4) + required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/coffee = 3) /datum/chemical_reaction/nuka_cola name = "Nuka Cola" - id = "nuka_cola" - results = list("nuka_cola" = 6) - required_reagents = list("uranium" = 1, "cola" = 6) + id = /datum/reagent/consumable/nuka_cola + results = list(/datum/reagent/consumable/nuka_cola = 6) + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6) /datum/chemical_reaction/moonshine name = "Moonshine" - id = "moonshine" - results = list("moonshine" = 10) - required_reagents = list("nutriment" = 5, "sugar" = 5) - required_catalysts = list("enzyme" = 5) + id = /datum/reagent/consumable/ethanol/moonshine + results = list(/datum/reagent/consumable/ethanol/moonshine = 10) + required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/wine name = "Wine" - id = "wine" - results = list("wine" = 10) - required_reagents = list("grapejuice" = 10) - required_catalysts = list("enzyme" = 5) + id = /datum/reagent/consumable/ethanol/wine + results = list(/datum/reagent/consumable/ethanol/wine = 10) + required_reagents = list(/datum/reagent/consumable/grapejuice = 10) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/spacebeer name = "Space Beer" id = "spacebeer" - results = list("beer" = 10) - required_reagents = list("flour" = 10) - required_catalysts = list("enzyme" = 5) + results = list(/datum/reagent/consumable/ethanol/beer = 10) + required_reagents = list(/datum/reagent/consumable/flour = 10) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/vodka name = "Vodka" - id = "vodka" - results = list("vodka" = 10) - required_reagents = list("potato" = 10) - required_catalysts = list("enzyme" = 5) + id = /datum/reagent/consumable/ethanol/vodka + results = list(/datum/reagent/consumable/ethanol/vodka = 10) + required_reagents = list(/datum/reagent/consumable/potato_juice = 10) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/kahlua name = "Kahlua" - id = "kahlua" - results = list("kahlua" = 5) - required_reagents = list("coffee" = 5, "sugar" = 5) - required_catalysts = list("enzyme" = 5) + id = /datum/reagent/consumable/ethanol/kahlua + results = list(/datum/reagent/consumable/ethanol/kahlua = 5) + required_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/sugar = 5) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/gin_tonic name = "Gin and Tonic" - id = "gintonic" - results = list("gintonic" = 3) - required_reagents = list("gin" = 2, "tonic" = 1) + id = /datum/reagent/consumable/ethanol/gintonic + results = list(/datum/reagent/consumable/ethanol/gintonic = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/tonic = 1) /datum/chemical_reaction/rum_coke name = "Rum and Coke" - id = "rumcoke" - results = list("rumcoke" = 3) - required_reagents = list("rum" = 2, "cola" = 1) + id = /datum/reagent/consumable/ethanol/rum_coke + results = list(/datum/reagent/consumable/ethanol/rum_coke = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/cuba_libre name = "Cuba Libre" - id = "cubalibre" - results = list("cubalibre" = 4) - required_reagents = list("rumcoke" = 3, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/cuba_libre + results = list(/datum/reagent/consumable/ethanol/cuba_libre = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/rum_coke = 3, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/martini name = "Classic Martini" - id = "martini" - results = list("martini" = 3) - required_reagents = list("gin" = 2, "vermouth" = 1) + id = /datum/reagent/consumable/ethanol/martini + results = list(/datum/reagent/consumable/ethanol/martini = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/vodkamartini name = "Vodka Martini" - id = "vodkamartini" - results = list("vodkamartini" = 3) - required_reagents = list("vodka" = 2, "vermouth" = 1) + id = /datum/reagent/consumable/ethanol/vodkamartini + results = list(/datum/reagent/consumable/ethanol/vodkamartini = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/white_russian name = "White Russian" - id = "whiterussian" - results = list("whiterussian" = 5) - required_reagents = list("blackrussian" = 3, "cream" = 2) + id = /datum/reagent/consumable/ethanol/white_russian + results = list(/datum/reagent/consumable/ethanol/white_russian = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 3, /datum/reagent/consumable/cream = 2) /datum/chemical_reaction/whiskey_cola name = "Whiskey Cola" - id = "whiskeycola" - results = list("whiskeycola" = 3) - required_reagents = list("whiskey" = 2, "cola" = 1) + id = /datum/reagent/consumable/ethanol/whiskey_cola + results = list(/datum/reagent/consumable/ethanol/whiskey_cola = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/screwdriver name = "Screwdriver" - id = "screwdrivercocktail" - results = list("screwdrivercocktail" = 3) - required_reagents = list("vodka" = 2, "orangejuice" = 1) + id = /datum/reagent/consumable/ethanol/screwdrivercocktail + results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/bloody_mary name = "Bloody Mary" - id = "bloodymary" - results = list("bloodymary" = 4) - required_reagents = list("vodka" = 1, "tomatojuice" = 2, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/bloody_mary + results = list(/datum/reagent/consumable/ethanol/bloody_mary = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/gargle_blaster name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" - results = list("gargleblaster" = 5) - required_reagents = list("vodka" = 1, "gin" = 1, "whiskey" = 1, "cognac" = 1, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/gargle_blaster + results = list(/datum/reagent/consumable/ethanol/gargle_blaster = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/brave_bull name = "Brave Bull" - id = "bravebull" - results = list("bravebull" = 3) - required_reagents = list("tequila" = 2, "kahlua" = 1) + id = /datum/reagent/consumable/ethanol/brave_bull + results = list(/datum/reagent/consumable/ethanol/brave_bull = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/ethanol/kahlua = 1) /datum/chemical_reaction/tequila_sunrise name = "Tequila Sunrise" - id = "tequilasunrise" - results = list("tequilasunrise" = 5) - required_reagents = list("tequila" = 2, "orangejuice" = 2, "grenadine" = 1) + id = /datum/reagent/consumable/ethanol/tequila_sunrise + results = list(/datum/reagent/consumable/ethanol/tequila_sunrise = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/orangejuice = 2, /datum/reagent/consumable/grenadine = 1) /datum/chemical_reaction/toxins_special name = "Toxins Special" - id = "toxinsspecial" - results = list("toxinsspecial" = 5) - required_reagents = list("rum" = 2, "vermouth" = 1, "plasma" = 2) + id = /datum/chemical_reaction/toxins_special + results = list(/datum/chemical_reaction/toxins_special = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2) /datum/chemical_reaction/beepsky_smash name = "Beepksy Smash" id = "beepksysmash" - results = list("beepskysmash" = 5) - required_reagents = list("limejuice" = 2, "quadruple_sec" = 2, "iron" = 1) + results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5) + required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1) /datum/chemical_reaction/doctor_delight name = "The Doctor's Delight" id = "doctordelight" - results = list("doctorsdelight" = 5) - required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "cryoxadone" = 1) + results = list(/datum/reagent/consumable/doctor_delight = 5) + required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1) /datum/chemical_reaction/irish_cream name = "Irish Cream" - id = "irishcream" - results = list("irishcream" = 3) - required_reagents = list("whiskey" = 2, "cream" = 1) + id = /datum/reagent/consumable/ethanol/irish_cream + results = list(/datum/reagent/consumable/ethanol/irish_cream = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/manly_dorf name = "The Manly Dorf" - id = "manlydorf" - results = list("manlydorf" = 3) - required_reagents = list ("beer" = 1, "ale" = 2) + id = /datum/reagent/consumable/ethanol/manly_dorf + results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3) + required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2) /datum/chemical_reaction/greenbeer name = "Green Beer" - id = "greenbeer" - results = list("greenbeer" = 10) - required_reagents = list("greencrayonpowder" = 1, "beer" = 10) + id = /datum/reagent/consumable/ethanol/beer/green + results = list(/datum/reagent/consumable/ethanol/beer/green = 10) + required_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/green = 1, /datum/reagent/consumable/ethanol/beer = 10) /datum/chemical_reaction/hooch name = "Hooch" - id = "hooch" - results = list("hooch" = 3) - required_reagents = list ("ethanol" = 2, "welding_fuel" = 1) - required_catalysts = list("enzyme" = 1) + id = /datum/reagent/consumable/ethanol/hooch + results = list(/datum/reagent/consumable/ethanol/hooch = 3) + required_reagents = list (/datum/reagent/consumable/ethanol = 2, /datum/reagent/fuel = 1) + required_catalysts = list(/datum/reagent/consumable/enzyme = 1) /datum/chemical_reaction/irish_coffee name = "Irish Coffee" - id = "irishcoffee" - results = list("irishcoffee" = 2) - required_reagents = list("irishcream" = 1, "coffee" = 1) + id = /datum/reagent/consumable/ethanol/irishcoffee + results = list(/datum/reagent/consumable/ethanol/irishcoffee = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/coffee = 1) /datum/chemical_reaction/b52 name = "B-52" - id = "b52" - results = list("b52" = 3) - required_reagents = list("irishcream" = 1, "kahlua" = 1, "cognac" = 1) + id = /datum/reagent/consumable/ethanol/b52 + results = list(/datum/reagent/consumable/ethanol/b52 = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/cognac = 1) /datum/chemical_reaction/atomicbomb name = "Atomic Bomb" - id = "atomicbomb" - results = list("atomicbomb" = 10) - required_reagents = list("b52" = 10, "uranium" = 1) + id = /datum/reagent/consumable/ethanol/atomicbomb + results = list(/datum/reagent/consumable/ethanol/atomicbomb = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/b52 = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/margarita name = "Margarita" - id = "margarita" - results = list("margarita" = 3) - required_reagents = list("tequila" = 2, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/margarita + results = list(/datum/reagent/consumable/ethanol/margarita = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/longislandicedtea name = "Long Island Iced Tea" - id = "longislandicedtea" - results = list("longislandicedtea" = 4) - required_reagents = list("vodka" = 1, "gin" = 1, "tequila" = 1, "cubalibre" = 1) + id = /datum/reagent/consumable/ethanol/longislandicedtea + results = list(/datum/reagent/consumable/ethanol/longislandicedtea = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/tequila = 1, /datum/reagent/consumable/ethanol/cuba_libre = 1) /datum/chemical_reaction/threemileisland name = "Three Mile Island Iced Tea" - id = "threemileisland" - results = list("threemileisland" = 10) - required_reagents = list("longislandicedtea" = 10, "uranium" = 1) + id = /datum/reagent/consumable/ethanol/threemileisland + results = list(/datum/reagent/consumable/ethanol/threemileisland = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/longislandicedtea = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/whiskeysoda name = "Whiskey Soda" - id = "whiskeysoda" - results = list("whiskeysoda" = 3) - required_reagents = list("whiskey" = 2, "sodawater" = 1) + id = /datum/reagent/consumable/ethanol/whiskeysoda + results = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/sodawater = 1) /datum/chemical_reaction/black_russian name = "Black Russian" - id = "blackrussian" - results = list("blackrussian" = 5) - required_reagents = list("vodka" = 3, "kahlua" = 2) + id = /datum/reagent/consumable/ethanol/black_russian + results = list(/datum/reagent/consumable/ethanol/black_russian = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/consumable/ethanol/kahlua = 2) /datum/chemical_reaction/manhattan name = "Manhattan" - id = "manhattan" - results = list("manhattan" = 3) - required_reagents = list("whiskey" = 2, "vermouth" = 1) + id = /datum/reagent/consumable/ethanol/manhattan + results = list(/datum/reagent/consumable/ethanol/manhattan = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/ethanol/vermouth = 1) /datum/chemical_reaction/manhattan_proj name = "Manhattan Project" - id = "manhattan_proj" - results = list("manhattan_proj" = 10) - required_reagents = list("manhattan" = 10, "uranium" = 1) + id = /datum/reagent/consumable/ethanol/manhattan_proj + results = list(/datum/reagent/consumable/ethanol/manhattan_proj = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 10, /datum/reagent/uranium = 1) /datum/chemical_reaction/vodka_tonic name = "Vodka and Tonic" - id = "vodkatonic" - results = list("vodkatonic" = 3) - required_reagents = list("vodka" = 2, "tonic" = 1) + id = /datum/reagent/consumable/ethanol/vodkatonic + results = list(/datum/reagent/consumable/ethanol/vodkatonic = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/tonic = 1) /datum/chemical_reaction/gin_fizz name = "Gin Fizz" - id = "ginfizz" - results = list("ginfizz" = 4) - required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/ginfizz + results = list(/datum/reagent/consumable/ethanol/ginfizz = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/bahama_mama name = "Bahama mama" - id = "bahama_mama" - results = list("bahama_mama" = 6) - required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1) + id = /datum/reagent/consumable/ethanol/bahama_mama + results = list(/datum/reagent/consumable/ethanol/bahama_mama = 6) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/orangejuice = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/singulo name = "Singulo" - id = "singulo" - results = list("singulo" = 10) - required_reagents = list("vodka" = 5, "radium" = 1, "wine" = 5) + id = /datum/reagent/consumable/ethanol/singulo + results = list(/datum/reagent/consumable/ethanol/singulo = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/uranium/radium = 1, /datum/reagent/consumable/ethanol/wine = 5) /datum/chemical_reaction/alliescocktail name = "Allies Cocktail" - id = "alliescocktail" - results = list("alliescocktail" = 2) - required_reagents = list("martini" = 1, "vodka" = 1) + id = /datum/reagent/consumable/ethanol/alliescocktail + results = list(/datum/reagent/consumable/ethanol/alliescocktail = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/martini = 1, /datum/reagent/consumable/ethanol/vodka = 1) /datum/chemical_reaction/demonsblood name = "Demons Blood" - id = "demonsblood" - results = list("demonsblood" = 4) - required_reagents = list("rum" = 1, "spacemountainwind" = 1, "blood" = 1, "dr_gibb" = 1) + id = /datum/reagent/consumable/ethanol/demonsblood + results = list(/datum/reagent/consumable/ethanol/demonsblood = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/dr_gibb = 1) /datum/chemical_reaction/booger name = "Booger" - id = "booger" - results = list("booger" = 4) - required_reagents = list("cream" = 1, "banana" = 1, "rum" = 1, "watermelonjuice" = 1) + id = /datum/reagent/consumable/ethanol/booger + results = list(/datum/reagent/consumable/ethanol/booger = 4) + required_reagents = list(/datum/reagent/consumable/cream = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/watermelonjuice = 1) /datum/chemical_reaction/antifreeze name = "Anti-freeze" - id = "antifreeze" - results = list("antifreeze" = 4) - required_reagents = list("vodka" = 2, "cream" = 1, "ice" = 1) + id = /datum/reagent/consumable/ethanol/antifreeze + results = list(/datum/reagent/consumable/ethanol/antifreeze = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/barefoot name = "Barefoot" - id = "barefoot" - results = list("barefoot" = 3) - required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) + id = /datum/reagent/consumable/ethanol/barefoot + results = list(/datum/reagent/consumable/ethanol/barefoot = 3) + required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ethanol/vermouth = 1) ////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// /datum/chemical_reaction/sbiten name = "Sbiten" - id = "sbiten" - results = list("sbiten" = 10) - required_reagents = list("vodka" = 10, "capsaicin" = 1) + id = /datum/reagent/consumable/ethanol/sbiten + results = list(/datum/reagent/consumable/ethanol/sbiten = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/consumable/capsaicin = 1) /datum/chemical_reaction/red_mead name = "Red Mead" - id = "red_mead" - results = list("red_mead" = 2) - required_reagents = list("blood" = 1, "mead" = 1) + id = /datum/reagent/consumable/ethanol/red_mead + results = list(/datum/reagent/consumable/ethanol/red_mead = 2) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/mead = 1) /datum/chemical_reaction/mead name = "Mead" - id = "mead" - results = list("mead" = 2) - required_reagents = list("honey" = 2) - required_catalysts = list("enzyme" = 5) + id = /datum/reagent/consumable/ethanol/mead + results = list(/datum/reagent/consumable/ethanol/mead = 2) + required_reagents = list(/datum/reagent/consumable/honey = 2) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/iced_beer name = "Iced Beer" - id = "iced_beer" - results = list("iced_beer" = 6) - required_reagents = list("beer" = 5, "ice" = 1) + id = /datum/reagent/consumable/ethanol/iced_beer + results = list(/datum/reagent/consumable/ethanol/iced_beer = 6) + required_reagents = list(/datum/reagent/consumable/ethanol/beer = 5, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/grog name = "Grog" - id = "grog" - results = list("grog" = 2) - required_reagents = list("rum" = 1, "water" = 1) + id = /datum/reagent/consumable/ethanol/grog + results = list(/datum/reagent/consumable/ethanol/grog = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/water = 1) /datum/chemical_reaction/soy_latte name = "Soy Latte" - id = "soy_latte" - results = list("soy_latte" = 2) - required_reagents = list("coffee" = 1, "soymilk" = 1) + id = /datum/reagent/consumable/soy_latte + results = list(/datum/reagent/consumable/soy_latte = 2) + required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/soymilk = 1) /datum/chemical_reaction/cafe_latte name = "Cafe Latte" - id = "cafe_latte" - results = list("cafe_latte" = 2) - required_reagents = list("coffee" = 1, "milk" = 1) + id = /datum/reagent/consumable/cafe_latte + results = list(/datum/reagent/consumable/cafe_latte = 2) + required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/milk = 1) /datum/chemical_reaction/acidspit name = "Acid Spit" - id = "acidspit" - results = list("acidspit" = 6) - required_reagents = list("sacid" = 1, "wine" = 5) + id = /datum/reagent/consumable/ethanol/acid_spit + results = list(/datum/reagent/consumable/ethanol/acid_spit = 6) + required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/consumable/ethanol/wine = 5) /datum/chemical_reaction/amasec name = "Amasec" - id = "amasec" - results = list("amasec" = 10) - required_reagents = list("iron" = 1, "wine" = 5, "vodka" = 5) + id = /datum/reagent/consumable/ethanol/amasec + results = list(/datum/reagent/consumable/ethanol/amasec = 10) + required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/consumable/ethanol/wine = 5, /datum/reagent/consumable/ethanol/vodka = 5) /datum/chemical_reaction/changelingsting name = "Changeling Sting" - id = "changelingsting" - results = list("changelingsting" = 5) - required_reagents = list("screwdrivercocktail" = 1, "lemon_lime" = 2) + id = /datum/reagent/consumable/ethanol/changelingsting + results = list(/datum/reagent/consumable/ethanol/changelingsting = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 1, /datum/reagent/consumable/lemon_lime = 2) /datum/chemical_reaction/aloe name = "Aloe" - id = "aloe" - results = list("aloe" = 2) - required_reagents = list("irishcream" = 1, "watermelonjuice" = 1) + id = /datum/reagent/consumable/ethanol/aloe + results = list(/datum/reagent/consumable/ethanol/aloe = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/watermelonjuice = 1) /datum/chemical_reaction/andalusia name = "Andalusia" - id = "andalusia" - results = list("andalusia" = 3) - required_reagents = list("rum" = 1, "whiskey" = 1, "lemonjuice" = 1) + id = /datum/reagent/consumable/ethanol/andalusia + results = list(/datum/reagent/consumable/ethanol/andalusia = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1) /datum/chemical_reaction/neurotoxin name = "Neurotoxin" - id = "neurotoxin" - results = list("neurotoxin" = 2) - required_reagents = list("gargleblaster" = 1, "morphine" = 1) + id = /datum/reagent/consumable/ethanol/neurotoxin + results = list(/datum/reagent/consumable/ethanol/neurotoxin = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/gargle_blaster = 1, /datum/reagent/medicine/morphine = 1) /datum/chemical_reaction/snowwhite name = "Snow White" - id = "snowwhite" - results = list("snowwhite" = 2) - required_reagents = list("beer" = 1, "lemon_lime" = 1) + id = /datum/reagent/consumable/ethanol/snowwhite + results = list(/datum/reagent/consumable/ethanol/snowwhite = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/lemon_lime = 1) /datum/chemical_reaction/irishcarbomb name = "Irish Car Bomb" - id = "irishcarbomb" - results = list("irishcarbomb" = 2) - required_reagents = list("ale" = 1, "irishcream" = 1) + id = /datum/reagent/consumable/ethanol/irishcarbomb + results = list(/datum/reagent/consumable/ethanol/irishcarbomb = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/ethanol/irish_cream = 1) /datum/chemical_reaction/syndicatebomb name = "Syndicate Bomb" - id = "syndicatebomb" - results = list("syndicatebomb" = 2) - required_reagents = list("beer" = 1, "whiskeycola" = 1) + id = /datum/reagent/consumable/ethanol/syndicatebomb + results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1) /datum/chemical_reaction/erikasurprise name = "Erika Surprise" - id = "erikasurprise" - results = list("erikasurprise" = 5) - required_reagents = list("ale" = 1, "limejuice" = 1, "whiskey" = 1, "banana" = 1, "ice" = 1) + id = /datum/reagent/consumable/ethanol/erikasurprise + results = list(/datum/reagent/consumable/ethanol/erikasurprise = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/devilskiss name = "Devils Kiss" - id = "devilskiss" - results = list("devilskiss" = 3) - required_reagents = list("blood" = 1, "kahlua" = 1, "rum" = 1) + id = /datum/reagent/consumable/ethanol/devilskiss + results = list(/datum/reagent/consumable/ethanol/devilskiss = 3) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1) /datum/chemical_reaction/hippiesdelight name = "Hippies Delight" - id = "hippiesdelight" - results = list("hippiesdelight" = 2) - required_reagents = list("mushroomhallucinogen" = 1, "gargleblaster" = 1) + id = /datum/reagent/consumable/ethanol/hippies_delight + results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2) + required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1) /datum/chemical_reaction/bananahonk name = "Banana Honk" - id = "bananahonk" - results = list("bananahonk" = 2) - required_reagents = list("laughter" = 1, "cream" = 1) + id = /datum/reagent/consumable/ethanol/bananahonk + results = list(/datum/reagent/consumable/ethanol/bananahonk = 2) + required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/silencer name = "Silencer" - id = "silencer" - results = list("silencer" = 3) - required_reagents = list("nothing" = 1, "cream" = 1, "sugar" = 1) + id = /datum/reagent/consumable/ethanol/silencer + results = list(/datum/reagent/consumable/ethanol/silencer = 3) + required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/driestmartini name = "Driest Martini" - id = "driestmartini" - results = list("driestmartini" = 2) - required_reagents = list("nothing" = 1, "gin" = 1) + id = /datum/reagent/consumable/ethanol/driestmartini + results = list(/datum/reagent/consumable/ethanol/driestmartini = 2) + required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1) /datum/chemical_reaction/thirteenloko name = "Thirteen Loko" - id = "thirteenloko" - results = list("thirteenloko" = 3) - required_reagents = list("vodka" = 1, "coffee" = 1, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/thirteenloko + results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/chocolatepudding name = "Chocolate Pudding" - id = "chocolatepudding" - results = list("chocolatepudding" = 20) - required_reagents = list("chocolate_milk" = 10, "eggyolk" = 5) + id = /datum/reagent/consumable/chocolatepudding + results = list(/datum/reagent/consumable/chocolatepudding = 20) + required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 10, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/vanillapudding name = "Vanilla Pudding" - id = "vanillapudding" - results = list("vanillapudding" = 20) - required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5) + id = /datum/reagent/consumable/vanillapudding + results = list(/datum/reagent/consumable/vanillapudding = 20) + required_reagents = list(/datum/reagent/consumable/vanilla = 5, /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/cherryshake name = "Cherry Shake" - id = "cherryshake" - results = list("cherryshake" = 3) - required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1) + id = /datum/reagent/consumable/cherryshake + results = list(/datum/reagent/consumable/cherryshake = 3) + required_reagents = list(/datum/reagent/consumable/cherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/bluecherryshake name = "Blue Cherry Shake" - id = "bluecherryshake" - results = list("bluecherryshake" = 3) - required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1) + id = /datum/reagent/consumable/bluecherryshake + results = list(/datum/reagent/consumable/bluecherryshake = 3) + required_reagents = list(/datum/reagent/consumable/bluecherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/drunkenblumpkin name = "Drunken Blumpkin" - id = "drunkenblumpkin" - results = list("drunkenblumpkin" = 4) - required_reagents = list("blumpkinjuice" = 1, "irishcream" = 2, "ice" = 1) + id = /datum/reagent/consumable/ethanol/drunkenblumpkin + results = list(/datum/reagent/consumable/ethanol/drunkenblumpkin = 4) + required_reagents = list(/datum/reagent/consumable/blumpkinjuice = 1, /datum/reagent/consumable/ethanol/irish_cream = 2, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/pumpkin_latte name = "Pumpkin space latte" - id = "pumpkin_latte" - results = list("pumpkin_latte" = 15) - required_reagents = list("pumpkinjuice" = 5, "coffee" = 5, "cream" = 5) + id = /datum/reagent/consumable/pumpkin_latte + results = list(/datum/reagent/consumable/pumpkin_latte = 15) + required_reagents = list(/datum/reagent/consumable/pumpkinjuice = 5, /datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/cream = 5) /datum/chemical_reaction/gibbfloats name = "Gibb Floats" - id = "gibbfloats" - results = list("gibbfloats" = 15) - required_reagents = list("dr_gibb" = 5, "ice" = 5, "cream" = 5) + id = /datum/reagent/consumable/gibbfloats + results = list(/datum/reagent/consumable/gibbfloats = 15) + required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5) /datum/chemical_reaction/triple_citrus - name = "triple_citrus" - id = "triple_citrus" - results = list("triple_citrus" = 5) - required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) + name = /datum/reagent/consumable/triple_citrus + id = /datum/reagent/consumable/triple_citrus + results = list(/datum/reagent/consumable/triple_citrus = 5) + required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1) /datum/chemical_reaction/grape_soda name = "grape soda" - id = "grapesoda" - results = list("grapesoda" = 2) - required_reagents = list("grapejuice" = 1, "sodawater" = 1) + id = /datum/reagent/consumable/grape_soda + results = list(/datum/reagent/consumable/grape_soda = 2) + required_reagents = list(/datum/reagent/consumable/grapejuice = 1, /datum/reagent/consumable/sodawater = 1) /datum/chemical_reaction/grappa - name = "grappa" - id = "grappa" - results = list("grappa" = 10) - required_reagents = list ("wine" = 10) - required_catalysts = list ("enzyme" = 5) + name = /datum/reagent/consumable/ethanol/grappa + id = /datum/reagent/consumable/ethanol/grappa + results = list(/datum/reagent/consumable/ethanol/grappa = 10) + required_reagents = list (/datum/reagent/consumable/ethanol/wine = 10) + required_catalysts = list (/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/whiskey_sour name = "Whiskey Sour" - id = "whiskey_sour" - results = list("whiskey_sour" = 3) - required_reagents = list("whiskey" = 1, "lemonjuice" = 1, "sugar" = 1) + id = /datum/reagent/consumable/ethanol/whiskey_sour + results = list(/datum/reagent/consumable/ethanol/whiskey_sour = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/sugar = 1) mix_message = "The mixture darkens to a rich gold hue." /datum/chemical_reaction/fetching_fizz name = "Fetching Fizz" - id = "fetching_fizz" - results = list("fetching_fizz" = 3) - required_reagents = list("nuka_cola" = 1, "iron" = 1) //Manufacturable from only the mining station + id = /datum/reagent/consumable/ethanol/fetching_fizz + results = list(/datum/reagent/consumable/ethanol/fetching_fizz = 3) + required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station mix_message = "The mixture slightly vibrates before settling." /datum/chemical_reaction/hearty_punch name = "Hearty Punch" - id = "hearty_punch" - results = list("hearty_punch" = 1) //Very little, for balance reasons - required_reagents = list("bravebull" = 5, "syndicatebomb" = 5, "absinthe" = 5) + id = /datum/reagent/consumable/ethanol/hearty_punch + results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons + required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5) mix_message = "The mixture darkens to a healthy crimson." required_temp = 315 //Piping hot! /datum/chemical_reaction/bacchus_blessing name = "Bacchus' Blessing" - id = "bacchus_blessing" - results = list("bacchus_blessing" = 4) - required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1) + id = /datum/reagent/consumable/ethanol/bacchus_blessing + results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1) mix_message = "The mixture turns to a sickening froth." +/datum/chemical_reaction/lemonade + name = "Lemonade" + id = /datum/reagent/consumable/lemonade + results = list(/datum/reagent/consumable/lemonade = 5) + required_reagents = list(/datum/reagent/consumable/lemonjuice = 2, /datum/reagent/water = 2, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/ice = 1) + mix_message = "You're suddenly reminded of home." + /datum/chemical_reaction/arnold_palmer name = "Arnold Palmer" - id = "arnold_palmer" - results = list("arnold_palmer" = 2) - required_reagents = list("tea" = 1, "lemonjuice" = 1) + id = /datum/reagent/consumable/tea/arnold_palmer + results = list(/datum/reagent/consumable/tea/arnold_palmer = 2) + required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/lemonade = 1) mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange." /datum/chemical_reaction/chocolate_milk name = "chocolate milk" - id = "chocolate_milk" - results = list("chocolate_milk" = 2) - required_reagents = list("milk" = 1, "cocoa" = 1) + id = /datum/reagent/consumable/milk/chocolate_milk + results = list(/datum/reagent/consumable/milk/chocolate_milk = 2) + required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/coco = 1) mix_message = "The color changes as the mixture blends smoothly." /datum/chemical_reaction/eggnog - name = "eggnog" - id = "eggnog" - results = list("eggnog" = 15) - required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5) + name = /datum/reagent/consumable/ethanol/eggnog + id = /datum/reagent/consumable/ethanol/eggnog + results = list(/datum/reagent/consumable/ethanol/eggnog = 15) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 5, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/eggyolk = 5) /datum/chemical_reaction/narsour name = "Nar'sour" - id = "narsour" - results = list("narsour" = 1) - required_reagents = list("blood" = 1, "lemonjuice" = 1, "demonsblood" = 1) + id = /datum/reagent/consumable/ethanol/narsour + results = list(/datum/reagent/consumable/ethanol/narsour = 1) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1) mix_message = "The mixture develops a sinister glow." mix_sound = 'sound/effects/singlebeat.ogg' /datum/chemical_reaction/quadruplesec name = "Quadruple Sec" - id = "quadruple_sec" - results = list("quadruple_sec" = 15) - required_reagents = list("triple_sec" = 5, "triple_citrus" = 5, "creme_de_menthe" = 5) + id = /datum/reagent/consumable/ethanol/quadruple_sec + results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15) + required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5) mix_message = "The snap of a taser emanates clearly from the mixture as it settles." mix_sound = 'sound/weapons/taser.ogg' /datum/chemical_reaction/grasshopper name = "Grasshopper" - id = "grasshopper" - results = list("grasshopper" = 15) - required_reagents = list("cream" = 5, "creme_de_menthe" = 5, "creme_de_cacao" = 5) + id = /datum/reagent/consumable/ethanol/grasshopper + results = list(/datum/reagent/consumable/ethanol/grasshopper = 15) + required_reagents = list(/datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5, /datum/reagent/consumable/ethanol/creme_de_cacao = 5) mix_message = "A vibrant green bubbles forth as the mixture emulsifies." /datum/chemical_reaction/stinger name = "Stinger" - id = "stinger" - results = list("stinger" = 15) - required_reagents = list("whiskey" = 10, "creme_de_menthe" = 5 ) + id = /datum/reagent/consumable/ethanol/stinger + results = list(/datum/reagent/consumable/ethanol/stinger = 15) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 10, /datum/reagent/consumable/ethanol/creme_de_menthe = 5 ) /datum/chemical_reaction/quintuplesec name = "Quintuple Sec" - id = "quintuple_sec" - results = list("quintuple_sec" = 15) - required_reagents = list("quadruple_sec" = 5, "clownstears" = 5, "syndicatebomb" = 5) + id = /datum/reagent/consumable/ethanol/quintuple_sec + results = list(/datum/reagent/consumable/ethanol/quintuple_sec = 15) + required_reagents = list(/datum/reagent/consumable/ethanol/quadruple_sec = 5, /datum/reagent/consumable/clownstears = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5) mix_message = "Judgement is upon you." mix_sound = 'sound/items/airhorn2.ogg' /datum/chemical_reaction/bastion_bourbon name = "Bastion Bourbon" - id = "bastion_bourbon" - results = list("bastion_bourbon" = 2) - required_reagents = list("tea" = 1, "creme_de_menthe" = 1, "triple_citrus" = 1, "berryjuice" = 1) //herbal and minty, with a hint of citrus and berry + id = /datum/reagent/consumable/ethanol/bastion_bourbon + results = list(/datum/reagent/consumable/ethanol/bastion_bourbon = 2) + required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/berryjuice = 1) //herbal and minty, with a hint of citrus and berry mix_message = "You catch an aroma of hot tea and fruits as the mix blends into a blue-green color." /datum/chemical_reaction/squirt_cider name = "Squirt Cider" - id = "squirt_cider" - results = list("squirt_cider" = 1) - required_reagents = list("water" = 1, "tomatojuice" = 1, "nutriment" = 1) + id = /datum/reagent/consumable/ethanol/squirt_cider + results = list(/datum/reagent/consumable/ethanol/squirt_cider = 1) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/nutriment = 1) mix_message = "The mix swirls and turns a bright red that reminds you of an apple's skin." /datum/chemical_reaction/fringe_weaver name = "Fringe Weaver" - id = "fringe_weaver" - results = list("fringe_weaver" = 10) - required_reagents = list("ethanol" = 9, "sugar" = 1) //9 karmotrine, 1 adelhyde + id = /datum/reagent/consumable/ethanol/fringe_weaver + results = list(/datum/reagent/consumable/ethanol/fringe_weaver = 10) + required_reagents = list(/datum/reagent/consumable/ethanol = 9, /datum/reagent/consumable/sugar = 1) //9 karmotrine, 1 adelhyde mix_message = "The mix turns a pleasant cream color and foams up." /datum/chemical_reaction/sugar_rush name = "Sugar Rush" - id = "sugar_rush" - results = list("sugar_rush" = 4) - required_reagents = list("sugar" = 2, "lemonjuice" = 1, "wine" = 1) //2 adelhyde (sweet), 1 powdered delta (sour), 1 karmotrine (alcohol) + id = /datum/reagent/consumable/ethanol/sugar_rush + results = list(/datum/reagent/consumable/ethanol/sugar_rush = 4) + required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/wine = 1) //2 adelhyde (sweet), 1 powdered delta (sour), 1 karmotrine (alcohol) mix_message = "The mixture bubbles and brightens into a girly pink." /datum/chemical_reaction/crevice_spike name = "Crevice Spike" - id = "crevice_spike" - results = list("crevice_spike" = 6) - required_reagents = list("limejuice" = 2, "capsaicin" = 4) //2 powdered delta (sour), 4 flanergide (spicy) + id = /datum/reagent/consumable/ethanol/crevice_spike + results = list(/datum/reagent/consumable/ethanol/crevice_spike = 6) + required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/capsaicin = 4) //2 powdered delta (sour), 4 flanergide (spicy) mix_message = "The mixture stings your eyes as it settles." /datum/chemical_reaction/sake - name = "sake" - id = "sake" - results = list("sake" = 10) - required_reagents = list("rice" = 10) - required_catalysts = list("enzyme" = 5) + name = /datum/reagent/consumable/ethanol/sake + id = /datum/reagent/consumable/ethanol/sake + results = list(/datum/reagent/consumable/ethanol/sake = 10) + required_reagents = list(/datum/reagent/consumable/rice = 10) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mix_message = "The rice grains ferment into a clear, sweet-smelling liquid." /datum/chemical_reaction/peppermint_patty name = "Peppermint Patty" - id = "peppermint_patty" - results = list("peppermint_patty" = 10) - required_reagents = list("hot_coco" = 6, "creme_de_cacao" = 1, "creme_de_menthe" = 1, "vodka" = 1, "menthol" = 1) + id = /datum/reagent/consumable/ethanol/peppermint_patty + results = list(/datum/reagent/consumable/ethanol/peppermint_patty = 10) + required_reagents = list(/datum/reagent/consumable/hot_coco = 6, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/menthol = 1) mix_message = "The coco turns mint green just as the strong scent hits your nose." /datum/chemical_reaction/alexander name = "Alexander" - id = "alexander" - results = list("alexander" = 3) - required_reagents = list("cognac" = 1, "creme_de_cacao" = 1, "cream" = 1) + id = /datum/reagent/consumable/ethanol/alexander + results = list(/datum/reagent/consumable/ethanol/alexander = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) /datum/chemical_reaction/sidecar name = "Sidecar" - id = "sidecar" - results = list("sidecar" = 4) - required_reagents = list("cognac" = 2, "triple_sec" = 1, "lemonjuice" = 1) + id = /datum/reagent/consumable/ethanol/sidecar + results = list(/datum/reagent/consumable/ethanol/sidecar = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 2, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/lemonjuice = 1) /datum/chemical_reaction/between_the_sheets name = "Between the Sheets" - id = "between_the_sheets" - results = list("between_the_sheets" = 5) - required_reagents = list("rum" = 1, "sidecar" = 4) + id = /datum/reagent/consumable/ethanol/between_the_sheets + results = list(/datum/reagent/consumable/ethanol/between_the_sheets = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/sidecar = 4) /datum/chemical_reaction/kamikaze name = "Kamikaze" - id = "kamikaze" - results = list("kamikaze" = 3) - required_reagents = list("vodka" = 1, "triple_sec" = 1, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/kamikaze + results = list(/datum/reagent/consumable/ethanol/kamikaze = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/limejuice = 1) /datum/chemical_reaction/mojito name = "Mojito" - id = "mojito" - results = list("mojito" = 5) - required_reagents = list("rum" = 1, "sugar" = 1, "limejuice" = 1, "sodawater" = 1, "menthol" = 1) + id = /datum/reagent/consumable/ethanol/mojito + results = list(/datum/reagent/consumable/ethanol/mojito = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/menthol = 1) /datum/chemical_reaction/fernet_cola name = "Fernet Cola" - id = "fernet_cola" - results = list("fernet_cola" = 2) - required_reagents = list("fernet" = 1, "cola" = 1) + id = /datum/reagent/consumable/ethanol/fernet_cola + results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1) /datum/chemical_reaction/fanciulli name = "Fanciulli" - id = "fanciulli" - results = list("fanciulli" = 2) - required_reagents = list("manhattan" = 1, "fernet" = 1) + id = /datum/reagent/consumable/ethanol/fanciulli + results = list(/datum/reagent/consumable/ethanol/fanciulli = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 1, /datum/reagent/consumable/ethanol/fernet = 1) /datum/chemical_reaction/branca_menta name = "Branca Menta" - id = "branca_menta" - results = list("branca_menta" = 3) - required_reagents = list("fernet" = 1, "creme_de_menthe" = 1, "ice" = 1) + id = /datum/reagent/consumable/ethanol/branca_menta + results = list(/datum/reagent/consumable/ethanol/branca_menta = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ice = 1) /datum/chemical_reaction/blank_paper name = "Blank Paper" - id = "blank_paper" - results = list("blank_paper" = 3) - required_reagents = list("silencer" = 1, "nothing" = 1, "nuka_cola" = 1) + id = /datum/reagent/consumable/ethanol/blank_paper + results = list(/datum/reagent/consumable/ethanol/blank_paper = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1) /datum/chemical_reaction/wizz_fizz name = "Wizz Fizz" - id = "wizz_fizz" - results = list("wizz_fizz" = 3) - required_reagents = list("triple_sec" = 1, "sodawater" = 1, "champagne" = 1) + id = /datum/reagent/consumable/ethanol/wizz_fizz + results = list(/datum/reagent/consumable/ethanol/wizz_fizz = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/ethanol/champagne = 1) mix_message = "The beverage starts to froth with an almost mystical zeal!" mix_sound = 'sound/effects/bubbles2.ogg' /datum/chemical_reaction/bug_spray name = "Bug Spray" - id = "bug_spray" - results = list("bug_spray" = 5) - required_reagents = list("triple_sec" = 2, "lemon_lime" = 1, "rum" = 2, "vodka" = 1) + id = /datum/reagent/consumable/ethanol/bug_spray + results = list(/datum/reagent/consumable/ethanol/bug_spray = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1) mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?" mix_sound = 'sound/creatures/bee.ogg' /datum/chemical_reaction/jack_rose name = "Jack Rose" - id = "jack_rose" - results = list("jack_rose" = 4) - required_reagents = list("grenadine" = 1, "applejack" = 2, "limejuice" = 1) + id = /datum/reagent/consumable/ethanol/jack_rose + results = list(/datum/reagent/consumable/ethanol/jack_rose = 4) + required_reagents = list(/datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/ethanol/applejack = 2, /datum/reagent/consumable/limejuice = 1) mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow." /datum/chemical_reaction/turbo name = "Turbo" - id = "turbo" - results = list("turbo" = 5) - required_reagents = list("moonshine" = 2, "nitrous_oxide" = 1, "sugar_rush" = 1, "pwr_game" = 1) + id = /datum/reagent/consumable/ethanol/turbo + results = list(/datum/reagent/consumable/ethanol/turbo = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1) /datum/chemical_reaction/old_timer name = "Old Timer" - id = "old_timer" - results = list("old_timer" = 6) - required_reagents = list("whiskeysoda" = 3, "parsnipjuice" = 2, "alexander" = 1) + id = /datum/reagent/consumable/ethanol/old_timer + results = list(/datum/reagent/consumable/ethanol/old_timer = 6) + required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1) /datum/chemical_reaction/rubberneck name = "Rubberneck" - id = "rubberneck" - results = list("rubberneck" = 10) - required_reagents = list("ethanol" = 4, "grey_bull" = 5, "astrotame" = 1) + id = /datum/reagent/consumable/ethanol/rubberneck + results = list(/datum/reagent/consumable/ethanol/rubberneck = 10) + required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1) /datum/chemical_reaction/duplex name = "Duplex" - id = "duplex" - results = list("duplex" = 4) - required_reagents = list("hcider" = 2, "applejuice" = 1, "berryjuice" = 1) + id = /datum/reagent/consumable/ethanol/duplex + results = list(/datum/reagent/consumable/ethanol/duplex = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/hcider = 2, /datum/reagent/consumable/applejuice = 1, /datum/reagent/consumable/berryjuice = 1) /datum/chemical_reaction/trappist name = "Trappist" - id = "trappist" - results = list("trappist" = 5) - required_reagents = list("ale" = 2, "holywater" = 2, "sugar" = 1) + id = /datum/reagent/consumable/ethanol/trappist + results = list(/datum/reagent/consumable/ethanol/trappist = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/cream_soda name = "Cream Soda" - id = "cream_soda" - results = list("cream_soda" = 4) - required_reagents = list("sugar" = 2, "sodawater" = 2, "vanilla" = 1) + id = /datum/reagent/consumable/cream_soda + results = list(/datum/reagent/consumable/cream_soda = 4) + required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/sodawater = 2, /datum/reagent/consumable/vanilla = 1) /datum/chemical_reaction/blazaam name = "Blazaam" - id = "blazaam" - results = list("blazaam" = 3) - required_reagents = list("gin" = 2, "peachjuice" = 1, "bluespace" = 1) + id = /datum/reagent/consumable/ethanol/blazaam + results = list(/datum/reagent/consumable/ethanol/blazaam = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1) /datum/chemical_reaction/planet_cracker name = "Planet Cracker" - id = "planet_cracker" - results = list("planet_cracker" = 4) - required_reagents = list("champagne" = 2, "lizardwine" = 2, "eggyolk" = 1, "gold" = 1) + id = /datum/reagent/consumable/ethanol/planet_cracker + results = list(/datum/reagent/consumable/ethanol/planet_cracker = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/champagne = 2, /datum/reagent/consumable/ethanol/lizardwine = 2, /datum/reagent/consumable/eggyolk = 1, /datum/reagent/gold = 1) mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited." /datum/chemical_reaction/red_queen name = "Red Queen" - id = "red_queen" - results = list("red_queen" = 10) - required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) \ No newline at end of file + id = /datum/reagent/consumable/red_queen + results = list(/datum/reagent/consumable/red_queen = 10) + required_reagents = list(/datum/reagent/consumable/tea = 6, /datum/reagent/mercury = 2, /datum/reagent/consumable/blackpepper = 1, /datum/reagent/growthserum = 1) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index d10286d21ad..923976f3487 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -11,8 +11,8 @@ /datum/chemical_reaction/tofu name = "Tofu" id = "tofu" - required_reagents = list("soymilk" = 10) - required_catalysts = list("enzyme" = 5) + required_reagents = list(/datum/reagent/consumable/soymilk = 10) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mob_react = FALSE /datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume) @@ -24,7 +24,7 @@ /datum/chemical_reaction/chocolate_bar name = "Chocolate Bar" id = "chocolate_bar" - required_reagents = list("soymilk" = 2, "cocoa" = 2, "sugar" = 2) + required_reagents = list(/datum/reagent/consumable/soymilk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2) /datum/chemical_reaction/chocolate_bar/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -36,7 +36,7 @@ /datum/chemical_reaction/chocolate_bar2 name = "Chocolate Bar" id = "chocolate_bar" - required_reagents = list("chocolate_milk" = 4, "sugar" = 2) + required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 4, /datum/reagent/consumable/sugar = 2) mob_react = FALSE /datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume) @@ -47,40 +47,40 @@ /datum/chemical_reaction/hot_coco name = "Hot Coco" - id = "hot_coco" - results = list("hot_coco" = 5) - required_reagents = list("water" = 5, "cocoa" = 1) + id = /datum/reagent/consumable/hot_coco + results = list(/datum/reagent/consumable/hot_coco = 5) + required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/coco = 1) /datum/chemical_reaction/coffee name = "Coffee" - id = "coffee" - results = list("coffee" = 5) - required_reagents = list("coffeepowder" = 1, "water" = 5) + id = /datum/reagent/consumable/coffee + results = list(/datum/reagent/consumable/coffee = 5) + required_reagents = list(/datum/reagent/toxin/coffeepowder = 1, /datum/reagent/water = 5) /datum/chemical_reaction/tea name = "Tea" - id = "tea" - results = list("tea" = 5) - required_reagents = list("teapowder" = 1, "water" = 5) + id = /datum/reagent/consumable/tea + results = list(/datum/reagent/consumable/tea = 5) + required_reagents = list(/datum/reagent/toxin/teapowder = 1, /datum/reagent/water = 5) /datum/chemical_reaction/soysauce name = "Soy Sauce" - id = "soysauce" - results = list("soysauce" = 5) - required_reagents = list("soymilk" = 4, "sacid" = 1) + id = /datum/reagent/consumable/soysauce + results = list(/datum/reagent/consumable/soysauce = 5) + required_reagents = list(/datum/reagent/consumable/soymilk = 4, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/corn_syrup - name = "corn_syrup" - id = "corn_syrup" - results = list("corn_syrup" = 5) - required_reagents = list("corn_starch" = 1, "sacid" = 1) + name = /datum/reagent/consumable/corn_syrup + id = /datum/reagent/consumable/corn_syrup + results = list(/datum/reagent/consumable/corn_syrup = 5) + required_reagents = list(/datum/reagent/consumable/corn_starch = 1, /datum/reagent/toxin/acid = 1) required_temp = 374 /datum/chemical_reaction/cheesewheel name = "Cheesewheel" id = "cheesewheel" - required_reagents = list("milk" = 40) - required_catalysts = list("enzyme" = 5) + required_reagents = list(/datum/reagent/consumable/milk = 40) + required_catalysts = list(/datum/reagent/consumable/enzyme = 5) /datum/chemical_reaction/cheesewheel/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -90,7 +90,7 @@ /datum/chemical_reaction/synthmeat name = "synthmeat" id = "synthmeat" - required_reagents = list("blood" = 5, "cryoxadone" = 1) + required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/medicine/cryoxadone = 1) mob_react = FALSE /datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume) @@ -100,20 +100,20 @@ /datum/chemical_reaction/hot_ramen name = "Hot Ramen" - id = "hot_ramen" - results = list("hot_ramen" = 3) - required_reagents = list("water" = 1, "dry_ramen" = 3) + id = /datum/reagent/consumable/hot_ramen + results = list(/datum/reagent/consumable/hot_ramen = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/dry_ramen = 3) /datum/chemical_reaction/hell_ramen name = "Hell Ramen" - id = "hell_ramen" - results = list("hell_ramen" = 6) - required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) + id = /datum/reagent/consumable/hell_ramen + results = list(/datum/reagent/consumable/hell_ramen = 6) + required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/hot_ramen = 6) /datum/chemical_reaction/imitationcarpmeat name = "Imitation Carpmeat" id = "imitationcarpmeat" - required_reagents = list("carpotoxin" = 5) + required_reagents = list(/datum/reagent/toxin/carpotoxin = 5) required_container = /obj/item/reagent_containers/food/snacks/tofu mix_message = "The mixture becomes similar to carp meat." @@ -126,7 +126,7 @@ /datum/chemical_reaction/dough name = "Dough" id = "dough" - required_reagents = list("water" = 10, "flour" = 15) + required_reagents = list(/datum/reagent/water = 10, /datum/reagent/consumable/flour = 15) mix_message = "The ingredients form a dough." /datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume) @@ -137,7 +137,7 @@ /datum/chemical_reaction/cakebatter name = "Cake Batter" id = "cakebatter" - required_reagents = list("eggyolk" = 15, "flour" = 15, "sugar" = 5) + required_reagents = list(/datum/reagent/consumable/eggyolk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) mix_message = "The ingredients form a cake batter." /datum/chemical_reaction/cakebatter/on_reaction(datum/reagents/holder, created_volume) @@ -147,12 +147,12 @@ /datum/chemical_reaction/cakebatter/vegan id = "vegancakebatter" - required_reagents = list("soymilk" = 15, "flour" = 15, "sugar" = 5) + required_reagents = list(/datum/reagent/consumable/soymilk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) /datum/chemical_reaction/ricebowl name = "Rice Bowl" id = "ricebowl" - required_reagents = list("rice" = 10, "water" = 10) + required_reagents = list(/datum/reagent/consumable/rice = 10, /datum/reagent/water = 10) required_container = /obj/item/reagent_containers/glass/bowl mix_message = "The rice absorbs the water." diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index df47998cb2b..ff90ce9c8e1 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -31,18 +31,17 @@ decksize = 50 card_text_file = "strings/cas_black.txt" -/obj/item/toy/cards/deck/cas/Initialize() - . = ..() +/obj/item/toy/cards/deck/cas/populate_deck() var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt")) allcards = cards_against_space[card_face] var/list/possiblecards = allcards.Copy() if(possiblecards.len < decksize) // sanity check decksize = (possiblecards.len - 1) var/list/randomcards = list() - while (randomcards.len < decksize) + for(var/x in 1 to decksize) randomcards += pick_n_take(possiblecards) - for(var/i=1 to randomcards.len) - var/cardtext = randomcards[i] + for(var/x in 1 to randomcards.len) + var/cardtext = randomcards[x] var/datum/playingcard/P P = new() P.name = "[cardtext]" @@ -50,7 +49,7 @@ cards += P if(!blanks) return - for(var/x=1 to blanks) + for(var/x in 1 to blanks) var/datum/playingcard/P P = new() P.name = "Blank Card" @@ -58,10 +57,7 @@ cards += P shuffle_inplace(cards) // distribute blank cards throughout deck -/obj/item/toy/cards/deck/cas/attack_hand(mob/user) - . = ..() - if(.) - return +/obj/item/toy/cards/deck/cas/draw_card(mob/user) if(isliving(user)) var/mob/living/L = user if(!(L.mobility_flags & MOBILITY_PICKUP)) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index f79bf982af9..0eab0aea60c 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -17,7 +17,7 @@ body { line-height: 1.2; overflow-x: hidden; overflow-y: scroll; - word-wrap: break-word; + word-wrap: break-word; scrollbar-face-color:#1A1A1A; scrollbar-track-color:#171717; scrollbar-highlight-color:#171717; @@ -305,6 +305,7 @@ em {font-style: normal; font-weight: bold;} .userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;} .danger {color: #c51e1e;} .warning {color: #c51e1e; font-style: italic;} +.alertwarning {color: #FF0000; font-weight: bold} .boldwarning {color: #c51e1e; font-style: italic; font-weight: bold} .announce {color: #c51e1e; font-weight: bold;} .boldannounce {color: #c51e1e; font-weight: bold;} @@ -318,6 +319,8 @@ em {font-style: normal; font-weight: bold;} .unconscious {color: #a4bad6; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #059223;} +.red {color: #FF0000} +.blue {color: #215cff} .nicegreen {color: #059223;} .shadowling {color: #8e8a99;} .cult {color: #aa1c1c;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css index cbf1daad751..09d2539039c 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput_white.css +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -303,6 +303,7 @@ h1.alert, h2.alert {color: #000000;} .userdanger {color: #ff0000; font-weight: bold; font-size: 24px;} .danger {color: #ff0000;} .warning {color: #ff0000; font-style: italic;} +.alertwarning {color: #FF0000; font-weight: bold} .boldwarning {color: #ff0000; font-style: italic; font-weight: bold} .announce {color: #228b22; font-weight: bold;} .boldannounce {color: #ff0000; font-weight: bold;} @@ -316,7 +317,9 @@ h1.alert, h2.alert {color: #000000;} .unconscious {color: #0000ff; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} .green {color: #03ff39;} -.nicegreen {color: #14a833;} +.red {color: #FF0000} +.blue {color: #0000FF} +.nicegreen {color: #14a833;} .shadowling {color: #3b2769;} .cult {color: #960000;} diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 829cb55312f..d8ed7fd8d3e 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -69,7 +69,7 @@ /obj/item/storage/bag/easterbasket/Initialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) - STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)) + STR.set_holdable(list(/obj/item/reagent_containers/food/snacks/egg, /obj/item/reagent_containers/food/snacks/chocolateegg, /obj/item/reagent_containers/food/snacks/boiledegg)) /obj/item/storage/bag/easterbasket/proc/countEggs() cut_overlays() @@ -163,7 +163,7 @@ icon_state = "briochecake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche slices_num = 6 - bonus_reagents = list("nutriment" = 10, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) /obj/item/reagent_containers/food/snacks/cakeslice/brioche name = "brioche cake slice" @@ -184,10 +184,10 @@ name = "scotch egg" desc = "A boiled egg wrapped in a delicious, seasoned meatball." icon_state = "scotchegg" - bonus_reagents = list("nutriment" = 2, "vitamin" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) bitesize = 3 filling_color = "#FFFFF0" - list_reagents = list("nutriment" = 6) + list_reagents = list(/datum/reagent/consumable/nutriment = 6) /datum/crafting_recipe/food/scotchegg name = "Scotch egg" @@ -204,8 +204,8 @@ name = "Mammi" desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement." icon_state = "mammi" - bonus_reagents = list("nutriment" = 3, "vitamin" = 1) - list_reagents = list("nutriment" = 8, "vitamin" = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) /datum/crafting_recipe/food/mammi name = "Mammi" @@ -221,8 +221,8 @@ name = "chocolate bunny" desc = "Contains less than 10% real rabbit!" icon_state = "chocolatebunny" - bonus_reagents = list("nutriment" = 1, "vitamin" = 1) - list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2) filling_color = "#A0522D" /datum/crafting_recipe/food/chocolatebunny diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index 91b778158ba..5b53499a8b3 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -6,14 +6,14 @@ //spooky recipes /datum/recipe/sugarcookie/spookyskull - reagents = list("flour" = 5, "sugar" = 5, "milk" = 5) + reagents = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/milk = 5) items = list( /obj/item/reagent_containers/food/snacks/egg, ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull /datum/recipe/sugarcookie/spookycoffin - reagents = list("flour" = 5, "sugar" = 5, "coffee" = 5) + reagents = list(/datum/reagent/consumable/flour = 5, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/coffee = 5) items = list( /obj/item/reagent_containers/food/snacks/egg, ) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index f70d23f307d..65163c2e12f 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -65,7 +65,7 @@ var/datum/reagent/R = null if(random_reagent) R = pick(subtypesof(/datum/reagent)) - R = GLOB.chemical_reagents_list[initial(R.id)] + R = GLOB.chemical_reagents_list[R] queen_bee = new(src) queen_bee.beehome = src @@ -95,7 +95,7 @@ bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0) var/obj/item/reagent_containers/honeycomb/HC = new(src) if(queen_bee.beegent) - HC.set_reagent(queen_bee.beegent.id) + HC.set_reagent(queen_bee.beegent.type) honeycombs += HC if(bees.len < get_max_bees()) diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index e7faff02091..daa22c4f850 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -9,7 +9,7 @@ disease_amount = 0 volume = 10 amount_per_transfer_from_this = 0 - list_reagents = list("honey" = 5) + list_reagents = list(/datum/reagent/consumable/honey = 5) grind_results = list() var/honey_color = "" @@ -22,7 +22,7 @@ /obj/item/reagent_containers/honeycomb/update_icon() cut_overlays() - var/mutable_appearance/honey_overlay = mutable_appearance(icon, "honey") + var/mutable_appearance/honey_overlay = mutable_appearance(icon, /datum/reagent/consumable/honey) if(honey_color) honey_overlay.icon_state = "greyscale_honey" honey_overlay.color = honey_color @@ -34,7 +34,7 @@ if(istype(R)) name = "honeycomb ([R.name])" honey_color = R.color - reagents.add_reagent(R.id,5) + reagents.add_reagent(R.type,5) else honey_color = "" update_icon() \ No newline at end of file diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index e7d87c98e99..7f3eb296872 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -215,9 +215,9 @@ var/S = 0 for(var/obj/item/reagent_containers/food/snacks/grown/I in contents) S += 5 - if(I.reagents.get_reagent_amount("nutriment") < 0.1) + if(I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) < 0.1) points += 1*productivity - else points += I.reagents.get_reagent_amount("nutriment")*10*productivity + else points += I.reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)*10*productivity qdel(I) if(S) processing = TRUE diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index bc5f3d2ace8..33fbeb91d63 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -34,7 +34,7 @@ data["tastes"] = list(fruit.wine_flavor = 1) else data["tastes"] = list(fruit.tastes[1] = 1) - reagents.add_reagent("fruit_wine", amount, data) + reagents.add_reagent(/datum/reagent/consumable/ethanol/fruit_wine, amount, data) qdel(fruit) playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1c81c3827ba..19d5128f9e1 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -145,20 +145,20 @@ return TRUE /obj/item/reagent_containers/food/snacks/grown/on_grind() - var/nutriment = reagents.get_reagent_amount("nutriment") + var/nutriment = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) if(grind_results&&grind_results.len) for(var/i in 1 to grind_results.len) grind_results[grind_results[i]] = nutriment - reagents.del_reagent("nutriment") - reagents.del_reagent("vitamin") + reagents.del_reagent(/datum/reagent/consumable/nutriment) + reagents.del_reagent(/datum/reagent/consumable/nutriment/vitamin) /obj/item/reagent_containers/food/snacks/grown/on_juice() - var/nutriment = reagents.get_reagent_amount("nutriment") + var/nutriment = reagents.get_reagent_amount(/datum/reagent/consumable/nutriment) if(juice_results&&juice_results.len) for(var/i in 1 to juice_results.len) juice_results[juice_results[i]] = nutriment - reagents.del_reagent("nutriment") - reagents.del_reagent("vitamin") + reagents.del_reagent(/datum/reagent/consumable/nutriment) + reagents.del_reagent(/datum/reagent/consumable/nutriment/vitamin) // For item-containing growns such as eggy or gatfruit /obj/item/reagent_containers/food/snacks/grown/shell/attack_self(mob/user) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index a3b93db1ea2..e84025208a3 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -25,7 +25,7 @@ icon_dead = "ambrosia-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) - reagents_add = list("space_drugs" = 0.15, "bicaridine" = 0.1, "kelotane" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05, "toxin" = 0.1) + reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/medicine/bicaridine = 0.1, /datum/reagent/medicine/kelotane = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1) /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris seed = /obj/item/seeds/ambrosia @@ -42,7 +42,7 @@ plantname = "Ambrosia Deus" product = /obj/item/reagent_containers/food/snacks/grown/ambrosia/deus mutatelist = list(/obj/item/seeds/ambrosia/gaia) - reagents_add = list("omnizine" = 0.15, "synaptizine" = 0.15, "space_drugs" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/medicine/omnizine = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) rarity = 40 /obj/item/reagent_containers/food/snacks/grown/ambrosia/deus @@ -62,7 +62,7 @@ plantname = "Ambrosia Gaia" product = /obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia mutatelist = list(/obj/item/seeds/ambrosia/deus) - reagents_add = list("earthsblood" = 0.05, "nutriment" = 0.06, "vitamin" = 0.05) + reagents_add = list(/datum/reagent/medicine/earthsblood = 0.05, /datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/nutriment/vitamin = 0.05) rarity = 30 //These are some pretty good plants right here genes = list() weed_rate = 4 diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm index 007c0b24542..f8e58aee1b4 100644 --- a/code/modules/hydroponics/grown/apple.dm +++ b/code/modules/hydroponics/grown/apple.dm @@ -14,7 +14,7 @@ icon_dead = "apple-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/apple/gold) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/apple seed = /obj/item/seeds/apple @@ -24,9 +24,9 @@ filling_color = "#FF4500" bitesize = 100 // Always eat the apple in one bite foodtype = FRUIT - juice_results = list("applejuice" = 0) + juice_results = list(/datum/reagent/consumable/applejuice = 0) tastes = list("apple" = 1) - distill_reagent = "hcider" + distill_reagent = /datum/reagent/consumable/ethanol/hcider // Gold Apple /obj/item/seeds/apple/gold @@ -39,7 +39,7 @@ maturation = 10 production = 10 mutatelist = list() - reagents_add = list("gold" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/gold = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 40 // Alchemy! /obj/item/reagent_containers/food/snacks/grown/apple/gold diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index daa2f7ee282..fe87f8dc400 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -12,7 +12,7 @@ icon_dead = "banana-dead" genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/banana/mime, /obj/item/seeds/banana/bluespace) - reagents_add = list("banana" = 0.1, "potassium" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/consumable/banana = 0.1, /datum/reagent/potassium = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.02) /obj/item/reagent_containers/food/snacks/grown/banana seed = /obj/item/seeds/banana @@ -24,8 +24,8 @@ filling_color = "#FFFF00" bitesize = 5 foodtype = FRUIT - juice_results = list("banana" = 0) - distill_reagent = "bananahonk" + juice_results = list(/datum/reagent/consumable/banana = 0) + distill_reagent = /datum/reagent/consumable/ethanol/bananahonk /obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user) user.visible_message("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") @@ -33,7 +33,7 @@ sleep(25) if(!user) return (OXYLOSS) - user.say("BANG!", forced = "banana") + user.say("BANG!", forced = /datum/reagent/consumable/banana) sleep(25) if(!user) return (OXYLOSS) @@ -70,7 +70,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/banana/mime growthstages = 4 mutatelist = list() - reagents_add = list("nothing" = 0.1, "mutetoxin" = 0.1, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/consumable/nothing = 0.1, /datum/reagent/toxin/mutetoxin = 0.1, /datum/reagent/consumable/nutriment = 0.02) rarity = 15 /obj/item/reagent_containers/food/snacks/grown/banana/mime @@ -80,7 +80,7 @@ icon_state = "mimana" trash = /obj/item/grown/bananapeel/mimanapeel filling_color = "#FFFFEE" - distill_reagent = "silencer" + distill_reagent = /datum/reagent/consumable/ethanol/silencer /obj/item/grown/bananapeel/mimanapeel seed = /obj/item/seeds/banana/mime @@ -100,7 +100,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/banana/bluespace mutatelist = list() genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest) - reagents_add = list("bluespace" = 0.2, "banana" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/bluespace = 0.2, /datum/reagent/consumable/banana = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.02) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/banana/bluespace diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index 4338e3b0700..3e5fee411fa 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -15,7 +15,7 @@ icon_dead = "soybean-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/soya/koi) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05, "cooking_oil" = 0.03) //Vegetable oil! + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/consumable/cooking_oil = 0.03) //Vegetable oil! /obj/item/reagent_containers/food/snacks/grown/soybeans seed = /obj/item/seeds/soya @@ -26,7 +26,7 @@ filling_color = "#F0E68C" bitesize_mod = 2 foodtype = VEGETABLES - grind_results = list("soymilk" = 0) + grind_results = list(/datum/reagent/consumable/soymilk = 0) tastes = list("soy" = 1) wine_power = 20 @@ -40,7 +40,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/koibeans potency = 10 mutatelist = list() - reagents_add = list("carpotoxin" = 0.1, "vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/toxin/carpotoxin = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/koibeans diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index a7e55733e4e..46060897f5e 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -15,7 +15,7 @@ icon_dead = "berry-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/berries seed = /obj/item/seeds/berry @@ -26,9 +26,9 @@ filling_color = "#FF00FF" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("berryjuice" = 0) + juice_results = list(/datum/reagent/consumable/berryjuice = 0) tastes = list("berry" = 1) - distill_reagent = "gin" + distill_reagent = /datum/reagent/consumable/ethanol/gin // Poison Berries /obj/item/seeds/berry/poison @@ -39,7 +39,7 @@ plantname = "Poison-Berry Bush" product = /obj/item/reagent_containers/food/snacks/grown/berries/poison mutatelist = list(/obj/item/seeds/berry/death) - reagents_add = list("cyanide" = 0.15, "tirizene" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/toxin/cyanide = 0.15, /datum/reagent/toxin/staminatoxin = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 10 // Mildly poisonous berries are common in reality /obj/item/reagent_containers/food/snacks/grown/berries/poison @@ -49,7 +49,7 @@ icon_state = "poisonberrypile" filling_color = "#C71585" foodtype = FRUIT | TOXIC - juice_results = list("poisonberryjuice" = 0) + juice_results = list(/datum/reagent/consumable/poisonberryjuice = 0) tastes = list("poison-berry" = 1) distill_reagent = null wine_power = 35 @@ -65,7 +65,7 @@ lifespan = 30 potency = 50 mutatelist = list() - reagents_add = list("coniine" = 0.08, "tirizene" = 0.1, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/toxin/coniine = 0.08, /datum/reagent/toxin/staminatoxin = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/berries/death @@ -91,7 +91,7 @@ endurance = 25 mutatelist = list() genes = list(/datum/plant_gene/trait/glow/berry, /datum/plant_gene/trait/repeated_harvest) - reagents_add = list("uranium" = 0.25, "iodine" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/uranium = 0.25, /datum/reagent/iodine = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/berries/glow @@ -123,7 +123,7 @@ icon_dead = "cherry-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/cherry/blue) - reagents_add = list("nutriment" = 0.07, "sugar" = 0.07) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/consumable/sugar = 0.07) /obj/item/reagent_containers/food/snacks/grown/cherries seed = /obj/item/seeds/cherry @@ -134,7 +134,7 @@ filling_color = "#FF0000" bitesize_mod = 2 foodtype = FRUIT - grind_results = list("cherryjelly" = 0) + grind_results = list(/datum/reagent/consumable/cherryjelly = 0) tastes = list("cherry" = 1) wine_power = 30 @@ -147,7 +147,7 @@ plantname = "Blue Cherry Tree" product = /obj/item/reagent_containers/food/snacks/grown/bluecherries mutatelist = list() - reagents_add = list("nutriment" = 0.07, "sugar" = 0.07) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.07, /datum/reagent/consumable/sugar = 0.07) rarity = 10 /obj/item/reagent_containers/food/snacks/grown/bluecherries @@ -158,7 +158,7 @@ filling_color = "#6495ED" bitesize_mod = 2 foodtype = FRUIT - grind_results = list("bluecherryjelly" = 0) + grind_results = list(/datum/reagent/consumable/bluecherryjelly = 0) tastes = list("blue cherry" = 1) wine_power = 50 @@ -181,7 +181,7 @@ icon_dead = "grape-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grape/green) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1, "sugar" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1) /obj/item/reagent_containers/food/snacks/grown/grapes seed = /obj/item/seeds/grape @@ -192,9 +192,9 @@ filling_color = "#FF1493" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("grapejuice" = 0) + juice_results = list(/datum/reagent/consumable/grapejuice = 0) tastes = list("grape" = 1) - distill_reagent = "wine" + distill_reagent = /datum/reagent/consumable/ethanol/wine // Green Grapes /obj/item/seeds/grape/green @@ -204,7 +204,7 @@ species = "greengrape" plantname = "Green-Grape Vine" product = /obj/item/reagent_containers/food/snacks/grown/grapes/green - reagents_add = list("kelotane" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1, "sugar" = 0.1) + reagents_add = list(/datum/reagent/medicine/kelotane = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1) // No rarity: technically it's a beneficial mutant, but it's not exactly "new"... mutatelist = list() @@ -214,4 +214,4 @@ icon_state = "greengrapes" filling_color = "#7FFF00" tastes = list("green grape" = 1) - distill_reagent = "cognac" + distill_reagent = /datum/reagent/consumable/ethanol/cognac diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 67c5e61dcf5..a7e571d7c1d 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -17,7 +17,7 @@ /obj/item/seeds/cannabis/death, /obj/item/seeds/cannabis/white, /obj/item/seeds/cannabis/ultimate) - reagents_add = list("space_drugs" = 0.15, "lipolicide" = 0.35) // gives u the munchies + reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.35) // gives u the munchies /obj/item/seeds/cannabis/rainbow @@ -28,7 +28,7 @@ plantname = "Rainbow Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow mutatelist = list() - reagents_add = list("mindbreaker" = 0.15, "lipolicide" = 0.35) + reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.15, /datum/reagent/toxin/lipolicide = 0.35) rarity = 40 /obj/item/seeds/cannabis/death @@ -39,7 +39,7 @@ plantname = "Deathweed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/death mutatelist = list() - reagents_add = list("cyanide" = 0.35, "space_drugs" = 0.15, "lipolicide" = 0.15) + reagents_add = list(/datum/reagent/toxin/cyanide = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15) rarity = 40 /obj/item/seeds/cannabis/white @@ -50,7 +50,7 @@ plantname = "Lifeweed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/white mutatelist = list() - reagents_add = list("omnizine" = 0.35, "space_drugs" = 0.15, "lipolicide" = 0.15) + reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15) rarity = 40 @@ -62,21 +62,21 @@ plantname = "Omega Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate mutatelist = list() - reagents_add = list("space_drugs" = 0.3, - "mindbreaker" = 0.3, - "mercury" = 0.15, - "lithium" = 0.15, - "atropine" = 0.15, - "haloperidol" = 0.15, - "methamphetamine" = 0.15, - "capsaicin" = 0.15, - "barbers_aid" = 0.15, - "bath_salts" = 0.15, - "itching_powder" = 0.15, - "crank" = 0.15, - "krokodil" = 0.15, - "histamine" = 0.15, - "lipolicide" = 0.15) + reagents_add = list(/datum/reagent/drug/space_drugs = 0.3, + /datum/reagent/toxin/mindbreaker = 0.3, + /datum/reagent/mercury = 0.15, + /datum/reagent/lithium = 0.15, + /datum/reagent/medicine/atropine = 0.15, + /datum/reagent/medicine/haloperidol = 0.15, + /datum/reagent/drug/methamphetamine = 0.15, + /datum/reagent/consumable/capsaicin = 0.15, + /datum/reagent/barbers_aid = 0.15, + /datum/reagent/drug/bath_salts = 0.15, + /datum/reagent/toxin/itching_powder = 0.15, + /datum/reagent/drug/crank = 0.15, + /datum/reagent/drug/krokodil = 0.15, + /datum/reagent/toxin/histamine = 0.15, + /datum/reagent/toxin/lipolicide = 0.15) rarity = 69 diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index c53cd6718ac..f4520d7fcfb 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -11,7 +11,7 @@ potency = 15 icon_dead = "wheat-dead" mutatelist = list(/obj/item/seeds/wheat/oat, /obj/item/seeds/wheat/meat) - reagents_add = list("nutriment" = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) /obj/item/reagent_containers/food/snacks/grown/wheat seed = /obj/item/seeds/wheat @@ -22,9 +22,9 @@ filling_color = "#F0E68C" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("flour" = 0) + grind_results = list(/datum/reagent/consumable/flour = 0) tastes = list("wheat" = 1) - distill_reagent = "beer" + distill_reagent = /datum/reagent/consumable/ethanol/beer // Oat /obj/item/seeds/wheat/oat @@ -45,16 +45,16 @@ filling_color = "#556B2F" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("flour" = 0) + grind_results = list(/datum/reagent/consumable/flour = 0) tastes = list("oat" = 1) - distill_reagent = "ale" + distill_reagent = /datum/reagent/consumable/ethanol/ale // Rice /obj/item/seeds/wheat/rice name = "pack of rice seeds" desc = "These may, or may not, grow into rice." icon_state = "seed-rice" - species = "rice" + species = /datum/reagent/consumable/rice plantname = "Rice Stalks" product = /obj/item/reagent_containers/food/snacks/grown/rice mutatelist = list() @@ -69,9 +69,9 @@ filling_color = "#FAFAD2" bitesize_mod = 2 foodtype = GRAIN - grind_results = list("rice" = 0) + grind_results = list(/datum/reagent/consumable/rice = 0) tastes = list("rice" = 1) - distill_reagent = "sake" + distill_reagent = /datum/reagent/consumable/ethanol/sake //Meatwheat - grows into synthetic meat /obj/item/seeds/wheat/meat @@ -92,7 +92,7 @@ bitesize_mod = 2 seed = /obj/item/seeds/wheat/meat foodtype = MEAT | GRAIN - grind_results = list("flour" = 0, "blood" = 0) + grind_results = list(/datum/reagent/consumable/flour = 0, /datum/reagent/blood = 0) tastes = list("meatwheat" = 1) can_distill = FALSE diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 6325daacdcc..0522b5fd454 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -16,7 +16,7 @@ icon_dead = "chili-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/chili/ice, /obj/item/seeds/chili/ghost) - reagents_add = list("capsaicin" = 0.25, "vitamin" = 0.04, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/consumable/capsaicin = 0.25, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.04) /obj/item/reagent_containers/food/snacks/grown/chili seed = /obj/item/seeds/chili @@ -41,7 +41,7 @@ production = 4 rarity = 20 mutatelist = list() - reagents_add = list("frostoil" = 0.25, "vitamin" = 0.02, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/consumable/frostoil = 0.25, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.02) /obj/item/reagent_containers/food/snacks/grown/icepepper seed = /obj/item/seeds/chili/ice @@ -67,7 +67,7 @@ yield = 3 rarity = 20 mutatelist = list() - reagents_add = list("condensedcapsaicin" = 0.3, "capsaicin" = 0.55, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/consumable/condensedcapsaicin = 0.3, /datum/reagent/consumable/capsaicin = 0.55, /datum/reagent/consumable/nutriment = 0.04) /obj/item/reagent_containers/food/snacks/grown/ghost_chili seed = /obj/item/seeds/chili/ghost diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 7a847032d9f..a02afba25d6 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -23,7 +23,7 @@ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/orange) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/citrus/lime seed = /obj/item/seeds/lime @@ -31,7 +31,7 @@ desc = "It's so sour, your face will twist." icon_state = "lime" filling_color = "#00FF00" - juice_results = list("limejuice" = 0) + juice_results = list(/datum/reagent/consumable/limejuice = 0) // Orange /obj/item/seeds/orange @@ -50,7 +50,7 @@ icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/lime, /obj/item/seeds/orange_3d) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/citrus/orange seed = /obj/item/seeds/orange @@ -58,8 +58,8 @@ desc = "It's a tangy fruit." icon_state = "orange" filling_color = "#FFA500" - juice_results = list("orangejuice" = 0) - distill_reagent = "triple_sec" + juice_results = list(/datum/reagent/consumable/orangejuice = 0) + distill_reagent = /datum/reagent/consumable/ethanol/triple_sec // Lemon /obj/item/seeds/lemon @@ -77,7 +77,7 @@ icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/firelemon) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/citrus/lemon seed = /obj/item/seeds/lemon @@ -85,7 +85,7 @@ desc = "When life gives you lemons, make lemonade." icon_state = "lemon" filling_color = "#FFD700" - juice_results = list("lemonjuice" = 0) + juice_results = list(/datum/reagent/consumable/lemonjuice = 0) // Combustible lemon /obj/item/seeds/firelemon //combustible lemon is too long so firelemon @@ -102,7 +102,7 @@ lifespan = 55 endurance = 45 yield = 4 - reagents_add = list("nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/firelemon seed = /obj/item/seeds/firelemon @@ -174,16 +174,16 @@ icon_grow = "lime-grow" icon_dead = "lime-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d seed = /obj/item/seeds/orange - name = "extradminesional orange" + name = "extradimensional orange" desc = "You can hardly wrap your head around this thing." icon_state = "orang" filling_color = "#FFA500" - juice_results = list("orangejuice" = 0) - distill_reagent = "triple_sec" + juice_results = list(/datum/reagent/consumable/orangejuice = 0) + distill_reagent = /datum/reagent/consumable/ethanol/triple_sec tastes = list("polygons" = 1, "oranges" = 1) /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user) diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index ea1b9716bd1..e84a913c2da 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -16,7 +16,7 @@ icon_dead = "cocoapod-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/cocoapod/vanillapod) - reagents_add = list("cocoa" = 0.25, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/coco = 0.25, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/cocoapod seed = /obj/item/seeds/cocoapod @@ -27,7 +27,7 @@ bitesize_mod = 2 foodtype = FRUIT tastes = list("cocoa" = 1) - distill_reagent = "creme_de_cacao" + distill_reagent = /datum/reagent/consumable/ethanol/creme_de_cacao // Vanilla Pod /obj/item/seeds/cocoapod/vanillapod @@ -39,7 +39,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/vanillapod genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list() - reagents_add = list("vanilla" = 0.25, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/vanilla = 0.25, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/vanillapod seed = /obj/item/seeds/cocoapod/vanillapod @@ -49,4 +49,4 @@ filling_color = "#FFD700" foodtype = FRUIT tastes = list("vanilla" = 1) - distill_reagent = "vanilla" //Takes longer, but you can get even more vanilla from it. + distill_reagent = /datum/reagent/consumable/vanilla //Takes longer, but you can get even more vanilla from it. diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index c259baaf2df..691cbb8344f 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -13,7 +13,7 @@ icon_grow = "corn-grow" // Uses one growth icons set for all the subtypes icon_dead = "corn-dead" // Same for the dead icon mutatelist = list(/obj/item/seeds/corn/snapcorn) - reagents_add = list("cornoil" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/cornoil = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/corn seed = /obj/item/seeds/corn @@ -25,9 +25,9 @@ trash = /obj/item/grown/corncob bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("corn_starch" = 0) + juice_results = list(/datum/reagent/consumable/corn_starch = 0) tastes = list("corn" = 1) - distill_reagent = "whiskey" + distill_reagent = /datum/reagent/consumable/ethanol/whiskey /obj/item/grown/corncob name = "corn cob" diff --git a/code/modules/hydroponics/grown/eggplant.dm b/code/modules/hydroponics/grown/eggplant.dm index 7c01a68f0a7..f893ad9e57c 100644 --- a/code/modules/hydroponics/grown/eggplant.dm +++ b/code/modules/hydroponics/grown/eggplant.dm @@ -13,7 +13,7 @@ icon_dead = "eggplant-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/eggplant/eggy) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/eggplant seed = /obj/item/seeds/eggplant @@ -36,7 +36,7 @@ lifespan = 75 production = 12 mutatelist = list() - reagents_add = list("nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/shell/eggy seed = /obj/item/seeds/eggplant/eggy @@ -47,4 +47,4 @@ filling_color = "#F8F8FF" bitesize_mod = 2 foodtype = MEAT - distill_reagent = "eggnog" + distill_reagent = /datum/reagent/consumable/ethanol/eggnog diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 4e1718f853e..cdb27cc4f9a 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -15,7 +15,7 @@ icon_grow = "poppy-grow" icon_dead = "poppy-dead" mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily) - reagents_add = list("bicaridine" = 0.2, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/medicine/bicaridine = 0.2, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/poppy seed = /obj/item/seeds/poppy @@ -26,7 +26,7 @@ filling_color = "#FF6347" bitesize_mod = 3 foodtype = VEGETABLES | GROSS - distill_reagent = "vermouth" + distill_reagent = /datum/reagent/consumable/ethanol/vermouth // Lily /obj/item/seeds/poppy/lily @@ -79,7 +79,7 @@ growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' - reagents_add = list("nutriment" = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) /obj/item/reagent_containers/food/snacks/grown/harebell seed = /obj/item/seeds/harebell @@ -89,7 +89,7 @@ slot_flags = ITEM_SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 3 - distill_reagent = "vermouth" + distill_reagent = /datum/reagent/consumable/ethanol/vermouth // Sunflower /obj/item/seeds/sunflower @@ -107,7 +107,7 @@ icon_grow = "sunflower-grow" icon_dead = "sunflower-dead" mutatelist = list(/obj/item/seeds/sunflower/moonflower, /obj/item/seeds/sunflower/novaflower) - reagents_add = list("cornoil" = 0.08, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/consumable/cornoil = 0.08, /datum/reagent/consumable/nutriment = 0.04) /obj/item/grown/sunflower // FLOWER POWER! seed = /obj/item/seeds/sunflower @@ -141,7 +141,7 @@ icon_dead = "sunflower-dead" product = /obj/item/reagent_containers/food/snacks/grown/moonflower mutatelist = list() - reagents_add = list("moonshine" = 0.2, "vitamin" = 0.02, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/consumable/ethanol/moonshine = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.02) rarity = 15 /obj/item/reagent_containers/food/snacks/grown/moonflower @@ -152,7 +152,7 @@ slot_flags = ITEM_SLOT_HEAD filling_color = "#E6E6FA" bitesize_mod = 2 - distill_reagent = "absinthe" //It's made from flowers. + distill_reagent = /datum/reagent/consumable/ethanol/absinthe //It's made from flowers. // Novaflower /obj/item/seeds/sunflower/novaflower @@ -165,7 +165,7 @@ icon_dead = "sunflower-dead" product = /obj/item/grown/novaflower mutatelist = list() - reagents_add = list("condensedcapsaicin" = 0.25, "capsaicin" = 0.3, "nutriment" = 0) + reagents_add = list(/datum/reagent/consumable/condensedcapsaicin = 0.25, /datum/reagent/consumable/capsaicin = 0.3, /datum/reagent/consumable/nutriment = 0) rarity = 20 /obj/item/grown/novaflower @@ -183,7 +183,7 @@ throw_speed = 1 throw_range = 3 attack_verb = list("roasted", "scorched", "burned") - grind_results = list("capsaicin" = 0, "condensedcapsaicin" = 0) + grind_results = list(/datum/reagent/consumable/capsaicin = 0, /datum/reagent/consumable/condensedcapsaicin = 0) /obj/item/grown/novaflower/add_juice() ..() diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index 557a1476424..53d147f22b1 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -2,14 +2,14 @@ name = "pack of garlic seeds" desc = "A packet of extremely pungent seeds." icon_state = "seed-garlic" - species = "garlic" + species = /datum/reagent/consumable/garlic plantname = "Garlic Sprouts" product = /obj/item/reagent_containers/food/snacks/grown/garlic yield = 6 potency = 25 growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' - reagents_add = list("garlic" = 0.15, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/garlic seed = /obj/item/seeds/garlic diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 1a1c2ac07fa..bbaccbc437d 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -16,7 +16,7 @@ icon_dead = "grass-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/grass/carpet) - reagents_add = list("nutriment" = 0.02, "hydrogen" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05) /obj/item/reagent_containers/food/snacks/grown/grass seed = /obj/item/seeds/grass @@ -45,7 +45,7 @@ name = "pack of carpet seeds" desc = "These seeds grow into stylish carpet samples." icon_state = "seed-carpet" - species = "carpet" + species = /datum/reagent/carpet plantname = "Carpet" product = /obj/item/reagent_containers/food/snacks/grown/grass/carpet mutatelist = list() diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 6ceb69536dc..5f1fdcdaa92 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -14,7 +14,7 @@ growthstages = 4 rarity = 30 var/list/mutations = list() - reagents_add = list("charcoal" = 0.04, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/medicine/charcoal = 0.04, /datum/reagent/consumable/nutriment = 0.02) /obj/item/seeds/kudzu/Copy() var/obj/item/seeds/kudzu/S = ..() @@ -58,7 +58,7 @@ /obj/item/seeds/kudzu/on_chem_reaction(datum/reagents/S) var/list/temp_mut_list = list() - if(S.has_reagent("sterilizine", 5)) + if(S.has_reagent(/datum/reagent/space_cleaner/sterilizine, 5)) for(var/datum/spacevine_mutation/SM in mutations) if(SM.quality == NEGATIVE) temp_mut_list += SM @@ -66,7 +66,7 @@ mutations.Remove(pick(temp_mut_list)) temp_mut_list.Cut() - if(S.has_reagent("welding_fuel", 5)) + if(S.has_reagent(/datum/reagent/fuel, 5)) for(var/datum/spacevine_mutation/SM in mutations) if(SM.quality == POSITIVE) temp_mut_list += SM @@ -74,7 +74,7 @@ mutations.Remove(pick(temp_mut_list)) temp_mut_list.Cut() - if(S.has_reagent("phenol", 5)) + if(S.has_reagent(/datum/reagent/phenol, 5)) for(var/datum/spacevine_mutation/SM in mutations) if(SM.quality == MINOR_NEGATIVE) temp_mut_list += SM @@ -82,16 +82,16 @@ mutations.Remove(pick(temp_mut_list)) temp_mut_list.Cut() - if(S.has_reagent("blood", 15)) + if(S.has_reagent(/datum/reagent/blood, 15)) adjust_production(rand(15, -5)) - if(S.has_reagent("amatoxin", 5)) + if(S.has_reagent(/datum/reagent/toxin/amatoxin, 5)) adjust_production(rand(5, -15)) - if(S.has_reagent("plasma", 5)) + if(S.has_reagent(/datum/reagent/toxin/plasma, 5)) adjust_potency(rand(5, -15)) - if(S.has_reagent("holywater", 10)) + if(S.has_reagent(/datum/reagent/water/holywater, 10)) adjust_potency(rand(15, -5)) diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 8d23089818f..3bebfb5cbd5 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -12,7 +12,7 @@ icon_dead = "watermelon-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/watermelon/holy) - reagents_add = list("water" = 0.2, "vitamin" = 0.04, "nutriment" = 0.2) + reagents_add = list(/datum/reagent/water = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.2) /obj/item/seeds/watermelon/suicide_act(mob/user) user.visible_message("[user] is swallowing [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -33,7 +33,7 @@ filling_color = "#008000" bitesize_mod = 3 foodtype = FRUIT - juice_results = list("watermelonjuice" = 0) + juice_results = list(/datum/reagent/consumable/watermelonjuice = 0) wine_power = 40 // Holymelon @@ -45,7 +45,7 @@ plantname = "Holy Melon Vines" product = /obj/item/reagent_containers/food/snacks/grown/holymelon mutatelist = list() - reagents_add = list("holywater" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/water/holywater = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/holymelon @@ -63,7 +63,7 @@ var/uses = 1 if(seed) uses = round(seed.potency / 20) - AddComponent(/datum/component/anti_magic, TRUE, TRUE, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god + AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, uses, TRUE, CALLBACK(src, .proc/block_magic), CALLBACK(src, .proc/expire)) //deliver us from evil o melon god /obj/item/reagent_containers/food/snacks/grown/holymelon/proc/block_magic(mob/user, major) if(major) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index eb790c11c38..e13dbdbbff3 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -45,7 +45,7 @@ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/replicapod) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/cabbage seed = /obj/item/seeds/cabbage @@ -71,7 +71,7 @@ maturation = 3 yield = 4 growthstages = 3 - reagents_add = list("sugar" = 0.25) + reagents_add = list(/datum/reagent/consumable/sugar = 0.25) /obj/item/reagent_containers/food/snacks/grown/sugarcane seed = /obj/item/seeds/sugarcane @@ -81,7 +81,7 @@ filling_color = "#FFD700" bitesize_mod = 2 foodtype = VEGETABLES | SUGAR - distill_reagent = "rum" + distill_reagent = /datum/reagent/consumable/ethanol/rum // Gatfruit /obj/item/seeds/gatfruit @@ -101,7 +101,7 @@ growthstages = 2 rarity = 60 // Obtainable only with xenobio+superluck. growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' - reagents_add = list("sulfur" = 0.1, "carbon" = 0.1, "nitrogen" = 0.07, "potassium" = 0.05) + reagents_add = list(/datum/reagent/sulfur = 0.1, /datum/reagent/carbon = 0.1, /datum/reagent/nitrogen = 0.07, /datum/reagent/potassium = 0.05) /obj/item/reagent_containers/food/snacks/grown/shell/gatfruit seed = /obj/item/seeds/gatfruit @@ -123,7 +123,7 @@ plantname = "Cherry Bomb Tree" product = /obj/item/reagent_containers/food/snacks/grown/cherry_bomb mutatelist = list() - reagents_add = list("nutriment" = 0.1, "sugar" = 0.1, "blackpowder" = 0.7) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1, /datum/reagent/blackpowder = 0.7) rarity = 60 //See above /obj/item/reagent_containers/food/snacks/grown/cherry_bomb diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index fe2beb896c5..f30e110b912 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -21,7 +21,7 @@ growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list("morphine" = 0.35, "charcoal" = 0.35, "nutriment" = 0) + reagents_add = list(/datum/reagent/medicine/morphine = 0.35, /datum/reagent/medicine/charcoal = 0.35, /datum/reagent/consumable/nutriment = 0) /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi seed = /obj/item/seeds/reishi @@ -47,7 +47,7 @@ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/angel) - reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.35, "nutriment" = 0, "growthserum" = 0.1) + reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.04, /datum/reagent/toxin/amatoxin = 0.35, /datum/reagent/consumable/nutriment = 0, /datum/reagent/growthserum = 0.1) /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita seed = /obj/item/seeds/amanita @@ -73,7 +73,7 @@ growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.1, "nutriment" = 0, "amanitin" = 0.2) + reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.04, /datum/reagent/toxin/amatoxin = 0.1, /datum/reagent/consumable/nutriment = 0, /datum/reagent/toxin/amanitin = 0.2) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/mushroom/angel @@ -99,7 +99,7 @@ growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list("mushroomhallucinogen" = 0.25, "nutriment" = 0.02) + reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.25, /datum/reagent/consumable/nutriment = 0.02) /obj/item/reagent_containers/food/snacks/grown/mushroom/libertycap seed = /obj/item/seeds/liberty @@ -125,7 +125,7 @@ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/plump/walkingmushroom) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet seed = /obj/item/seeds/plump @@ -133,7 +133,7 @@ desc = "Plumus Hellmus: Plump, soft and s-so inviting~" icon_state = "plumphelmet" filling_color = "#9370DB" - distill_reagent = "manlydorf" + distill_reagent = /datum/reagent/consumable/ethanol/manly_dorf // Walking Mushroom /obj/item/seeds/plump/walkingmushroom @@ -149,7 +149,7 @@ yield = 1 growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' mutatelist = list() - reagents_add = list("vitamin" = 0.05, "nutriment" = 0.15) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.15) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/mushroom/walkingmushroom @@ -190,7 +190,7 @@ growthstages = 3 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list("nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle seed = /obj/item/seeds/chanter @@ -219,7 +219,7 @@ genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' mutatelist = list(/obj/item/seeds/glowshroom/glowcap, /obj/item/seeds/glowshroom/shadowshroom) - reagents_add = list("radium" = 0.1, "phosphorus" = 0.1, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/uranium/radium = 0.1, /datum/reagent/phosphorus = 0.1, /datum/reagent/consumable/nutriment = 0.04) /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom seed = /obj/item/seeds/glowshroom @@ -264,7 +264,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap genes = list(/datum/plant_gene/trait/glow/red, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list() - reagents_add = list("teslium" = 0.1, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/teslium = 0.1, /datum/reagent/consumable/nutriment = 0.04) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap @@ -289,7 +289,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom genes = list(/datum/plant_gene/trait/glow/shadow, /datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list() - reagents_add = list("radium" = 0.2, "nutriment" = 0.04) + reagents_add = list(/datum/reagent/uranium/radium = 0.2, /datum/reagent/consumable/nutriment = 0.04) rarity = 30 /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom @@ -321,7 +321,7 @@ potency = 15 growthstages = 3 rarity = 20 - reagents_add = list("nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) resistance_flags = FIRE_PROOF /obj/item/seeds/lavaland/polypore diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index b64bdce4ccc..7fe9d52fe50 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -11,7 +11,7 @@ growthstages = 5 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy) mutatelist = list(/obj/item/seeds/nettle/death) - reagents_add = list("sacid" = 0.5) + reagents_add = list(/datum/reagent/toxin/acid = 0.5) /obj/item/seeds/nettle/death name = "pack of death-nettle seeds" @@ -25,7 +25,7 @@ yield = 2 genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/stinging) mutatelist = list() - reagents_add = list("facid" = 0.5, "sacid" = 0.5) + reagents_add = list(/datum/reagent/toxin/acid/fluacid = 0.5, /datum/reagent/toxin/acid = 0.5) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/nettle // "snack" diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 9cb8d1a63c6..2ebaa6d5e27 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -13,7 +13,7 @@ growthstages = 3 weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) mutatelist = list(/obj/item/seeds/onion/red) /obj/item/reagent_containers/food/snacks/grown/onion @@ -36,7 +36,7 @@ plantname = "Red Onion Sprouts" weed_chance = 1 product = /obj/item/reagent_containers/food/snacks/grown/onion/red - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1, "tearjuice" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/tearjuice = 0.05) /obj/item/reagent_containers/food/snacks/grown/onion/red seed = /obj/item/seeds/onion/red @@ -61,7 +61,7 @@ name = "onion slices" desc = "Rings, not for wearing." icon_state = "onionslice" - list_reagents = list("nutriment" = 5, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#C0C9A0" gender = PLURAL cooked_type = /obj/item/reagent_containers/food/snacks/onionrings @@ -71,4 +71,4 @@ desc = "They shine like exceptionally low quality amethyst." icon_state = "onionslice_red" filling_color = "#C29ACF" - list_reagents = list("nutriment" = 5, "vitamin" = 2, "tearjuice" = 2.5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/tearjuice = 2.5) diff --git a/code/modules/hydroponics/grown/pineapple.dm b/code/modules/hydroponics/grown/pineapple.dm index e52c261217b..40b3a67573f 100644 --- a/code/modules/hydroponics/grown/pineapple.dm +++ b/code/modules/hydroponics/grown/pineapple.dm @@ -12,7 +12,7 @@ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/apple) - reagents_add = list("vitamin" = 0.02, "nutriment" = 0.2, "water" = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.2, /datum/reagent/water = 0.04) /obj/item/reagent_containers/food/snacks/grown/pineapple seed = /obj/item/seeds/pineapple diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 15378b368e7..20f2a357b60 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -16,7 +16,7 @@ icon_dead = "potato-dead" genes = list(/datum/plant_gene/trait/battery) mutatelist = list(/obj/item/seeds/potato/sweet) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/potato seed = /obj/item/seeds/potato @@ -26,8 +26,8 @@ filling_color = "#E9967A" bitesize = 100 foodtype = VEGETABLES - juice_results = list("potato" = 0) - distill_reagent = "vodka" + juice_results = list(/datum/reagent/consumable/potato_juice = 0) + distill_reagent = /datum/reagent/consumable/ethanol/vodka /obj/item/reagent_containers/food/snacks/grown/potato/wedges name = "potato wedges" @@ -57,11 +57,11 @@ plantname = "Sweet Potato Plants" product = /obj/item/reagent_containers/food/snacks/grown/potato/sweet mutatelist = list() - reagents_add = list("vitamin" = 0.1, "sugar" = 0.1, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.1, /datum/reagent/consumable/sugar = 0.1, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/potato/sweet seed = /obj/item/seeds/potato/sweet name = "sweet potato" desc = "It's sweet." icon_state = "sweetpotato" - distill_reagent = "sbiten" + distill_reagent = /datum/reagent/consumable/ethanol/sbiten diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 644dedff3d0..e26d1c1d2a1 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -14,7 +14,7 @@ icon_dead = "pumpkin-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/pumpkin/blumpkin) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.2) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.2) /obj/item/reagent_containers/food/snacks/grown/pumpkin seed = /obj/item/seeds/pumpkin @@ -24,7 +24,7 @@ filling_color = "#FFA500" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("pumpkinjuice" = 0) + juice_results = list(/datum/reagent/consumable/pumpkinjuice = 0) wine_power = 20 /obj/item/reagent_containers/food/snacks/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) @@ -45,7 +45,7 @@ plantname = "Blumpkin Vines" product = /obj/item/reagent_containers/food/snacks/grown/blumpkin mutatelist = list() - reagents_add = list("ammonia" = 0.2, "chlorine" = 0.1, "nutriment" = 0.2) + reagents_add = list(/datum/reagent/ammonia = 0.2, /datum/reagent/chlorine = 0.1, /datum/reagent/consumable/nutriment = 0.2) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/blumpkin @@ -56,5 +56,5 @@ filling_color = "#87CEFA" bitesize_mod = 2 foodtype = FRUIT - juice_results = list("blumpkinjuice" = 0) + juice_results = list(/datum/reagent/consumable/blumpkinjuice = 0) wine_power = 50 diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index c50de8d8c50..44e8ced977b 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -16,7 +16,7 @@ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_dead = "rainbowbunch-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) - reagents_add = list("nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/rainbow_flower seed = /obj/item/seeds/rainbow_bunch @@ -38,40 +38,40 @@ if(1) item_color = "red" color = "#DA0000" - list_reagents = list("redcrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/red = 3) desc += " This one is in a bright red color." if(2) item_color = "orange" color = "#FF9300" - list_reagents = list("orangecrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/orange = 3) desc += " This one is in a citrus orange color." if(3) item_color = "yellow" color = "#FFF200" - list_reagents = list("yellowcrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/yellow = 3) desc += " This one is in a bright yellow color." if(4) item_color = "green" color = "#A8E61D" - list_reagents = list("greencrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/green = 3) desc += " This one is in a grassy green color." if(5) item_color = "blue" color = "#00B7EF" - list_reagents = list("bluecrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/blue = 3) desc += " This one is in a soothing blue color." if(6) item_color = "purple" color = "#DA00FF" - list_reagents = list("purplecrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/purple = 3) desc += " This one is in a vibrant purple color." if(7) item_color = "black" color = "#1C1C1C" - list_reagents = list("blackcrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/black = 3) desc += " This one is in a midnight black color." if(8) item_color = "white" color = "#FFFFFF" - list_reagents = list("whitecrayonpowder" = 3) + list_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/white = 3) desc += " This one is in a pure white color." diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 1db1ba9bbd8..41907e7bea9 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -31,7 +31,7 @@ /obj/item/seeds/replicapod/on_reagent_change(changetype) if(changetype == ADD_REAGENT) - var/datum/reagent/blood/B = reagents.has_reagent("blood") + var/datum/reagent/blood/B = reagents.has_reagent(/datum/reagent/blood) if(B) if(B.data["mind"] && B.data["cloneable"]) mind = B.data["mind"] @@ -41,14 +41,14 @@ blood_type = B.data["blood_type"] features = B.data["features"] factions = B.data["factions"] - factions = B.data["quirks"] + quirks = B.data["quirks"] contains_sample = TRUE visible_message("The [src] is injected with a fresh blood sample.") log_cloning("[key_name(mind)]'s cloning record was added to [src] at [AREACOORD(src)].") else visible_message("The [src] rejects the sample!") - if(!reagents.has_reagent("blood")) + if(!reagents.has_reagent(/datum/reagent/blood)) mind = null ckey = null realName = null diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 090809ca880..871d1535a0d 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -12,7 +12,7 @@ growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' mutatelist = list(/obj/item/seeds/carrot/parsnip) - reagents_add = list("oculine" = 0.25, "vitamin" = 0.04, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/medicine/oculine = 0.25, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/carrot seed = /obj/item/seeds/carrot @@ -22,7 +22,7 @@ filling_color = "#FFA500" bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("carrotjuice" = 0) + juice_results = list(/datum/reagent/consumable/carrotjuice = 0) wine_power = 30 /obj/item/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params) @@ -45,7 +45,7 @@ product = /obj/item/reagent_containers/food/snacks/grown/parsnip icon_dead = "carrot-dead" mutatelist = list() - reagents_add = list("vitamin" = 0.05, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/parsnip seed = /obj/item/seeds/carrot/parsnip @@ -54,7 +54,7 @@ icon_state = "parsnip" bitesize_mod = 2 foodtype = VEGETABLES - juice_results = list("parsnipjuice" = 0) + juice_results = list(/datum/reagent/consumable/parsnipjuice = 0) wine_power = 35 @@ -72,7 +72,7 @@ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" mutatelist = list(/obj/item/seeds/redbeet) - reagents_add = list("vitamin" = 0.04, "sugar" = 0.2, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/sugar = 0.2, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/whitebeet seed = /obj/item/seeds/whitebeet @@ -98,7 +98,7 @@ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' icon_dead = "whitebeet-dead" genes = list(/datum/plant_gene/trait/maxchem) - reagents_add = list("vitamin" = 0.05, "nutriment" = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) /obj/item/reagent_containers/food/snacks/grown/redbeet seed = /obj/item/seeds/redbeet diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index fc84617ed8f..3d62ecdf7fc 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -21,7 +21,7 @@ desc = "These aromatic tips of the tea plant can be dried to make tea." icon_state = "tea_aspera_leaves" filling_color = "#008000" - grind_results = list("teapowder" = 0) + grind_results = list(/datum/reagent/toxin/teapowder = 0) dry_grind = TRUE can_distill = FALSE @@ -33,7 +33,7 @@ plantname = "Tea Astra Plant" product = /obj/item/reagent_containers/food/snacks/grown/tea/astra mutatelist = list() - reagents_add = list("synaptizine" = 0.1, "vitamin" = 0.04, "teapowder" = 0.1) + reagents_add = list(/datum/reagent/medicine/synaptizine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/toxin/teapowder = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/tea/astra @@ -41,7 +41,7 @@ name = "Tea Astra tips" icon_state = "tea_astra_leaves" filling_color = "#4582B4" - grind_results = list("teapowder" = 0, "salglu_solution" = 0) + grind_results = list(/datum/reagent/toxin/teapowder = 0, /datum/reagent/medicine/salglu_solution = 0) // Coffee @@ -61,7 +61,7 @@ icon_dead = "coffee-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/coffee/robusta) - reagents_add = list("vitamin" = 0.04, "coffeepowder" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/toxin/coffeepowder = 0.1) /obj/item/reagent_containers/food/snacks/grown/coffee seed = /obj/item/seeds/coffee @@ -71,8 +71,8 @@ filling_color = "#DC143C" bitesize_mod = 2 dry_grind = TRUE - grind_results = list("coffeepowder" = 0) - distill_reagent = "kahlua" + grind_results = list(/datum/reagent/toxin/coffeepowder = 0) + distill_reagent = /datum/reagent/consumable/ethanol/kahlua // Coffee Robusta /obj/item/seeds/coffee/robusta @@ -83,7 +83,7 @@ plantname = "Coffee Robusta Bush" product = /obj/item/reagent_containers/food/snacks/grown/coffee/robusta mutatelist = list() - reagents_add = list("ephedrine" = 0.1, "vitamin" = 0.04, "coffeepowder" = 0.1) + reagents_add = list(/datum/reagent/medicine/ephedrine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/toxin/coffeepowder = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/coffee/robusta @@ -91,4 +91,4 @@ name = "coffee robusta beans" desc = "Increases robustness by 37 percent!" icon_state = "coffee_robusta" - grind_results = list("coffeepowder" = 0, "morphine" = 0) + grind_results = list(/datum/reagent/toxin/coffeepowder = 0, /datum/reagent/medicine/morphine = 0) diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index 684271fa6b4..1e2d25d8257 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -13,7 +13,7 @@ growthstages = 3 icon_dead = "tobacco-dead" mutatelist = list(/obj/item/seeds/tobacco/space) - reagents_add = list("nicotine" = 0.03, "nutriment" = 0.03) + reagents_add = list(/datum/reagent/drug/nicotine = 0.03, /datum/reagent/consumable/nutriment = 0.03) /obj/item/reagent_containers/food/snacks/grown/tobacco seed = /obj/item/seeds/tobacco @@ -21,7 +21,7 @@ desc = "Dry them out to make some smokes." icon_state = "tobacco_leaves" filling_color = "#008000" - distill_reagent = "creme_de_menthe" //Menthol, I guess. + distill_reagent = /datum/reagent/consumable/ethanol/creme_de_menthe //Menthol, I guess. // Space Tobacco /obj/item/seeds/tobacco/space @@ -32,7 +32,7 @@ plantname = "Space Tobacco Plant" product = /obj/item/reagent_containers/food/snacks/grown/tobacco/space mutatelist = list() - reagents_add = list("salbutamol" = 0.05, "nicotine" = 0.08, "nutriment" = 0.03) + reagents_add = list(/datum/reagent/medicine/salbutamol = 0.05, /datum/reagent/drug/nicotine = 0.08, /datum/reagent/consumable/nutriment = 0.03) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/tobacco/space diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index ffd0ba70897..f4ca793be99 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -12,7 +12,7 @@ icon_dead = "tomato-dead" genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/tomato/blue, /obj/item/seeds/tomato/blood, /obj/item/seeds/tomato/killer) - reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) /obj/item/reagent_containers/food/snacks/grown/tomato seed = /obj/item/seeds/tomato @@ -23,9 +23,9 @@ filling_color = "#FF6347" bitesize_mod = 2 foodtype = FRUIT - grind_results = list("ketchup" = 0) - juice_results = list("tomatojuice" = 0) - distill_reagent = "enzyme" + grind_results = list(/datum/reagent/consumable/ketchup = 0) + juice_results = list(/datum/reagent/consumable/tomatojuice = 0) + distill_reagent = /datum/reagent/consumable/enzyme // Blood Tomato /obj/item/seeds/tomato/blood @@ -36,7 +36,7 @@ plantname = "Blood-Tomato Plants" product = /obj/item/reagent_containers/food/snacks/grown/tomato/blood mutatelist = list() - reagents_add = list("blood" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/blood = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/tomato/blood @@ -47,8 +47,8 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" foodtype = FRUIT | GROSS - grind_results = list("ketchup" = 0, "blood" = 0) - distill_reagent = "bloodymary" + grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0) + distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary // Blue Tomato /obj/item/seeds/tomato/blue @@ -62,7 +62,7 @@ icon_grow = "bluetomato-grow" mutatelist = list(/obj/item/seeds/tomato/blue/bluespace) genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/repeated_harvest) - reagents_add = list("lube" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/lube = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/tomato/blue @@ -72,7 +72,7 @@ icon_state = "bluetomato" splat_type = /obj/effect/decal/cleanable/oil filling_color = "#0000FF" - distill_reagent = "laughter" + distill_reagent = /datum/reagent/consumable/laughter // Bluespace Tomato /obj/item/seeds/tomato/blue/bluespace @@ -85,7 +85,7 @@ yield = 2 mutatelist = list() genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest) - reagents_add = list("lube" = 0.2, "bluespace" = 0.2, "vitamin" = 0.04, "nutriment" = 0.1) + reagents_add = list(/datum/reagent/lube = 0.2, /datum/reagent/bluespace = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 50 /obj/item/reagent_containers/food/snacks/grown/tomato/blue/bluespace @@ -120,7 +120,7 @@ icon_state = "killertomato" var/awakening = 0 filling_color = "#FF0000" - distill_reagent = "demonsblood" + distill_reagent = /datum/reagent/consumable/ethanol/demonsblood /obj/item/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone) if(awakening) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 1bb11459562..cd27d88ee1c 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -24,7 +24,7 @@ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 - list_reagents = list("weedkiller" = 100) + list_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 100) /obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user) user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -39,7 +39,7 @@ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 - list_reagents = list("pestkiller" = 100) + list_reagents = list(/datum/reagent/toxin/pestkiller = 100) /obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user) user.visible_message("[user] is huffing [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -160,17 +160,17 @@ /obj/item/reagent_containers/glass/bottle/nutrient/ez name = "bottle of E-Z-Nutrient" desc = "Contains a fertilizer that causes mild mutations with each harvest." - list_reagents = list("eznutriment" = 50) + list_reagents = list(/datum/reagent/plantnutriment/eznutriment = 50) /obj/item/reagent_containers/glass/bottle/nutrient/l4z name = "bottle of Left 4 Zed" desc = "Contains a fertilizer that limits plant yields to no more than one and causes significant mutations in plants." - list_reagents = list("left4zednutriment" = 50) + list_reagents = list(/datum/reagent/plantnutriment/left4zednutriment = 50) /obj/item/reagent_containers/glass/bottle/nutrient/rh name = "bottle of Robust Harvest" desc = "Contains a fertilizer that increases the yield of a plant by 30% while causing no mutations." - list_reagents = list("robustharvestnutriment" = 50) + list_reagents = list(/datum/reagent/plantnutriment/robustharvestnutriment = 50) /obj/item/reagent_containers/glass/bottle/nutrient/empty name = "bottle" @@ -183,9 +183,9 @@ /obj/item/reagent_containers/glass/bottle/killer/weedkiller name = "bottle of weed killer" desc = "Contains a herbicide." - list_reagents = list("weedkiller" = 50) + list_reagents = list(/datum/reagent/toxin/plantbgone/weedkiller = 50) /obj/item/reagent_containers/glass/bottle/killer/pestkiller name = "bottle of pest spray" desc = "Contains a pesticide." - list_reagents = list("pestkiller" = 50) + list_reagents = list(/datum/reagent/toxin/pestkiller = 50) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5f9a1a7ceba..6072468bf90 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -424,6 +424,7 @@ plant_health = 0 harvest = 0 pestlevel = 0 // Pests die + lastproduce = 0 if(!dead) update_icon() dead = 1 @@ -444,7 +445,7 @@ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines // Requires 5 mutagen to possibly change species.// Poor man's mutagen. - if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10)) + if(S.has_reagent(/datum/reagent/toxin/mutagen, 5) || S.has_reagent(/datum/reagent/uranium/radium, 10) || S.has_reagent(/datum/reagent/uranium, 10)) switch(rand(100)) if(91 to 100) adjustHealth(-10) @@ -465,202 +466,202 @@ to_chat(user, "Nothing happens...") // 2 or 1 units is enough to change the yield and other stats.// Can change the yield and other stats, but requires more than mutagen - else if(S.has_reagent("mutagen", 2) || S.has_reagent("radium", 5) || S.has_reagent("uranium", 5)) + else if(S.has_reagent(/datum/reagent/toxin/mutagen, 2) || S.has_reagent(/datum/reagent/uranium/radium, 5) || S.has_reagent(/datum/reagent/uranium, 5)) hardmutate() - else if(S.has_reagent("mutagen", 1) || S.has_reagent("radium", 2) || S.has_reagent("uranium", 2)) + else if(S.has_reagent(/datum/reagent/toxin/mutagen, 1) || S.has_reagent(/datum/reagent/uranium/radium, 2) || S.has_reagent(/datum/reagent/uranium, 2)) mutate() // After handling the mutating, we now handle the damage from adding crude radioactives... - if(S.has_reagent("uranium", 1)) - adjustHealth(-round(S.get_reagent_amount("uranium") * 1)) - adjustToxic(round(S.get_reagent_amount("uranium") * 2)) - if(S.has_reagent("radium", 1)) - adjustHealth(-round(S.get_reagent_amount("radium") * 1)) - adjustToxic(round(S.get_reagent_amount("radium") * 3)) // Radium is harsher (OOC: also easier to produce) + if(S.has_reagent(/datum/reagent/uranium, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium) * 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium) * 2)) + if(S.has_reagent(/datum/reagent/uranium/radium, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/uranium/radium) * 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/uranium/radium) * 3)) // Radium is harsher (OOC: also easier to produce) // Nutriments - if(S.has_reagent("eznutriment", 1)) + if(S.has_reagent(/datum/reagent/plantnutriment/eznutriment, 1)) yieldmod = 1 mutmod = 1 - adjustNutri(round(S.get_reagent_amount("eznutriment") * 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/eznutriment) * 1)) - if(S.has_reagent("left4zednutriment", 1)) + if(S.has_reagent(/datum/reagent/plantnutriment/left4zednutriment, 1)) yieldmod = 0 mutmod = 2 - adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/left4zednutriment) * 1)) - if(S.has_reagent("robustharvestnutriment", 1)) + if(S.has_reagent(/datum/reagent/plantnutriment/robustharvestnutriment, 1)) yieldmod = 1.3 mutmod = 0 - adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 )) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/plantnutriment/robustharvestnutriment) *1 )) // Ambrosia Gaia produces earthsblood. - if(S.has_reagent("earthsblood")) - self_sufficiency_progress += S.get_reagent_amount("earthsblood") + if(S.has_reagent(/datum/reagent/medicine/earthsblood)) + self_sufficiency_progress += S.get_reagent_amount(/datum/reagent/medicine/earthsblood) if(self_sufficiency_progress >= self_sufficiency_req) become_self_sufficient() else if(!self_sustaining) to_chat(user, "[src] warms as it might on a spring day under a genuine Sun.") // Antitoxin binds shit pretty well. So the tox goes significantly down - if(S.has_reagent("charcoal", 1)) - adjustToxic(-round(S.get_reagent_amount("charcoal") * 2)) + if(S.has_reagent(/datum/reagent/medicine/charcoal, 1)) + adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/charcoal) * 2)) // NIGGA, YOU JUST WENT ON FULL RETARD. - if(S.has_reagent("toxin", 1)) - adjustToxic(round(S.get_reagent_amount("toxin") * 2)) + if(S.has_reagent(/datum/reagent/toxin, 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin) * 2)) // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now... - if(S.has_reagent("milk", 1)) - adjustNutri(round(S.get_reagent_amount("milk") * 0.1)) - adjustWater(round(S.get_reagent_amount("milk") * 0.9)) + if(S.has_reagent(/datum/reagent/consumable/milk, 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.1)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/milk) * 0.9)) // Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay? - if(S.has_reagent("beer", 1)) - adjustHealth(-round(S.get_reagent_amount("beer") * 0.05)) - adjustNutri(round(S.get_reagent_amount("beer") * 0.25)) - adjustWater(round(S.get_reagent_amount("beer") * 0.7)) + if(S.has_reagent(/datum/reagent/consumable/ethanol/beer, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.05)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.25)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) * 0.7)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial - if(S.has_reagent("fluorine", 1)) - adjustHealth(-round(S.get_reagent_amount("fluorine") * 2)) - adjustToxic(round(S.get_reagent_amount("fluorine") * 2.5)) - adjustWater(-round(S.get_reagent_amount("fluorine") * 0.5)) + if(S.has_reagent(/datum/reagent/fluorine, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 2)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/fluorine) * 2.5)) + adjustWater(-round(S.get_reagent_amount(/datum/reagent/fluorine) * 0.5)) adjustWeeds(-rand(1,4)) // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial - if(S.has_reagent("chlorine", 1)) - adjustHealth(-round(S.get_reagent_amount("chlorine") * 1)) - adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5)) - adjustWater(-round(S.get_reagent_amount("chlorine") * 0.5)) + if(S.has_reagent(/datum/reagent/chlorine, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/chlorine) * 1.5)) + adjustWater(-round(S.get_reagent_amount(/datum/reagent/chlorine) * 0.5)) adjustWeeds(-rand(1,3)) // White Phosphorous + water -> phosphoric acid. That's not a good thing really. // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. - if(S.has_reagent("phosphorus", 1)) - adjustHealth(-round(S.get_reagent_amount("phosphorus") * 0.75)) - adjustNutri(round(S.get_reagent_amount("phosphorus") * 0.1)) - adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5)) + if(S.has_reagent(/datum/reagent/phosphorus, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.75)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.1)) + adjustWater(-round(S.get_reagent_amount(/datum/reagent/phosphorus) * 0.5)) adjustWeeds(-rand(1,2)) // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... - if(S.has_reagent("sugar", 1)) + if(S.has_reagent(/datum/reagent/consumable/sugar, 1)) adjustWeeds(rand(1,2)) adjustPests(rand(1,2)) - adjustNutri(round(S.get_reagent_amount("sugar") * 0.1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sugar) * 0.1)) // It is water! - if(S.has_reagent("water", 1)) - adjustWater(round(S.get_reagent_amount("water") * 1)) + if(S.has_reagent(/datum/reagent/water, 1)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/water) * 1)) // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~ - if(S.has_reagent("holywater", 1)) - adjustWater(round(S.get_reagent_amount("holywater") * 1)) - adjustHealth(round(S.get_reagent_amount("holywater") * 0.1)) + if(S.has_reagent(/datum/reagent/water/holywater, 1)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/water/holywater) * 0.1)) // A variety of nutrients are dissolved in club soda, without sugar. // These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth. - if(S.has_reagent("sodawater", 1)) - adjustWater(round(S.get_reagent_amount("sodawater") * 1)) - adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1)) - adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1)) + if(S.has_reagent(/datum/reagent/consumable/sodawater, 1)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/sodawater) * 0.1)) // Man, you guys are retards - if(S.has_reagent("sacid", 1)) - adjustHealth(-round(S.get_reagent_amount("sacid") * 1)) - adjustToxic(round(S.get_reagent_amount("sacid") * 1.5)) + if(S.has_reagent(/datum/reagent/toxin/acid, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid) * 1.5)) adjustWeeds(-rand(1,2)) // SERIOUSLY - if(S.has_reagent("facid", 1)) - adjustHealth(-round(S.get_reagent_amount("facid") * 2)) - adjustToxic(round(S.get_reagent_amount("facid") * 3)) + if(S.has_reagent(/datum/reagent/toxin/acid/fluacid, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 2)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/acid/fluacid) * 3)) adjustWeeds(-rand(1,4)) // Plant-B-Gone is just as bad - if(S.has_reagent("plantbgone", 1)) - adjustHealth(-round(S.get_reagent_amount("plantbgone") * 5)) - adjustToxic(round(S.get_reagent_amount("plantbgone") * 6)) + if(S.has_reagent(/datum/reagent/toxin/plantbgone, 1)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 5)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone) * 6)) adjustWeeds(-rand(4,8)) // why, just why - if(S.has_reagent("napalm", 1)) + if(S.has_reagent(/datum/reagent/napalm, 1)) if(!(myseed.resistance_flags & FIRE_PROOF)) - adjustHealth(-round(S.get_reagent_amount("napalm") * 6)) - adjustToxic(round(S.get_reagent_amount("napalm") * 7)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7)) adjustWeeds(-rand(5,9)) //Weed Spray - if(S.has_reagent("weedkiller", 1)) - adjustToxic(round(S.get_reagent_amount("weedkiller") * 0.5)) + if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/plantbgone/weedkiller) * 0.5)) //old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts adjustWeeds(-rand(1,2)) //Pest Spray - if(S.has_reagent("pestkiller", 1)) - adjustToxic(round(S.get_reagent_amount("pestkiller") * 0.5)) + if(S.has_reagent(/datum/reagent/toxin/pestkiller, 1)) + adjustToxic(round(S.get_reagent_amount(/datum/reagent/toxin/pestkiller) * 0.5)) adjustPests(-rand(1,2)) // Healing - if(S.has_reagent("cryoxadone", 1)) - adjustHealth(round(S.get_reagent_amount("cryoxadone") * 3)) - adjustToxic(-round(S.get_reagent_amount("cryoxadone") * 3)) + if(S.has_reagent(/datum/reagent/medicine/cryoxadone, 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) + adjustToxic(-round(S.get_reagent_amount(/datum/reagent/medicine/cryoxadone) * 3)) // Ammonia is bad ass. - if(S.has_reagent("ammonia", 1)) - adjustHealth(round(S.get_reagent_amount("ammonia") * 0.5)) - adjustNutri(round(S.get_reagent_amount("ammonia") * 1)) + if(S.has_reagent(/datum/reagent/ammonia, 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.5)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/ammonia) * 1)) if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount("ammonia") * 0.01)) + myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/ammonia) * 0.01)) // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants - if(S.has_reagent("saltpetre", 1)) - var/salt = S.get_reagent_amount("saltpetre") + if(S.has_reagent(/datum/reagent/saltpetre, 1)) + var/salt = S.get_reagent_amount(/datum/reagent/saltpetre) adjustHealth(round(salt * 0.25)) if (myseed) myseed.adjust_production(-round(salt/100)-prob(salt%100)) myseed.adjust_potency(round(salt*0.5)) // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer - if(S.has_reagent("ash", 1)) - adjustHealth(round(S.get_reagent_amount("ash") * 0.25)) - adjustNutri(round(S.get_reagent_amount("ash") * 0.5)) + if(S.has_reagent(/datum/reagent/ash, 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/ash) * 0.25)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/ash) * 0.5)) adjustWeeds(-1) // This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. - if(S.has_reagent("diethylamine", 1)) - adjustHealth(round(S.get_reagent_amount("diethylamine") * 1)) - adjustNutri(round(S.get_reagent_amount("diethylamine") * 2)) + if(S.has_reagent(/datum/reagent/diethylamine, 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 2)) if(myseed) - myseed.adjust_yield(round(S.get_reagent_amount("diethylamine") * 0.02)) + myseed.adjust_yield(round(S.get_reagent_amount(/datum/reagent/diethylamine) * 0.02)) adjustPests(-rand(1,2)) // Compost, effectively - if(S.has_reagent("nutriment", 1)) - adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5)) - adjustNutri(round(S.get_reagent_amount("nutriment") * 1)) + if(S.has_reagent(/datum/reagent/consumable/nutriment, 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 0.5)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/nutriment) * 1)) // Compost for EVERYTHING - if(S.has_reagent("virusfood", 1)) - adjustNutri(round(S.get_reagent_amount("virusfood") * 0.5)) - adjustHealth(-round(S.get_reagent_amount("virusfood") * 0.5)) + if(S.has_reagent(/datum/reagent/consumable/virus_food, 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/consumable/virus_food) * 0.5)) + adjustHealth(-round(S.get_reagent_amount(/datum/reagent/consumable/virus_food) * 0.5)) // FEED ME - if(S.has_reagent("blood", 1)) - adjustNutri(round(S.get_reagent_amount("blood") * 1)) + if(S.has_reagent(/datum/reagent/blood, 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/blood) * 1)) adjustPests(rand(2,4)) // FEED ME SEYMOUR - if(S.has_reagent("strange_reagent", 1)) + if(S.has_reagent(/datum/reagent/medicine/strange_reagent, 1)) spawnplant() // The best stuff there is. For testing/debugging. - if(S.has_reagent("adminordrazine", 1)) - adjustWater(round(S.get_reagent_amount("adminordrazine") * 1)) - adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1)) - adjustNutri(round(S.get_reagent_amount("adminordrazine") * 1)) + if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 1)) + adjustWater(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) + adjustHealth(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) + adjustNutri(round(S.get_reagent_amount(/datum/reagent/medicine/adminordrazine) * 1)) adjustPests(-rand(1,5)) adjustWeeds(-rand(1,5)) - if(S.has_reagent("adminordrazine", 5)) + if(S.has_reagent(/datum/reagent/medicine/adminordrazine, 5)) switch(rand(100)) if(66 to 100) mutatespecie() @@ -812,6 +813,7 @@ if(myseed) //Could be that they're just using it as a de-weeder age = 0 plant_health = 0 + lastproduce = 0 if(harvest) harvest = FALSE //To make sure they can't just put in another seed and insta-harvest it qdel(myseed) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 53282ed06d3..4bb9b6995f4 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -97,7 +97,7 @@ // Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate) /datum/plant_gene/reagent name = "Nutriment" - var/reagent_id = "nutriment" + var/reagent_id = /datum/reagent/consumable/nutriment var/rate = 0.04 /datum/plant_gene/reagent/get_name() @@ -108,7 +108,7 @@ name = "UNKNOWN" var/datum/reagent/R = GLOB.chemical_reagents_list[reag_id] - if(R && R.id == reagent_id) + if(R && R.type == reagent_id) name = R.name /datum/plant_gene/reagent/New(reag_id = null, reag_rate = 0) @@ -179,7 +179,7 @@ // For code, see grown.dm name = "Liquid Contents" examine_line = "It has a lot of liquid contents inside." - + /datum/plant_gene/trait/squash/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) // Squash the plant on slip. G.squash(C) @@ -198,7 +198,7 @@ var/obj/item/seeds/seed = G.seed var/stun_len = seed.potency * rate - if(!istype(G, /obj/item/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube"))) + if(!istype(G, /obj/item/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent(/datum/reagent/lube))) stun_len /= 3 G.AddComponent(/datum/component/slippery, min(stun_len,140), NONE, CALLBACK(src, .proc/handle_slip, G)) @@ -347,7 +347,7 @@ pocell.name = "[G.name] battery" pocell.desc = "A rechargeable plant-based power cell. This one has a rating of [DisplayEnergy(pocell.maxcharge)], and you should not swallow it." - if(G.reagents.has_reagent("plasma", 2)) + if(G.reagents.has_reagent(/datum/reagent/toxin/plasma, 2)) pocell.rigged = TRUE qdel(G) @@ -360,7 +360,7 @@ /datum/plant_gene/trait/stinging/on_slip(obj/item/reagent_containers/food/snacks/grown/G, atom/target) on_throw_impact(G, target) - + /datum/plant_gene/trait/stinging/on_throw_impact(obj/item/reagent_containers/food/snacks/grown/G, atom/target) if(isliving(target) && G.reagents && G.reagents.total_volume) var/mob/living/L = target diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 28468ea132a..459aa821664 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -164,9 +164,9 @@ var/amount = 1 + round(potency * reagents_add[rid], 1) var/list/data = null - if(rid == "blood") // Hack to make blood in plants always O- + if(rid == /datum/reagent/blood) // Hack to make blood in plants always O- data = list("blood_type" = "O-") - if(rid == "nutriment" || rid == "vitamin") + if(rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin) // apple tastes of apple. if(istype(T, /obj/item/reagent_containers/food/snacks/grown)) var/obj/item/reagent_containers/food/snacks/grown/grown_edible = T diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 08b8a9947b4..9ae72795b72 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -26,14 +26,14 @@ var/obj/item/storage/book/bible/booze/B = new - if(SSreligion.religion) - B.deity_name = SSreligion.deity - B.name = SSreligion.bible_name - B.icon_state = SSreligion.bible_icon_state - B.item_state = SSreligion.bible_item_state - to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.") + if(GLOB.religion) + B.deity_name = GLOB.deity + B.name = GLOB.bible_name + B.icon_state = GLOB.bible_icon_state + B.item_state = GLOB.bible_item_state + to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.") H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) - var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod + var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod var/obj/item/nullrod/N = new nrt(H) H.put_in_hands(N) return @@ -102,9 +102,9 @@ else B.name = "The Holy Book of [new_religion]" - SSreligion.religion = new_religion - SSreligion.bible_name = B.name - SSreligion.deity = B.deity_name + GLOB.religion = new_religion + GLOB.bible_name = B.name + GLOB.deity = B.deity_name H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 8ae63a8a768..cbffb981b92 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -323,14 +323,13 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums return null /obj/machinery/computer/libraryconsole/bookmanagement/proc/print_forbidden_lore(mob/user) - var/spook = pick("blood", "brass") - var/turf/T = get_turf(src) - if(spook == "blood") - new /obj/item/melee/cultblade/dagger(T) + if (prob(50)) + new /obj/item/melee/cultblade/dagger(get_turf(src)) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a sinister dagger sitting on the desk. You don't even remember where it came from...") else - new /obj/item/clockwork/slab(T) + new /obj/item/clockwork/slab(get_turf(src)) + to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a strange metal tablet sitting on the desk. You don't even remember where it came from...") - to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a [spook == "blood" ? "sinister dagger" : "strange metal tablet"] sitting on the desk. You don't even remember where it came from...") user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2) /obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/W, mob/user, params) @@ -485,11 +484,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums if(href_list["printbible"]) if(cooldown < world.time) var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc) - if(SSreligion.bible_icon_state && SSreligion.bible_item_state) - B.icon_state = SSreligion.bible_icon_state - B.item_state = SSreligion.bible_item_state - B.name = SSreligion.bible_name - B.deity_name = SSreligion.deity + if(GLOB.bible_icon_state && GLOB.bible_item_state) + B.icon_state = GLOB.bible_icon_state + B.item_state = GLOB.bible_item_state + B.name = GLOB.bible_name + B.deity_name = GLOB.deity cooldown = world.time + PRINTER_COOLDOWN else say("Printer currently unavailable, please wait a moment.") diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 797009cc1b8..7b8823bc665 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -148,7 +148,7 @@ desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl." icon = 'icons/obj/lavaland/ash_flora.dmi' icon_state = "mushroom_shavings" - list_reagents = list("sugar" = 3, "ethanol" = 2, "stabilizing_agent" = 3, "minttoxin" = 2) + list_reagents = list(/datum/reagent/consumable/sugar = 3, /datum/reagent/consumable/ethanol = 2, /datum/reagent/stabilizing_agent = 3, /datum/reagent/toxin/minttoxin = 2) w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE max_integrity = 100 @@ -166,7 +166,7 @@ /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf name = "mushroom leaf" desc = "A leaf, from a mushroom." - list_reagents = list("nutriment" = 3, "vitfro" = 2, "nicotine" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/vitfro = 2, /datum/reagent/drug/nicotine = 2) icon_state = "mushroom_leaf" seed = /obj/item/seeds/lavaland/porcini wine_power = 40 @@ -174,7 +174,7 @@ /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap name = "mushroom cap" desc = "The cap of a large mushroom." - list_reagents = list("mindbreaker" = 2, "entpoly" = 4, "mushroomhallucinogen" = 2) + list_reagents = list(/datum/reagent/toxin/mindbreaker = 2, /datum/reagent/consumable/entpoly = 4, /datum/reagent/drug/mushroomhallucinogen = 2) icon_state = "mushroom_cap" seed = /obj/item/seeds/lavaland/inocybe wine_power = 70 @@ -182,14 +182,14 @@ /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem name = "mushroom stem" desc = "A long mushroom stem. It's slightly glowing." - list_reagents = list("tinlux" = 2, "vitamin" = 1, "space_drugs" = 1) + list_reagents = list(/datum/reagent/consumable/tinlux = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/drug/space_drugs = 1) icon_state = "mushroom_stem" seed = /obj/item/seeds/lavaland/ember wine_power = 60 /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit name = "cactus fruit" - list_reagents = list("vitamin" = 2, "nutriment" = 2, "vitfro" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/vitfro = 4) desc = "A cactus fruit covered in a thick, reddish skin. And some ash." icon_state = "cactus_fruit" seed = /obj/item/seeds/lavaland/cactus @@ -218,7 +218,7 @@ else if(contents.len >= 20) to_chat(user, "You can't add more ingredients to [src]!") else - if(reagents.has_reagent("water", 10)) //are we starting a soup or a salad? + if(reagents.has_reagent(/datum/reagent/water, 10)) //are we starting a soup or a salad? var/obj/item/reagent_containers/food/snacks/customizable/A = new/obj/item/reagent_containers/food/snacks/customizable/soup/ashsoup(get_turf(src)) A.initialize_custom_food(src, S, user) else diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 398954acc2b..582ed15fd6a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -138,7 +138,7 @@ desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it." id = "bountymod" materials = list(MAT_METAL = 4000, MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 4000) - reagents_list = list("blood" = 40) + reagents_list = list(/datum/reagent/blood = 40) build_path = /obj/item/borg/upgrade/modkit/bounty //Spooky special loot @@ -455,7 +455,7 @@ /obj/item/immortality_talisman/Initialize() . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) + AddComponent(/datum/component/anti_magic, TRUE, TRUE, TRUE) /datum/action/item_action/immortality name = "Immortality" @@ -579,7 +579,7 @@ /obj/item/reagent_containers/glass/bottle/potion/flight name = "strange elixir" desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'." - list_reagents = list("flightpotion" = 5) + list_reagents = list(/datum/reagent/flightpotion = 5) /obj/item/reagent_containers/glass/bottle/potion/update_icon() if(reagents.total_volume) @@ -589,7 +589,6 @@ /datum/reagent/flightpotion name = "Flight Potion" - id = "flightpotion" description = "Strange mutagenic compound of unknown origins." reagent_state = LIQUID color = "#FFEBEB" @@ -883,7 +882,7 @@ /datum/disease/transformation/dragon name = "dragon transformation" cure_text = "nothing" - cures = list("adminordrazine") + cures = list(/datum/reagent/medicine/adminordrazine) agent = "dragon's blood" desc = "What do dragons have to do with Space Station 13?" stage_prob = 20 @@ -1051,6 +1050,11 @@ /obj/structure/closet/crate/necropolis/colossus name = "colossus chest" +/obj/structure/closet/crate/necropolis/colossus/bullet_act(obj/item/projectile/P) + if(istype(P, /obj/item/projectile/colossus)) + return BULLET_ACT_FORCE_PIERCE + return ..() + /obj/structure/closet/crate/necropolis/colossus/PopulateContents() var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) var/random_crystal = pick(choices) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 8183cff25b2..f2aaa7bb574 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -138,9 +138,14 @@ if(!has_minerals) return - for(var/obj/machinery/requests_console/D in GLOB.allConsoles) - if(D.receive_ore_updates) - D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0) + var/datum/signal/subspace/messaging/rc/signal = new(src, list( + "ore_update" = TRUE, + "sender" = "Ore Redemption Machine", + "message" = msg, + "verified" = "Verified by Ore Redemption Machine", + "priority" = REQ_NORMAL_MESSAGE_PRIORITY + )) + signal.send_to_receivers() /obj/machinery/mineral/ore_redemption/process() if(!materials.mat_container || panel_open || !powered()) diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 5d2fc6f4bd8..92a6d34c4b3 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -15,7 +15,7 @@ STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_items = 40 STR.max_combined_w_class = 40 - STR.can_hold = typecacheof(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) + STR.set_holdable(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) /obj/item/storage/bag/money/vault/PopulateContents() new /obj/item/coin/silver(src) @@ -24,4 +24,4 @@ new /obj/item/coin/silver(src) new /obj/item/coin/gold(src) new /obj/item/coin/gold(src) - new /obj/item/coin/adamantine(src) \ No newline at end of file + new /obj/item/coin/adamantine(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 73313ffde80..9acfd04d25b 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -352,7 +352,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_gold_heads" value = 25 materials = list(MAT_GOLD = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("gold" = 4) + grind_results = list(/datum/reagent/gold = 4) /obj/item/coin/silver name = "silver coin" @@ -360,7 +360,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_silver_heads" value = 10 materials = list(MAT_SILVER = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("silver" = 4) + grind_results = list(/datum/reagent/silver = 4) /obj/item/coin/diamond name = "diamond coin" @@ -368,7 +368,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_diamond_heads" value = 100 materials = list(MAT_DIAMOND = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("carbon" = 4) + grind_results = list(/datum/reagent/carbon = 4) /obj/item/coin/iron name = "iron coin" @@ -376,7 +376,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_iron_heads" value = 1 materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("iron" = 4) + grind_results = list(/datum/reagent/iron = 4) /obj/item/coin/plasma name = "plasma coin" @@ -384,7 +384,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_plasma_heads" value = 40 materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("plasma" = 4) + grind_results = list(/datum/reagent/toxin/plasma = 4) /obj/item/coin/uranium name = "uranium coin" @@ -392,7 +392,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_uranium_heads" value = 25 materials = list(MAT_URANIUM = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("uranium" = 4) + grind_results = list(/datum/reagent/uranium = 4) /obj/item/coin/bananium name = "bananium coin" @@ -400,7 +400,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "coin_bananium_heads" value = 200 //makes the clown cry materials = list(MAT_BANANIUM = MINERAL_MATERIAL_AMOUNT*0.2) - grind_results = list("banana" = 4) + grind_results = list(/datum/reagent/consumable/banana = 4) /obj/item/coin/adamantine name = "adamantine coin" @@ -421,7 +421,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ sideslist = list("heads") materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT*0.2) value = 1 - grind_results = list("iron" = 4) + grind_results = list(/datum/reagent/iron = 4) /obj/item/coin/antagtoken name = "antag token" @@ -430,7 +430,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ desc = "A novelty coin that helps the heart know what hard evidence cannot prove." sideslist = list("valid", "salad") value = 0 - grind_results = list("sodiumchloride" = 4) + grind_results = list(/datum/reagent/consumable/sodiumchloride = 4) /obj/item/coin/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/cable_coil)) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index c50f05ad0f9..71106b1927e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -262,11 +262,11 @@ /datum/sprite_accessory/hair/cornrowbraid name = "Cornrow Braid" - icon_state = "hair_rowbraid" + icon_state = "hair_cornrowbraid" /datum/sprite_accessory/hair/cornrowdualtail - name = "Cornrow Dual Tail" - icon_state = "hair_rowdualtail" + name = "Cornrow Tail" + icon_state = "hair_cornrowtail" /datum/sprite_accessory/hair/crew name = "Crewcut" @@ -284,10 +284,6 @@ name = "Dandy Pompadour" icon_state = "hair_dandypompadour" -/datum/sprite_accessory/hair/dave - name = "Dave" - icon_state = "hair_dave" - /datum/sprite_accessory/hair/devillock name = "Devil Lock" icon_state = "hair_devilock" @@ -490,7 +486,7 @@ /datum/sprite_accessory/hair/shavedmohawk name = "Mohawk (Unshaven)" - icon_state = "hair_unshavenmohawk" + icon_state = "hair_unshaven_mohawk" /datum/sprite_accessory/hair/mulder name = "Mulder" @@ -616,10 +612,6 @@ name = "Ponytail (Spiky)" icon_state = "hair_spikyponytail" -/datum/sprite_accessory/hair/ziegler - name = "Ponytail (Ziegler)" - icon_state = "hair_ziegler" - /datum/sprite_accessory/hair/poofy name = "Poofy" icon_state = "hair_poofy" @@ -632,10 +624,6 @@ name = "Ronin" icon_state = "hair_ronin" -/datum/sprite_accessory/hair/scully - name = "Scully" - icon_state = "hair_scully" - /datum/sprite_accessory/hair/shaved name = "Shaved" icon_state = "hair_shaved" @@ -870,10 +858,6 @@ name = "Beard (Moonshiner)" icon_state = "facial_moonshiner" -/datum/sprite_accessory/facial_hair/tribearder - name = "Beard (Tribearder)" - icon_state = "facial_tribearder" - /datum/sprite_accessory/facial_hair/longbeard name = "Beard (Long)" icon_state = "facial_longbeard" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 194ec9e122a..43b3eaffc8d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -13,6 +13,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) density = FALSE see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost movement_type = GROUND | FLYING @@ -136,6 +137,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) . = ..() grant_all_languages() + show_data_huds() + data_huds_on = 1 /mob/dead/observer/get_photo_description(obj/item/camera/camera) if(!invisibility || camera.see_ghosts) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 717b9e1855e..f9ff185106f 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -139,7 +139,7 @@ if(iscarbon(AM)) var/mob/living/carbon/C = AM if(blood_id == C.get_blood_id())//both mobs have the same blood substance - if(blood_id == "blood") //normal blood + if(blood_id == /datum/reagent/blood) //normal blood if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) var/datum/disease/D = thing @@ -147,7 +147,7 @@ continue C.ForceContractDisease(D) if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", amount * 0.5) + C.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) return 1 C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM) @@ -161,7 +161,7 @@ return /mob/living/carbon/get_blood_data(blood_id) - if(blood_id == "blood") //actual blood reagent + if(blood_id == /datum/reagent/blood) //actual blood reagent var/blood_data = list() //set the blood data blood_data["donor"] = src @@ -176,7 +176,7 @@ blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() for(var/datum/reagent/R in reagents.reagent_list) - temp_chem[R.id] = R.volume + temp_chem[R.type] = R.volume blood_data["trace_chem"] = list2params(temp_chem) if(mind) blood_data["mind"] = mind @@ -206,11 +206,11 @@ /mob/living/simple_animal/get_blood_id() if(blood_volume) - return "blood" + return /datum/reagent/blood /mob/living/carbon/monkey/get_blood_id() if(!(HAS_TRAIT(src, TRAIT_HUSK))) - return "blood" + return /datum/reagent/blood /mob/living/carbon/human/get_blood_id() if(HAS_TRAIT(src, TRAIT_HUSK)) @@ -219,7 +219,7 @@ return dna.species.exotic_blood else if((NOBLOOD in dna.species.species_traits)) return - return "blood" + return /datum/reagent/blood // This is has more potential uses, and is probably faster than the old proc. /proc/get_safe_blood(bloodtype) @@ -246,7 +246,7 @@ //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) - if(get_blood_id() != "blood") + if(get_blood_id() != /datum/reagent/blood) return if(!T) T = get_turf(src) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index ec536e2b15e..4273dad86ca 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -74,7 +74,7 @@ if(victim.stat == CONSCIOUS) src.visible_message("[victim] kicks free of the blood pool just before entering it!", null, "You hear splashing and struggling.") - else if(victim.reagents && victim.reagents.has_reagent("demonsblood")) + else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/demonsblood)) visible_message("Something prevents [victim] from entering the pool!", "A strange force is blocking [victim] from entering!", "You hear a splash and a thud.") else victim.forceMove(src) @@ -105,7 +105,7 @@ if(!victim) return FALSE - if(victim.reagents && victim.reagents.has_reagent("devilskiss")) + if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/consumable/ethanol/devilskiss)) to_chat(src, "AAH! THEIR FLESH! IT BURNS!") adjustBruteLoss(25) //I can't use adjustHealth() here because bloodcrawl affects /mob/living and adjustHealth() only affects simple mobs var/found_bloodpool = FALSE diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 0b95d4e4828..7a88ef7d92a 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -94,13 +94,13 @@ if(istype(O, /obj/item/organ_storage)) return //Borg organ bags shouldn't be killing brains - if(damaged_brain && O.is_drainable() && O.reagents.has_reagent("mannitol")) //attempt to heal the brain + if(damaged_brain && O.is_drainable() && O.reagents.has_reagent(/datum/reagent/medicine/mannitol)) //attempt to heal the brain . = TRUE //don't do attack animation. if(brain_death || brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing to_chat(user, "[src] is far too damaged, there's nothing else we can do for it!") return - if(!O.reagents.has_reagent("mannitol", 10)) + if(!O.reagents.has_reagent(/datum/reagent/medicine/mannitol, 10)) to_chat(user, "There's not enough mannitol in [O] to restore [src]!") return diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index be7402d3b3e..3357a932f5d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -95,8 +95,14 @@ Doesn't work on other aliens/AI.*/ var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in options if(!M) return 0 + if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(user, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return FALSE var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) if(msg) + if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(user, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return log_directed_talk(user, M, msg, LOG_SAY, tag="alien whisper") to_chat(M, "You hear a strange, alien voice in your head...[msg]") to_chat(user, "You said: \"[msg]\" to [M]") @@ -279,23 +285,6 @@ Doesn't work on other aliens/AI.*/ new choice(user.loc) return TRUE -/obj/effect/proc_holder/alien/regurgitate - name = "Regurgitate" - desc = "Empties the contents of your stomach." - plasma_cost = 0 - action_icon_state = "alien_barf" - -/obj/effect/proc_holder/alien/regurgitate/fire(mob/living/carbon/user) - if(user.stomach_contents.len) - for(var/atom/movable/A in user.stomach_contents) - user.stomach_contents.Remove(A) - A.forceMove(user.drop_location()) - if(isliving(A)) - var/mob/M = A - M.reset_perspective() - user.visible_message("[user] hurls out the contents of their stomach!") - return - /obj/effect/proc_holder/alien/sneak name = "Sneak" desc = "Blend into the shadows to stalk your prey." diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 48c29737108..5881f40e405 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -22,11 +22,6 @@ /obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_leg/alien, /obj/item/bodypart/l_leg/alien) -//This is fine right now, if we're adding organ specific damage this needs to be updated -/mob/living/carbon/alien/humanoid/Initialize() - AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) - . = ..() - /mob/living/carbon/alien/humanoid/restrained(ignore_grab) return handcuffed @@ -93,15 +88,11 @@ else return initial(pixel_x) -/mob/living/carbon/alien/humanoid/get_permeability_protection() +/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) return 0.8 /mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno) drop_all_held_items() - for(var/atom/movable/A in stomach_contents) - stomach_contents.Remove(A) - new_xeno.stomach_contents.Add(A) - A.forceMove(new_xeno) ..() //For alien evolution/promotion/queen finder procs. Checks for an active alien of that type diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index 4d2a7d68ad1..95a1cd8b991 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -1,9 +1,4 @@ -/mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0) - if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling)) - devour_mob(pulling, devour_time = 60) - else - ..() /mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(user.a_intent == INTENT_HARM) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 51fe5e2e100..acfe3f6fafb 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -4,7 +4,7 @@ set invisibility = 0 if (notransform) return - if(..() && !IsInStasis()) //not dead and not in stasis + if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis // GROW! if(amount_grown < max_grown) amount_grown++ diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index feeb66a9be7..028d8c43fe1 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -26,7 +26,7 @@ /obj/item/organ/alien/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("sacid", 10) + S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) return S @@ -45,7 +45,7 @@ /obj/item/organ/alien/plasmavessel/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("plasma", storedPlasma/10) + S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) return S /obj/item/organ/alien/plasmavessel/large diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 9023a2d8ced..e370e3ab161 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -18,7 +18,7 @@ /obj/item/organ/body_egg/alien_embryo/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("sacid", 10) + S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) return S /obj/item/organ/body_egg/alien_embryo/on_life() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 89188d61a1c..e25f4f37c4c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -11,8 +11,8 @@ //This must be done first, so the mob ghosts correctly before DNA etc is nulled . = ..() + QDEL_LIST(hand_bodyparts) QDEL_LIST(internal_organs) - QDEL_LIST(stomach_contents) QDEL_LIST(bodyparts) QDEL_LIST(implants) remove_from_all_data_huds() @@ -22,30 +22,6 @@ /mob/living/carbon/initialize_footstep() AddComponent(/datum/component/footstep, 1, 2) -/mob/living/carbon/relaymove(mob/user, direction) - if(user in src.stomach_contents) - if(prob(40)) - if(prob(25)) - audible_message("You hear something rumbling inside [src]'s stomach...", \ - "You hear something rumbling.", 4,\ - "Something is rumbling inside your stomach!") - var/obj/item/I = user.get_active_held_item() - if(I && I.force) - var/d = rand(round(I.force / 4), I.force) - var/obj/item/bodypart/BP = get_bodypart(BODY_ZONE_CHEST) - if(BP.receive_damage(d, 0)) - update_damage_overlays() - visible_message("[user] attacks [src]'s stomach wall with the [I.name]!", \ - "[user] attacks your stomach wall with the [I.name]!") - playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) - - if(prob(src.getBruteLoss() - 50)) - for(var/atom/movable/A in stomach_contents) - A.forceMove(drop_location()) - stomach_contents.Remove(A) - src.gib() - - /mob/living/carbon/swap_hand(held_index) if(!held_index) held_index = (active_hand_index % held_items.len)+1 @@ -492,7 +468,7 @@ add_splatter_floor(T) if(stun) adjustBruteLoss(3) - else if(src.reagents.has_reagent("blazaam")) + else if(src.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam)) if(T) T.add_vomit_floor(src, VOMIT_PURPLE) else @@ -554,11 +530,12 @@ /mob/living/carbon/update_stamina() var/stam = getStaminaLoss() if(stam > DAMAGE_PRECISION) - var/total_health = (health - stam) + var/total_health = (maxHealth - stam) if(total_health <= crit_threshold && !stat) if(!IsParalyzed()) to_chat(src, "You're too exhausted to keep going...") Paralyze(100) + stam_paralysed = TRUE update_health_hud() /mob/living/carbon/update_sight() @@ -640,6 +617,17 @@ else . += INFINITY +/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS = 0, CHEST = 0, GROIN = 0, LEGS = 0, FEET = 0, ARMS = 0, HEAD = 0)) + for(var/obj/item/I in get_equipped_items()) + for(var/zone in target_zones) + if(I.body_parts_covered & zone) + target_zones[zone] = max(1 - I.permeability_coefficient, target_zones[zone]) + var/protection = 0 + for(var/zone in target_zones) + protection += target_zones[zone] + protection *= INVERSE(target_zones.len) + return protection + //this handles hud updates /mob/living/carbon/update_damage_hud() @@ -741,7 +729,7 @@ if(hud_used.healths) if(stat != DEAD) . = 1 - if(!shown_health_amount) + if(shown_health_amount == null) shown_health_amount = health if(shown_health_amount >= maxHealth) hud_used.healths.icon_state = "health0" @@ -868,19 +856,6 @@ /mob/living/carbon/fakefireextinguish() remove_overlay(FIRE_LAYER) - -/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130) - C.visible_message("[src] is attempting to devour [C]!", \ - "[src] is attempting to devour you!") - if(!do_mob(src, C, devour_time)) - return - if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == INTENT_GRAB) - C.visible_message("[src] devours [C]!", \ - "[src] devours you!") - C.forceMove(src) - stomach_contents.Add(C) - log_combat(src, C, "devoured") - /mob/living/carbon/proc/create_bodyparts() var/l_arm_index_next = -1 var/r_arm_index_next = 0 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 60c5383aafd..ce05600f3e3 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -233,7 +233,7 @@ shock_damage *= dna.species.siemens_coeff if(shock_damage<1 && !override) return 0 - if(reagents.has_reagent("teslium")) + if(reagents.has_reagent(/datum/reagent/teslium)) shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging! if(illusion) adjustStaminaLoss(shock_damage) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index d00cf21de6f..ae84700f492 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -5,7 +5,6 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) has_limbs = 1 held_items = list(null, null) - var/list/stomach_contents = list() var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know. var/list/internal_organs_slot= list() //Same as above, but stores "slot ID" - "organ" pairs for easy access. var/silent = FALSE //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. @@ -62,3 +61,5 @@ var/damageoverlaytemp = 0 var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects + var/stam_regen_start_time = 0 //used to halt stamina regen temporarily + var/stam_paralysed = FALSE //so we get back up if we regen during a paralyse diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 9307e21c4d8..babd0ec041c 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -241,12 +241,13 @@ else gain_trauma_type(BRAIN_TRAUMA_SEVERE) - if(prev_brainloss < BRAIN_DAMAGE_MILD && brainloss >= BRAIN_DAMAGE_MILD) - to_chat(src, "You feel lightheaded.") - else if(prev_brainloss < BRAIN_DAMAGE_SEVERE && brainloss >= BRAIN_DAMAGE_SEVERE) - to_chat(src, "You feel less in control of your thoughts.") - else if(prev_brainloss < (BRAIN_DAMAGE_DEATH - 20) && brainloss >= (BRAIN_DAMAGE_DEATH - 20)) - to_chat(src, "You can feel your mind flickering on and off...") + if (stat < UNCONSCIOUS) // conscious or soft-crit + if(prev_brainloss < BRAIN_DAMAGE_MILD && brainloss >= BRAIN_DAMAGE_MILD) + to_chat(src, "You feel lightheaded.") + else if(prev_brainloss < BRAIN_DAMAGE_SEVERE && brainloss >= BRAIN_DAMAGE_SEVERE) + to_chat(src, "You feel less in control of your thoughts.") + else if(prev_brainloss < (BRAIN_DAMAGE_DEATH - 20) && brainloss >= (BRAIN_DAMAGE_DEATH - 20)) + to_chat(src, "You can feel your mind flickering on and off...") /mob/living/carbon/setBrainLoss(amount) var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index ae0e223e085..88cc5efe31d 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -9,19 +9,17 @@ emote("deathgasp") . = ..() - + for(var/T in get_traumas()) var/datum/brain_trauma/BT = T BT.on_death() - + if(SSticker.mode) SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now /mob/living/carbon/gib(no_brain, no_organs, no_bodyparts) var/atom/Tsec = drop_location() for(var/mob/M in src) - if(M in stomach_contents) - stomach_contents.Remove(M) M.forceMove(Tsec) visible_message("[M] bursts out of [src]!") ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 0e6dc2819a5..85b260d8798 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -224,12 +224,12 @@ if(bleedsuppress) msg += "[t_He] [t_is] bandaged with something.\n" else if(bleed_rate) - if(reagents.has_reagent("heparin")) + if(reagents.has_reagent(/datum/reagent/toxin/heparin)) msg += "[t_He] [t_is] bleeding uncontrollably!\n" else msg += "[t_He] [t_is] bleeding!\n" - if(reagents.has_reagent("teslium")) + if(reagents.has_reagent(/datum/reagent/teslium)) msg += "[t_He] [t_is] emitting a gentle blue glow!\n" if(islist(stun_absorption)) @@ -237,40 +237,45 @@ if(stun_absorption[i]["end_time"] > world.time && stun_absorption[i]["examine_message"]) msg += "[t_He] [t_is][stun_absorption[i]["examine_message"]]\n" - if(drunkenness && !skipface && !appears_dead) //Drunkenness - switch(drunkenness) - if(11 to 21) - msg += "[t_He] [t_is] slightly flushed.\n" - if(21.01 to 41) //.01s are used in case drunkenness ends up to be a small decimal - msg += "[t_He] [t_is] flushed.\n" - if(41.01 to 51) - msg += "[t_He] [t_is] quite flushed and [t_his] breath smells of alcohol.\n" - if(51.01 to 61) - msg += "[t_He] [t_is] very flushed and [t_his] movements jerky, with breath reeking of alcohol.\n" - if(61.01 to 91) - msg += "[t_He] look[p_s()] like a drunken mess.\n" - if(91.01 to INFINITY) - msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" - - if(HAS_TRAIT(user, TRAIT_EMPATH) && !appears_dead && (src != user)) - if (a_intent != INTENT_HELP) - msg += "[t_He] seem[p_s()] to be on guard.\n" - if (getOxyLoss() >= 10) - msg += "[t_He] seem[p_s()] winded.\n" - if (getToxLoss() >= 10) - msg += "[t_He] seem[p_s()] sickly.\n" - GET_COMPONENT_FROM(mood, /datum/component/mood, src) - if(mood.sanity <= SANITY_DISTURBED) - msg += "[t_He] seem[p_s()] distressed.\n" - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) - if (HAS_TRAIT(src, TRAIT_BLIND)) - msg += "[t_He] appear[p_s()] to be staring off into space.\n" - if (HAS_TRAIT(src, TRAIT_DEAF)) - msg += "[t_He] appear[p_s()] to not be responding to noises.\n" - - msg += "" - if(!appears_dead) + if(drunkenness && !skipface) //Drunkenness + switch(drunkenness) + if(11 to 21) + msg += "[t_He] [t_is] slightly flushed.\n" + if(21.01 to 41) //.01s are used in case drunkenness ends up to be a small decimal + msg += "[t_He] [t_is] flushed.\n" + if(41.01 to 51) + msg += "[t_He] [t_is] quite flushed and [t_his] breath smells of alcohol.\n" + if(51.01 to 61) + msg += "[t_He] [t_is] very flushed and [t_his] movements jerky, with breath reeking of alcohol.\n" + if(61.01 to 91) + msg += "[t_He] look[p_s()] like a drunken mess.\n" + if(91.01 to INFINITY) + msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n" + + if(src != user) + if(HAS_TRAIT(user, TRAIT_EMPATH)) + if (a_intent != INTENT_HELP) + msg += "[t_He] seem[p_s()] to be on guard.\n" + if (getOxyLoss() >= 10) + msg += "[t_He] seem[p_s()] winded.\n" + if (getToxLoss() >= 10) + msg += "[t_He] seem[p_s()] sickly.\n" + GET_COMPONENT_FROM(mood, /datum/component/mood, src) + if(mood.sanity <= SANITY_DISTURBED) + msg += "[t_He] seem[p_s()] distressed.\n" + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src) + if (HAS_TRAIT(src, TRAIT_BLIND)) + msg += "[t_He] appear[p_s()] to be staring off into space.\n" + if (HAS_TRAIT(src, TRAIT_DEAF)) + msg += "[t_He] appear[p_s()] to not be responding to noises.\n" + + msg += "" + + if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.isholy) + msg += "[t_He] [t_has] a holy aura about [t_him].\n" + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "religious_comfort", /datum/mood_event/religiously_comforted) + if(stat == UNCONSCIOUS) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2c86eaf6c75..35a17b8984a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -700,7 +700,7 @@ to_chat(src, "You can't do that right now!") return FALSE if(!Adjacent(M) && (M.loc != src)) - if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))) + if((be_close == FALSE) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))) return TRUE to_chat(src, "You are too far away!") return FALSE @@ -732,7 +732,7 @@ return else if(hud_used.healths) - var/health_amount = health - getStaminaLoss() + var/health_amount = min(health, maxHealth - getStaminaLoss()) if(..(health_amount)) //not dead switch(hal_screwyhud) if(SCREWYHUD_CRIT) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 90fb37f44fc..8af0ce6273b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -169,12 +169,6 @@ return ..() -/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) - if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (HAS_TRAIT(src, TRAIT_FAT)) && ismonkey(pulling)) - devour_mob(pulling) - else - ..() - /mob/living/carbon/human/grippedby(mob/living/user, instant = FALSE) if(w_uniform) w_uniform.add_fingerprint(user) @@ -238,7 +232,7 @@ "[M] disarmed [src]!") else if(!M.client || prob(5)) // only natural monkeys get to stun reliably, (they only do it occasionaly) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - if (src.IsKnockdown() && !src.IsParalyzed()) + if (src.IsKnockdown() && !src.IsParalyzed()) Paralyze(40) log_combat(M, src, "pinned") visible_message("[M] has pinned down [src]!", \ @@ -680,8 +674,6 @@ to_chat(src, "You succesfuly remove the durathread strand.") remove_status_effect(STATUS_EFFECT_CHOKINGSTRAND) return - visible_message("[src] examines [p_them()]self.", \ - "You check yourself for injuries.") check_self_for_injuries() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8bf25832ee1..5dfec65aa9a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -134,26 +134,6 @@ return ..() -/mob/living/carbon/human/get_permeability_protection() - var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0) - for(var/obj/item/I in get_equipped_items()) - if(I.body_parts_covered & HANDS) - prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"]) - if(I.body_parts_covered & CHEST) - prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"]) - if(I.body_parts_covered & GROIN) - prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"]) - if(I.body_parts_covered & LEGS) - prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"]) - if(I.body_parts_covered & FEET) - prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"]) - if(I.body_parts_covered & ARMS) - prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"]) - if(I.body_parts_covered & HEAD) - prot["head"] = max(1 - I.permeability_coefficient, prot["head"]) - var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 - return protection - /mob/living/carbon/human/can_use_guns(obj/item/G) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 94ca3443da3..698d76a8800 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -43,8 +43,6 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_move(NewLoc) if(shoes) if(mobility_flags & MOBILITY_STAND) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ca3e63f38d4..99100292210 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -28,9 +28,11 @@ if (QDELETED(src)) return 0 - if(!IsInStasis()) + if(!IS_IN_STASIS(src)) if(.) //not dead - handle_active_genes() + + for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes + HM.on_life() if(stat != DEAD) //heart attack stuff @@ -310,10 +312,6 @@ clear_alert("embeddedobject") SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "embedded") -/mob/living/carbon/human/proc/handle_active_genes() - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_life() - /mob/living/carbon/human/proc/handle_heart() var/we_breath = !HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT) @@ -335,29 +333,24 @@ //If you're covered in blood, you'll start smelling like shit faster. var/obj/item/head = get_item_by_slot(SLOT_HEAD) - if(head) - IF_HAS_BLOOD_DNA(head) - hygiene_loss -= 1 * HYGIENE_FACTOR + if(head && HAS_BLOOD_DNA(head)) + hygiene_loss -= 1 * HYGIENE_FACTOR var/obj/item/mask = get_item_by_slot(SLOT_HEAD) - if(mask) - IF_HAS_BLOOD_DNA(mask) - hygiene_loss -= 1 * HYGIENE_FACTOR + if(mask && HAS_BLOOD_DNA(mask)) + hygiene_loss -= 1 * HYGIENE_FACTOR var/obj/item/uniform = get_item_by_slot(SLOT_W_UNIFORM) - if(uniform) - IF_HAS_BLOOD_DNA(uniform) - hygiene_loss -= 4 * HYGIENE_FACTOR + if(uniform && HAS_BLOOD_DNA(uniform)) + hygiene_loss -= 4 * HYGIENE_FACTOR var/obj/item/suit = get_item_by_slot(SLOT_WEAR_SUIT) - if(suit) - IF_HAS_BLOOD_DNA(suit) - hygiene_loss -= 3 * HYGIENE_FACTOR + if(suit && HAS_BLOOD_DNA(suit)) + hygiene_loss -= 3 * HYGIENE_FACTOR var/obj/item/feet = get_item_by_slot(SLOT_SHOES) - if(feet) - IF_HAS_BLOOD_DNA(feet) - hygiene_loss -= 0.5 * HYGIENE_FACTOR + if(feet && HAS_BLOOD_DNA(feet)) + hygiene_loss -= 0.5 * HYGIENE_FACTOR adjust_hygiene(hygiene_loss) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 5a4f4ec4089..b8a15478912 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -949,9 +949,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_mutant_bodyparts() /datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == exotic_blood) + if(chem.type == exotic_blood) H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) - H.reagents.del_reagent(chem.id) + H.reagents.del_reagent(chem.type) return 1 return FALSE @@ -1102,7 +1102,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(I.item_flags & SLOWS_WHILE_IN_HAND) . += I.slowdown if(!HAS_TRAIT(H, TRAIT_IGNOREDAMAGESLOWDOWN)) - var/health_deficiency = (H.maxHealth - H.health + H.staminaloss) + var/health_deficiency = max(H.maxHealth - H.health, H.staminaloss) if(health_deficiency >= 40) if(flight) . += (health_deficiency / 75) @@ -1235,9 +1235,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage target.apply_damage(damage*1.5, attack_type, affecting, armor_block) log_combat(user, target, "kicked") - else//other attacks to 1/2 raw damage + full in stamina damage - target.apply_damage(damage*0.5, attack_type, affecting, armor_block) - target.apply_damage(damage, STAMINA, affecting, armor_block) + else//other attacks deal full raw damage + 1.5x in stamina damage + target.apply_damage(damage, attack_type, affecting, armor_block) + target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) log_combat(user, target, "punched") if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 952b8473723..2c19204d497 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -7,7 +7,7 @@ attack_sound = 'sound/weapons/etherealhit.ogg' miss_sound = 'sound/weapons/etherealmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ethereal - exotic_blood = "liquidelectricity" //Liquid Electricity. fuck you think of something better gamer + exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer siemens_coeff = 0.5 //They thrive on energy brutemod = 1.25 //They're weak to punches attack_type = BURN //burn bish diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 9b7cf1ef082..a12fb1d68d6 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -13,9 +13,9 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "pestkiller") + if(chem.type == /datum/reagent/toxin/pestkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3171b92139a..3466c851b00 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -314,9 +314,9 @@ H.take_overall_damage(2,0) /datum/species/golem/wood/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "plantbgone") + if(chem.type == /datum/reagent/toxin/plantbgone) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 //Radioactive @@ -403,9 +403,9 @@ if(P.starting) var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/target = get_turf(P.starting) // redirect the projectile - P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H) + P.firer = H + P.preparePixelProjectile(locate(CLAMP(new_x, 1, world.maxx), CLAMP(new_y, 1, world.maxy), H.z), H) return BULLET_ACT_FORCE_PIERCE return ..() @@ -624,14 +624,14 @@ C.RemoveSpell(dominate) /datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "holywater") + if(istype(chem, /datum/reagent/water/holywater)) H.adjustFireLoss(4) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) - if(chem.id == "unholywater") + if(chem.type == /datum/reagent/fuel/unholywater) H.adjustBruteLoss(-4) H.adjustFireLoss(-4) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) /datum/species/golem/clockwork diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 5168ca1e6ee..0a4bd4792fb 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -7,7 +7,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD) inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime - exotic_blood = "slimejelly" + exotic_blood = /datum/reagent/toxin/slimejelly damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs liked_food = MEAT @@ -591,6 +591,8 @@ return FALSE if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) //mindshield implant, no dice return FALSE + if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + return FALSE if(M in linked_mobs) return FALSE linked_mobs.Add(M) @@ -676,9 +678,14 @@ var/mob/living/M = input("Select who to send your message to:","Send thought to?",null) as null|mob in options if(!M) return - + if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(H, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return var/msg = sanitize(input("Message:", "Telepathy") as text|null) if(msg) + if(M.anti_magic_check(FALSE, FALSE, TRUE, 0)) + to_chat(H, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.") + return log_directed_talk(H, M, msg, LOG_SAY, "slime telepathy") to_chat(M, "You hear an alien voice in your head... [msg]") to_chat(H, "You telepathically said: \"[msg]\" to [M]") diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index ad0a7733c43..455405b8787 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -11,7 +11,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth - liked_food = VEGETABLES | DAIRY + liked_food = VEGETABLES | DAIRY | CLOTH disliked_food = FRUIT | GROSS toxic_food = MEAT | RAW mutanteyes = /obj/item/organ/eyes/moth @@ -45,9 +45,9 @@ /datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) . = ..() - if(chem.id == "pestkiller") + if(chem.type == /datum/reagent/toxin/pestkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) /datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 97e05f6477f..aad4b5f6f16 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -51,9 +51,9 @@ QDEL_NULL(mush) /datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "weedkiller") + if(chem.type == /datum/reagent/toxin/plantbgone/weedkiller) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return TRUE /datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 1ea6bf21fb9..c0c80b81832 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -44,9 +44,9 @@ H.take_overall_damage(2,0) /datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "plantbgone") + if(chem.type == /datum/reagent/toxin/plantbgone) H.adjustToxLoss(3) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 /datum/species/pod/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 25bd05dbc9f..468c0de1431 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -18,13 +18,13 @@ mutanteyes = /obj/item/organ/eyes/snail mutanttongue = /obj/item/organ/tongue/snail - exotic_blood = "lube" + exotic_blood = /datum/reagent/lube /datum/species/snail/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "sodiumchloride") + if(istype(chem,/datum/reagent/consumable/sodiumchloride)) H.adjustFireLoss(2) playsound(H, 'sound/weapons/sear.ogg', 30, 1) - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 /datum/species/snail/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 1847bb0eb21..366211d1cee 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -14,7 +14,7 @@ var/list/initial_species_traits //for getting these values back for assume_disguise() var/list/initial_inherent_traits changesource_flags = MIRROR_BADMIN | WABBAJACK - + /datum/species/synth/New() initial_species_traits = species_traits.Copy() initial_inherent_traits = inherent_traits.Copy() @@ -34,9 +34,9 @@ assume_disguise(old_species, H) /datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - if(chem.id == "synthflesh") + if(chem.type == /datum/reagent/medicine/synthflesh) chem.reaction_mob(H, TOUCH, 2 ,0) //heal a little - H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return 1 else return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index dad5b618e24..3aec4b0211a 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -95,11 +95,11 @@ to_chat(H, "[victim] doesn't have blood!") return V.drain_cooldown = world.time + 30 - if(victim.anti_magic_check(FALSE, TRUE, FALSE)) + if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0)) to_chat(victim, "[H] tries to bite you, but stops before touching you!") to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return - if(victim?.reagents?.has_reagent("garlic")) + if(victim?.reagents?.has_reagent(/datum/reagent/consumable/garlic)) to_chat(victim, "[H] tries to bite you, but recoils in disgust!") to_chat(H, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") return diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index ae8c0e6802f..7130a8b352c 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -14,7 +14,7 @@ var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE liked_food = GROSS | MEAT | RAW - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN /datum/species/zombie/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 733de2922aa..aa0b39b982d 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -15,13 +15,13 @@ amount = dna.species.spec_stun(src, amount) return ..() -/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0) +/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canstun = 0) amount = dna.species.spec_stun(src,amount) if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER)) amount *= rand(1.25, 1.3) return ..() -/mob/living/carbon/human/Sleeping(amount, updating = 1, ignore_sleepimmune = 0) +/mob/living/carbon/human/Sleeping(amount, updating = 1, ignore_canstun = 0) if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER)) amount *= rand(1.25, 1.3) return ..() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8d8a939762f..0e63ad65f96 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -8,7 +8,7 @@ damageoverlaytemp = 0 update_damage_hud() - if(!IsInStasis()) + if(!IS_IN_STASIS(src)) if(stat != DEAD) //Reagent processing needs to come before breathing, to prevent edge cases. handle_organs() @@ -65,7 +65,7 @@ //Second link in a breath chain, calls check_breath() /mob/living/carbon/proc/breathe() - if(reagents.has_reagent("lexorin")) + if(reagents.has_reagent(/datum/reagent/toxin/lexorin)) return if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) return @@ -137,7 +137,7 @@ //CRIT if(!breath || (breath.total_moles() == 0) || !lungs) - if(reagents.has_reagent("epinephrine") && lungs) + if(reagents.has_reagent(/datum/reagent/medicine/epinephrine) && lungs) return adjustOxyLoss(1) @@ -312,10 +312,17 @@ return /mob/living/carbon/proc/handle_bodyparts() + var/stam_regen = FALSE + if(stam_regen_start_time <= world.time) + stam_regen = TRUE + if(stam_paralysed) + stam_paralysed = FALSE + SetParalyzed(0) //Really we should have sources for status effects + update_health_hud() for(var/I in bodyparts) var/obj/item/bodypart/BP = I if(BP.needs_processing) - . |= BP.on_life() + . |= BP.on_life(stam_regen) /mob/living/carbon/proc/handle_organs() for(var/V in internal_organs) @@ -375,23 +382,6 @@ if(radiation > RAD_MOB_SAFE) adjustToxLoss(log(radiation-RAD_MOB_SAFE)*RAD_TOX_COEFFICIENT) -/mob/living/carbon/handle_stomach() - set waitfor = 0 - for(var/mob/living/M in stomach_contents) - if(M.loc != src) - stomach_contents.Remove(M) - continue - if(iscarbon(M) && stat != DEAD) - if(M.stat == DEAD) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(SSmobs.times_fired%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - adjust_nutrition(10) - /* Alcohol Poisoning Chart diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 624ed6d0160..9f7fdbe96e4 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -9,7 +9,7 @@ if (notransform) return - if(..() && !IsInStasis()) + if(..() && !IS_IN_STASIS(src)) if(!client) if(stat == CONSCIOUS) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 631dddb1571..349872ba312 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -61,9 +61,9 @@ . = ..() remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE) var/amount - if(reagents.has_reagent("morphine")) + if(reagents.has_reagent(/datum/reagent/medicine/morphine)) amount = -1 - if(reagents.has_reagent("nuka_cola")) + if(reagents.has_reagent(/datum/reagent/consumable/nuka_cola)) amount = -1 if(amount) add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) @@ -151,15 +151,6 @@ return threatcount -/mob/living/carbon/monkey/get_permeability_protection() - var/protection = 0 - if(head) - protection = 1 - head.permeability_coefficient - if(wear_mask) - protection = max(1 - wear_mask.permeability_coefficient, protection) - protection = protection/7 //the rest of the body isn't covered. - return protection - /mob/living/carbon/monkey/IsVocal() if(!getorganslot(ORGAN_SLOT_LUNGS)) return 0 diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index c4751434f17..348ef7553be 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -46,4 +46,9 @@ for(var/T in get_traumas()) var/datum/brain_trauma/trauma = T message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) + + if (src.mind.has_antag_datum(/datum/antagonist/traitor)) + message = GLOB.syndicate_code_phrase_regex.Replace(message, "$1") + message = GLOB.syndicate_code_response_regex.Replace(message, "$1") + return message diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 7c2b3a0f51d..0d40c75d80b 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -35,7 +35,7 @@ if(!loc) return - if(!IsInStasis()) + if(!IS_IN_STASIS(src)) if(stat != DEAD) //Mutations and radiation @@ -59,9 +59,6 @@ if(environment) handle_environment(environment) - //stuff in the stomach - handle_stomach() - handle_gravity() if(stat != DEAD) @@ -117,9 +114,6 @@ var/turf/location = get_turf(src) location.hotspot_expose(700, 50, 1) -/mob/living/proc/handle_stomach() - return - //this updates all special effects: knockdown, druggy, stuttering, etc.. /mob/living/proc/handle_status_effects() if(confused) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9f6616d96fd..01e1e782912 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -383,7 +383,7 @@ death() /mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE) - if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IsInStasis())) + if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS(src))) return TRUE /mob/living/canUseStorage() @@ -902,7 +902,7 @@ return 1 //used in datum/reagents/reaction() proc -/mob/living/proc/get_permeability_protection() +/mob/living/proc/get_permeability_protection(list/target_zones) return 0 /mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering @@ -995,7 +995,7 @@ apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), EFFECT_IRRADIATE, blocked) -/mob/living/anti_magic_check(magic = TRUE, holy = FALSE, major = TRUE, self = FALSE) +/mob/living/anti_magic_check(magic = TRUE, holy = FALSE, tinfoil = FALSE, chargecost = 1, self = FALSE) . = ..() if(.) return @@ -1008,7 +1008,8 @@ /mob/living/proc/fakefire() return - +/mob/living/proc/unfry_mob() //Callback proc to tone down spam from multiple sizzling frying oil dipping. + REMOVE_TRAIT(src, TRAIT_OIL_FRIED, "cooking_oil_react") //Mobs on Fire /mob/living/proc/IgniteMob() @@ -1097,8 +1098,7 @@ var/stun = IsStun() var/knockdown = IsKnockdown() var/ignore_legs = get_leg_ignore() - var/in_stasis = IsInStasis() - var/canmove = !IsImmobilized() && !stun && conscious && !paralyzed && !buckled && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && !in_stasis && (has_arms || ignore_legs || has_legs) + var/canmove = !IsImmobilized() && !stun && conscious && !paralyzed && !buckled && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && !IS_IN_STASIS(src) && (has_arms || ignore_legs || has_legs) if(canmove) mobility_flags |= MOBILITY_MOVE else diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index ab11291d74d..1ce3885cbb2 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -350,7 +350,7 @@ to_chat(src, "You resist Nar'Sie's influence... but not all of it. Run!") adjustBruteLoss(35) if(src && reagents) - reagents.add_reagent("heparin", 5) + reagents.add_reagent(/datum/reagent/toxin/heparin, 5) return FALSE if(GLOB.cult_narsie && GLOB.cult_narsie.souls_needed[src]) GLOB.cult_narsie.souls_needed -= src diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index f11e9695e8b..c9a1b1adec0 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -9,7 +9,7 @@ var/obj/item/projectile/P = mover return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) if(mover.throwing) - return (!density || !(mobility_flags & MOBILITY_STAND)) + return (!density || !(mobility_flags & MOBILITY_STAND) || (mover.throwing.thrower == src && !ismob(mover))) if(buckled == mover) return TRUE if(ismob(mover)) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 2215d6d5980..70fea44ed1d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -229,6 +229,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Recompose message for AI hrefs, language incomprehension. message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) + show_message(message, 2, deaf_message, deaf_type) return message diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f1e2d1ee47d..15ed13269a5 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -29,6 +29,7 @@ sec_hud = DATA_HUD_SECURITY_BASIC d_hud = DATA_HUD_DIAGNOSTIC_ADVANCED mob_size = MOB_SIZE_LARGE + var/battery = 200 //emergency power if the AI's APC is off var/list/network = list("ss13") var/obj/machinery/camera/current var/list/connected_robots = list() @@ -41,7 +42,6 @@ var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. - var/obj/item/pda/ai/aiPDA var/obj/item/multitool/aiMulti var/mob/living/simple_animal/bot/Bot var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. @@ -233,6 +233,8 @@ if(statpanel("Status")) if(!stat) stat(null, text("System integrity: [(health+100)/2]%")) + if(isturf(loc)) //only show if we're "in" a core + stat(null, text("Backup Power: [battery/2]%")) stat(null, text("Connected cyborgs: [connected_robots.len]")) for(var/mob/living/silicon/robot/R in connected_robots) var/robot_status = "Nominal" @@ -282,15 +284,6 @@ viewalerts = 1 src << browse(dat, "window=aialerts&can_close=0") -/mob/living/silicon/ai/proc/ai_roster() - var/dat = "Crew RosterCrew Roster:

" - - dat += GLOB.data_core.get_manifest() - dat += "" - - src << browse(dat, "window=airoster") - onclose(src, "airoster") - /mob/living/silicon/ai/proc/ai_call_shuttle() if(control_disabled) to_chat(usr, "Wireless control is disabled!") @@ -338,8 +331,14 @@ set name = "Toggle Floor Bolts" if(!isturf(loc)) // if their location isn't a turf return // stop - if(incapacitated()) + if(stat == DEAD) return + if(incapacitated()) + if(battery < 50) + to_chat(src, "Insufficient backup power!") + return + battery = battery - 50 + to_chat(src, "You route power from your backup battery to move the bolts.") var/is_anchored = FALSE if(move_resist == MOVE_FORCE_VERY_STRONG) move_resist = MOVE_FORCE_NORMAL @@ -813,7 +812,8 @@ to_chat(user, "No intelligence patterns detected." ) return ShutOffDoomsdayDevice() - new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location. + var/obj/structure/AIcore/new_core = new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location. + new_core.circuit.battery = battery ai_restore_power()//So the AI initially has power. control_disabled = TRUE //Can't control things remotely if you're stuck in a card! radio_enabled = FALSE //No talking on the built-in radio for you either! diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 15a04235cc0..fb7aa030e09 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -28,11 +28,15 @@ // Handle power damage (oxy) if(aiRestorePowerRoutine) // Lost power - adjustOxyLoss(1) + if (!battery) + to_chat(src, "Your backup battery's output drops below usable levels. It takes only a moment longer for your systems to fail, corrupted and unusable.") + adjustOxyLoss(200) + else + battery -- else // Gain Power - if(getOxyLoss()) - adjustOxyLoss(-1) + if (battery < 200) + battery ++ if(!lacks_power()) var/area/home = get_area(src) diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index eb6d0ce9919..8c47bc0cfdc 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -576,7 +576,7 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', "nine" = 'sound/vox_fem/nine.ogg', "nineteen" = 'sound/vox_fem/nineteen.ogg', "ninety" = 'sound/vox_fem/ninety.ogg', -"nitrogen" = 'sound/vox_fem/nitrogen.ogg', +/datum/reagent/nitrogen = 'sound/vox_fem/nitrogen.ogg', "n" = 'sound/vox_fem/n.ogg', "nominal" = 'sound/vox_fem/nominal.ogg', "no" = 'sound/vox_fem/no.ogg', @@ -975,4 +975,4 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', "zombie" = 'sound/vox_fem/zombie.ogg', "zone" = 'sound/vox_fem/zone.ogg', "zulu" = 'sound/vox_fem/zulu.ogg')) -#endif \ No newline at end of file +#endif diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index b09358bb487..c2bf28280d8 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -27,7 +27,6 @@ var/speakDoubleExclamation = "alarms" var/speakQuery = "queries" - var/obj/item/radio/headset // The pAI's headset var/obj/item/pai_cable/cable // The cable we produce and use when door or camera jacking var/master // Name of the one who commands us @@ -39,10 +38,6 @@ var/screen // Which screen our main window displays var/subscreen // Which specific function of the main screen is being displayed - var/obj/item/pda/ai/pai/pda = null - - var/obj/machinery/newscaster //pAI Newscaster - var/secHUD = 0 // Toggles whether the Security HUD is active or not var/medHUD = 0 // Toggles whether the Medical HUD is active or not @@ -58,6 +53,8 @@ var/obj/item/integrated_signaler/signaler // AI's signaller var/obj/item/instrument/piano_synth/internal_instrument + var/obj/machinery/newscaster //pAI Newscaster + var/obj/item/healthanalyzer/hostscan //pAI healthanalyzer var/encryptmod = FALSE var/holoform = FALSE @@ -111,20 +108,21 @@ P.setPersonality(src) forceMove(P) card = P - job = "personal AI" + job = "Personal AI" signaler = new(src) + hostscan = new /obj/item/healthanalyzer(src) if(!radio) radio = new /obj/item/radio/headset/silicon/pai(src) newscaster = new /obj/machinery/newscaster(src) if(!aicamera) aicamera = new /obj/item/camera/siliconcam/ai_camera(src) + aicamera.flash_enabled = TRUE //PDA - pda = new(src) - spawn(5) - pda.ownjob = "pAI Messenger" - pda.owner = text("[]", src) - pda.name = pda.owner + " (" + pda.ownjob + ")" + aiPDA = new/obj/item/pda/ai(src) + aiPDA.owner = real_name + aiPDA.ownjob = "pAI Messenger" + aiPDA.name = real_name + " (" + aiPDA.ownjob + ")" . = ..() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 00bca64322c..0a4f20096a9 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -6,21 +6,30 @@ /mob/living/silicon/pai/var/list/available_software = list( + //Nightvision + //T-Ray + //radiation eyes + //chem goggs + //mesons "crew manifest" = 5, "digital messenger" = 5, - "medical records" = 15, - "security records" = 15, - //"camera jack" = 10, - "door jack" = 30, "atmosphere sensor" = 5, + "photography module" = 5, + "remote signaller" = 10, + "medical records" = 10, + "security records" = 10, + "camera zoom" = 10, + "host scan" = 10, + //"camera jack" = 10, //"heartbeat sensor" = 10, - "security HUD" = 20, + //"projection array" = 15, "medical HUD" = 20, - "universal translator" = 35, - //"projection array" = 15 - "remote signaller" = 5, - "loudness booster" = 25, - "encryption keys" = 20 + "security HUD" = 20, + "loudness booster" = 20, + "newscaster" = 20, + "door jack" = 25, + "encryption keys" = 25, + "universal translator" = 35 ) /mob/living/silicon/pai/proc/paiInterface() @@ -69,6 +78,9 @@ left_part = softwareSignal() if("loudness") left_part = softwareLoudness() + if("hostscan") + left_part = softwareHostScan() + //usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc @@ -114,176 +126,180 @@ onclose(src, "pai") temp = null - - /mob/living/silicon/pai/Topic(href, href_list) - ..() + if(..()) + return var/soft = href_list["software"] var/sub = href_list["sub"] if(soft) screen = soft - if(sub) - subscreen = text2num(sub) - switch(soft) - // Purchasing new software - if("buy") - if(subscreen == 1) - var/target = href_list["buy"] - if(available_software.Find(target) && !software.Find(target)) - var/cost = available_software[target] - if(ram >= cost) - software.Add(target) - ram -= cost + if(sub) + subscreen = text2num(sub) + switch(soft) + if("buy") // Purchasing new software + if(subscreen == 1) + var/target = href_list["buy"] + if(available_software.Find(target) && !software.Find(target)) + var/cost = available_software[target] + if(ram >= cost) + software.Add(target) + ram -= cost + var/datum/hud/pai/pAIhud = hud_used + pAIhud?.update_software_buttons() + else + temp = "Insufficient RAM available." else - temp = "Insufficient RAM available." - else - temp = "Trunk \"[target]\" not found." - - // Configuring onboard radio - if("radio") - radio.attack_self(src) - - if("image") - var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What") - var/pID = 1 - - switch(newImage) - if("Happy") - pID = 1 - if("Cat") - pID = 2 - if("Extremely Happy") - pID = 3 - if("Face") - pID = 4 - if("Laugh") - pID = 5 - if("Off") - pID = 6 - if("Sad") - pID = 7 - if("Angry") - pID = 8 - if("What") - pID = 9 - if("Null") - pID = 10 - card.setEmotion(pID) - - if("news") - newscaster.ui_interact(src) - - if("signaller") - - if(href_list["send"]) - signaler.send_activation() - audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") - playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) - - if(href_list["freq"]) - var/new_frequency = (signaler.frequency + text2num(href_list["freq"])) - if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ) - new_frequency = sanitize_frequency(new_frequency) - signaler.set_frequency(new_frequency) - - if(href_list["code"]) - signaler.code += text2num(href_list["code"]) - signaler.code = round(signaler.code) - signaler.code = min(100, signaler.code) - signaler.code = max(1, signaler.code) + temp = "Trunk \"[target]\" not found." + if("radio") // Configuring onboard radio + radio.attack_self(src) - if("directive") - if(href_list["getdna"]) - var/mob/living/M = card.loc - var/count = 0 - while(!isliving(M)) - if(!M || !M.loc) - return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - M = M.loc - count++ - if(count >= 6) + if("image") // Set pAI card display face + var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What") + var/pID = 1 + + switch(newImage) + if("Happy") + pID = 1 + if("Cat") + pID = 2 + if("Extremely Happy") + pID = 3 + if("Face") + pID = 4 + if("Laugh") + pID = 5 + if("Off") + pID = 6 + if("Sad") + pID = 7 + if("Angry") + pID = 8 + if("What") + pID = 9 + if("Null") + pID = 10 + card.setEmotion(pID) + + if("news") + newscaster.ui_interact(src) + + if("camzoom") + aicamera.adjust_zoom(usr) + + if("signaller") + if(href_list["send"]) + signaler.send_activation() + audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") + playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) + + if(href_list["freq"]) + var/new_frequency = (signaler.frequency + text2num(href_list["freq"])) + if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ) + new_frequency = sanitize_frequency(new_frequency) + signaler.set_frequency(new_frequency) + + if(href_list["code"]) + signaler.code += text2num(href_list["code"]) + signaler.code = round(signaler.code) + signaler.code = min(100, signaler.code) + signaler.code = max(1, signaler.code) + + if("directive") + if(href_list["getdna"]) + if(iscarbon(card.loc)) + CheckDNA(card.loc, src) //you should only be able to check when directly in hand, muh immersions? + else to_chat(src, "You are not being carried by anyone!") - return 0 - spawn CheckDNA(M, src) + return 0 // FALSE ? If you return here you won't call paiinterface() below - if("pdamessage") - if(!isnull(pda)) - if(href_list["toggler"]) - pda.toff = !pda.toff - else if(href_list["ringer"]) - pda.silent = !pda.silent - else if(href_list["target"]) - if(silent) - return alert("Communications circuits remain uninitialized.") + if("pdamessage") + if(!isnull(aiPDA)) + if(href_list["toggler"]) + aiPDA.toff = !aiPDA.toff + else if(href_list["ringer"]) + aiPDA.silent = !aiPDA.silent + else if(href_list["target"]) + if(silent) + return alert("Communications circuits remain uninitialized.") + var/target = locate(href_list["target"]) in GLOB.PDAs + aiPDA.create_message(src, target) - var/target = locate(href_list["target"]) in GLOB.PDAs - pda.create_message(src, target) + if("medicalrecord") // Accessing medical records + if(subscreen == 1) + medicalActive1 = find_record("id", href_list["med_rec"], GLOB.data_core.general) + if(medicalActive1) + medicalActive2 = find_record("id", href_list["med_rec"], GLOB.data_core.medical) + if(!medicalActive2) + medicalActive1 = null + temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." - // Accessing medical records - if("medicalrecord") - if(subscreen == 1) - medicalActive1 = find_record("id", href_list["med_rec"], GLOB.data_core.general) - if(medicalActive1) - medicalActive2 = find_record("id", href_list["med_rec"], GLOB.data_core.medical) - if(!medicalActive2) - medicalActive1 = null - temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." + if("securityrecord") + if(subscreen == 1) + securityActive1 = find_record("id", href_list["sec_rec"], GLOB.data_core.general) + if(securityActive1) + securityActive2 = find_record("id", href_list["sec_rec"], GLOB.data_core.security) + if(!securityActive2) + securityActive1 = null + temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." - if("securityrecord") - if(subscreen == 1) - securityActive1 = find_record("id", href_list["sec_rec"], GLOB.data_core.general) - if(securityActive1) - securityActive2 = find_record("id", href_list["sec_rec"], GLOB.data_core.security) - if(!securityActive2) - securityActive1 = null - temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." - if("securityhud") - if(href_list["toggle"]) - secHUD = !secHUD - if(secHUD) - var/datum/atom_hud/sec = GLOB.huds[sec_hud] - sec.add_hud_to(src) - else - var/datum/atom_hud/sec = GLOB.huds[sec_hud] - sec.remove_hud_from(src) - if("medicalhud") - if(href_list["toggle"]) - medHUD = !medHUD - if(medHUD) - var/datum/atom_hud/med = GLOB.huds[med_hud] - med.add_hud_to(src) - else - var/datum/atom_hud/med = GLOB.huds[med_hud] - med.remove_hud_from(src) - if("encryptionkeys") - if(href_list["toggle"]) - encryptmod = TRUE - if("translator") - if(href_list["toggle"]) - grant_all_languages(TRUE) - // this is PERMAMENT. - if("doorjack") - if(href_list["jack"]) - if(cable && cable.machine) - hackdoor = cable.machine - hackloop() - if(href_list["cancel"]) - hackdoor = null - if(href_list["cable"]) - var/turf/T = get_turf(loc) - cable = new /obj/item/pai_cable(T) - T.visible_message("A port on [src] opens to reveal [cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.") - if("loudness") - if(subscreen == 1) // Open Instrument - internal_instrument.interact(src) - if(subscreen == 2) // Change Instrument type - internal_instrument.selectInstrument() + if("securityhud") + if(href_list["toggle"]) + secHUD = !secHUD + if(secHUD) + var/datum/atom_hud/sec = GLOB.huds[sec_hud] + sec.add_hud_to(src) + else + var/datum/atom_hud/sec = GLOB.huds[sec_hud] + sec.remove_hud_from(src) - //updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window - paiInterface() // So we'll just call the update directly rather than doing some default checks - return + if("medicalhud") + if(href_list["toggle"]) + medHUD = !medHUD + if(medHUD) + var/datum/atom_hud/med = GLOB.huds[med_hud] + med.add_hud_to(src) + else + var/datum/atom_hud/med = GLOB.huds[med_hud] + med.remove_hud_from(src) + + if("hostscan") + if(href_list["toggle"]) + var/mob/living/silicon/pai/pAI = usr + pAI.hostscan.attack_self(usr) + if(href_list["toggle2"]) + var/mob/living/silicon/pai/pAI = usr + pAI.hostscan.toggle_mode() + + if("encryptionkeys") + if(href_list["toggle"]) + encryptmod = TRUE + + if("translator") + if(href_list["toggle"]) + grant_all_languages(TRUE) + // this is PERMAMENT. + + if("doorjack") + if(href_list["jack"]) + if(cable && cable.machine) + hackdoor = cable.machine + hackloop() + if(href_list["cancel"]) + hackdoor = null + if(href_list["cable"]) + var/turf/T = get_turf(loc) + cable = new /obj/item/pai_cable(T) + T.visible_message("A port on [src] opens to reveal [cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.") + + if("loudness") + if(subscreen == 1) // Open Instrument + internal_instrument.interact(src) + if(subscreen == 2) // Change Instrument type + internal_instrument.selectInstrument() + + paiInterface() // MENUS @@ -295,7 +311,6 @@ dat += "Directives
" dat += "Radio Configuration
" dat += "Screen Display
" - dat += "Newscaster
" //dat += "Text Messaging
" dat += "
" @@ -306,6 +321,8 @@ dat += "Digital Messenger
" if(s == "crew manifest") dat += "Crew Manifest
" + if(s == "host scan") + dat += "Host Health Scan" if(s == "medical records") dat += "Medical Records
" if(s == "security records") @@ -321,6 +338,8 @@ // Advanced dat += "Advanced
" for(var/s in software) + if(s == "camera zoom") + dat += "Adjust Camera Zoom
" if(s == "atmosphere sensor") dat += "Atmospheric Sensor
" if(s == "heartbeat sensor") @@ -390,6 +409,8 @@ return dat /mob/living/silicon/pai/proc/CheckDNA(mob/living/carbon/M, mob/living/silicon/pai/P) + if(!istype(M)) + return var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No") if(answer == "Yes") M.visible_message("[M] presses [M.p_their()] thumb against [P].",\ @@ -482,7 +503,7 @@ . += "
\nBack
" return . -// Encryption kets +// Encryption Keys /mob/living/silicon/pai/proc/softwareEncryptionKeys() var/dat = {"

Encryption Key Firmware


When enabled, this device will be able to use up to two (2) encryption keys for departmental channel access.

@@ -500,7 +521,7 @@ // Security HUD /mob/living/silicon/pai/proc/facialRecognition() - var/dat = {"

Facial Recognition Suite


+ var/dat = {"

Facial Recognition Overlay


When enabled, this package will scan all viewable faces and compare them against the known criminal database, providing real-time graphical data about any detected persons of interest.

The package is currently [ (secHUD) ? "en" : "dis" ]abled.
Toggle Package
@@ -510,47 +531,24 @@ // Medical HUD /mob/living/silicon/pai/proc/medicalAnalysis() var/dat = "" - if(subscreen == 0) - dat += {"

Medical Analysis Suite


-

Visual Status Overlay


- When enabled, this package will scan all nearby crewmembers' vitals and provide real-time graphical data about their state of health.

- The suite is currently [ (medHUD) ? "en" : "dis" ]abled.
- Toggle Suite
-
- Host Bioscan
- "} - if(subscreen == 1) - dat += {"

Medical Analysis Suite


-

Host Bioscan


- "} - var/mob/living/M = card.loc - if(!isliving(M)) - while(!isliving(M)) - if(isturf(M)) - temp = "Error: No biological host found.
" - subscreen = 0 - return dat - M = M.loc - dat += {"Bioscan Results for [M]:
" - Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]
- Scan Breakdown:
- Respiratory: [M.getOxyLoss() > 50 ? "" : ""][M.getOxyLoss()]
- Toxicology: [M.getToxLoss() > 50 ? "" : ""][M.getToxLoss()]
- Burns: [M.getFireLoss() > 50 ? "" : ""][M.getFireLoss()]
- Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
- Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
- "} - for(var/thing in M.diseases) - var/datum/disease/D = thing - dat += {"

Infection Detected.


- Name: [D.name]
- Type: [D.spread_text]
- Stage: [D.stage]/[D.max_stages]
- Possible Cure: [D.cure_text]
- "} - dat += "Visual Status Overlay
" + dat += {"

Medical Analysis Overlay


+ When enabled, this package will scan all nearby crewmembers' vitals and provide real-time graphical data about their state of health.

+ The suite is currently [ (medHUD) ? "en" : "dis" ]abled.
+ Toggle Suite
+ "} return dat +//Health Scanner +/mob/living/silicon/pai/proc/softwareHostScan() + + var/dat = "" + dat += {"

Host Bisoscan Settings


+ + Change Scan Type
+ + Toggle Verbosity
+ "} + return dat // Atmospheric Scanner /mob/living/silicon/pai/proc/softwareAtmo() var/dat = "

Atmospheric Sensor

" @@ -636,19 +634,19 @@ var/dat = "

Digital Messenger

" dat += {"Signal/Receiver Status: - [(pda.toff) ? "\[Off\]" : "\[On\]"]
+ [(aiPDA.toff) ? "\[Off\]" : "\[On\]"]
Ringer Status: - [(pda.silent) ? "\[Off\]" : "\[On\]"]

"} + [(aiPDA.silent) ? "\[Off\]" : "\[On\]"]

"} dat += "
    " - if(!pda.toff) + if(!aiPDA.toff) for (var/obj/item/pda/P in sortNames(get_viewable_pdas())) - if (P == pda) + if (P == aiPDA) continue dat += "
  • [P]" dat += "
  • " dat += "
" dat += "

" - dat += "Messages:
[pda.tnote]" + dat += "Messages:
[aiPDA.tnote]" return dat // Loudness Booster diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ed039e4b59c..83eca3e515c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -410,11 +410,11 @@ /obj/item/reagent_containers/spray/cyborg_drying name = "drying agent spray" color = "#A000A0" - list_reagents = list("drying_agent" = 250) + list_reagents = list(/datum/reagent/drying_agent = 250) /obj/item/reagent_containers/spray/cyborg_lube name = "lube spray" - list_reagents = list("lube" = 250) + list_reagents = list(/datum/reagent/lube = 250) /obj/item/robot_module/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) ..() @@ -425,11 +425,11 @@ var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules if(CD) - CD.reagents.add_reagent("drying_agent", 5 * coeff) + CD.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff) var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules if(CL) - CL.reagents.add_reagent("lube", 2 * coeff) + CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff) /obj/item/robot_module/clown name = "Clown" @@ -492,7 +492,7 @@ ..() var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules if(O) - O.reagents.add_reagent("enzyme", 2 * coeff) + O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff) /obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 25fa70b061d..228d17af971 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -23,7 +23,7 @@ var/obj/item/camera/siliconcam/aicamera = null //photography hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_TRACK_HUD) - var/obj/item/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say() + var/obj/item/radio/borg/radio = null //All silicons make use of this, with (p)AI's creating headsets var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) @@ -44,6 +44,7 @@ var/hack_software = FALSE //Will be able to use hacking actions var/interaction_range = 7 //wireless control range + var/obj/item/pda/aiPDA /mob/living/silicon/Initialize() . = ..() @@ -321,6 +322,11 @@ usr << browse(list, "window=laws") +/mob/living/silicon/proc/ai_roster() + var/datum/browser/popup = new(src, "airoster", "Crew Manifest", 387, 420) + popup.set_content(GLOB.data_core.get_manifest()) + popup.open() + /mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). if(!radio) to_chat(src, "Radio not detected.") diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 4f31bd06976..617963b8dcb 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -237,7 +237,7 @@ Auto Patrol[]"}, targets += C if(targets.len>0) var/mob/living/carbon/t = pick(targets) - if((t.stat!=2) && (!(t.mobility_flags & MOBILITY_STAND)) && (!t.handcuffed)) //we don't shoot people who are dead, cuffed or lying down. + if(t.stat != DEAD && (t.mobility_flags & MOBILITY_STAND) && !t.handcuffed) //we don't shoot people who are dead, cuffed or lying down. shootAt(t) switch(mode) @@ -435,7 +435,7 @@ Auto Patrol[]"}, projectile = /obj/item/projectile/beam/lasertag/redtag /mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target) - if(lastfired && world.time - lastfired < shot_delay) + if(world.time <= lastfired + shot_delay) return lastfired = world.time var/turf/T = loc diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index eb3a29d51ea..2609d01786d 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -132,7 +132,7 @@ extinguish_people = TRUE internal_ext = new /obj/item/extinguisher(src) - internal_ext.chem = "clf3" //Refill the internal extinguisher with liquid fire + internal_ext.chem = /datum/reagent/clf3 //Refill the internal extinguisher with liquid fire internal_ext.power = 3 internal_ext.safety = FALSE internal_ext.precision = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index f01e88bda77..fd2275c0e72 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -43,16 +43,16 @@ var/declare_cooldown = 0 //Prevents spam of critical patient alerts. var/stationary_mode = 0 //If enabled, the Medibot will not move automatically. //Setting which reagents to use to treat what by default. By id. - var/treatment_brute_avoid = "tricordrazine" - var/treatment_brute = "bicaridine" + var/treatment_brute_avoid = /datum/reagent/medicine/tricordrazine + var/treatment_brute = /datum/reagent/medicine/bicaridine var/treatment_oxy_avoid = null - var/treatment_oxy = "dexalin" - var/treatment_fire_avoid = "tricordrazine" - var/treatment_fire = "kelotane" - var/treatment_tox_avoid = "tricordrazine" - var/treatment_tox = "charcoal" + var/treatment_oxy = /datum/reagent/medicine/dexalin + var/treatment_fire_avoid = /datum/reagent/medicine/tricordrazine + var/treatment_fire = /datum/reagent/medicine/kelotane + var/treatment_tox_avoid = /datum/reagent/medicine/tricordrazine + var/treatment_tox = /datum/reagent/medicine/charcoal var/treatment_virus_avoid = null - var/treatment_virus = "spaceacillin" + var/treatment_virus = /datum/reagent/medicine/spaceacillin var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible. var/shut_up = 0 //self explanatory :) @@ -60,9 +60,9 @@ name = "\improper Mysterious Medibot" desc = "International Medibot of mystery." skin = "bezerk" - treatment_brute = "tricordrazine" - treatment_fire = "tricordrazine" - treatment_tox = "tricordrazine" + treatment_brute = /datum/reagent/medicine/tricordrazine + treatment_fire = /datum/reagent/medicine/tricordrazine + treatment_tox = /datum/reagent/medicine/tricordrazine /mob/living/simple_animal/bot/medbot/derelict name = "\improper Old Medibot" @@ -70,13 +70,13 @@ skin = "bezerk" heal_threshold = 0 declare_crit = 0 - treatment_oxy = "pancuronium" + treatment_oxy = /datum/reagent/toxin/pancuronium treatment_brute_avoid = null - treatment_brute = "pancuronium" + treatment_brute = /datum/reagent/toxin/pancuronium treatment_fire_avoid = null - treatment_fire = "sodium_thiopental" + treatment_fire = /datum/reagent/toxin/sodium_thiopental treatment_tox_avoid = null - treatment_tox = "sodium_thiopental" + treatment_tox = /datum/reagent/toxin/sodium_thiopental /mob/living/simple_animal/bot/medbot/update_icon() cut_overlays() @@ -369,7 +369,7 @@ //If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS. if((reagent_glass) && (use_beaker) && ((C.getBruteLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getToxLoss() >= heal_threshold) || (C.getOxyLoss() >= (heal_threshold + 15)))) for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) - if(!C.reagents.has_reagent(R.id)) + if(!C.reagents.has_reagent(R.type)) return TRUE //They're injured enough for it! @@ -469,7 +469,7 @@ //If the patient is injured but doesn't have our special reagent in them then we should give it to them first if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume) for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) - if(!C.reagents.has_reagent(R.id) && !check_overdose(patient, R.id, injection_amount)) + if(!C.reagents.has_reagent(R.type) && !check_overdose(patient, R.type, injection_amount)) reagent_id = "internal_beaker" break diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 980d3e75774..b962b423206 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -54,7 +54,7 @@ var/atom/Tsec = drop_location() new /obj/item/stock_parts/cell/potato(Tsec) var/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/S = new(Tsec) - S.reagents.add_reagent("whiskey", 15) + S.reagents.add_reagent(/datum/reagent/consumable/ethanol/whiskey, 15) S.on_reagent_change(ADD_REAGENT) ..() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 567b33af970..b8f24699e11 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -174,7 +174,15 @@ return BULLET_ACT_FORCE_PIERCE // complete projectile permutation return ..() + +//////////////////////////Angelic-Juggernaut//////////////////////////// +/mob/living/simple_animal/hostile/construct/armored/angelic + icon_state = "behemoth_angelic" + icon_living = "behemoth_angelic" + loot = list(/obj/item/ectoplasm/angelic) +/mob/living/simple_animal/hostile/construct/armored/noncult + ////////////////////////Wraith///////////////////////////////////////////// /mob/living/simple_animal/hostile/construct/wraith name = "Wraith" @@ -220,7 +228,13 @@ /mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things AIStatus = AI_ON - +//////////////////////////Angelic-Wraith//////////////////////////// +/mob/living/simple_animal/hostile/construct/wraith/angelic + icon_state = "floating_angelic" + icon_living = "floating_angelic" + loot = list(/obj/item/ectoplasm/angelic) + +/mob/living/simple_animal/hostile/construct/wraith/noncult /////////////////////////////Artificer///////////////////////// /mob/living/simple_animal/hostile/construct/builder @@ -297,7 +311,15 @@ AIStatus = AI_ON environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP -/////////////////////////////Non-cult Artificer///////////////////////// +/////////////////////////////Angelic Artificer///////////////////////// +/mob/living/simple_animal/hostile/construct/builder/angelic + icon_state = "artificer_angelic" + icon_living = "artificer_angelic" + loot = list(/obj/item/ectoplasm/angelic) + construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified, + /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, + /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser) + /mob/living/simple_animal/hostile/construct/builder/noncult construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, @@ -305,7 +327,6 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser) - /////////////////////////////Harvester///////////////////////// /mob/living/simple_animal/hostile/construct/harvester name = "Harvester" diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 7ca65a11b00..67cd3047ff6 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -289,5 +289,5 @@ /mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L) ..() if(L.a_intent == INTENT_HARM && L.reagents && !stat) - L.reagents.add_reagent("nutriment", 0.4) - L.reagents.add_reagent("vitamin", 0.4) + L.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4) + L.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 32adaea113c..42b173452ff 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -330,12 +330,12 @@ /obj/item/udder/Initialize() create_reagents(50) - reagents.add_reagent("milk", 20) + reagents.add_reagent(/datum/reagent/consumable/milk, 20) . = ..() /obj/item/udder/proc/generateMilk() if(prob(5)) - reagents.add_reagent("milk", rand(5, 10)) + reagents.add_reagent(/datum/reagent/consumable/milk, rand(5, 10)) /obj/item/udder/proc/milkAnimal(obj/O, mob/user) var/obj/item/reagent_containers/glass/G = O diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 0d93f129160..b4fd7e01ad0 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -110,9 +110,9 @@ icon_state = "mouse_gray_dead" bitesize = 3 eatverb = "devour" - list_reagents = list("nutriment" = 3, "vitamin" = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) foodtype = GROSS | MEAT | RAW - grind_results = list("blood" = 20, "liquidgibs" = 5) + grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5) /obj/item/reagent_containers/food/snacks/deadmouse/attackby(obj/item/I, mob/user, params) if(I.is_sharp() && user.a_intent == INTENT_HARM) diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index d8912ee25f7..2fbbc9ab99c 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -1,6 +1,6 @@ /mob/living/simple_animal/hostile/retaliate/poison var/poison_per_bite = 0 - var/poison_type = "toxin" + var/poison_type = /datum/reagent/toxin /mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 0a4ad713c08..6076ba4de3e 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -472,7 +472,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/used_message = "All the cards seem to be blank now." var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later." var/ling_failure = "The deck refuses to respond to a souless creature such as you." - var/list/possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support") + var/list/possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic") var/random = TRUE var/allowmultiple = FALSE var/allowling = TRUE @@ -547,6 +547,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if("Dextrous") pickedtype = /mob/living/simple_animal/hostile/guardian/dextrous + if("Gravitokinetic") + pickedtype = /mob/living/simple_animal/hostile/guardian/gravitokinetic + var/list/guardians = user.hasparasites() if(guardians.len && !allowmultiple) to_chat(user, "You already have a [mob_name]!" ) @@ -575,10 +578,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians random = FALSE /obj/item/guardiancreator/choose/dextrous - possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support") + possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic") /obj/item/guardiancreator/choose/wizard - possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard") + possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Gravitokinetic") allowmultiple = TRUE /obj/item/guardiancreator/tech @@ -594,13 +597,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you." /obj/item/guardiancreator/tech/choose/traitor - possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support") + possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic") /obj/item/guardiancreator/tech/choose random = FALSE /obj/item/guardiancreator/tech/choose/dextrous - possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support") + possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic") /obj/item/paper/guides/antag/guardian name = "Holoparasite Guide" @@ -624,6 +627,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
Standard: Devastating close combat attacks and high damage resist. Can smash through weak walls.

+ Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
+
"} /obj/item/paper/guides/antag/guardian/update_icon() @@ -652,6 +657,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
Standard: Devastating close combat attacks and high damage resist. Can smash through weak walls.

+ Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
+
"} diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 55bbea98eef..4078f4b041c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -81,7 +81,7 @@ else to_chat(user, "[src] glows with a strange light, and you don't touch it.") -/obj/guardian_bomb/Bump(atom/A) +/obj/guardian_bomb/Bumped(atom/A) detonate(A) ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm new file mode 100644 index 00000000000..f7305975968 --- /dev/null +++ b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm @@ -0,0 +1,62 @@ +//gravitokinetic +/mob/living/simple_animal/hostile/guardian/gravitokinetic + melee_damage_lower = 15 + melee_damage_upper = 15 + damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) + playstyle_string = "As a gravitokinetic type, you can alt click to make the gravity on the ground stronger, and punching applies this effect to a target." + magic_fluff_string = "..And draw the Singularity, an anomalous force of terror." + tech_fluff_string = "Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online." + carp_fluff_string = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?" + var/list/gravito_targets = list() + var/gravity_power_range = 10 //how close the stand must stay to the target to keep the heavy gravity + var/datum/callback/distance_check + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/Initialize() + . = ..() + distance_check = CALLBACK(src, .proc/__distance_check) + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/AttackingTarget() + . = ..() + if(isliving(target) && target != src) + to_chat(src, "Your punch has applied heavy gravity to [target]!") + add_gravity(target, 2) + to_chat(target, "Everything feels really heavy!") + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/AltClickOn(atom/A) + if(isopenturf(A) && is_deployed() && stat != DEAD && in_range(src, A) && !incapacitated()) + var/turf/T = A + if(isspaceturf(T)) + to_chat(src, "You cannot add gravity to space!") + return + visible_message("[src] slams their fist into the [T]!", "You modify the gravity of the [T].") + do_attack_animation(T) + add_gravity(T, 4) + return + return ..() + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/Recall(forced) + . = ..() + to_chat(src, "You have released your gravitokinetic powers!") + for(var/datum/component/C in gravito_targets) + remove_gravity(C) + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/Moved(oldLoc, dir) + . = ..() + for(var/datum/component/C in gravito_targets) + if(get_dist(src, C.parent) > gravity_power_range) + remove_gravity(C) + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/add_gravity(atom/A, new_gravity = 2) + var/datum/component/C = A.AddComponent(/datum/component/forced_gravity,new_gravity) + RegisterSignal(A, COMSIG_MOVABLE_MOVED, distance_check) + gravito_targets.Add(C) + playsound(src, 'sound/effects/gravhit.ogg', 100, 1) + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/remove_gravity(datum/component/C) + UnregisterSignal(C.parent, COMSIG_MOVABLE_MOVED) + gravito_targets.Remove(C) + qdel(C) + +/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/__distance_check(atom/movable/AM, OldLoc, Dir, Forced) + if(get_dist(src, AM) > gravity_power_range) + remove_gravity(AM.GetComponent(/datum/component/forced_gravity)) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index b13f377c5d1..6abcf07c814 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -142,7 +142,7 @@ var/mob/living/L = target if(L.reagents) beegent.reaction_mob(L, INJECT) - L.reagents.add_reagent(beegent.id, rand(1,5)) + L.reagents.add_reagent(beegent.type, rand(1,5)) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) @@ -208,7 +208,7 @@ /mob/living/simple_animal/hostile/poison/bees/toxin/Initialize() . = ..() var/datum/reagent/R = pick(typesof(/datum/reagent/toxin)) - assign_reagent(GLOB.chemical_reagents_list[initial(R.id)]) + assign_reagent(GLOB.chemical_reagents_list[R]) /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" @@ -228,7 +228,7 @@ if(. && beegent && isliving(target)) var/mob/living/L = target beegent.reaction_mob(L, TOUCH) - L.reagents.add_reagent(beegent.id, rand(1,5)) + L.reagents.add_reagent(beegent.type, rand(1,5)) //PEASENT BEES @@ -239,7 +239,7 @@ /mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) if(!B) return FALSE - if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) + if(B.beegent && beegent && B.beegent.type != beegent.type || B.beegent && !beegent || !B.beegent && beegent) return TRUE return FALSE @@ -256,9 +256,9 @@ /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I - if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped - if(S.reagents.has_reagent("royal_bee_jelly",5)) - S.reagents.remove_reagent("royal_bee_jelly", 5) + if(S.reagents.has_reagent(/datum/reagent/royal_bee_jelly)) //checked twice, because I really don't want royal bee jelly to be duped + if(S.reagents.has_reagent(/datum/reagent/royal_bee_jelly,5)) + S.reagents.remove_reagent(/datum/reagent/royal_bee_jelly, 5) var/obj/item/queen_bee/qb = new(user.drop_location()) qb.queen = new(qb) if(queen && queen.beegent) @@ -269,8 +269,8 @@ to_chat(user, "You don't have enough royal bee jelly to split a bee in two!") else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] - if(R && S.reagents.has_reagent(R.id, 5)) - S.reagents.remove_reagent(R.id,5) + if(R && S.reagents.has_reagent(R.type, 5)) + S.reagents.remove_reagent(R.type,5) queen.assign_reagent(R) user.visible_message("[user] injects [src]'s genome with [R.name], mutating its DNA!","You inject [src]'s genome with [R.name], mutating its DNA!") name = queen.name @@ -296,7 +296,7 @@ forceMove(beehome.drop_location()) else ..() - + /mob/living/simple_animal/hostile/poison/bees/short desc = "These bees seem unstable and won't survive for long." diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 41644ec234a..447cbe339d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -23,8 +23,8 @@ harm_intent_damage = 8 obj_damage = 50 - melee_damage_lower = 15 - melee_damage_upper = 15 + melee_damage_lower = 20 + melee_damage_upper = 20 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' speak_emote = list("gnashes") @@ -38,12 +38,6 @@ pressure_resistance = 200 gold_core_spawnable = HOSTILE_SPAWN -/mob/living/simple_animal/hostile/carp/AttackingTarget() - . = ..() - if(. && ishuman(target)) - var/mob/living/carbon/human/H = target - H.adjustStaminaLoss(8) - /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 85bd6c49c68..1a7aad1dd68 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -6,7 +6,7 @@ /mob/living/simple_animal/hostile/poison var/poison_per_bite = 5 - var/poison_type = "toxin" + var/poison_type = /datum/reagent/toxin /mob/living/simple_animal/hostile/poison/AttackingTarget() . = ..() @@ -156,7 +156,7 @@ melee_damage_upper = 1 poison_per_bite = 12 move_to_delay = 4 - poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? + poison_type = /datum/reagent/toxin/venom //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? speed = 1 gold_core_spawnable = NO_SPAWN @@ -177,14 +177,17 @@ status_flags = NONE mob_size = MOB_SIZE_LARGE gold_core_spawnable = NO_SPAWN + var/slowed_by_webs = FALSE -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay() - var/turf/T = get_turf(src) - if(locate(/obj/structure/spider/stickyweb) in T) - speed = 2 - else - speed = 7 +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/Moved(atom/oldloc, dir) . = ..() + if(slowed_by_webs) + if(!(locate(/obj/structure/spider/stickyweb) in loc)) + remove_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB) + slowed_by_webs = FALSE + else if(locate(/obj/structure/spider/stickyweb) in loc) + add_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB, priority=100, multiplicative_slowdown=3) + slowed_by_webs = TRUE //midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one. /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife @@ -212,7 +215,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - poison_type = "frostoil" + poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) gold_core_spawnable = NO_SPAWN @@ -221,7 +224,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - poison_type = "frostoil" + poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) gold_core_spawnable = NO_SPAWN @@ -230,7 +233,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - poison_type = "frostoil" + poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 74e3b0b35f9..9600141c1b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -65,7 +65,6 @@ /obj/item/organ/body_egg/changeling_egg/proc/Pop() var/mob/living/carbon/monkey/M = new(owner) - owner.stomach_contents += M for(var/obj/item/organ/I in src) I.Insert(M, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 751d6a87c4d..b991c7feadc 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -337,6 +337,7 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget() + SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target) in_melee = TRUE return target.attack_animal(src) @@ -406,12 +407,13 @@ if(casingtype) var/obj/item/ammo_casing/casing = new casingtype(startloc) playsound(src, projectilesound, 100, 1) - casing.fire_casing(targeted_atom, src, null, null, null, ran_zone()) + casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), src) else if(projectiletype) var/obj/item/projectile/P = new projectiletype(startloc) playsound(src, projectilesound, 100, 1) P.starting = startloc P.firer = src + P.fired_from = src P.yo = targeted_atom.y - startloc.y P.xo = targeted_atom.x - startloc.x if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 247e4290df2..b2cf20e6fb8 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -105,7 +105,6 @@ /datum/reagent/toxin/leaper_venom name = "Leaper venom" - id = "leaper_venom" description = "A toxin spat out by leapers that, while harmless in small doses, quickly creates a toxic reaction if too much is in the body." color = "#801E28" // rgb: 128, 30, 40 toxpwr = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 5c28b07b34e..27e736bafcc 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -1,3 +1,4 @@ +#define COLOSSUS_SLEEP(X) sleep(X); if(QDELETED(src)) return; /* COLOSSUS @@ -73,7 +74,7 @@ Difficulty: Very Hard telegraph() if(health < maxHealth/3) - double_spiral() + INVOKE_ASYNC(src, .proc/double_spiral) else visible_message("\"Judgement.\"") INVOKE_ASYNC(src, .proc/spiral_shoot, pick(TRUE, FALSE)) @@ -123,17 +124,17 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots() dir_shots(GLOB.diagonals) - sleep(10) + COLOSSUS_SLEEP(10) dir_shots(GLOB.cardinals) - sleep(10) + COLOSSUS_SLEEP(10) dir_shots(GLOB.diagonals) - sleep(10) + COLOSSUS_SLEEP(10) dir_shots(GLOB.cardinals) /mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral() visible_message("\"Die.\"") - sleep(10) + COLOSSUS_SLEEP(10) INVOKE_ASYNC(src, .proc/spiral_shoot) INVOKE_ASYNC(src, .proc/spiral_shoot, TRUE) @@ -151,7 +152,7 @@ Difficulty: Very Hard counter = 16 shoot_projectile(start_turf, counter * 22.5) playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, 1) - sleep(1) + COLOSSUS_SLEEP(1) /mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker, set_angle) if(!isnum(set_angle) && (!marker || marker == loc)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 6724b62e469..ea7b8849793 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -3,6 +3,7 @@ #define SWOOP_DAMAGEABLE 1 #define SWOOP_INVULNERABLE 2 +#define DRAKE_SLEEP(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; /* @@ -137,20 +138,24 @@ Difficulty: Medium var/turf/T = pick(RANGE_TURFS(1, target)) new /obj/effect/temp_visual/lava_warning(T, 60) // longer reset time for the lava amount-- - sleep(delay) + DRAKE_SLEEP(delay) /mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_swoop(var/amount = 30) INVOKE_ASYNC(src, .proc/lava_pools, amount) swoop_attack(FALSE, target, 1000) // longer cooldown until it gets reset below + if(QDELETED(src) || stat == DEAD) + return fire_cone() if(health < maxHealth*0.5) - sleep(10) + DRAKE_SLEEP(10) fire_cone() - sleep(10) + DRAKE_SLEEP(10) fire_cone() SetRecoveryTime(40) /mob/living/simple_animal/hostile/megafauna/dragon/proc/mass_fire(var/spiral_count = 12, var/range = 15, var/times = 3) + if(QDELETED(src) || stat == DEAD) + return for(var/i = 1 to times) SetRecoveryTime(50) playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1) @@ -158,7 +163,7 @@ Difficulty: Medium for(var/j = 1 to spiral_count) var/list/turfs = line_target(j * increment + i * increment / 2, range, src) INVOKE_ASYNC(src, .proc/fire_line, turfs) - sleep(25) + DRAKE_SLEEP(25) SetRecoveryTime(30) /mob/living/simple_animal/hostile/megafauna/dragon/proc/lava_arena() @@ -179,7 +184,7 @@ Difficulty: Medium T.ChangeTurf(/turf/open/floor/plating/asteroid/basalt/lava_land_surface) else indestructible_turfs += T - sleep(10) // give them a bit of time to realize what attack is actually happening + DRAKE_SLEEP(10) // give them a bit of time to realize what attack is actually happening var/list/turfs = RANGE_TURFS(2, center) while(amount > 0) @@ -203,10 +208,12 @@ Difficulty: Medium else if(!istype(T, /turf/closed/indestructible)) new /obj/effect/temp_visual/lava_safe(T) amount-- - sleep(24) + DRAKE_SLEEP(24) return 1 // attack finished completely /mob/living/simple_animal/hostile/megafauna/dragon/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker + if(QDELETED(src) || stat == DEAD) + return //angry but helpless SetRecoveryTime(80) visible_message("[src] starts to glow vibrantly as its wounds close up!") adjustBruteLoss(-250) // yeah you're gonna pay for that, don't run nerd @@ -214,10 +221,12 @@ Difficulty: Medium move_to_delay = move_to_delay / 2 light_range = 10 sleep(10) // run. - mass_fire(20, 15, 3) - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) - move_to_delay = initial(move_to_delay) - light_range = initial(light_range) + if(!QDELETED(src)) + if(stat != DEAD) + mass_fire(20, 15, 3) + move_to_delay = initial(move_to_delay) + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) + light_range = initial(light_range) /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_cone(var/atom/at = target) playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1) @@ -245,6 +254,10 @@ Difficulty: Medium return (getline(src, T) - get_turf(src)) /mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_line(var/list/turfs) + dragon_fire_line(src, turfs) + +//fire line keeps going even if dragon is deleted +/proc/dragon_fire_line(var/source, var/list/turfs) var/list/hit_list = list() for(var/turf/T in turfs) if(istype(T, /turf/closed)) @@ -252,11 +265,11 @@ Difficulty: Medium new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) for(var/mob/living/L in T.contents) - if(L in hit_list || L == src) + if(L in hit_list || L == source) continue hit_list += L L.adjustFireLoss(20) - to_chat(L, "You're hit by [src]'s fire breath!") + to_chat(L, "You're hit by [source]'s fire breath!") // deals damage to mechs for(var/obj/mecha/M in T.contents) @@ -306,6 +319,7 @@ Difficulty: Medium swooping |= SWOOP_INVULNERABLE mouse_opacity = MOUSE_OPACITY_TRANSPARENT sleep(7) + //badmins please don't kill it while it's invulnerable while(target && loc != get_turf(target)) forceMove(get_step(src, get_dir(src, target))) @@ -354,6 +368,8 @@ Difficulty: Medium density = TRUE sleep(1) + if(QDELETED(src)) + return swooping &= ~SWOOP_DAMAGEABLE SetRecoveryTime(swoop_cooldown) if(!lava_success) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index 7384d778f9f..125861fa807 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -131,7 +131,6 @@ /obj/item/udder/gutlunch/generateMilk() if(prob(60)) - reagents.add_reagent("cream", rand(2, 5)) + reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5)) if(prob(45)) - reagents.add_reagent("salglu_solution", rand(2,5)) - + reagents.add_reagent(/datum/reagent/medicine/salglu_solution, rand(2,5)) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 9cdeaa2f629..55e5dedc482 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -186,6 +186,6 @@ var/counter for(counter=0, counter<=powerlevel, counter++) var/obj/item/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/reagent_containers/food/snacks/hugemushroomslice(src.loc) - S.reagents.add_reagent("mushroomhallucinogen", powerlevel) - S.reagents.add_reagent("omnizine", powerlevel) - S.reagents.add_reagent("synaptizine", powerlevel) + S.reagents.add_reagent(/datum/reagent/drug/mushroomhallucinogen, powerlevel) + S.reagents.add_reagent(/datum/reagent/medicine/omnizine, powerlevel) + S.reagents.add_reagent(/datum/reagent/medicine/synaptizine, powerlevel) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 609f610c2c2..da3f86ed273 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -35,7 +35,7 @@ do_footstep = TRUE var/banana_time = 0 // If there's no time set it won't spawn. var/banana_type = /obj/item/grown/bananapeel - var/attack_reagent + var/attack_reagent /mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() if(bodytemperature < minbodytemp) @@ -109,7 +109,7 @@ attacktext = "cheers up" loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) banana_type = /obj/item/grown/bananapeel - attack_reagent = "laughter" + attack_reagent = /datum/reagent/consumable/laughter /mob/living/simple_animal/hostile/retaliate/clown/fleshclown name = "Fleshclown" @@ -216,7 +216,7 @@ attacktext = "ferociously mauls" environment_smash = ENVIRONMENT_SMASH_NONE loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) - attack_reagent = "dizzysolution" + attack_reagent = /datum/reagent/peaceborg/confuse /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer name = "The Destroyer" @@ -274,4 +274,4 @@ speed = 20 attacktext = "bounces off of" loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - attack_reagent = "mindbreaker" + attack_reagent = /datum/reagent/toxin/mindbreaker diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 2f07a61e9ca..497a0c3310f 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -64,6 +64,7 @@ unsuitable_atmos_damage = 0 faction = list("hostile","vines","plants") var/list/grasping = list() + var/list/tethers = list() var/max_grasps = 4 var/grasp_chance = 20 var/grasp_pull_chance = 85 @@ -75,6 +76,8 @@ var/datum/beam/B = grasping[L] if(B) qdel(B) + for(var/datum/component/tether in tethers) + tether.RemoveComponent() grasping = null return ..() @@ -96,24 +99,31 @@ step(L,get_dir(L,src)) //reel them in L.Paralyze(60) //you can't get away now~ - if(grasping.len < max_grasps) + if(length(grasping) < max_grasps) grasping: for(var/mob/living/L in view(grasp_range, src)) - if(L == src || faction_check_mob(L) || (L in grasping) || L == target) + if(L == src || faction_check_mob(L) || L in grasping || L == target) continue - for(var/t in getline(src,L)) - for(var/a in t) - var/atom/A = a - if(A.density && A != L) + for(var/turf/T in getline(src,L)) + if (T.density) + continue grasping + for(var/obj/O in T) + if(O.density) continue grasping if(prob(grasp_chance)) to_chat(L, "\The [src] has you entangled!") grasping[L] = Beam(L, "vine", time=INFINITY, maxdistance=5, beam_type=/obj/effect/ebeam/vine) - + tethers += list(L.AddComponent(/datum/component/tether, src, grasp_range+1, /obj/effect/ebeam/vine), AddComponent(/datum/component/tether, L, grasp_range+1, /obj/effect/ebeam/vine)) break //only take 1 new victim per cycle /mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target) + for(var/turf/T in getline(src,target)) + if (T.density) + return + for(var/obj/O in T) + if(O.density) + return var/dist = get_dist(src,the_target) Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine) the_target.attack_animal(src) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index b04a50f6b13..af5a733792f 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -140,9 +140,9 @@ . = ..() remove_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE) var/amount = 0 - if(reagents.has_reagent("morphine")) // morphine slows slimes down + if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down amount = 2 - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow amount = 5 if(amount) add_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount) diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index a2df855d0b7..b5720c62250 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -76,4 +76,4 @@ slime_mutation[2] = colour slime_mutation[3] = colour slime_mutation[4] = colour - return(slime_mutation) \ No newline at end of file + return(slime_mutation) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 1d41e25a334..b5747b1f65e 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -374,14 +374,6 @@ priority_absorb_key["stuns_absorbed"] += amount return TRUE -/////////////////////////////////// STASIS /////////////////////////////////// - -/mob/living/proc/IsInStasis() - . = has_status_effect(STATUS_EFFECT_STASIS) - -/mob/living/proc/SetStasis(apply, updating = TRUE) - . = apply ? apply_status_effect(STATUS_EFFECT_STASIS, null, updating) : remove_status_effect(STATUS_EFFECT_STASIS) - /////////////////////////////////// DISABILITIES //////////////////////////////////// /mob/living/proc/add_quirk(quirktype, spawn_effects) //separate proc due to the way these ones are handled if(HAS_TRAIT(src, quirktype)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 74022342581..fd6f8bb0045 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -698,11 +698,11 @@ mob_spell_list -= S qdel(S) -/mob/proc/anti_magic_check(magic = TRUE, holy = FALSE, major = TRUE, self = FALSE) - if(!magic && !holy) +/mob/proc/anti_magic_check(magic = TRUE, holy = FALSE, tinfoil = FALSE, chargecost = 1, self = FALSE) + if(!magic && !holy && !tinfoil) return var/list/protection_sources = list() - if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, src, magic, holy, major, self, protection_sources) & COMPONENT_BLOCK_MAGIC) + if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, src, magic, holy, tinfoil, chargecost, self, protection_sources) & COMPONENT_BLOCK_MAGIC) if(protection_sources.len) return pick(protection_sources) else diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 83d6dcd71a4..3cc734b8f38 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -99,8 +99,6 @@ var/list/progressbars = null //for stacking do_after bars - var/list/mousemove_intercept_objects - var/datum/click_intercept var/registered_z diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 04cd056e58a..cac9ec1f3d3 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1,4 +1,3 @@ - // see _DEFINES/is_helpers.dm for mob type checks /mob/proc/lowest_buckled_mob() @@ -54,14 +53,14 @@ var/te = n var/t = "" n = length(n) - var/p = null - p = 1 - while(p <= n) + + for(var/p = 1 to min(n,MAX_BROADCAST_LEN)) if ((copytext(te, p, p + 1) == " " || prob(pr))) t = text("[][]", t, copytext(te, p, p + 1)) else t = text("[]*", t) - p++ + if(n > MAX_BROADCAST_LEN) + t += "..." //signals missing text return sanitize(t) /proc/slur(n) @@ -499,3 +498,25 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(HAS_TRAIT(src, TRAIT_DISSECTED)) . += "This body has been dissected and analyzed. It is no longer worth experimenting on.
" + +// Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. +// A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled +// Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" +// Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role +// This also does some admin notification and logging as well +/mob/proc/has_valid_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.joblessrole != RETURNTOLOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(client.prefs.job_preferences.len == 0) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 959abea8cdf..af538cac605 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) +/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)) if (notransform) return //Handle items on mob @@ -123,6 +123,19 @@ qdel(G) //we lose the organs in the missing limbs qdel(BP) + //transfer stuns + if(tr_flags & TR_KEEPSTUNS) + O.Stun(AmountStun(), ignore_canstun = TRUE) + O.Knockdown(AmountKnockdown(), ignore_canstun = TRUE) + O.Immobilize(AmountImmobilized(), ignore_canstun = TRUE) + O.Paralyze(AmountParalyzed(), ignore_canstun = TRUE) + O.Unconscious(AmountUnconscious(), ignore_canstun = TRUE) + O.Sleeping(AmountSleeping(), ignore_canstun = TRUE) + + //transfer reagents + if(tr_flags & TR_KEEPREAGENTS) + reagents.trans_to(O, reagents.total_volume) + //transfer mind if we didn't yet if(mind) mind.transfer_to(O) @@ -149,7 +162,7 @@ ////////////////////////// Humanize ////////////////////////////// //Could probably be merged with monkeyize but other transformations got their own procs, too -/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG)) +/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)) if (notransform) return //Handle items on mob @@ -283,6 +296,19 @@ qdel(G) //we lose the organs in the missing limbs qdel(BP) + //transfer stuns + if(tr_flags & TR_KEEPSTUNS) + O.Stun(AmountStun(), ignore_canstun = TRUE) + O.Knockdown(AmountKnockdown(), ignore_canstun = TRUE) + O.Immobilize(AmountImmobilized(), ignore_canstun = TRUE) + O.Paralyze(AmountParalyzed(), ignore_canstun = TRUE) + O.Unconscious(AmountUnconscious(), ignore_canstun = TRUE) + O.Sleeping(AmountSleeping(), ignore_canstun = TRUE) + + //transfer reagents + if(tr_flags & TR_KEEPREAGENTS) + reagents.trans_to(O, reagents.total_volume) + if(mind) mind.transfer_to(O) var/datum/antagonist/changeling/changeling = O.mind.has_antag_datum(/datum/antagonist/changeling) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index b4f567158c2..c58ecca5727 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -97,7 +97,7 @@ if(issilicon(usr)) return var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - if(usr.canUseTopic(src)) + if(usr.canUseTopic(src, BE_CLOSE)) card_slot.try_eject(null, usr) // Eject ID card from computer, if it has ID slot with card inside. @@ -108,7 +108,7 @@ if(issilicon(usr)) return var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI] - if(usr.canUseTopic(src)) + if(usr.canUseTopic(src, BE_CLOSE)) ai_slot.try_eject(null, usr,1) @@ -120,7 +120,7 @@ if(issilicon(usr)) return - if(usr.canUseTopic(src)) + if(usr.canUseTopic(src, BE_CLOSE)) var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] if(uninstall_component(portable_drive, usr)) portable_drive.verb_pickup() @@ -130,7 +130,7 @@ if(issilicon(user)) return - if(user.canUseTopic(src)) + if(user.canUseTopic(src, BE_CLOSE)) var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI] var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] @@ -159,7 +159,7 @@ /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr - if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src)) + if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src, BE_CLOSE)) return attack_self(M) return ..() diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 3106a9e5105..07f762353f4 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -77,7 +77,7 @@ return if(!isturf(loc) && !ismob(loc)) // No opening it in backpack. return - if(!user.canUseTopic(src)) + if(!user.canUseTopic(src, BE_CLOSE)) return toggle_open(user) diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm index d5c2499a3ce..3b344dacda6 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm @@ -13,7 +13,7 @@ H.stuttering = 0 H.lying = 0 H.update_mobility() - H.reagents.add_reagent("stimulants", 5) + H.reagents.add_reagent(/datum/reagent/medicine/stimulants, 5) H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost") a_boost-- to_chat(H, "There are [a_boost] adrenaline boosts remaining.") @@ -22,5 +22,5 @@ /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost_after() var/mob/living/carbon/human/H = affecting - H.reagents.add_reagent("radium", a_transfer) + H.reagents.add_reagent(/datum/reagent/uranium/radium, a_transfer) to_chat(H, "You are beginning to feel the after-effect of the injection.") diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm index 7a192c427c6..be51588423c 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm @@ -23,9 +23,6 @@ var/mob/living/carbon/C = energyKatana.loc C.transferItemToLoc(energyKatana, get_turf(energyKatana), TRUE) - //Somebody swollowed my sword, probably the clown doing a circus act. - if(energyKatana in C.stomach_contents) - C.stomach_contents -= energyKatana else energyKatana.forceMove(get_turf(energyKatana)) diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm index 0496a2f1c34..7300f22f9b8 100644 --- a/code/modules/ninja/suit/suit_attackby.dm +++ b/code/modules/ninja/suit/suit_attackby.dm @@ -5,13 +5,13 @@ return ..() if(istype(I, /obj/item/reagent_containers/glass))//If it's a glass beaker. - if(I.reagents.has_reagent("radium", a_transfer) && a_boost < a_maxamount) - I.reagents.remove_reagent("radium", a_transfer) + if(I.reagents.has_reagent(/datum/reagent/uranium/radium, a_transfer) && a_boost < a_maxamount) + I.reagents.remove_reagent(/datum/reagent/uranium/radium, a_transfer) a_boost++; to_chat(U, "There are now [a_boost] adrenaline boosts remaining.") return - if(I.reagents.has_reagent("smoke_powder", a_transfer) && s_bombs < s_maxamount) - I.reagents.remove_reagent("smoke_powder", a_transfer) + if(I.reagents.has_reagent(/datum/reagent/smoke_powder, a_transfer) && s_bombs < s_maxamount) + I.reagents.remove_reagent(/datum/reagent/smoke_powder, a_transfer) s_bombs++; to_chat(U, "There are now [s_bombs] smoke bombs remaining.") return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 98ce25de3cb..568301154ac 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -23,7 +23,7 @@ throw_range = 7 materials = list(MAT_METAL=10) pressure_resistance = 2 - grind_results = list("iron" = 2, "iodine" = 1) + grind_results = list(/datum/reagent/iron = 2, /datum/reagent/iodine = 1) var/colour = "black" //what colour the ink is! var/degrees = 0 var/font = PEN_FONT @@ -165,9 +165,9 @@ /obj/item/pen/sleepy/Initialize() . = ..() create_reagents(45, OPENCONTAINER) - reagents.add_reagent("chloralhydratedelayed", 20) - reagents.add_reagent("mutetoxin", 15) - reagents.add_reagent("tirizene", 10) + reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 20) + reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 15) + reagents.add_reagent(/datum/reagent/toxin/staminatoxin, 10) /* * (Alan) Edaggers @@ -179,6 +179,14 @@ /obj/item/pen/edagger/Initialize() . = ..() AddComponent(/datum/component/butchering, 60, 100, 0, 'sound/weapons/blade1.ogg', TRUE) + +/obj/item/pen/edagger/suicide_act(mob/user) + . = BRUTELOSS + if(on) + user.visible_message("[user] forcefully rams the pen into their mouth!") + else + user.visible_message("[user] is holding a pen up to their mouth! It looks like [user.p_theyre()] trying to commit suicide!") + attack_self(user) /obj/item/pen/edagger/attack_self(mob/living/user) if(on) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index fd93413c365..c0e20323cf8 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -330,6 +330,6 @@ name = "toner cartridge" icon = 'icons/obj/device.dmi' icon_state = "tonercartridge" - grind_results = list("iodine" = 40, "iron" = 10) + grind_results = list(/datum/reagent/iodine = 40, /datum/reagent/iron = 10) var/charges = 5 var/max_charges = 5 diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 87b8d8f00f6..34dfdd13e97 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -47,14 +47,16 @@ . = ..() to_chat(user, "Alt-click to change its focusing, allowing you to set how big of an area it will capture.") -/obj/item/camera/AltClick(mob/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return +/obj/item/camera/proc/adjust_zoom(mob/user) var/desired_x = input(user, "How high do you want the camera to shoot, between [picture_size_x_min] and [picture_size_x_max]?", "Zoom", picture_size_x) as num var/desired_y = input(user, "How wide do you want the camera to shoot, between [picture_size_y_min] and [picture_size_y_max]?", "Zoom", picture_size_y) as num picture_size_x = min(CLAMP(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) picture_size_y = min(CLAMP(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) +/obj/item/camera/AltClick(mob/user) + if(!user.canUseTopic(src, BE_CLOSE)) + return + adjust_zoom(user) /obj/item/camera/attack(mob/living/carbon/human/M, mob/user) return @@ -221,7 +223,7 @@ else if(default_picture_name) picture.picture_name = default_picture_name - + p.set_picture(picture, TRUE, TRUE) if(CONFIG_GET(flag/picture_logging_camera)) picture.log_to_file() diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index bd77d468d73..ef2b803b9db 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -14,7 +14,7 @@ /obj/item/storage/photo_album/Initialize() . = ..() GET_COMPONENT(STR, /datum/component/storage) - STR.can_hold = typecacheof(list(/obj/item/photo)) + STR.set_holdable(list(/obj/item/photo)) STR.max_combined_w_class = 42 STR.max_items = 21 LAZYADD(SSpersistence.photo_albums, src) diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 8ee75576bac..03b3aa2777c 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -9,7 +9,7 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE max_integrity = 50 - grind_results = list("iodine" = 4) + grind_results = list(/datum/reagent/iodine = 4) var/datum/picture/picture var/scribble //Scribble on the back. diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4d0d5832ccb..1d0ae34ddc5 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -500,7 +500,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai attack_verb = list("whipped", "lashed", "disciplined", "flogged") singular_name = "cable piece" full_w_class = WEIGHT_CLASS_SMALL - grind_results = list("copper" = 2) //2 copper per cable in the coil + grind_results = list(/datum/reagent/copper = 2) //2 copper per cable in the coil usesound = 'sound/items/deconstruct.ogg' /obj/item/stack/cable_coil/cyborg @@ -649,7 +649,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai // called when cable_coil is click on an installed obj/cable // or click on a turf that already contains a "node" cable -/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, var/showerror = TRUE) +/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user, var/showerror = TRUE, forceddir) var/turf/U = user.loc if(!isturf(U)) return @@ -664,14 +664,16 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai return - if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing + if(U == T && !forceddir) //if clicked on the turf we're standing on and a direction wasn't supplied, try to put a cable in the direction we're facing place_turf(T,user) return var/dirn = get_dir(C, user) + if(forceddir) + dirn = forceddir - // one end of the clicked cable is pointing towards us - if(C.d1 == dirn || C.d2 == dirn) + // one end of the clicked cable is pointing towards us and no direction was supplied + if((C.d1 == dirn || C.d2 == dirn) && !forceddir) if(!U.can_have_cabling()) //checking if it's a plating or catwalk if (showerror) to_chat(user, "You can only lay cables on catwalks and plating!") @@ -716,7 +718,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai return - // exisiting cable doesn't point at our position, so see if it's a stub + // exisiting cable doesn't point at our position or we have a supplied direction, so see if it's a stub else if(C.d1 == 0) // if so, make it a full cable pointing from it's old direction to our dirn var/nd1 = C.d2 // these will be the new directions diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 44d14a521a7..93946cb3ae1 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -14,7 +14,7 @@ var/charge = 0 // note %age conveted to actual charge in New var/maxcharge = 1000 materials = list(MAT_METAL=700, MAT_GLASS=50) - grind_results = list("lithium" = 15, "iron" = 5, "silicon" = 5) + grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) var/rigged = FALSE // true if rigged to explode var/chargerate = 100 //how much power is given every tick in a recharger var/self_recharge = 0 //does it self recharge, over time, or not? @@ -103,7 +103,7 @@ return (FIRELOSS) /obj/item/stock_parts/cell/on_reagent_change(changetype) - rigged = !isnull(reagents.has_reagent("plasma", 5)) //has_reagent returns the reagent datum + rigged = !isnull(reagents.has_reagent(/datum/reagent/toxin/plasma, 5)) //has_reagent returns the reagent datum ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 81f82c890a2..3a11d363b93 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -345,13 +345,16 @@ var/BR = brightness var/PO = bulb_power var/CO = bulb_colour + if(color) + CO = color var/area/A = get_area(src) if (A && A.fire) CO = bulb_emergency_colour else if (nightshift_enabled) BR = nightshift_brightness PO = nightshift_light_power - CO = nightshift_light_color + if(!color) + CO = nightshift_light_color var/matching = light && BR == light.light_range && PO == light.light_power && CO == light.light_color if(!matching) switchcount++ @@ -384,6 +387,10 @@ broken_sparks(start_only=TRUE) +/obj/machinery/light/update_atom_colour() + ..() + update() + /obj/machinery/light/proc/broken_sparks(start_only=FALSE) if(status == LIGHT_BROKEN && has_power()) if(!start_only) @@ -754,7 +761,7 @@ var/base_state var/switchcount = 0 // number of times switched materials = list(MAT_GLASS=100) - grind_results = list("silicon" = 5, "nitrogen" = 10) //Nitrogen is used as a cheaper alternative to argon in incandescent lighbulbs + grind_results = list(/datum/reagent/silicon = 5, /datum/reagent/nitrogen = 10) //Nitrogen is used as a cheaper alternative to argon in incandescent lighbulbs var/rigged = FALSE // true if rigged to explode var/brightness = 2 //how much light it gives off @@ -836,7 +843,7 @@ to_chat(user, "You inject the solution into \the [src].") - if(S.reagents.has_reagent("plasma", 5)) + if(S.reagents.has_reagent(/datum/reagent/toxin/plasma, 5)) rigged = TRUE diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 2f539533330..b0c33c4821c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -208,6 +208,7 @@ if(prob(35)) sparks.start() P.firer = user ? user : src + P.fired_from = src if(last_projectile_params) P.p_x = last_projectile_params[2] P.p_y = last_projectile_params[3] diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 92e7c7e6b5d..f769f447bf4 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -304,6 +304,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!istype(T)) //We are in a crate or somewhere that isn't turf, if we return to turf resume processing but for now. return //Yeah just stop. + if(isclosedturf(T)) + var/turf/did_it_melt = T.Melt() + if(!isclosedturf(did_it_melt)) //In case some joker finds way to place these on indestructible walls + visible_message("[src] melts through [T]!") + return + if(power) soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max @@ -572,8 +578,36 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/attackby(obj/item/W, mob/living/user, params) if(!istype(W) || (W.item_flags & ABSTRACT) || !istype(user)) return - if (istype(W, /obj/item/melee/roastingstick)) + if(istype(W, /obj/item/melee/roastingstick)) return ..() + if(istype(W, /obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/cig = W + var/clumsy = HAS_TRAIT(user, TRAIT_CLUMSY) + if(clumsy) + var/which_hand = BODY_ZONE_L_ARM + if(!(user.active_hand_index % 2)) + which_hand = BODY_ZONE_R_ARM + var/obj/item/bodypart/dust_arm = user.get_bodypart(which_hand) + dust_arm.dismember() + user.visible_message("The [W] flashes out of existence on contact with \the [src], resonating with a horrible sound...",\ + "Oops! The [W] flashes out of existence on contact with \the [src], taking your arm with it! That was clumsy of you!") + playsound(src, 'sound/effects/supermatter.ogg', 150, 1) + Consume(dust_arm) + qdel(W) + return + if(cig.lit || user.a_intent != INTENT_HELP) + user.visible_message("A hideous sound echoes as [W] is ashed out on contact with \the [src]. That didn't seem like a good idea...") + playsound(src, 'sound/effects/supermatter.ogg', 150, 1) + Consume(W) + radiation_pulse(src, 150, 4) + return ..() + else + cig.light() + user.visible_message("As [user] lights \their [W] on \the [src], silence fills the room...",\ + "Time seems to slow to a crawl as you touch \the [src] with \the [W].\n\The [W] flashes alight with an eerie energy as you nonchalantly lift your hand away from \the [src]. Damn.") + playsound(src, 'sound/effects/supermatter.ogg', 50, 1) + radiation_pulse(src, 50, 3) + return if(istype(W, /obj/item/scalpel/supermatter)) var/obj/item/scalpel/supermatter/scalpel = W to_chat(user, "You carefully begin to scrape \the [src] with \the [W]...") @@ -583,9 +617,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) new /obj/item/nuke_core/supermatter_sliver(drop_location()) matter_power += 800 scalpel.usesLeft-- - if (!scalpel.usesLeft) + if (!scalpel.usesLeft) to_chat(user, "A tiny piece of \the [W] falls off, rendering it useless!") - else + else to_chat(user, "You fail to extract a sliver from \The [src]. \the [W] isn't sharp enough anymore!") else if(user.dropItemToGround(W)) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ @@ -649,6 +683,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2) +//Do not blow up our internal radio +/obj/machinery/power/supermatter_crystal/contents_explosion(severity, target) + return + +/obj/machinery/power/supermatter_crystal/prevent_content_explosion() + return TRUE + /obj/machinery/power/supermatter_crystal/engine is_main_engine = TRUE diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 994216e584a..21d7d2ccc01 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -41,6 +41,11 @@ var/comp_id = 0 var/efficiency +/obj/machinery/power/compressor/Destroy() + if (turbine && turbine.compressor == src) + turbine.compressor = null + turbine = null + return ..() /obj/machinery/power/turbine name = "gas turbine generator" @@ -57,6 +62,12 @@ var/lastgen var/productivity = 1 +/obj/machinery/power/turbine/Destroy() + if (compressor && compressor.turbine == src) + compressor.turbine = null + compressor = null + return ..() + /obj/machinery/computer/turbine_computer name = "gas turbine control computer" desc = "A computer to remotely control a gas turbine." diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 8c0684ba74e..ba3bb803070 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -1,8 +1,8 @@ -/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) +/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) distro += variance for (var/i = max(1, pellets), i > 0, i--) var/targloc = get_turf(target) - ready_proj(target, user, quiet, zone_override) + ready_proj(target, user, quiet, zone_override, fired_from) if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now... if(randomspread) spread = round((rand() - 0.5) * distro) @@ -20,11 +20,12 @@ update_icon() return TRUE -/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") +/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", atom/fired_from) if (!BB) return BB.original = target BB.firer = user + BB.fired_from = fired_from if (zone_override) BB.def_zone = zone_override else diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index ad5b31a5564..11ad40ef37a 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -134,8 +134,8 @@ /obj/item/ammo_casing/shotgun/dart/bioterror/Initialize() . = ..() - reagents.add_reagent("neurotoxin", 6) - reagents.add_reagent("spore", 6) - reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT - reagents.add_reagent("coniine", 6) - reagents.add_reagent("sodium_thiopental", 6) + reagents.add_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 6) + reagents.add_reagent(/datum/reagent/toxin/spore, 6) + reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 6) //;HELP OPS IN MAINT + reagents.add_reagent(/datum/reagent/toxin/coniine, 6) + reagents.add_reagent(/datum/reagent/toxin/sodium_thiopental, 6) diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm index a6b65f79e39..11f7b8670df 100644 --- a/code/modules/projectiles/ammunition/caseless/_caseless.dm +++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm @@ -3,7 +3,7 @@ firing_effect_type = null heavy_metal = FALSE -/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) +/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) if (..()) //successfully firing moveToNullspace() QDEL_NULL(src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 59847ef3e19..b27dd19726b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -267,7 +267,7 @@ else //Smart spread sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread)) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd)) + if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) firing_burst = FALSE return FALSE @@ -313,7 +313,7 @@ return sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd)) + if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) return else diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 267d7c3e37e..ea53edc4e6b 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -1,6 +1,6 @@ #define DUEL_IDLE 1 #define DUEL_PREPARATION 2 -#define DUEL_READY 3 +#define DUEL_READY 3 #define DUEL_COUNTDOWN 4 #define DUEL_FIRING 5 @@ -219,7 +219,7 @@ else duel.fired[src] = TRUE . = ..() - + /obj/item/gun/energy/dueling/before_firing(target,user) var/obj/item/ammo_casing/energy/duel/D = chambered D.setting = setting @@ -253,7 +253,7 @@ D.setting = setting D.update_icon() -/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread) +/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) . = ..() var/obj/effect/temp_visual/dueling_chaff/C = new(get_turf(user)) C.setting = setting @@ -297,7 +297,7 @@ var/mob/living/L = target if(!istype(target)) return BULLET_ACT_BLOCK - + var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD) B.dismember() qdel(B) @@ -321,7 +321,7 @@ GET_COMPONENT(STR, /datum/component/storage) STR.max_w_class = WEIGHT_CLASS_SMALL STR.max_items = 2 - STR.can_hold = typecacheof(list(/obj/item/gun/energy/dueling)) + STR.set_holdable(list(/obj/item/gun/energy/dueling)) /obj/item/storage/lockbox/dueling/update_icon() cut_overlays() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 90d00fb730c..9674e19e0df 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -33,7 +33,7 @@ return else no_den_usage = 0 - if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, major = FALSE, self = TRUE)) + if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE)) add_fingerprint(user) to_chat(user, "Something is interfering with [src].") return diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 81e1b7ffd2f..66ba6d4115d 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -267,11 +267,9 @@ stop_aiming(current_user) QDEL_NULL(mobhook) if(istype(current_user)) - LAZYREMOVE(current_user.mousemove_intercept_objects, src) current_user = null if(istype(user)) current_user = user - LAZYOR(current_user.mousemove_intercept_objects, src) mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_mob_move))) /obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 28496d3f874..befffbe2bcd 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -18,6 +18,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/def_zone = "" //Aiming at var/atom/movable/firer = null//Who shot it + var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret) var/suppressed = FALSE //Attack message var/yo = null var/xo = null @@ -134,6 +135,8 @@ return TRUE /obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE) + if(fired_from) + SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle) var/turf/target_loca = get_turf(target) var/hitx @@ -194,8 +197,7 @@ if(reagents && reagents.reagent_list) reagent_note = " REAGENTS:" for(var/datum/reagent/R in reagents.reagent_list) - reagent_note += R.id + " (" - reagent_note += num2text(R.volume) + ") " + reagent_note += "[R.name] ([num2text(R.volume)])" if(ismob(firer)) log_combat(firer, L, "shot", src, reagent_note) @@ -354,6 +356,8 @@ pixel_move(1, FALSE) /obj/item/projectile/proc/fire(angle, atom/direct_target) + if(fired_from) + SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) //If no angle needs to resolve it from xo/yo! if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ded512afcd9..92b83aeea00 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -69,7 +69,7 @@ /obj/item/projectile/beam/disabler name = "disabler beam" icon_state = "omnilaser" - damage = 40 + damage = 30 damage_type = STAMINA flag = "energy" hitsound = 'sound/weapons/tap.ogg' diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 6f6527abc16..8091efcdfc5 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -29,9 +29,9 @@ /obj/item/projectile/bullet/dart/metalfoam/Initialize() . = ..() - reagents.add_reagent("aluminium", 15) - reagents.add_reagent("foaming_agent", 5) - reagents.add_reagent("facid", 5) + reagents.add_reagent(/datum/reagent/aluminium, 15) + reagents.add_reagent(/datum/reagent/foaming_agent, 5) + reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 5) /obj/item/projectile/bullet/dart/syringe name = "syringe" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index a019c05ef19..1cd5a9f0bbb 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -12,5 +12,5 @@ /obj/item/projectile/bullet/a762_enchanted name = "enchanted 7.62 bullet" - damage = 5 + damage = 20 stamina = 80 diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm index cf0e6f81dcc..c83668df16a 100644 --- a/code/modules/projectiles/projectile/energy/ebow.dm +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -4,7 +4,7 @@ damage = 15 damage_type = TOX nodamage = FALSE - stamina = 50 + stamina = 60 eyeblur = 10 knockdown = 10 slur = 5 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d6900fd1fd0..b1edb2f9f69 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,5 +1,6 @@ #define CHEMICAL_QUANTISATION_LEVEL 0.0001 //stops floating point errors causing issues with checking reagent amounts + /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -11,25 +12,28 @@ for(var/path in paths) var/datum/reagent/D = new path() - GLOB.chemical_reagents_list[D.id] = D + GLOB.chemical_reagents_list[path] = D /proc/build_chemical_reactions_list() //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. // For example: - // chemical_reaction_list["plasma"] is a list of all reactions relating to plasma + // chemical_reaction_list[/datum/reagent/toxin/plasma] is a list of all reactions relating to plasma if(GLOB.chemical_reactions_list) return - var/paths = subtypesof(/datum/chemical_reaction) + //Randomized need to go last since they need to check against conflicts with normal recipes + var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) GLOB.chemical_reactions_list = list() for(var/path in paths) - var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() + if(!D.id) + continue + if(D.required_reagents && D.required_reagents.len) for(var/reaction in D.required_reagents) reaction_ids += reaction @@ -83,10 +87,9 @@ return "no reagents" var/list/data = list() - var/seperator for(var/r in reagent_list) //no reagents will be left behind var/datum/reagent/R = r - data += "[seperator ? " | " : null][R.id] ([round(R.volume, 0.1)]u)" + data += "[R.type] ([round(R.volume, 0.1)]u)" //Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals. return english_list(data) @@ -107,7 +110,7 @@ current_list_element = 1 var/datum/reagent/R = cached_reagents[current_list_element] - remove_reagent(R.id, 1) + remove_reagent(R.type, 1) current_list_element++ total_transfered++ @@ -122,7 +125,7 @@ var/part = amount / total_volume for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - remove_reagent(R.id, R.volume * part) + remove_reagent(R.type, R.volume * part) update_total() handle_reactions() @@ -142,15 +145,15 @@ /datum/reagents/proc/get_master_reagent_id() var/list/cached_reagents = reagent_list - var/id + var/max_type var/max_volume = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.volume > max_volume) max_volume = R.volume - id = R.id + max_type = R.type - return id + return max_type /datum/reagents/proc/get_master_reagent() var/list/cached_reagents = reagent_list @@ -197,8 +200,8 @@ var/transfer_amount = T.volume * part if(preserve_data) trans_data = copy_data(T) - R.add_reagent(T.id, transfer_amount * multiplier, trans_data, chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. - remove_reagent(T.id, transfer_amount) + R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. + remove_reagent(T.type, transfer_amount) update_total() R.update_total() @@ -230,7 +233,7 @@ var/copy_amount = T.volume * part if(preserve_data) trans_data = T.data - R.add_reagent(T.id, copy_amount * multiplier, trans_data) + R.add_reagent(T.type, copy_amount * multiplier, trans_data) src.update_total() R.update_total() @@ -254,11 +257,11 @@ var/trans_data = null for (var/CR in cached_reagents) var/datum/reagent/current_reagent = CR - if(current_reagent.id == reagent) + if(current_reagent.type == reagent) if(preserve_data) trans_data = current_reagent.data - R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp) - remove_reagent(current_reagent.id, amount, 1) + R.add_reagent(current_reagent.type, amount, trans_data, src.chem_temp) + remove_reagent(current_reagent.type, amount, 1) break src.update_total() @@ -318,10 +321,10 @@ need_mob_update += R.addiction_act_stage4(C) if(40 to INFINITY) to_chat(C, "You feel like you've gotten over your need for [R.name].") - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_overdose") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") cached_addictions.Remove(R) else - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.id]_overdose") + SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") addiction_tick++ if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. C.updatehealth() @@ -357,7 +360,7 @@ reaction_occurred = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id + for(var/reaction in cached_reactions[R.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id if(!reaction) continue @@ -466,15 +469,15 @@ var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent - if(R.id != reagent) - del_reagent(R.id) + if(R.type != reagent) + del_reagent(R.type) update_total() /datum/reagents/proc/del_reagent(reagent) var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent - if(R.id == reagent) + if(R.type == reagent) if(my_atom && isliving(my_atom)) var/mob/living/M = my_atom R.on_mob_delete(M) @@ -491,7 +494,7 @@ for(var/reagent in cached_reagents) var/datum/reagent/R = reagent if(R.volume < 0.1) - del_reagent(R.id) + del_reagent(R.type) else total_volume += R.volume @@ -501,7 +504,7 @@ var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - del_reagent(R.id) + del_reagent(R.type) return 0 /datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1) @@ -587,7 +590,7 @@ //add the reagent to the existing if it exists for(var/A in cached_reagents) var/datum/reagent/R = A - if (R.id == reagent) + if (R.type == reagent) R.volume += amount update_total() if(my_atom) @@ -615,7 +618,7 @@ handle_reactions() return TRUE -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15) +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) for(var/r_id in list_reagents) var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) @@ -637,7 +640,7 @@ for(var/A in cached_reagents) var/datum/reagent/R = A - if (R.id == reagent) + if (R.type == reagent) //clamp the removal amount to be between current reagent amount //and zero, to prevent removing more than the holder has stored amount = CLAMP(amount, 0, R.volume) @@ -655,7 +658,7 @@ var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent - if (R.id == reagent) + if (R.type == reagent) if(!amount) return R else @@ -670,7 +673,7 @@ var/list/cached_reagents = reagent_list for(var/_reagent in cached_reagents) var/datum/reagent/R = _reagent - if (R.id == reagent) + if (R.type == reagent) return round(R.volume, CHEMICAL_QUANTISATION_LEVEL) return 0 @@ -703,7 +706,7 @@ // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. if(matches) // Have our other proc handle removement - has_removed_reagent = remove_reagent(R.id, amount, safety) + has_removed_reagent = remove_reagent(R.type, amount, safety) return has_removed_reagent @@ -712,14 +715,14 @@ var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - if(R.id == reagent_id) + if(R.type == reagent_id) return R.data /datum/reagents/proc/set_data(reagent_id, new_data) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - if(R.id == reagent_id) + if(R.type == reagent_id) R.data = new_data /datum/reagents/proc/copy_data(datum/reagent/current_reagent) @@ -818,6 +821,6 @@ for(var/thing in subtypesof(/datum/reagent)) var/datum/reagent/R = thing if(initial(R.can_synth)) - random_reagents += initial(R.id) + random_reagents += R var/picked_reagent = pick(random_reagents) return picked_reagent diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 271c04ab921..d1f90d8d83c 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -1,3 +1,16 @@ +/proc/translate_legacy_chem_id(id) + switch (id) + if ("sacid") + return "sulphuricacid" + if ("facid") + return "fluorosulfuricacid" + if ("co2") + return "carbondioxide" + if ("mine_salve") + return "minerssalve" + else + return ckey(id) + /obj/machinery/chem_dispenser name = "chem dispenser" desc = "Creates and dispenses chemicals." @@ -21,48 +34,48 @@ var/macroresolution = 1 var/obj/item/reagent_containers/beaker = null var/list/dispensable_reagents = list( - "hydrogen", - "lithium", - "carbon", - "nitrogen", - "oxygen", - "fluorine", - "sodium", - "aluminium", - "silicon", - "phosphorus", - "sulfur", - "chlorine", - "potassium", - "iron", - "copper", - "mercury", - "radium", - "water", - "ethanol", - "sugar", - "sacid", - "welding_fuel", - "silver", - "iodine", - "bromine", - "stable_plasma" + /datum/reagent/hydrogen, + /datum/reagent/lithium, + /datum/reagent/carbon, + /datum/reagent/nitrogen, + /datum/reagent/oxygen, + /datum/reagent/fluorine, + /datum/reagent/sodium, + /datum/reagent/aluminium, + /datum/reagent/silicon, + /datum/reagent/phosphorus, + /datum/reagent/sulfur, + /datum/reagent/chlorine, + /datum/reagent/potassium, + /datum/reagent/iron, + /datum/reagent/copper, + /datum/reagent/mercury, + /datum/reagent/uranium/radium, + /datum/reagent/water, + /datum/reagent/consumable/ethanol, + /datum/reagent/consumable/sugar, + /datum/reagent/toxin/acid, + /datum/reagent/fuel, + /datum/reagent/silver, + /datum/reagent/iodine, + /datum/reagent/bromine, + /datum/reagent/stable_plasma ) //these become available once the manipulator has been upgraded to tier 4 (femto) var/list/upgrade_reagents = list( "oil", - "ash", - "acetone", - "saltpetre", - "ammonia", - "diethylamine" + /datum/reagent/ash, + /datum/reagent/acetone, + /datum/reagent/saltpetre, + /datum/reagent/ammonia, + /datum/reagent/diethylamine ) var/list/emagged_reagents = list( - "space_drugs", - "morphine", - "carpotoxin", - "mine_salve", - "toxin" + /datum/reagent/drug/space_drugs, + /datum/reagent/medicine/morphine, + /datum/reagent/toxin/carpotoxin, + /datum/reagent/medicine/mine_salve, + /datum/reagent/toxin ) var/list/saved_recipes = list() @@ -187,7 +200,7 @@ var/chemname = temp.name if(is_hallucinating && prob(5)) chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" - chemicals.Add(list(list("title" = chemname, "id" = temp.id))) + chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name)))) for(var/recipe in saved_recipes) recipes.Add(list(recipe)) data["chemicals"] = chemicals @@ -209,7 +222,7 @@ if("dispense") if(!is_operational() || QDELETED(cell)) return - var/reagent = params["reagent"] + var/reagent = GLOB.name2reagent[params["reagent"]] if(beaker && dispensable_reagents.Find(reagent)) var/datum/reagents/R = beaker.reagents var/free = R.maximum_volume - R.total_volume @@ -241,7 +254,7 @@ var/res = macroresolution for(var/key in chemicals_to_dispense) // i suppose you could edit the list locally before passing it var/list/keysplit = splittext(key," ") - var/r_id = keysplit[1] + var/r_id = GLOB.name2reagent[translate_legacy_chem_id(keysplit[1])] if(beaker && dispensable_reagents.Find(r_id)) // but since we verify we have the reagent, it'll be fine var/datum/reagents/R = beaker.reagents var/free = R.maximum_volume - R.total_volume @@ -273,7 +286,8 @@ var/resmismatch = FALSE for(var/reagents in first_process) var/list/reagent = splittext(reagents, "=") - if(dispensable_reagents.Find(reagent[1])) + var/reagent_id = GLOB.name2reagent[translate_legacy_chem_id(reagent[1])] + if(dispensable_reagents.Find(reagent_id)) if (!resmismatch && !check_macro_part(reagents, res)) resmismatch = TRUE continue @@ -437,35 +451,35 @@ nopower_state = null pass_flags = PASSTABLE dispensable_reagents = list( - "water", - "ice", - "coffee", - "cream", - "tea", - "icetea", - "cola", - "spacemountainwind", - "dr_gibb", - "space_up", - "tonic", - "sodawater", - "lemon_lime", - "pwr_game", - "shamblers", - "sugar", - "orangejuice", - "grenadine", - "limejuice", - "tomatojuice", - "lemonjuice", - "menthol" + /datum/reagent/water, + /datum/reagent/consumable/ice, + /datum/reagent/consumable/coffee, + /datum/reagent/consumable/cream, + /datum/reagent/consumable/tea, + /datum/reagent/consumable/icetea, + /datum/reagent/consumable/space_cola, + /datum/reagent/consumable/spacemountainwind, + /datum/reagent/consumable/dr_gibb, + /datum/reagent/consumable/space_up, + /datum/reagent/consumable/tonic, + /datum/reagent/consumable/sodawater, + /datum/reagent/consumable/lemon_lime, + /datum/reagent/consumable/pwr_game, + /datum/reagent/consumable/shamblers, + /datum/reagent/consumable/sugar, + /datum/reagent/consumable/orangejuice, + /datum/reagent/consumable/grenadine, + /datum/reagent/consumable/limejuice, + /datum/reagent/consumable/tomatojuice, + /datum/reagent/consumable/lemonjuice, + /datum/reagent/consumable/menthol ) upgrade_reagents = null emagged_reagents = list( - "thirteenloko", - "whiskeycola", - "mindbreaker", - "tirizene" + /datum/reagent/consumable/ethanol/thirteenloko, + /datum/reagent/consumable/ethanol/whiskey_cola, + /datum/reagent/toxin/mindbreaker, + /datum/reagent/toxin/staminatoxin ) /obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged @@ -493,32 +507,32 @@ icon_state = "booze_dispenser" circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer dispensable_reagents = list( - "beer", - "kahlua", - "whiskey", - "wine", - "vodka", - "gin", - "rum", - "tequila", - "vermouth", - "cognac", - "ale", - "absinthe", - "hcider", - "creme_de_menthe", - "creme_de_cacao", - "triple_sec", - "sake", - "applejack" + /datum/reagent/consumable/ethanol/beer, + /datum/reagent/consumable/ethanol/kahlua, + /datum/reagent/consumable/ethanol/whiskey, + /datum/reagent/consumable/ethanol/wine, + /datum/reagent/consumable/ethanol/vodka, + /datum/reagent/consumable/ethanol/gin, + /datum/reagent/consumable/ethanol/rum, + /datum/reagent/consumable/ethanol/tequila, + /datum/reagent/consumable/ethanol/vermouth, + /datum/reagent/consumable/ethanol/cognac, + /datum/reagent/consumable/ethanol/ale, + /datum/reagent/consumable/ethanol/absinthe, + /datum/reagent/consumable/ethanol/hcider, + /datum/reagent/consumable/ethanol/creme_de_menthe, + /datum/reagent/consumable/ethanol/creme_de_cacao, + /datum/reagent/consumable/ethanol/triple_sec, + /datum/reagent/consumable/ethanol/sake, + /datum/reagent/consumable/ethanol/applejack ) upgrade_reagents = null emagged_reagents = list( - "ethanol", - "iron", - "minttoxin", - "atomicbomb", - "fernet" + /datum/reagent/consumable/ethanol, + /datum/reagent/iron, + /datum/reagent/toxin/minttoxin, + /datum/reagent/consumable/ethanol/atomicbomb, + /datum/reagent/consumable/ethanol/fernet ) /obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged @@ -542,9 +556,9 @@ /obj/machinery/chem_dispenser/mutagen name = "mutagen dispenser" desc = "Creates and dispenses mutagen." - dispensable_reagents = list("mutagen") + dispensable_reagents = list(/datum/reagent/toxin/mutagen) upgrade_reagents = null - emagged_reagents = list("plasma") + emagged_reagents = list(/datum/reagent/toxin/plasma) /obj/machinery/chem_dispenser/mutagensaltpeter @@ -553,19 +567,19 @@ flags_1 = NODECONSTRUCT_1 dispensable_reagents = list( - "mutagen", - "saltpetre", - "eznutriment", - "left4zednutriment", - "robustharvestnutriment", - "water", - "plantbgone", - "weedkiller", - "pestkiller", - "cryoxadone", - "ammonia", - "ash", - "diethylamine") + /datum/reagent/toxin/mutagen, + /datum/reagent/saltpetre, + /datum/reagent/plantnutriment/eznutriment, + /datum/reagent/plantnutriment/left4zednutriment, + /datum/reagent/plantnutriment/robustharvestnutriment, + /datum/reagent/water, + /datum/reagent/toxin/plantbgone, + /datum/reagent/toxin/plantbgone/weedkiller, + /datum/reagent/toxin/pestkiller, + /datum/reagent/medicine/cryoxadone, + /datum/reagent/ammonia, + /datum/reagent/ash, + /datum/reagent/diethylamine) upgrade_reagents = null /obj/machinery/chem_dispenser/mutagensaltpeter/Initialize() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 7ef9bb5cde0..4302dcc129f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -153,7 +153,7 @@ /obj/machinery/chem_master/ui_base_html(html) var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) . = replacetext(html, "", assets.css_tag()) - + /obj/machinery/chem_master/ui_data(mob/user) var/list/data = list() data["isBeakerLoaded"] = beaker ? 1 : 0 @@ -173,13 +173,13 @@ var/beakerContents[0] if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "id" = R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... + beakerContents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = R.volume))) // list in a list because Byond merges the first list... data["beakerContents"] = beakerContents var/bufferContents[0] if(reagents.total_volume) for(var/datum/reagent/N in reagents.reagent_list) - bufferContents.Add(list(list("name" = N.name, "id" = N.id, "volume" = N.volume))) // ^ + bufferContents.Add(list(list("name" = N.name, "id" = ckey(N.name), "volume" = N.volume))) // ^ data["bufferContents"] = bufferContents //Calculated at init time as it never changes @@ -203,26 +203,26 @@ if("transferToBuffer") if(beaker) - var/id = params["id"] + var/reagent = GLOB.name2reagent[params["id"]] var/amount = text2num(params["amount"]) if (amount > 0) - beaker.reagents.trans_id_to(src, id, amount) + beaker.reagents.trans_id_to(src, reagent, amount) . = TRUE else if (amount == -1) // -1 means custom amount useramount = input("Enter the Amount you want to transfer:", name, useramount) as num|null if (useramount > 0) - beaker.reagents.trans_id_to(src, id, useramount) + beaker.reagents.trans_id_to(src, reagent, useramount) . = TRUE if("transferFromBuffer") - var/id = params["id"] + var/reagent = GLOB.name2reagent[params["id"]] var/amount = text2num(params["amount"]) if (amount > 0) if(mode) - reagents.trans_id_to(beaker, id, amount) + reagents.trans_id_to(beaker, reagent, amount) . = TRUE else - reagents.remove_reagent(id, amount) + reagents.remove_reagent(reagent, amount) . = TRUE if("toggleMode") @@ -343,7 +343,7 @@ . = TRUE if("analyze") - var/datum/reagent/R = GLOB.chemical_reagents_list[params["id"]] + var/datum/reagent/R = GLOB.name2reagent[params["id"]] if(R) var/state = "Unknown" if(initial(R.reagent_state) == 1) diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm index daac5a5d1ce..df288cf9d41 100644 --- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -8,8 +8,8 @@ flags_1 = NODECONSTRUCT_1 use_power = NO_POWER_USE var/static/list/shortcuts = list( - "meth" = "methamphetamine", - "tricord" = "tricordrazine" + "meth" = /datum/reagent/drug/methamphetamine, + "tricord" = /datum/reagent/medicine/tricordrazine ) /obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ @@ -36,7 +36,7 @@ input_reagent = shortcuts[input_reagent] else input_reagent = find_reagent(input_reagent) - if(!input_reagent || !GLOB.chemical_reagents_list[input_reagent]) + if(!input_reagent || !GLOB.name2reagent[input_reagent]) say("OUT OF RANGE") return else diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 147f83f0169..17be6ee05f1 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -166,9 +166,9 @@ var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list if(B) data["has_blood"] = TRUE - data["blood"] = list() - data["blood"]["dna"] = B.data["blood_DNA"] || "none" - data["blood"]["type"] = B.data["blood_type"] || "none" + data[/datum/reagent/blood] = list() + data[/datum/reagent/blood]["dna"] = B.data["blood_DNA"] || "none" + data[/datum/reagent/blood]["type"] = B.data["blood_type"] || "none" data["viruses"] = get_viruses_data(B) data["resistances"] = get_resistance_data(B) if(SYMPTOM_DETAILS) @@ -214,7 +214,7 @@ var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." - B.reagents.add_reagent("blood", 20, data) + B.reagents.add_reagent(/datum/reagent/blood, 20, data) wait = TRUE update_icon() var/turf/source_turf = get_turf(src) @@ -226,7 +226,7 @@ var/datum/disease/D = SSdisease.archive_diseases[id] var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[D.name] vaccine bottle" - B.reagents.add_reagent("vaccine", 15, list(id)) + B.reagents.add_reagent(/datum/reagent/vaccine, 15, list(id)) wait = TRUE update_icon() addtimer(CALLBACK(src, .proc/reset_replicator_cooldown), 200) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index db5c0ded73a..36d7911ffbb 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -166,7 +166,7 @@ /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave . = ..() - if(operating || !user.canUseTopic(src)) + if(operating || !user.canUseTopic(src, !issilicon(user))) return var/list/options = list() @@ -197,7 +197,7 @@ choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) // post choice verification - if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src)) + if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user))) return switch(choice) @@ -298,12 +298,12 @@ /obj/machinery/reagentgrinder/proc/mix_complete() if(beaker?.reagents.total_volume) //Recipe to make Butter - var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF, 1) - beaker.reagents.remove_reagent("milk", MILK_TO_BUTTER_COEFF * butter_amt) + var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount(/datum/reagent/consumable/milk) / MILK_TO_BUTTER_COEFF, 1) + beaker.reagents.remove_reagent(/datum/reagent/consumable/milk, MILK_TO_BUTTER_COEFF * butter_amt) for(var/i in 1 to butter_amt) new /obj/item/reagent_containers/food/snacks/butter(drop_location()) //Recipe to make Mayonnaise - if (beaker.reagents.has_reagent("eggyolk")) - var/amount = beaker.reagents.get_reagent_amount("eggyolk") - beaker.reagents.remove_reagent("eggyolk", amount) - beaker.reagents.add_reagent("mayonnaise", amount) + if (beaker.reagents.has_reagent(/datum/reagent/consumable/eggyolk)) + var/amount = beaker.reagents.get_reagent_amount(/datum/reagent/consumable/eggyolk) + beaker.reagents.remove_reagent(/datum/reagent/consumable/eggyolk, amount) + beaker.reagents.add_reagent(/datum/reagent/consumable/mayonnaise, amount) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index aab435c1cfe..d908256bb7d 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -1,12 +1,21 @@ #define REM REAGENTS_EFFECT_MULTIPLIER +GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) + +/proc/build_name2reagent() + . = list() + for (var/t in subtypesof(/datum/reagent)) + var/datum/reagent/R = t + if (length(initial(R.name))) + .[ckey(initial(R.name))] = t + + //Various reagents //Toxin & acid reagents //Hydroponics stuff /datum/reagent var/name = "Reagent" - var/id = "reagent" var/description = "" var/specific_heat = SPECIFIC_HEAT_DEFAULT //J/(K*mol) var/taste_description = "metaphorical salt" @@ -43,7 +52,7 @@ var/modifier = CLAMP((1 - touch_protection), 0, 1) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) - M.reagents.add_reagent(id, amount) + M.reagents.add_reagent(type, amount) return 1 /datum/reagent/proc/reaction_obj(obj/O, volume) @@ -54,7 +63,7 @@ /datum/reagent/proc/on_mob_life(mob/living/carbon/M) current_cycle++ - holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. + holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. return // Called when this reagent is first added to a mob @@ -89,29 +98,29 @@ /datum/reagent/proc/overdose_start(mob/living/M) to_chat(M, "You feel like you took too much of [name]!") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) return /datum/reagent/proc/addiction_act_stage1(mob/living/M) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/withdrawal_light, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name) if(prob(30)) to_chat(M, "You feel like having some [name] right about now.") return /datum/reagent/proc/addiction_act_stage2(mob/living/M) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/withdrawal_medium, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name) if(prob(30)) to_chat(M, "You feel like you need [name]. You just can't get enough.") return /datum/reagent/proc/addiction_act_stage3(mob/living/M) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/withdrawal_severe, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name) if(prob(30)) to_chat(M, "You have an intense craving for [name].") return /datum/reagent/proc/addiction_act_stage4(mob/living/M) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/withdrawal_critical, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name) if(prob(30)) to_chat(M, "You're not feeling good at all! You really need some [name].") return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index d954194fdc6..258a7e70ce1 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -8,7 +8,6 @@ /datum/reagent/consumable/ethanol name = "Ethanol" - id = "ethanol" description = "A well-known alcohol with a variety of applications." color = "#404030" // rgb: 64, 64, 48 nutriment_factor = 0 @@ -81,7 +80,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beer name = "Beer" - id = "beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. Still popular today." color = "#664300" // rgb: 102, 67, 0 nutriment_factor = 1 * REAGENTS_METABOLISM @@ -92,7 +90,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" - id = "light_beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety has reduced calorie and alcohol content." boozepwr = 5 //Space Europeans hate it taste_description = "dish water" @@ -101,7 +98,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" - id = "greenbeer" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green." color = "#A8E61D" taste_description = "green piss water" @@ -119,7 +115,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/kahlua name = "Kahlua" - id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -139,7 +134,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/whiskey name = "Whiskey" - id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." color = "#664300" // rgb: 102, 67, 0 boozepwr = 75 @@ -151,7 +145,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" - id = "thirteenloko" description = "A potent mixture of caffeine and alcohol." color = "#102000" // rgb: 16, 32, 0 nutriment_factor = 1 * REAGENTS_METABOLISM @@ -215,7 +208,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/vodka name = "Vodka" - id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." color = "#0064C8" // rgb: 0, 100, 200 boozepwr = 65 @@ -231,7 +223,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bilk name = "Bilk" - id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." color = "#895C4C" // rgb: 137, 92, 76 nutriment_factor = 2 * REAGENTS_METABOLISM @@ -249,7 +240,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/threemileisland name = "Three Mile Island Iced Tea" - id = "threemileisland" description = "Made for a woman, strong enough for a man." color = "#666340" // rgb: 102, 99, 64 boozepwr = 10 @@ -265,7 +255,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/gin name = "Gin" - id = "gin" description = "It's gin. In space. I say, good sir." color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -276,7 +265,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/rum name = "Rum" - id = "rum" description = "Yohoho and all that." color = "#664300" // rgb: 102, 67, 0 boozepwr = 60 @@ -288,7 +276,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/tequila name = "Tequila" - id = "tequila" description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?" color = "#FFFF91" // rgb: 255, 255, 145 boozepwr = 70 @@ -300,7 +287,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" - id = "vermouth" description = "You suddenly feel a craving for a martini..." color = "#91FF91" // rgb: 145, 255, 145 boozepwr = 45 @@ -312,7 +298,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/wine name = "Wine" - id = "wine" description = "A premium alcoholic beverage made from distilled grape juice." color = "#7E4043" // rgb: 126, 64, 67 boozepwr = 35 @@ -324,7 +309,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" - id = "lizardwine" description = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol." color = "#7E4043" // rgb: 126, 64, 67 boozepwr = 45 @@ -333,7 +317,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/grappa name = "Grappa" - id = "grappa" description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you." color = "#F8EBF1" boozepwr = 60 @@ -344,7 +327,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/cognac name = "Cognac" - id = "cognac" description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." color = "#AB3C05" // rgb: 171, 60, 5 boozepwr = 75 @@ -356,7 +338,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" - id = "absinthe" description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not." color = rgb(10, 206, 0) boozepwr = 80 //Very strong even by default @@ -373,7 +354,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/hooch name = "Hooch" - id = "hooch" description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?" color = "#664300" // rgb: 102, 67, 0 boozepwr = 100 @@ -390,7 +370,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/ale name = "Ale" - id = "ale" description = "A dark alcoholic beverage made with malted barley and yeast." color = "#664300" // rgb: 102, 67, 0 boozepwr = 65 @@ -401,7 +380,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" - id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." color = "#FFFF91" // rgb: 255, 255, 145 boozepwr = 25 @@ -414,7 +392,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/patron name = "Patron" - id = "patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." color = "#585840" // rgb: 88, 88, 64 boozepwr = 60 @@ -427,7 +404,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" - id = "gintonic" description = "An all time classic, mild cocktail." color = "#664300" // rgb: 102, 67, 0 boozepwr = 25 @@ -439,7 +415,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" - id = "rumcoke" description = "Rum, mixed with cola." taste_description = "cola" boozepwr = 40 @@ -451,7 +426,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" - id = "cubalibre" description = "Viva la Revolucion! Viva Cuba Libre!" color = "#3E1B00" // rgb: 62, 27, 0 boozepwr = 50 @@ -472,7 +446,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/whiskey_cola name = "Whiskey Cola" - id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." color = "#3E1B00" // rgb: 62, 27, 0 boozepwr = 70 @@ -485,7 +458,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/martini name = "Classic Martini" - id = "martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." color = "#664300" // rgb: 102, 67, 0 boozepwr = 60 @@ -497,7 +469,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" - id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." color = "#664300" // rgb: 102, 67, 0 boozepwr = 65 @@ -509,7 +480,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/white_russian name = "White Russian" - id = "whiterussian" description = "That's just, like, your opinion, man..." color = "#A68340" // rgb: 166, 131, 64 boozepwr = 50 @@ -521,7 +491,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" - id = "screwdrivercocktail" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." color = "#A68310" // rgb: 166, 131, 16 boozepwr = 55 @@ -538,7 +507,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/booger name = "Booger" - id = "booger" description = "Ewww..." color = "#8CFF8C" // rgb: 140, 255, 140 boozepwr = 45 @@ -549,7 +517,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" - id = "bloodymary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." color = "#664300" // rgb: 102, 67, 0 boozepwr = 55 @@ -566,7 +533,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/brave_bull name = "Brave Bull" - id = "bravebull" description = "It's just as effective as Dutch-Courage!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 80 @@ -590,7 +556,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/tequila_sunrise name = "Tequila Sunrise" - id = "tequilasunrise" description = "Tequila, Grenadine, and Orange Juice." color = "#FFE48C" // rgb: 255, 228, 140 boozepwr = 45 @@ -608,7 +573,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/carbon/M) if(QDELETED(light_holder)) - M.reagents.del_reagent("tequilasunrise") //If we lost our light object somehow, remove the reagent + M.reagents.del_reagent(/datum/reagent/consumable/ethanol/tequila_sunrise) //If we lost our light object somehow, remove the reagent else if(light_holder.loc != M) light_holder.forceMove(M) return ..() @@ -619,7 +584,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/toxins_special name = "Toxins Special" - id = "toxinsspecial" description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 25 @@ -636,7 +600,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/beepsky_smash name = "Beepsky Smash" - id = "beepskysmash" description = "Drink this and prepare for the LAW." color = "#664300" // rgb: 102, 67, 0 boozepwr = 90 //THE FIST OF THE LAW IS STRONG AND HARD @@ -679,7 +642,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/irish_cream name = "Irish Cream" - id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish?" color = "#664300" // rgb: 102, 67, 0 boozepwr = 50 @@ -691,7 +653,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" - id = "manlydorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." color = "#664300" // rgb: 102, 67, 0 boozepwr = 100 //For the manly only @@ -718,7 +679,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/longislandicedtea name = "Long Island Iced Tea" - id = "longislandicedtea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 @@ -731,7 +691,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" - id = "moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." color = "#664300" // rgb: 102, 67, 0 boozepwr = 95 @@ -742,7 +701,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/b52 name = "B-52" - id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." color = "#664300" // rgb: 102, 67, 0 boozepwr = 85 @@ -758,7 +716,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/irishcoffee name = "Irish Coffee" - id = "irishcoffee" description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 @@ -770,7 +727,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/margarita name = "Margarita" - id = "margarita" description = "On the rocks with salt on the rim. Arriba~!" color = "#8CFF8C" // rgb: 140, 255, 140 boozepwr = 35 @@ -782,7 +738,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" - id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." color = "#360000" // rgb: 54, 0, 0 boozepwr = 70 @@ -795,7 +750,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/manhattan name = "Manhattan" - id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." color = "#664300" // rgb: 102, 67, 0 boozepwr = 30 @@ -808,7 +762,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/manhattan_proj name = "Manhattan Project" - id = "manhattan_proj" description = "A scientist's drink of choice, for pondering ways to blow up the station." color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -825,7 +778,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/whiskeysoda name = "Whiskey Soda" - id = "whiskeysoda" description = "For the more refined griffon." color = "#664300" // rgb: 102, 67, 0 boozepwr = 70 @@ -837,7 +789,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" - id = "antifreeze" description = "The ultimate refreshment. Not what it sounds like." color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 @@ -853,7 +804,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/barefoot name = "Barefoot" - id = "barefoot" description = "Barefoot and pregnant." color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -873,7 +823,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/snowwhite name = "Snow White" - id = "snowwhite" description = "A cold refreshment." color = "#FFFFFF" // rgb: 255, 255, 255 boozepwr = 35 @@ -885,7 +834,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. name = "Demon's Blood" - id = "demonsblood" description = "AHHHH!!!!" color = "#820000" // rgb: 130, 0, 0 boozepwr = 75 @@ -897,7 +845,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it. name = "Devil's Kiss" - id = "devilskiss" description = "Creepy time!" color = "#A68310" // rgb: 166, 131, 16 boozepwr = 70 @@ -909,7 +856,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" - id = "vodkatonic" description = "For when a gin and tonic isn't Russian enough." color = "#0064C8" // rgb: 0, 100, 200 boozepwr = 70 @@ -922,7 +868,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" - id = "ginfizz" description = "Refreshingly lemony, deliciously dry." color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -935,7 +880,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama Mama" - id = "bahama_mama" description = "Tropical cocktail." color = "#FF7F3B" // rgb: 255, 127, 59 boozepwr = 35 @@ -947,7 +891,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/singulo name = "Singulo" - id = "singulo" description = "A blue-space beverage!" color = "#2E6671" // rgb: 46, 102, 113 boozepwr = 35 @@ -959,7 +902,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" - id = "sbiten" description = "A spicy Vodka! Might be a little hot for the little guys!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 70 @@ -975,7 +917,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/red_mead name = "Red Mead" - id = "red_mead" description = "The true Viking drink! Even though it has a strange red color." color = "#C73C00" // rgb: 199, 60, 0 boozepwr = 31 //Red drinks are stronger @@ -987,7 +928,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/mead name = "Mead" - id = "mead" description = "A Viking drink, though a cheap one." color = "#664300" // rgb: 102, 67, 0 nutriment_factor = 1 * REAGENTS_METABOLISM @@ -1000,7 +940,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" - id = "iced_beer" description = "A beer which is so cold the air around it freezes." color = "#664300" // rgb: 102, 67, 0 boozepwr = 15 @@ -1015,7 +954,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/grog name = "Grog" - id = "grog" description = "Watered down rum, Nanotrasen approves!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 1 //Basically nothing @@ -1027,7 +965,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/aloe name = "Aloe" - id = "aloe" description = "So very, very, very good." color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 @@ -1039,7 +976,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" - id = "andalusia" description = "A nice, strangely named drink." color = "#664300" // rgb: 102, 67, 0 boozepwr = 40 @@ -1051,7 +987,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" - id = "alliescocktail" description = "A drink made from your allies. Not as sweet as those made from your enemies." color = "#664300" // rgb: 102, 67, 0 boozepwr = 45 @@ -1063,7 +998,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" - id = "acidspit" description = "A drink for the daring, can be deadly if incorrectly prepared!" color = "#365000" // rgb: 54, 80, 0 boozepwr = 80 @@ -1075,7 +1009,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/amasec name = "Amasec" - id = "amasec" description = "Official drink of the Nanotrasen Gun-Club!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 @@ -1087,7 +1020,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/changelingsting name = "Changeling Sting" - id = "changelingsting" description = "You take a tiny sip and feel a burning sensation..." color = "#2E6671" // rgb: 46, 102, 113 boozepwr = 95 @@ -1107,7 +1039,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/irishcarbomb name = "Irish Car Bomb" - id = "irishcarbomb" description = "Mmm, tastes like chocolate cake..." color = "#2E6671" // rgb: 46, 102, 113 boozepwr = 25 @@ -1119,7 +1050,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" - id = "syndicatebomb" description = "Tastes like terrorism!" color = "#2E6671" // rgb: 46, 102, 113 boozepwr = 90 @@ -1136,7 +1066,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/erikasurprise name = "Erika Surprise" - id = "erikasurprise" description = "The surprise is, it's green!" color = "#2E6671" // rgb: 46, 102, 113 boozepwr = 35 @@ -1148,7 +1077,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" - id = "driestmartini" description = "Only for the experienced. You think you see sand floating in the glass." nutriment_factor = 1 * REAGENTS_METABOLISM color = "#2E6671" // rgb: 46, 102, 113 @@ -1161,7 +1089,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" - id = "bananahonk" description = "A drink from Clown Heaven." nutriment_factor = 1 * REAGENTS_METABOLISM color = "#FFFF91" // rgb: 255, 255, 140 @@ -1180,7 +1107,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/silencer name = "Silencer" - id = "silencer" description = "A drink from Mime Heaven." nutriment_factor = 1 * REAGENTS_METABOLISM color = "#664300" // rgb: 102, 67, 0 @@ -1200,7 +1126,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/drunkenblumpkin name = "Drunken Blumpkin" - id = "drunkenblumpkin" description = "A weird mix of whiskey and blumpkin juice." color = "#1EA0FF" // rgb: 102, 67, 0 boozepwr = 50 @@ -1212,7 +1137,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" - id = "whiskey_sour" description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content." color = rgb(255, 201, 49) boozepwr = 35 @@ -1224,7 +1148,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/hcider name = "Hard Cider" - id = "hcider" description = "Apple juice, for adults." color = "#CD6839" nutriment_factor = 1 * REAGENTS_METABOLISM @@ -1238,7 +1161,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! name = "Fetching Fizz" - id = "fetching_fizz" description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~ color = rgb(255, 91, 15) boozepwr = 10 @@ -1258,7 +1180,6 @@ All effects don't start immediately, but rather get worse over time; the rate is //Another reference. Heals those in critical condition extremely quickly. /datum/reagent/consumable/ethanol/hearty_punch name = "Hearty Punch" - id = "hearty_punch" description = "Brave bull/syndicate bomb/absinthe mixture resulting in an energizing beverage. Mild alcohol content." color = rgb(140, 0, 0) boozepwr = 90 @@ -1281,7 +1202,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bacchus_blessing //An EXTREMELY powerful drink. Smashed in seconds, dead in minutes. name = "Bacchus' Blessing" - id = "bacchus_blessing" description = "Unidentifiable mixture. Unmeasurably high alcohol content." color = rgb(51, 19, 3) //Sickly brown boozepwr = 300 //I warned you @@ -1294,7 +1214,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/atomicbomb name = "Atomic Bomb" - id = "atomicbomb" description = "Nuclear proliferation never tasted so good." color = "#666300" // rgb: 102, 99, 0 boozepwr = 0 //custom drunk effect @@ -1324,7 +1243,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" - id = "gargleblaster" description = "Whoah, this stuff looks volatile!" color = "#664300" // rgb: 102, 67, 0 boozepwr = 0 //custom drunk effect @@ -1353,7 +1271,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/neurotoxin name = "Neurotoxin" - id = "neurotoxin" description = "A strong neurotoxin that puts the subject into a death-like state." color = "#2E2E61" // rgb: 46, 46, 97 boozepwr = 50 @@ -1378,7 +1295,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(current_cycle > 5) if(prob(20)) var/t = pickt() - ADD_TRAIT(M, t, id) + ADD_TRAIT(M, t, type) M.adjustStaminaLoss(10) if(current_cycle > 30) M.adjustBrainLoss(2*REM) @@ -1391,16 +1308,15 @@ All effects don't start immediately, but rather get worse over time; the rate is ..() /datum/reagent/consumable/ethanol/neurotoxin/on_mob_delete(mob/living/carbon/M) - REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_ARM, id) - REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_ARM, id) - REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_LEG, id) - REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_LEG, id) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_ARM, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_ARM, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_LEG, type) + REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_LEG, type) M.adjustStaminaLoss(10) ..() /datum/reagent/consumable/ethanol/hippies_delight name = "Hippie's Delight" - id = "hippiesdelight" description = "You just don't get it maaaan." color = "#664300" // rgb: 102, 67, 0 nutriment_factor = 0 @@ -1446,7 +1362,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/eggnog name = "Eggnog" - id = "eggnog" description = "For enjoying the most wonderful time of the year." color = "#fcfdc6" // rgb: 252, 253, 198 nutriment_factor = 2 * REAGENTS_METABOLISM @@ -1460,7 +1375,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/narsour name = "Nar'Sour" - id = "narsour" description = "Side effects include self-mutilation and hoarding plasteel." color = RUNE_COLOR_DARKRED boozepwr = 10 @@ -1477,7 +1391,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/triple_sec name = "Triple Sec" - id = "triple_sec" description = "A sweet and vibrant orange liqueur." color = "#ffcc66" boozepwr = 30 @@ -1488,7 +1401,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" - id = "creme_de_menthe" description = "A minty liqueur excellent for refreshing, cool drinks." color = "#00cc00" boozepwr = 20 @@ -1499,7 +1411,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" - id = "creme_de_cacao" description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities." color = "#996633" boozepwr = 20 @@ -1510,7 +1421,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" - id = "quadruple_sec" description = "Kicks just as hard as licking the powercell on a baton, but tastier." color = "#cc0000" boozepwr = 35 @@ -1530,7 +1440,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/quintuple_sec name = "Quintuple Sec" - id = "quintuple_sec" description = "Law, Order, Alcohol, and Police Brutality distilled into one single elixir of JUSTICE." color = "#ff3300" boozepwr = 80 @@ -1553,7 +1462,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/grasshopper name = "Grasshopper" - id = "grasshopper" description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this." color = "00ff00" boozepwr = 25 @@ -1565,7 +1473,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/stinger name = "Stinger" - id = "stinger" description = "A snappy way to end the day." color = "ccff99" boozepwr = 25 @@ -1577,7 +1484,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" - id = "bastion_bourbon" description = "Soothing hot herbal brew with restorative properties. Hints of citrus and berry flavors." color = "#00FFFF" boozepwr = 30 @@ -1615,7 +1521,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/squirt_cider name = "Squirt Cider" - id = "squirt_cider" description = "Fermented squirt extract with a nose of stale bread and ocean water. Whatever a squirt is." color = "#FF0000" boozepwr = 40 @@ -1633,7 +1538,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fringe_weaver name = "Fringe Weaver" - id = "fringe_weaver" description = "Bubbly, classy, and undoubtedly strong - a Glitch City classic." color = "#FFEAC4" boozepwr = 90 //classy hooch, essentially, but lower pwr to make up for slightly easier access @@ -1645,7 +1549,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" - id = "sugar_rush" description = "Sweet, light, and fruity - as girly as it gets." color = "#FF226C" boozepwr = 10 @@ -1663,7 +1566,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/crevice_spike name = "Crevice Spike" - id = "crevice_spike" description = "Sour, bitter, and smashingly sobering." color = "#5BD231" boozepwr = -10 //sobers you up - ideally, one would drink to get hit with brute damage now to avoid alcohol problems later @@ -1678,7 +1580,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/sake name = "Sake" - id = "sake" description = "A sweet rice wine of questionable legality and extreme potency." color = "#DDDDDD" boozepwr = 70 @@ -1689,7 +1590,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/peppermint_patty name = "Peppermint Patty" - id = "peppermint_patty" description = "This lightly alcoholic drink combines the benefits of menthol and cocoa." color = "#45ca7a" taste_description = "mint and chocolate" @@ -1706,7 +1606,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/alexander name = "Alexander" - id = "alexander" description = "Named after a Greek hero, this mix is said to embolden a user's shield as if they were in a phalanx." color = "#F5E9D3" boozepwr = 80 @@ -1739,7 +1638,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" - id = "sidecar" description = "The one ride you'll gladly give up the wheel for." color = "#FFC55B" boozepwr = 80 @@ -1751,7 +1649,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" - id = "between_the_sheets" description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap." color = "#F4C35A" boozepwr = 80 @@ -1764,19 +1661,18 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L) ..() if(L.IsSleeping()) - if(L.bruteloss && L.fireloss) //If you are damaged by both types, slightly increased healing but it only heals one. The more the merrier wink wink. + if(L.getBruteLoss() && L.getFireLoss()) //If you are damaged by both types, slightly increased healing but it only heals one. The more the merrier wink wink. if(prob(50)) L.adjustBruteLoss(-0.25) else L.adjustFireLoss(-0.25) - else if(L.bruteloss && !L.fireloss) //If you have only one, it still heals but not as well. + else if(L.getBruteLoss()) //If you have only one, it still heals but not as well. L.adjustBruteLoss(-0.2) - else if(!L.bruteloss && L.fireloss) + else if(L.getFireLoss()) L.adjustFireLoss(-0.2) /datum/reagent/consumable/ethanol/kamikaze name = "Kamikaze" - id = "kamikaze" description = "Divinely windy." color = "#EEF191" boozepwr = 60 @@ -1788,7 +1684,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/mojito name = "Mojito" - id = "mojito" description = "A drink that looks as refreshing as it tastes." color = "#DFFAD9" boozepwr = 30 @@ -1800,7 +1695,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fernet name = "Fernet" - id = "fernet" description = "An incredibly bitter herbal liqueur used as a digestif." color = "#1B2E24" // rgb: 27, 46, 36 boozepwr = 80 @@ -1817,7 +1711,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fernet_cola name = "Fernet Cola" - id = "fernet_cola" description = "A very popular and bittersweet digestif, ideal after a heavy meal. Best served on a sawed-off cola bottle as per tradition." color = "#390600" // rgb: 57, 6, boozepwr = 25 @@ -1837,7 +1730,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fanciulli name = "Fanciulli" - id = "fanciulli" description = "What if the Manhattan coctail ACTUALLY used a bitter herb liquour? Helps you sobers up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness color = "#CA933F" // rgb: 202, 147, 63 boozepwr = -10 @@ -1861,7 +1753,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" - id = "branca_menta" description = "A refreshing mixture of bitter Fernet with mint creme liquour." color = "#4B5746" // rgb: 75, 87, 70 boozepwr = 35 @@ -1884,7 +1775,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/blank_paper name = "Blank Paper" - id = "blank_paper" description = "A bubbling glass of blank paper. Just looking at it makes you feel fresh." nutriment_factor = 1 * REAGENTS_METABOLISM color = "#DCDCDC" // rgb: 220, 220, 220 @@ -1904,7 +1794,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" - id = "fruit_wine" description = "A wine made from grown plants." color = "#FFFFFF" boozepwr = 35 @@ -2010,7 +1899,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!? name = "Champagne" - id = "champagne" description = "A sparkling wine known for its ability to strike fast and hard." color = "#ffffc1" boozepwr = 40 @@ -2022,7 +1910,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/wizz_fizz name = "Wizz Fizz" - id = "wizz_fizz" description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild." color = "#4235d0" //Just pretend that the triple-sec was blue curacao. boozepwr = 50 @@ -2042,7 +1929,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/bug_spray name = "Bug Spray" - id = "bug_spray" description = "A harsh, acrid, bitter drink, for those who need something to brace themselves." color = "#33ff33" boozepwr = 50 @@ -2066,7 +1952,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/applejack name = "Applejack" - id = "applejack" description = "The perfect beverage for when you feel the need to horse around." color = "#ff6633" boozepwr = 20 @@ -2077,7 +1962,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" - id = "jack_rose" description = "A light cocktail perfect for sipping with a slice of pie." color = "#ff6633" boozepwr = 15 @@ -2089,7 +1973,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/turbo name = "Turbo" - id = "turbo" description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart." color = "#e94c3a" boozepwr = 85 @@ -2107,7 +1990,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/old_timer name = "Old Timer" - id = "old_timer" description = "An archaic potation enjoyed by old coots of all ages." color = "#996835" boozepwr = 35 @@ -2127,7 +2009,7 @@ All effects don't start immediately, but rather get worse over time; the rate is N.hair_color = "ccc" N.update_hair() if(N.age > 100) - N.become_nearsighted(id) + N.become_nearsighted(type) if(N.gender == MALE) N.facial_hair_style = "Beard (Very Long)" N.update_hair() @@ -2140,7 +2022,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/rubberneck name = "Rubberneck" - id = "rubberneck" description = "A quality rubberneck should not contain any gross natural ingredients." color = "#ffe65b" boozepwr = 60 @@ -2152,7 +2033,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/duplex name = "Duplex" - id = "duplex" description = "An inseparable combination of two fruity drinks." color = "#50e5cf" boozepwr = 25 @@ -2164,7 +2044,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" - id = "trappist" description = "A strong dark ale brewed by space-monks." color = "#390c00" boozepwr = 40 @@ -2183,7 +2062,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/blazaam name = "Blazaam" - id = "blazaam" description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover." boozepwr = 70 quality = DRINK_FANTASTIC @@ -2207,7 +2085,6 @@ All effects don't start immediately, but rather get worse over time; the rate is /datum/reagent/consumable/ethanol/planet_cracker name = "Planet Cracker" - id = "planet_cracker" description = "This jubilant drink celebrates humanity's triumph over the alien menace. May be offensive to non-human crewmembers." boozepwr = 50 quality = DRINK_FANTASTIC @@ -2215,6 +2092,3 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "planet_cracker" glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." - - - diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index d5c4423e62f..0d6df468b2a 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -6,7 +6,6 @@ /datum/reagent/consumable/orangejuice name = "Orange Juice" - id = "orangejuice" description = "Both delicious AND rich in Vitamin C, what more do you need?" color = "#E78108" // rgb: 231, 129, 8 taste_description = "oranges" @@ -22,7 +21,6 @@ /datum/reagent/consumable/tomatojuice name = "Tomato Juice" - id = "tomatojuice" description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" color = "#731008" // rgb: 115, 16, 8 taste_description = "tomatoes" @@ -38,7 +36,6 @@ /datum/reagent/consumable/limejuice name = "Lime Juice" - id = "limejuice" description = "The sweet-sour juice of limes." color = "#365E30" // rgb: 54, 94, 48 taste_description = "unbearable sourness" @@ -54,7 +51,6 @@ /datum/reagent/consumable/carrotjuice name = "Carrot Juice" - id = "carrotjuice" description = "It is just like a carrot but without crunching." color = "#973800" // rgb: 151, 56, 0 taste_description = "carrots" @@ -76,7 +72,6 @@ /datum/reagent/consumable/berryjuice name = "Berry Juice" - id = "berryjuice" description = "A delicious blend of several different kinds of berries." color = "#863333" // rgb: 134, 51, 51 taste_description = "berries" @@ -86,14 +81,12 @@ /datum/reagent/consumable/applejuice name = "Apple Juice" - id = "applejuice" description = "The sweet juice of an apple, fit for all ages." color = "#ECFF56" // rgb: 236, 255, 86 taste_description = "apples" /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" - id = "poisonberryjuice" description = "A tasty juice blended from various kinds of very deadly and toxic berries." color = "#863353" // rgb: 134, 51, 83 taste_description = "berries" @@ -108,7 +101,6 @@ /datum/reagent/consumable/watermelonjuice name = "Watermelon Juice" - id = "watermelonjuice" description = "Delicious juice made from watermelon." color = "#863333" // rgb: 134, 51, 51 taste_description = "juicy watermelon" @@ -118,7 +110,6 @@ /datum/reagent/consumable/lemonjuice name = "Lemon Juice" - id = "lemonjuice" description = "This juice is VERY sour." color = "#863333" // rgb: 175, 175, 0 taste_description = "sourness" @@ -128,7 +119,6 @@ /datum/reagent/consumable/banana name = "Banana Juice" - id = "banana" description = "The raw essence of a banana. HONK" color = "#863333" // rgb: 175, 175, 0 taste_description = "banana" @@ -144,7 +134,6 @@ /datum/reagent/consumable/nothing name = "Nothing" - id = "nothing" description = "Absolutely nothing." taste_description = "nothing" glass_icon_state = "nothing" @@ -161,7 +150,6 @@ /datum/reagent/consumable/laughter name = "Laughter" - id = "laughter" description = "Some say that this is the best medicine, but recent studies have proven that to be untrue." metabolization_rate = INFINITY color = "#FF4DD2" @@ -174,7 +162,6 @@ /datum/reagent/consumable/superlaughter name = "Super Laughter" - id = "superlaughter" description = "Funny until you're the one laughing." metabolization_rate = 1.5 * REAGENTS_METABOLISM color = "#FF4DD2" @@ -189,7 +176,6 @@ /datum/reagent/consumable/potato_juice name = "Potato Juice" - id = "potato" description = "Juice of the potato. Bleh." nutriment_factor = 2 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 @@ -200,14 +186,12 @@ /datum/reagent/consumable/grapejuice name = "Grape Juice" - id = "grapejuice" description = "The juice of a bunch of grapes. Guaranteed non-alcoholic." color = "#290029" // dark purple taste_description = "grape soda" /datum/reagent/consumable/milk name = "Milk" - id = "milk" description = "An opaque white liquid produced by the mammary glands of mammals." color = "#DFDFDF" // rgb: 223, 223, 223 taste_description = "milk" @@ -229,7 +213,6 @@ /datum/reagent/consumable/soymilk name = "Soy Milk" - id = "soymilk" description = "An opaque white liquid made from soybeans." color = "#DFDFC7" // rgb: 223, 223, 199 taste_description = "soy milk" @@ -245,7 +228,6 @@ /datum/reagent/consumable/cream name = "Cream" - id = "cream" description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" color = "#DFD7AF" // rgb: 223, 215, 175 taste_description = "creamy milk" @@ -261,7 +243,6 @@ /datum/reagent/consumable/coffee name = "Coffee" - id = "coffee" description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." color = "#482000" // rgb: 72, 32, 0 nutriment_factor = 0 @@ -288,7 +269,6 @@ /datum/reagent/consumable/tea name = "Tea" - id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" color = "#101000" // rgb: 16, 16, 0 nutriment_factor = 0 @@ -308,9 +288,18 @@ ..() . = 1 +/datum/reagent/consumable/lemonade + name = "Lemonade" + description = "Sweet, tangy lemonade. Good for the soul." + quality = DRINK_NICE + taste_description = "sunshine and summertime" + glass_icon_state = "lemonpitcher" + glass_name = "pitcher of lemonade" + glass_desc = "This drink leaves you feeling nostalgic for some reason." + + /datum/reagent/consumable/tea/arnold_palmer name = "Arnold Palmer" - id = "arnold_palmer" description = "Encourages the patient to go golfing." color = "#FFB766" quality = DRINK_NICE @@ -328,7 +317,6 @@ /datum/reagent/consumable/icecoffee name = "Iced Coffee" - id = "icecoffee" description = "Coffee and ice, refreshing and cool." color = "#102838" // rgb: 16, 40, 56 nutriment_factor = 0 @@ -348,7 +336,6 @@ /datum/reagent/consumable/icetea name = "Iced Tea" - id = "icetea" description = "No relation to a certain rap artist/actor." color = "#104038" // rgb: 16, 64, 56 nutriment_factor = 0 @@ -369,7 +356,6 @@ /datum/reagent/consumable/space_cola name = "Cola" - id = "cola" description = "A refreshing beverage." color = "#100800" // rgb: 16, 8, 0 taste_description = "cola" @@ -384,7 +370,6 @@ /datum/reagent/consumable/nuka_cola name = "Nuka Cola" - id = "nuka_cola" description = "Cola, cola never changes." color = "#100800" // rgb: 16, 8, 0 quality = DRINK_VERYGOOD @@ -395,10 +380,10 @@ /datum/reagent/consumable/nuka_cola/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-0.75, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.75, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/consumable/nuka_cola/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M) @@ -413,7 +398,6 @@ /datum/reagent/consumable/grey_bull name = "Grey Bull" - id = "grey_bull" description = "Grey Bull, it gives you gloves!" color = "#EEFF00" // rgb: 238, 255, 0 quality = DRINK_VERYGOOD @@ -424,10 +408,10 @@ /datum/reagent/consumable/grey_bull/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, id) + ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, type) /datum/reagent/consumable/grey_bull/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, id) + REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, type) ..() /datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M) @@ -440,7 +424,6 @@ /datum/reagent/consumable/spacemountainwind name = "SM Wind" - id = "spacemountainwind" description = "Blows right through you like a space wind." color = "#102000" // rgb: 16, 32, 0 taste_description = "sweet citrus soda" @@ -458,7 +441,6 @@ /datum/reagent/consumable/dr_gibb name = "Dr. Gibb" - id = "dr_gibb" description = "A delicious blend of 42 different flavours." color = "#102000" // rgb: 16, 32, 0 taste_description = "cherry soda" // FALSE ADVERTISING @@ -473,7 +455,6 @@ /datum/reagent/consumable/space_up name = "Space-Up" - id = "space_up" description = "Tastes like a hull breach in your mouth." color = "#00FF00" // rgb: 0, 255, 0 taste_description = "cherry soda" @@ -489,7 +470,6 @@ /datum/reagent/consumable/lemon_lime name = "Lemon Lime" description = "A tangy substance made of 0.5% natural citrus!" - id = "lemon_lime" color = "#8CFF00" // rgb: 135, 255, 0 taste_description = "tangy lime and lemon soda" glass_icon_state = "glass_yellow" @@ -504,7 +484,6 @@ /datum/reagent/consumable/pwr_game name = "Pwr Game" description = "The only drink with the PWR that true gamers crave." - id = "pwr_game" color = "#9385bf" // rgb: 58, 52, 75 taste_description = "sweet and salty tang" glass_icon_state = "glass_red" @@ -518,7 +497,6 @@ /datum/reagent/consumable/shamblers name = "Shambler's Juice" description = "~Shake me up some of that Shambler's Juice!~" - id = "shamblers" color = "#f00060" // rgb: 94, 0, 38 taste_description = "carbonated metallic soda" glass_icon_state = "glass_red" @@ -530,7 +508,6 @@ ..() /datum/reagent/consumable/sodawater name = "Soda Water" - id = "sodawater" description = "A can of club soda. Why not make a scotch and soda?" color = "#619494" // rgb: 97, 148, 148 taste_description = "carbonated water" @@ -546,7 +523,6 @@ /datum/reagent/consumable/tonic name = "Tonic Water" - id = "tonic" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." color = "#0064C8" // rgb: 0, 100, 200 taste_description = "tart and fresh" @@ -564,7 +540,6 @@ /datum/reagent/consumable/ice name = "Ice" - id = "ice" description = "Frozen water, your dentist wouldn't like you chewing this." reagent_state = SOLID color = "#619494" // rgb: 97, 148, 148 @@ -579,7 +554,6 @@ /datum/reagent/consumable/soy_latte name = "Soy Latte" - id = "soy_latte" description = "A nice and tasty beverage while you are reading your hippie books." color = "#664300" // rgb: 102, 67, 0 quality = DRINK_NICE @@ -601,7 +575,6 @@ /datum/reagent/consumable/cafe_latte name = "Cafe Latte" - id = "cafe_latte" description = "A nice, strong and tasty beverage while you are reading." color = "#664300" // rgb: 102, 67, 0 quality = DRINK_NICE @@ -623,7 +596,6 @@ /datum/reagent/consumable/doctor_delight name = "The Doctor's Delight" - id = "doctorsdelight" description = "A gulp a day keeps the Medibot away! A mixture of juices that heals most damage types fairly quickly at the cost of hunger." color = "#FF8CFF" // rgb: 255, 140, 255 quality = DRINK_VERYGOOD @@ -645,7 +617,6 @@ /datum/reagent/consumable/chocolatepudding name = "Chocolate Pudding" - id = "chocolatepudding" description = "A great dessert for chocolate lovers." color = "#800000" quality = DRINK_VERYGOOD @@ -657,7 +628,6 @@ /datum/reagent/consumable/vanillapudding name = "Vanilla Pudding" - id = "vanillapudding" description = "A great dessert for vanilla lovers." color = "#FAFAD2" quality = DRINK_VERYGOOD @@ -669,7 +639,6 @@ /datum/reagent/consumable/cherryshake name = "Cherry Shake" - id = "cherryshake" description = "A cherry flavored milkshake." color = "#FFB6C1" quality = DRINK_VERYGOOD @@ -681,7 +650,6 @@ /datum/reagent/consumable/bluecherryshake name = "Blue Cherry Shake" - id = "bluecherryshake" description = "An exotic milkshake." color = "#00F1FF" quality = DRINK_VERYGOOD @@ -693,7 +661,6 @@ /datum/reagent/consumable/pumpkin_latte name = "Pumpkin Latte" - id = "pumpkin_latte" description = "A mix of pumpkin juice and coffee." color = "#F4A460" quality = DRINK_VERYGOOD @@ -705,7 +672,6 @@ /datum/reagent/consumable/gibbfloats name = "Gibb Floats" - id = "gibbfloats" description = "Ice cream on top of a Dr. Gibb glass." color = "#B22222" quality = DRINK_NICE @@ -717,21 +683,18 @@ /datum/reagent/consumable/pumpkinjuice name = "Pumpkin Juice" - id = "pumpkinjuice" description = "Juiced from real pumpkin." color = "#FFA500" taste_description = "pumpkin" /datum/reagent/consumable/blumpkinjuice name = "Blumpkin Juice" - id = "blumpkinjuice" description = "Juiced from real blumpkin." color = "#00BFFF" taste_description = "a mouthful of pool water" /datum/reagent/consumable/triple_citrus name = "Triple Citrus" - id = "triple_citrus" description = "A solution." color = "#C8A5DC" quality = DRINK_NICE @@ -742,7 +705,6 @@ /datum/reagent/consumable/grape_soda name = "Grape soda" - id = "grapesoda" description = "Beloved of children and teetotalers." color = "#E6CDFF" taste_description = "grape soda" @@ -755,7 +717,6 @@ /datum/reagent/consumable/milk/chocolate_milk name = "Chocolate Milk" - id = "chocolate_milk" description = "Milk for cool kids." color = "#7D4E29" quality = DRINK_NICE @@ -763,7 +724,6 @@ /datum/reagent/consumable/menthol name = "Menthol" - id = "menthol" description = "Alleviates coughing symptoms one might have." color = "#80AF9C" taste_description = "mint" @@ -777,7 +737,6 @@ /datum/reagent/consumable/grenadine name = "Grenadine" - id = "grenadine" description = "Not cherry flavored!" color = "#EA1D26" taste_description = "sweet pomegranates" @@ -786,7 +745,6 @@ /datum/reagent/consumable/parsnipjuice name = "Parsnip Juice" - id = "parsnipjuice" description = "Why..." color = "#FFA500" taste_description = "parsnip" @@ -794,7 +752,6 @@ /datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink name = "Peach Juice" - id = "peachjuice" description = "Just peachy." color = "#E78108" taste_description = "peaches" @@ -802,7 +759,6 @@ /datum/reagent/consumable/cream_soda name = "Cream Soda" - id = "cream_soda" description = "A classic space-American vanilla flavored soft drink." color = "#dcb137" quality = DRINK_VERYGOOD @@ -817,7 +773,6 @@ /datum/reagent/consumable/red_queen name = "Red Queen" - id = "red_queen" description = "DRINK ME." color = "#e6ddc3" quality = DRINK_GOOD diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index e634f7195f0..7165086487b 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,17 +1,15 @@ /datum/reagent/drug name = "Drug" - id = "drug" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" var/trippy = TRUE //Does this drug make you trip? /datum/reagent/drug/on_mob_delete(mob/living/M) if(trippy) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_high") + SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[type]_high") /datum/reagent/drug/space_drugs name = "Space drugs" - id = "space_drugs" description = "An illegal chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 @@ -28,7 +26,7 @@ /datum/reagent/drug/space_drugs/overdose_start(mob/living/M) to_chat(M, "You start tripping hard!") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) /datum/reagent/drug/space_drugs/overdose_process(mob/living/M) if(M.hallucination < volume && prob(20)) @@ -37,7 +35,6 @@ /datum/reagent/drug/nicotine name = "Nicotine" - id = "nicotine" description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 @@ -68,7 +65,6 @@ /datum/reagent/drug/crank name = "Crank" - id = "crank" description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage." reagent_state = LIQUID color = "#FA00C8" @@ -117,7 +113,6 @@ /datum/reagent/drug/krokodil name = "Krokodil" - id = "krokodil" description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off." reagent_state = LIQUID color = "#0064B4" @@ -168,7 +163,6 @@ /datum/reagent/drug/methamphetamine name = "Methamphetamine" - id = "methamphetamine" description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" @@ -178,10 +172,10 @@ /datum/reagent/drug/methamphetamine/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/drug/methamphetamine/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M) @@ -252,7 +246,6 @@ /datum/reagent/drug/bath_salts name = "Bath Salts" - id = "bath_salts" description = "Makes you impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." reagent_state = LIQUID color = "#FAFAFA" @@ -263,16 +256,16 @@ /datum/reagent/drug/bath_salts/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_STUNIMMUNE, id) - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, id) + ADD_TRAIT(L, TRAIT_STUNIMMUNE, type) + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) if(iscarbon(L)) var/mob/living/carbon/C = L rage = new() C.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) /datum/reagent/drug/bath_salts/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, id) - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, id) + REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, type) + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) if(rage) QDEL_NULL(rage) ..() @@ -352,7 +345,6 @@ /datum/reagent/drug/aranesp name = "Aranesp" - id = "aranesp" description = "Amps you up, gets you going, and rapidly restores stamina damage. Side effects include breathlessness and toxicity." reagent_state = LIQUID color = "#78FFF0" @@ -371,7 +363,6 @@ /datum/reagent/drug/happiness name = "Happiness" - id = "happiness" description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." reagent_state = LIQUID color = "#FFF378" @@ -380,11 +371,11 @@ /datum/reagent/drug/happiness/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_FEARLESS, id) + ADD_TRAIT(L, TRAIT_FEARLESS, type) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug) /datum/reagent/drug/happiness/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, id) + REMOVE_TRAIT(L, TRAIT_FEARLESS, type) SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug") ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 3b545902e58..e13fddbd92b 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -9,7 +9,6 @@ /datum/reagent/consumable name = "Consumable" - id = "consumable" taste_description = "generic food" taste_mult = 4 var/nutriment_factor = 1 * REAGENTS_METABOLISM @@ -21,7 +20,7 @@ var/mob/living/carbon/human/H = M if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) H.adjust_nutrition(nutriment_factor) - holder.remove_reagent(src.id, metabolization_rate) + holder.remove_reagent(type, metabolization_rate) /datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == INGEST) @@ -35,11 +34,12 @@ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_verygood) if (DRINK_FANTASTIC) SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_fantastic) + if (FOOD_AMAZING) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "quality_food", /datum/mood_event/amazingtaste) return ..() /datum/reagent/consumable/nutriment name = "Nutriment" - id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." reagent_state = SOLID nutriment_factor = 15 * REAGENTS_METABOLISM @@ -90,7 +90,6 @@ /datum/reagent/consumable/nutriment/vitamin name = "Vitamin" - id = "vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." brute_heal = 1 @@ -103,7 +102,6 @@ /datum/reagent/consumable/cooking_oil name = "Cooking Oil" - id = "cooking_oil" description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) taste_mult = 0.8 @@ -111,7 +109,6 @@ nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own metabolization_rate = 10 * REAGENTS_METABOLISM var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world - var/boiling //Used in mob life to determine if the oil kills, and only on touch application /datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume) if(holder && holder.chem_temp >= fry_temperature) @@ -119,23 +116,32 @@ O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.") var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O) F.fry(volume) - F.reagents.add_reagent("cooking_oil", reac_volume) + F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) /datum/reagent/consumable/cooking_oil/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) return + var/boiling = FALSE if(holder && holder.chem_temp >= fry_temperature) boiling = TRUE - if(method == VAPOR || method == TOUCH) //Directly coats the mob, and doesn't go into their bloodstream - if(boiling) - M.visible_message("The boiling oil sizzles as it covers [M]!", \ - "You're covered in boiling oil!") + if(method != VAPOR && method != TOUCH) //Directly coats the mob, and doesn't go into their bloodstream + return ..() + if(!boiling) + return TRUE + var/oil_damage = ((holder.chem_temp / fry_temperature) * 0.33) //Damage taken per unit + if(method == TOUCH) + oil_damage *= 1 - M.get_permeability_protection() + var/FryLoss = round(min(38, oil_damage * reac_volume)) + if(!HAS_TRAIT(M, TRAIT_OIL_FRIED)) + M.visible_message("The boiling oil sizzles as it covers [M]!", \ + "You're covered in boiling oil!") + if(FryLoss) M.emote("scream") - playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE) - var/oil_damage = (holder.chem_temp / fry_temperature) * 0.33 //Damage taken per unit - M.adjustFireLoss(min(35, oil_damage * reac_volume)) //Damage caps at 35 - else - ..() + playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE) + ADD_TRAIT(M, TRAIT_OIL_FRIED, "cooking_oil_react") + addtimer(CALLBACK(M, /mob/living/proc/unfry_mob), 3) + if(FryLoss) + M.adjustFireLoss(FryLoss) return TRUE /datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume) @@ -148,7 +154,6 @@ /datum/reagent/consumable/sugar name = "Sugar" - id = "sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." reagent_state = SOLID color = "#FFFFFF" // rgb: 255, 255, 255 @@ -170,7 +175,6 @@ /datum/reagent/consumable/virus_food name = "Virus Food" - id = "virusfood" description = "A mixture of water and milk. Virus cells can use this mixture to reproduce." nutriment_factor = 2 * REAGENTS_METABOLISM color = "#899613" // rgb: 137, 150, 19 @@ -178,7 +182,6 @@ /datum/reagent/consumable/soysauce name = "Soysauce" - id = "soysauce" description = "A salty sauce made from the soy plant." nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" // rgb: 121, 35, 0 @@ -186,7 +189,6 @@ /datum/reagent/consumable/ketchup name = "Ketchup" - id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#731008" // rgb: 115, 16, 8 @@ -195,7 +197,6 @@ /datum/reagent/consumable/capsaicin name = "Capsaicin Oil" - id = "capsaicin" description = "This is what makes chilis hot." color = "#B31008" // rgb: 179, 16, 8 taste_description = "hot peppers" @@ -206,8 +207,8 @@ switch(current_cycle) if(1 to 15) heating = 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("cryostylane")) - holder.remove_reagent("cryostylane", 5) + if(holder.has_reagent(/datum/reagent/cryostylane)) + holder.remove_reagent(/datum/reagent/cryostylane, 5) if(isslime(M)) heating = rand(5,20) if(15 to 25) @@ -227,7 +228,6 @@ /datum/reagent/consumable/frostoil name = "Frost Oil" - id = "frostoil" description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" @@ -237,8 +237,8 @@ switch(current_cycle) if(1 to 15) cooling = -10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) + if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 5) if(isslime(M)) cooling = -rand(5,20) if(15 to 25) @@ -272,7 +272,6 @@ /datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" - id = "condensedcapsaicin" description = "A chemical agent used for self-defense and in police work." color = "#B31008" // rgb: 179, 16, 8 taste_description = "scorching agony" @@ -320,7 +319,6 @@ /datum/reagent/consumable/sodiumchloride name = "Table Salt" - id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." reagent_state = SOLID color = "#FFFFFF" // rgb: 255,255,255 @@ -341,7 +339,6 @@ /datum/reagent/consumable/blackpepper name = "Black Pepper" - id = "blackpepper" description = "A powder ground from peppercorns. *AAAACHOOO*" reagent_state = SOLID // no color (ie, black) @@ -349,7 +346,6 @@ /datum/reagent/consumable/coco name = "Coco Powder" - id = "cocoa" description = "A fatty, bitter paste made from coco beans." reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM @@ -358,7 +354,6 @@ /datum/reagent/consumable/hot_coco name = "Hot Chocolate" - id = "hot_coco" description = "Made with love! And coco beans." nutriment_factor = 3 * REAGENTS_METABOLISM color = "#403010" // rgb: 64, 48, 16 @@ -373,7 +368,6 @@ /datum/reagent/drug/mushroomhallucinogen name = "Mushroom Hallucinogen" - id = "mushroomhallucinogen" description = "A strong hallucinogenic drug derived from certain species of mushroom." color = "#E700E7" // rgb: 231, 0, 231 metabolization_rate = 0.2 * REAGENTS_METABOLISM @@ -404,7 +398,6 @@ /datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. name = "Garlic Juice" - id = "garlic" description = "Crushed garlic. Chefs love it, but it can make you smell bad." color = "#FEFEFE" taste_description = "garlic" @@ -428,7 +421,6 @@ /datum/reagent/consumable/sprinkles name = "Sprinkles" - id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." color = "#FF00FF" // rgb: 255, 0, 255 taste_description = "childhood whimsy" @@ -441,7 +433,6 @@ /datum/reagent/consumable/cornoil name = "Corn Oil" - id = "cornoil" description = "An oil derived from various types of corn." nutriment_factor = 20 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 @@ -461,14 +452,12 @@ /datum/reagent/consumable/enzyme name = "Universal Enzyme" - id = "enzyme" description = "A universal enzyme used in the preperation of certain chemicals and foods." color = "#365E30" // rgb: 54, 94, 48 taste_description = "sweetness" /datum/reagent/consumable/dry_ramen name = "Dry Ramen" - id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." reagent_state = SOLID color = "#302000" // rgb: 48, 32, 0 @@ -476,7 +465,6 @@ /datum/reagent/consumable/hot_ramen name = "Hot Ramen" - id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 @@ -488,7 +476,6 @@ /datum/reagent/consumable/hell_ramen name = "Hell Ramen" - id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 @@ -500,7 +487,6 @@ /datum/reagent/consumable/flour name = "Flour" - id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 @@ -511,25 +497,22 @@ var/obj/effect/decal/cleanable/food/flour/reagentdecal = new(T) reagentdecal = locate() in T //Might have merged with flour already there. if(reagentdecal) - reagentdecal.reagents.add_reagent("flour", reac_volume) + reagentdecal.reagents.add_reagent(/datum/reagent/consumable/flour, reac_volume) /datum/reagent/consumable/cherryjelly name = "Cherry Jelly" - id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 taste_description = "cherry" /datum/reagent/consumable/bluecherryjelly name = "Blue Cherry Jelly" - id = "bluecherryjelly" description = "Blue and tastier kind of cherry jelly." color = "#00F0FF" taste_description = "blue cherry" /datum/reagent/consumable/rice name = "Rice" - id = "rice" description = "tiny nutritious grains" reagent_state = SOLID nutriment_factor = 3 * REAGENTS_METABOLISM @@ -538,7 +521,6 @@ /datum/reagent/consumable/vanilla name = "Vanilla Powder" - id = "vanilla" description = "A fatty, bitter paste made from vanilla pods." reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM @@ -547,7 +529,6 @@ /datum/reagent/consumable/eggyolk name = "Egg Yolk" - id = "eggyolk" description = "It's full of protein." nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFB500" @@ -555,26 +536,23 @@ /datum/reagent/consumable/corn_starch name = "Corn Starch" - id = "corn_starch" description = "A slippery solution." color = "#C8A5DC" taste_description = "slime" /datum/reagent/consumable/corn_syrup name = "Corn Syrup" - id = "corn_syrup" description = "Decays into sugar." color = "#C8A5DC" metabolization_rate = 3 * REAGENTS_METABOLISM taste_description = "sweet slime" /datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/M) - holder.add_reagent("sugar", 3) + holder.add_reagent(/datum/reagent/consumable/sugar, 3) ..() /datum/reagent/consumable/honey - name = "honey" - id = "honey" + name = "Honey" description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" nutriment_factor = 15 * REAGENTS_METABOLISM @@ -582,7 +560,7 @@ taste_description = "sweetness" /datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M) - M.reagents.add_reagent("sugar",3) + M.reagents.add_reagent(/datum/reagent/consumable/sugar,3) if(prob(55)) M.adjustBruteLoss(-1*REM, 0) M.adjustFireLoss(-1*REM, 0) @@ -600,14 +578,12 @@ /datum/reagent/consumable/mayonnaise name = "Mayonnaise" - id = "mayonnaise" description = "An white and oily mixture of mixed egg yolks." color = "#DFDFDF" taste_description = "mayonnaise" /datum/reagent/consumable/tearjuice name = "Tear Juice" - id = "tearjuice" description = "A blinding substance extracted from certain onions." color = "#c0c9a0" taste_description = "bitterness" @@ -645,7 +621,6 @@ /datum/reagent/consumable/nutriment/stabilized name = "Stabilized Nutriment" - id = "stabilizednutriment" description = "A bioengineered protien-nutrient structure designed to decompose in high saturation. In layman's terms, it won't get you fat." reagent_state = SOLID nutriment_factor = 15 * REAGENTS_METABOLISM @@ -661,7 +636,6 @@ /datum/reagent/consumable/entpoly name = "Entropic Polypnium" - id = "entpoly" description = "An ichor, derived from a certain mushroom, makes for a bad time." color = "#1d043d" taste_description = "bitter mushroom" @@ -681,7 +655,6 @@ /datum/reagent/consumable/tinlux name = "Tinea Luxor" - id = "tinlux" description = "A stimulating ichor which causes luminescent fungi to grow on the skin. " color = "#b5a213" taste_description = "tingling mushroom" @@ -694,7 +667,6 @@ /datum/reagent/consumable/vitfro name = "Vitrium Froth" - id = "vitfro" description = "A bubbly paste that heals wounds of the skin." color = "#d3a308" nutriment_factor = 3 * REAGENTS_METABOLISM @@ -709,7 +681,6 @@ /datum/reagent/consumable/clownstears name = "Clown's Tears" - id = "clownstears" description = "The sorrow and melancholy of a thousand bereaved clowns, forever denied their Honkmechs." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#eef442" // rgb: 238, 244, 66 @@ -718,7 +689,6 @@ /datum/reagent/consumable/liquidelectricity name = "Liquid Electricity" - id = "liquidelectricity" description = "The blood of Ethereals, and the stuff that keeps them going. Great for them, horrid for anyone else." nutriment_factor = 5 * REAGENTS_METABOLISM color = "#97ee63" @@ -736,7 +706,6 @@ /datum/reagent/consumable/astrotame name = "Astrotame" - id = "astrotame" description = "A space age artifical sweetener." nutriment_factor = 0 metabolization_rate = 2 * REAGENTS_METABOLISM @@ -751,3 +720,13 @@ M.adjust_disgust(10) ..() . = 1 + +/datum/reagent/consumable/secretsauce + name = "secret sauce" + description = "What could it be." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#792300" + taste_description = "indescribable" + quality = FOOD_AMAZING + taste_mult = 100 + can_synth = FALSE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 30870424674..d94c8dfb77d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -8,16 +8,14 @@ /datum/reagent/medicine name = "Medicine" - id = "medicine" taste_description = "bitterness" /datum/reagent/medicine/on_mob_life(mob/living/carbon/M) current_cycle++ - holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism + holder.remove_reagent(type, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism /datum/reagent/medicine/leporazine name = "Leporazine" - id = "leporazine" description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." color = "#C8A5DC" // rgb: 200, 165, 220 @@ -30,7 +28,6 @@ /datum/reagent/medicine/adminordrazine //An OP chemical for admins name = "Adminordrazine" - id = "adminordrazine" description = "It's magic. We don't have to explain it." color = "#C8A5DC" // rgb: 200, 165, 220 can_synth = FALSE @@ -76,13 +73,11 @@ /datum/reagent/medicine/adminordrazine/quantum_heal name = "Quantum Medicine" - id = "quantum_heal" description = "Rare and experimental particles, that apparently swap the user's body with one from an alternate dimension where it's completely healthy." taste_description = "science" /datum/reagent/medicine/synaptizine name = "Synaptizine" - id = "synaptizine" description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." color = "#FF00FF" @@ -93,8 +88,8 @@ M.AdjustUnconscious(-20, FALSE) M.AdjustImmobilized(-20, FALSE) M.AdjustParalyzed(-20, FALSE) - if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 5) + if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) + holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) M.hallucination = max(0, M.hallucination - 10) if(prob(30)) M.adjustToxLoss(1, 0) @@ -103,16 +98,15 @@ /datum/reagent/medicine/synaphydramine name = "Diphen-Synaptizine" - id = "synaphydramine" description = "Reduces drowsiness, hallucinations, and Histamine from body." color = "#EC536D" // rgb: 236, 83, 109 /datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) - if(holder.has_reagent("mindbreaker")) - holder.remove_reagent("mindbreaker", 5) - if(holder.has_reagent("histamine")) - holder.remove_reagent("histamine", 5) + if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) + holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) + if(holder.has_reagent(/datum/reagent/toxin/histamine)) + holder.remove_reagent(/datum/reagent/toxin/histamine, 5) M.hallucination = max(0, M.hallucination - 10) if(prob(30)) M.adjustToxLoss(1, 0) @@ -121,7 +115,6 @@ /datum/reagent/medicine/inacusiate name = "Inacusiate" - id = "inacusiate" description = "Instantly restores all hearing to the patient, but does not cure deafness." color = "#6600FF" // rgb: 100, 165, 255 @@ -131,7 +124,6 @@ /datum/reagent/medicine/cryoxadone name = "Cryoxadone" - id = "cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." color = "#0000C8" taste_description = "sludge" @@ -151,7 +143,6 @@ /datum/reagent/medicine/clonexadone name = "Clonexadone" - id = "clonexadone" description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone." color = "#0000C8" taste_description = "muscle" @@ -167,7 +158,6 @@ /datum/reagent/medicine/pyroxadone name = "Pyroxadone" - id = "pyroxadone" description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." color = "#f7832a" taste_description = "spicy jelly" @@ -196,7 +186,6 @@ /datum/reagent/medicine/rezadone name = "Rezadone" - id = "rezadone" description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage." reagent_state = SOLID color = "#669900" // rgb: 102, 153, 0 @@ -219,7 +208,6 @@ /datum/reagent/medicine/spaceacillin name = "Spaceacillin" - id = "spaceacillin" description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.1 * REAGENTS_METABOLISM @@ -227,7 +215,6 @@ //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. /datum/reagent/medicine/silver_sulfadiazine name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#C8A5DC" @@ -253,7 +240,6 @@ /datum/reagent/medicine/oxandrolone name = "Oxandrolone" - id = "oxandrolone" description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns." reagent_state = LIQUID color = "#f7ffa5" @@ -276,7 +262,6 @@ /datum/reagent/medicine/styptic_powder name = "Styptic Powder" - id = "styptic_powder" description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means, deals minor toxin damage." reagent_state = LIQUID color = "#FF9696" @@ -303,7 +288,6 @@ /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" - id = "salglu_solution" description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." reagent_state = LIQUID color = "#DCDCDC" @@ -331,12 +315,12 @@ /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) if(prob(3)) to_chat(M, "You feel salty.") - holder.add_reagent("sodiumchloride", 1) - holder.remove_reagent("salglu_solution", 0.5) + holder.add_reagent(/datum/reagent/consumable/sodiumchloride, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) else if(prob(3)) to_chat(M, "You feel sweet.") - holder.add_reagent("sugar", 1) - holder.remove_reagent("salglu_solution", 0.5) + holder.add_reagent(/datum/reagent/consumable/sugar, 1) + holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) if(prob(33)) M.adjustBruteLoss(0.5*REM, FALSE, FALSE, BODYPART_ORGANIC) M.adjustFireLoss(0.5*REM, FALSE, FALSE, BODYPART_ORGANIC) @@ -345,7 +329,6 @@ /datum/reagent/medicine/mine_salve name = "Miner's Salve" - id = "mine_salve" description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed." reagent_state = LIQUID color = "#6D6374" @@ -383,7 +366,6 @@ /datum/reagent/medicine/synthflesh name = "Synthflesh" - id = "synthflesh" description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID color = "#FFEBEB" @@ -402,7 +384,6 @@ /datum/reagent/medicine/charcoal name = "Charcoal" - id = "charcoal" description = "Heals toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream." reagent_state = LIQUID color = "#000000" @@ -414,12 +395,11 @@ . = 1 for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) - M.reagents.remove_reagent(R.id,1) + M.reagents.remove_reagent(type,1) ..() /datum/reagent/medicine/omnizine name = "Omnizine" - id = "omnizine" description = "Slowly heals all damage types. Overdose will cause damage in all types instead." reagent_state = LIQUID color = "#DCDCDC" @@ -444,7 +424,6 @@ /datum/reagent/medicine/calomel name = "Calomel" - id = "calomel" description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." reagent_state = LIQUID color = "#19C832" @@ -454,7 +433,7 @@ /datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) - M.reagents.remove_reagent(R.id,2.5) + M.reagents.remove_reagent(R.type,2.5) if(M.health > 20) M.adjustToxLoss(2.5*REM, 0) . = 1 @@ -462,7 +441,6 @@ /datum/reagent/medicine/potass_iodide name = "Potassium Iodide" - id = "potass_iodide" description = "Efficiently restores low radiation damage." reagent_state = LIQUID color = "#14FF3C" @@ -475,7 +453,6 @@ /datum/reagent/medicine/pen_acid name = "Pentetic Acid" - id = "pen_acid" description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body." reagent_state = LIQUID color = "#E6FFF0" @@ -486,13 +463,12 @@ M.adjustToxLoss(-2*REM, 0) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) - M.reagents.remove_reagent(R.id,2) + M.reagents.remove_reagent(R.type,2) ..() . = 1 /datum/reagent/medicine/sal_acid name = "Salicyclic Acid" - id = "sal_acid" description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising." reagent_state = LIQUID color = "#D2D2D2" @@ -516,7 +492,6 @@ /datum/reagent/medicine/salbutamol name = "Salbutamol" - id = "salbutamol" description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." reagent_state = LIQUID color = "#00FFFF" @@ -531,7 +506,6 @@ /datum/reagent/medicine/perfluorodecalin name = "Perfluorodecalin" - id = "perfluorodecalin" description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." reagent_state = LIQUID color = "#FF6464" @@ -555,7 +529,6 @@ /datum/reagent/medicine/ephedrine name = "Ephedrine" - id = "ephedrine" description = "Increases stun resistance and movement speed. Overdose deals toxin damage and inhibits breathing." reagent_state = LIQUID color = "#D2FFFA" @@ -565,10 +538,10 @@ /datum/reagent/medicine/ephedrine/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-0.85, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.85, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/medicine/ephedrine/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) @@ -649,7 +622,6 @@ /datum/reagent/medicine/diphenhydramine name = "Diphenhydramine" - id = "diphenhydramine" description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness." reagent_state = LIQUID color = "#64FFE6" @@ -659,12 +631,11 @@ if(prob(10)) M.drowsyness += 1 M.jitteriness -= 1 - M.reagents.remove_reagent("histamine",3) + M.reagents.remove_reagent(/datum/reagent/toxin/histamine,3) ..() /datum/reagent/medicine/morphine name = "Morphine" - id = "morphine" description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." reagent_state = LIQUID color = "#A9FBFB" @@ -674,10 +645,10 @@ /datum/reagent/medicine/morphine/on_mob_add(mob/living/L) ..() - L.ignore_slowdown(id) + L.ignore_slowdown(type) /datum/reagent/medicine/morphine/on_mob_delete(mob/living/L) - L.unignore_slowdown(id) + L.unignore_slowdown(type) ..() /datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M) @@ -733,7 +704,6 @@ /datum/reagent/medicine/oculine name = "Oculine" - id = "oculine" description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind." reagent_state = LIQUID color = "#FFFFFF" @@ -764,7 +734,6 @@ /datum/reagent/medicine/atropine name = "Atropine" - id = "atropine" description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients." reagent_state = LIQUID color = "#000000" @@ -793,7 +762,6 @@ /datum/reagent/medicine/epinephrine name = "Epinephrine" - id = "epinephrine" description = "Minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage." reagent_state = LIQUID color = "#D2FFFA" @@ -802,10 +770,10 @@ /datum/reagent/medicine/epinephrine/on_mob_add(mob/living/carbon/M) ..() - ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, id) + ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type) /datum/reagent/medicine/epinephrine/on_mob_delete(mob/living/carbon/M) - REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, id) + REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type) ..() /datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M) @@ -834,7 +802,6 @@ /datum/reagent/medicine/strange_reagent name = "Strange Reagent" - id = "strange_reagent" description = "A miracle drug capable of bringing the dead back to life. Only functions when applied by patch or spray, if the target has less than 100 brute and burn damage (independent of one another) and hasn't been husked. Causes slight damage to the living." reagent_state = LIQUID color = "#A0E85E" @@ -873,7 +840,6 @@ /datum/reagent/medicine/mannitol name = "Mannitol" - id = "mannitol" description = "Efficiently restores brain damage." color = "#DCDCFF" @@ -883,20 +849,18 @@ /datum/reagent/medicine/neurine name = "Neurine" - id = "neurine" description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." color = "#EEFF8F" /datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C) - if(holder.has_reagent("neurotoxin")) - holder.remove_reagent("neurotoxin", 5) + if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin)) + holder.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5) if(prob(15)) C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) ..() /datum/reagent/medicine/mutadone name = "Mutadone" - id = "mutadone" description = "Removes jitteriness and restores genetic defects." color = "#5096C8" taste_description = "acid" @@ -910,7 +874,6 @@ /datum/reagent/medicine/antihol name = "Antihol" - id = "antihol" description = "Purges alcoholic substance from the patient's body and eliminates its side effects." color = "#00B4C8" taste_description = "raw egg" @@ -930,7 +893,6 @@ /datum/reagent/medicine/stimulants name = "Stimulants" - id = "stimulants" description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage." color = "#78008C" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -938,10 +900,10 @@ /datum/reagent/medicine/stimulants/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/medicine/stimulants/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M) @@ -965,7 +927,6 @@ /datum/reagent/medicine/insulin name = "Insulin" - id = "insulin" description = "Increases sugar depletion rates." reagent_state = LIQUID color = "#FFFFF0" @@ -974,13 +935,12 @@ /datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M) if(M.AdjustSleeping(-20, FALSE)) . = 1 - M.reagents.remove_reagent("sugar", 3) + M.reagents.remove_reagent(/datum/reagent/consumable/sugar, 3) ..() //Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient. /datum/reagent/medicine/bicaridine name = "Bicaridine" - id = "bicaridine" description = "Restores bruising. Overdose causes it instead." reagent_state = LIQUID color = "#C8A5DC" @@ -998,7 +958,6 @@ /datum/reagent/medicine/dexalin name = "Dexalin" - id = "dexalin" description = "Restores oxygen loss. Overdose causes it instead." reagent_state = LIQUID color = "#C8A5DC" @@ -1016,7 +975,6 @@ /datum/reagent/medicine/kelotane name = "Kelotane" - id = "kelotane" description = "Restores fire damage. Overdose causes it instead." reagent_state = LIQUID color = "#C8A5DC" @@ -1034,7 +992,6 @@ /datum/reagent/medicine/antitoxin name = "Anti-Toxin" - id = "antitoxin" description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage." reagent_state = LIQUID color = "#C8A5DC" @@ -1044,7 +1001,7 @@ /datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.id,1) + M.reagents.remove_reagent(R.type,1) ..() . = 1 @@ -1055,7 +1012,6 @@ /datum/reagent/medicine/inaprovaline name = "Inaprovaline" - id = "inaprovaline" description = "Stabilizes the breathing of patients. Good for those in critical condition." reagent_state = LIQUID color = "#C8A5DC" @@ -1067,7 +1023,6 @@ /datum/reagent/medicine/tricordrazine name = "Tricordrazine" - id = "tricordrazine" description = "Has a high chance to heal all types of damage. Overdose instead causes it." reagent_state = LIQUID color = "#C8A5DC" @@ -1093,7 +1048,6 @@ /datum/reagent/medicine/regen_jelly name = "Regenerative Jelly" - id = "regen_jelly" description = "Gradually regenerates all types of damage, without harming slime anatomy." reagent_state = LIQUID color = "#91D865" @@ -1109,7 +1063,6 @@ /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" - id = "syndicate_nanites" description = "Miniature medical robots that swiftly restore bodily damage." reagent_state = SOLID color = "#555555" @@ -1127,14 +1080,13 @@ /datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots if(prob(25)) - M.reagents.remove_reagent(src.id, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code + M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies ..() . = 1 /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" - id = "earthsblood" description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain." color = rgb(255, 175, 0) overdose_threshold = 25 @@ -1160,7 +1112,6 @@ /datum/reagent/medicine/haloperidol name = "Haloperidol" - id = "haloperidol" description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage." reagent_state = LIQUID color = "#27870a" @@ -1168,7 +1119,7 @@ /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/drug/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.id,5) + M.reagents.remove_reagent(R.type,5) M.drowsyness += 2 if(M.jitteriness >= 3) M.jitteriness -= 3 @@ -1182,7 +1133,6 @@ /datum/reagent/medicine/lavaland_extract name = "Lavaland Extract" - id = "lavaland_extract" description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise." color = "#C8A5DC" // rgb: 200, 165, 220 overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent @@ -1203,7 +1153,6 @@ //used for changeling's adrenaline power /datum/reagent/medicine/changelingadrenaline name = "Changeling Adrenaline" - id = "changelingadrenaline" description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." color = "#C8A5DC" overdose_threshold = 30 @@ -1221,17 +1170,16 @@ /datum/reagent/medicine/changelinghaste name = "Changeling Haste" - id = "changelinghaste" description = "Drastically increases movement speed, but deals toxin damage." color = "#C8A5DC" metabolization_rate = 1 /datum/reagent/medicine/changelinghaste/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/medicine/changelinghaste/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) @@ -1243,35 +1191,32 @@ // Heart attack code will not do damage if corazone is present // because it's SPACE MAGIC ASPIRIN name = "Corazone" - id = "corazone" description = "A medication used to treat pain, fever, and inflammation, along with heart attacks." color = "#F5F5F5" self_consuming = TRUE /datum/reagent/medicine/corazone/on_mob_add(mob/living/M) ..() - ADD_TRAIT(M, TRAIT_STABLEHEART, id) + ADD_TRAIT(M, TRAIT_STABLEHEART, type) /datum/reagent/medicine/corazone/on_mob_delete(mob/living/M) - REMOVE_TRAIT(M, TRAIT_STABLEHEART, id) + REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) ..() /datum/reagent/medicine/muscle_stimulant name = "Muscle Stimulant" - id = "muscle_stimulant" description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain." /datum/reagent/medicine/muscle_stimulant/on_mob_add(mob/living/M) . = ..() - M.ignore_slowdown(id) + M.ignore_slowdown(type) /datum/reagent/medicine/muscle_stimulant/on_mob_delete(mob/living/M) . = ..() - M.unignore_slowdown(id) + M.unignore_slowdown(type) /datum/reagent/medicine/modafinil name = "Modafinil" - id = "modafinil" description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with." reagent_state = LIQUID color = "#BEF7D8" // palish blue white @@ -1281,11 +1226,11 @@ var/overdose_progress = 0 // to track overdose progress /datum/reagent/medicine/modafinil/on_mob_add(mob/living/M) - ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, id) + ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type) ..() /datum/reagent/medicine/modafinil/on_mob_delete(mob/living/M) - REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, id) + REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type) ..() /datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M) @@ -1336,7 +1281,6 @@ /datum/reagent/medicine/psicodine name = "Psicodine" - id = "psicodine" description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." reagent_state = LIQUID color = "#07E79E" @@ -1345,10 +1289,10 @@ /datum/reagent/medicine/psicodine/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_FEARLESS, id) + ADD_TRAIT(L, TRAIT_FEARLESS, type) /datum/reagent/medicine/psicodine/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, id) + REMOVE_TRAIT(L, TRAIT_FEARLESS, type) ..() /datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c0379de1490..0645dbd80d0 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,7 +1,6 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) name = "Blood" - id = "blood" color = "#C80000" // rgb: 200, 0, 0 metabolization_rate = 5 //fast rate so it disappears fast. taste_description = "iron" @@ -26,9 +25,9 @@ if(iscarbon(L)) var/mob/living/carbon/C = L - if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) + if(C.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", reac_volume * 0.5) + C.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5) else C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) @@ -84,7 +83,6 @@ /datum/reagent/liquidgibs name = "Liquid gibs" - id = "liquidgibs" color = "#FF9966" description = "You don't even want to think about what's in here." taste_description = "gross iron" @@ -93,7 +91,6 @@ /datum/reagent/vaccine //data must contain virus type name = "Vaccine" - id = "vaccine" color = "#C81040" // rgb: 200, 16, 64 taste_description = "slime" @@ -111,7 +108,6 @@ /datum/reagent/water name = "Water" - id = "water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen." color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) taste_description = "water" @@ -183,7 +179,6 @@ /datum/reagent/water/holywater name = "Holy Water" - id = "holywater" description = "Water blessed by some deity." color = "#E0E8EF" // rgb: 224, 232, 239 glass_icon_state = "glass_clear" @@ -192,10 +187,10 @@ /datum/reagent/water/holywater/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_HOLY, id) + ADD_TRAIT(L, TRAIT_HOLY, type) /datum/reagent/water/holywater/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_HOLY, id) + REMOVE_TRAIT(L, TRAIT_HOLY, type) ..() /datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -242,9 +237,9 @@ remove_servant_of_ratvar(M) M.jitteriness = 0 M.stuttering = 0 - holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? + holder.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? return - holder.remove_reagent(id, 0.4) //fixed consumption to prevent balancing going out of whack + holder.remove_reagent(type, 0.4) //fixed consumption to prevent balancing going out of whack /datum/reagent/water/holywater/reaction_turf(turf/T, reac_volume) ..() @@ -257,13 +252,12 @@ /datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke name = "Unholy Water" - id = "unholywater" description = "Something that shouldn't exist on this plane of existence." taste_description = "suffering" /datum/reagent/fuel/unholywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) - M.reagents.add_reagent(id,reac_volume/4) + M.reagents.add_reagent(type,reac_volume/4) return return ..() @@ -284,12 +278,11 @@ M.adjustFireLoss(2, 0) M.adjustOxyLoss(2, 0) M.adjustBruteLoss(2, 0) - holder.remove_reagent(id, 1) + holder.remove_reagent(type, 1) return TRUE /datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god name = "Hell Water" - id = "hell_water" description = "YOUR FLESH! IT BURNS!" taste_description = "burning" @@ -299,17 +292,15 @@ M.adjustToxLoss(1, 0) M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard? M.adjustBrainLoss(5, 150) - holder.remove_reagent(id, 1) + holder.remove_reagent(type, 1) /datum/reagent/medicine/omnizine/godblood name = "Godblood" - id = "godblood" description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." overdose_threshold = 150 /datum/reagent/lube name = "Space Lube" - id = "lube" description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." color = "#009CA8" // rgb: 0, 156, 168 taste_description = "cherry" // by popular demand @@ -322,7 +313,6 @@ /datum/reagent/spraytan name = "Spray Tan" - id = "spraytan" description = "A substance applied to the skin to darken the skin." color = "#FFC080" // rgb: 255, 196, 128 Bright orange metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose @@ -412,13 +402,12 @@ else M.visible_message("[M] flexes [M.p_their()] arms.") if(prob(10)) - M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = "spraytan") + M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don???t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = /datum/reagent/spraytan) ..() return /datum/reagent/mutationtoxin name = "Stable Mutation Toxin" - id = "stablemutationtoxin" description = "A humanizing toxin." color = "#5EFF3B" //RGB: 94, 255, 59 metabolization_rate = INFINITY //So it instantly removes all of itself @@ -449,7 +438,6 @@ /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes name = "Mutation Toxin" - id = "mutationtoxin" description = "A corruptive toxin." color = "#13BC5E" // rgb: 19, 188, 94 race = /datum/species/jelly/slime @@ -457,14 +445,12 @@ /datum/reagent/mutationtoxin/felinid name = "Felinid Mutation Toxin" - id = "felinidmutationtoxin" color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/human/felinid mutationtext = "The pain subsides. You feel... like a degenerate." /datum/reagent/mutationtoxin/lizard name = "Lizard Mutation Toxin" - id = "lizardmutationtoxin" description = "A lizarding toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/lizard @@ -472,7 +458,6 @@ /datum/reagent/mutationtoxin/fly name = "Fly Mutation Toxin" - id = "flymutationtoxin" description = "An insectifying toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/fly @@ -480,7 +465,6 @@ /datum/reagent/mutationtoxin/moth name = "Moth Mutation Toxin" - id = "mothmutationtoxin" description = "A glowing toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/moth @@ -488,7 +472,6 @@ /datum/reagent/mutationtoxin/pod name = "Podperson Mutation Toxin" - id = "podmutationtoxin" description = "A vegetalizing toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/pod @@ -496,7 +479,6 @@ /datum/reagent/mutationtoxin/jelly name = "Imperfect Mutation Toxin" - id = "jellymutationtoxin" description = "An jellyfying toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/jelly @@ -504,7 +486,6 @@ /datum/reagent/mutationtoxin/golem name = "Golem Mutation Toxin" - id = "golemmutationtoxin" description = "A crystal toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/golem/random @@ -512,7 +493,6 @@ /datum/reagent/mutationtoxin/abductor name = "Abductor Mutation Toxin" - id = "abductormutationtoxin" description = "An alien toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/abductor @@ -520,7 +500,6 @@ /datum/reagent/mutationtoxin/android name = "Android Mutation Toxin" - id = "androidmutationtoxin" description = "A robotic toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/android @@ -530,7 +509,6 @@ //BLACKLISTED RACES /datum/reagent/mutationtoxin/skeleton name = "Skeleton Mutation Toxin" - id = "skeletonmutationtoxin" description = "A scary toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/skeleton @@ -538,7 +516,6 @@ /datum/reagent/mutationtoxin/zombie name = "Zombie Mutation Toxin" - id = "zombiemutationtoxin" description = "An undead toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past. @@ -546,7 +523,6 @@ /datum/reagent/mutationtoxin/ash name = "Ash Mutation Toxin" - id = "ashmutationtoxin" description = "An ashen toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/lizard/ashwalker @@ -556,7 +532,6 @@ //DANGEROUS RACES /datum/reagent/mutationtoxin/shadow name = "Shadow Mutation Toxin" - id = "shadowmutationtoxin" description = "A dark toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/shadow @@ -564,7 +539,6 @@ /datum/reagent/mutationtoxin/plasma name = "Plasma Mutation Toxin" - id = "plasmamutationtoxin" description = "A plasma-based toxin." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/plasmaman @@ -572,7 +546,6 @@ /datum/reagent/slime_toxin name = "Slime Mutation Toxin" - id = "slime_toxin" description = "A toxin that turns organic material into slime." color = "#5EFF3B" //RGB: 94, 255, 59 taste_description = "slime" @@ -589,7 +562,7 @@ to_chat(H, "Your jelly shifts and morphs, turning you into another subspecies!") var/species_type = pick(subtypesof(/datum/species/jelly)) H.set_species(species_type) - H.reagents.del_reagent(id) + H.reagents.del_reagent(type) switch(current_cycle) if(1 to 6) @@ -604,12 +577,11 @@ if(20 to INFINITY) var/species_type = pick(subtypesof(/datum/species/jelly)) H.set_species(species_type) - H.reagents.del_reagent(id) + H.reagents.del_reagent(type) to_chat(H, "You've become \a jellyperson!") /datum/reagent/mulligan name = "Mulligan Toxin" - id = "mulligan" description = "This toxin will rapidly change the DNA of human beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." color = "#5EFF3B" //RGB: 94, 255, 59 metabolization_rate = INFINITY @@ -625,7 +597,6 @@ /datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" - id = "amutationtoxin" description = "An advanced corruptive toxin produced by slimes." color = "#13BC5E" // rgb: 19, 188, 94 taste_description = "slime" @@ -636,7 +607,6 @@ /datum/reagent/gluttonytoxin name = "Gluttony's Blessing" - id = "gluttonytoxin" description = "An advanced corruptive toxin produced by something terrible." color = "#5EFF3B" //RGB: 94, 255, 59 can_synth = FALSE @@ -647,7 +617,6 @@ /datum/reagent/serotrotium name = "Serotrotium" - id = "serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." color = "#202040" // rgb: 20, 20, 40 metabolization_rate = 0.25 * REAGENTS_METABOLISM @@ -661,7 +630,6 @@ /datum/reagent/oxygen name = "Oxygen" - id = "oxygen" description = "A colorless, odorless gas. Grows on trees but is still pretty valuable." reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 @@ -681,7 +649,6 @@ /datum/reagent/copper name = "Copper" - id = "copper" description = "A highly ductile metal. Things made out of copper aren't very durable, but it makes a decent material for electrical wiring." reagent_state = SOLID color = "#6E3B08" // rgb: 110, 59, 8 @@ -696,7 +663,6 @@ /datum/reagent/nitrogen name = "Nitrogen" - id = "nitrogen" description = "A colorless, odorless, tasteless gas. A simple asphyxiant that can silently displace vital oxygen." reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 @@ -716,7 +682,6 @@ /datum/reagent/hydrogen name = "Hydrogen" - id = "hydrogen" description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 @@ -724,7 +689,6 @@ /datum/reagent/potassium name = "Potassium" - id = "potassium" description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." reagent_state = SOLID color = "#A0A0A0" // rgb: 160, 160, 160 @@ -732,7 +696,6 @@ /datum/reagent/mercury name = "Mercury" - id = "mercury" description = "A curious metal that's a liquid at room temperature. Neurodegenerative and very bad for the mind." color = "#484848" // rgb: 72, 72, 72A taste_mult = 0 // apparently tasteless. @@ -747,7 +710,6 @@ /datum/reagent/sulfur name = "Sulfur" - id = "sulfur" description = "A sickly yellow solid mostly known for its nasty smell. It's actually much more helpful than it looks in biochemisty." reagent_state = SOLID color = "#BF8C00" // rgb: 191, 140, 0 @@ -755,7 +717,6 @@ /datum/reagent/carbon name = "Carbon" - id = "carbon" description = "A crumbly black solid that, while unexciting on a physical level, forms the base of all known life. Kind of a big deal." reagent_state = SOLID color = "#1C1300" // rgb: 30, 20, 0 @@ -769,7 +730,6 @@ /datum/reagent/chlorine name = "Chlorine" - id = "chlorine" description = "A pale yellow gas that's well known as an oxidizer. While it forms many harmless molecules in its elemental form it is far from harmless." reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 @@ -782,7 +742,6 @@ /datum/reagent/fluorine name = "Fluorine" - id = "fluorine" description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest." reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 @@ -795,7 +754,6 @@ /datum/reagent/sodium name = "Sodium" - id = "sodium" description = "A soft silver metal that can easily be cut with a knife. It's not salt just yet, so refrain from putting in on your chips." reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 @@ -803,7 +761,6 @@ /datum/reagent/phosphorus name = "Phosphorus" - id = "phosphorus" description = "A ruddy red powder that burns readily. Though it comes in many colors, the general theme is always the same." reagent_state = SOLID color = "#832828" // rgb: 131, 40, 40 @@ -811,7 +768,6 @@ /datum/reagent/lithium name = "Lithium" - id = "lithium" description = "A silver metal, its claim to fame is its remarkably low density. Using it is a bit too effective in calming oneself down." reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 @@ -826,14 +782,12 @@ /datum/reagent/glycerol name = "Glycerol" - id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." color = "#808080" // rgb: 128, 128, 128 taste_description = "sweetness" /datum/reagent/space_cleaner/sterilizine name = "Sterilizine" - id = "sterilizine" description = "Sterilizes wounds in preparation for surgery." color = "#C8A5DC" // rgb: 200, 165, 220 taste_description = "bitterness" @@ -848,7 +802,6 @@ /datum/reagent/iron name = "Iron" - id = "iron" description = "Pure iron is a metal." reagent_state = SOLID taste_description = "iron" @@ -863,12 +816,11 @@ /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them. if(holder && holder.chem_temp < 100) // COLD iron. - M.reagents.add_reagent("toxin", reac_volume) + M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) ..() /datum/reagent/gold name = "Gold" - id = "gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." reagent_state = SOLID color = "#F7C430" // rgb: 247, 196, 48 @@ -876,7 +828,6 @@ /datum/reagent/silver name = "Silver" - id = "silver" description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." reagent_state = SOLID color = "#D0D0D0" // rgb: 208, 208, 208 @@ -884,12 +835,11 @@ /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_SILVER)) - M.reagents.add_reagent("toxin", reac_volume) + M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) ..() /datum/reagent/uranium name ="Uranium" - id = "uranium" description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." reagent_state = SOLID color = "#B8B8C0" // rgb: 184, 184, 192 @@ -906,11 +856,10 @@ var/obj/effect/decal/cleanable/greenglow/GG = locate() in T.contents if(!GG) GG = new/obj/effect/decal/cleanable/greenglow(T) - GG.reagents.add_reagent(id, reac_volume) + GG.reagents.add_reagent(type, reac_volume) /datum/reagent/uranium/radium name = "Radium" - id = "radium" description = "Radium is an alkaline earth metal. It is extremely radioactive." reagent_state = SOLID color = "#C7C7C7" // rgb: 199,199,199 @@ -919,7 +868,6 @@ /datum/reagent/bluespace name = "Bluespace Dust" - id = "bluespace" description = "A dust composed of microscopic bluespace crystals, with minor space-warping properties." reagent_state = SOLID color = "#0000CC" @@ -943,7 +891,6 @@ /datum/reagent/aluminium name = "Aluminium" - id = "aluminium" description = "A silvery white and ductile member of the boron group of chemical elements." reagent_state = SOLID color = "#A8A8A8" // rgb: 168, 168, 168 @@ -951,7 +898,6 @@ /datum/reagent/silicon name = "Silicon" - id = "silicon" description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." reagent_state = SOLID color = "#A8A8A8" // rgb: 168, 168, 168 @@ -959,7 +905,6 @@ /datum/reagent/fuel name = "Welding fuel" - id = "welding_fuel" description = "Required for welders. Flammable." color = "#660000" // rgb: 102, 0, 0 taste_description = "gross metal" @@ -980,7 +925,6 @@ /datum/reagent/space_cleaner name = "Space cleaner" - id = "cleaner" description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" color = "#A5F0EE" // rgb: 165, 240, 238 taste_description = "sourness" @@ -1039,7 +983,6 @@ /datum/reagent/space_cleaner/ez_clean name = "EZ Clean" - id = "ez_clean" description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "acid" @@ -1058,7 +1001,6 @@ /datum/reagent/cryptobiolin name = "Cryptobiolin" - id = "cryptobiolin" description = "Cryptobiolin causes confusion and dizziness." color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 1.5 * REAGENTS_METABOLISM @@ -1073,7 +1015,6 @@ /datum/reagent/impedrezene name = "Impedrezene" - id = "impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." color = "#C8A5DC" // rgb: 200, 165, 220A taste_description = "numbness" @@ -1090,7 +1031,6 @@ /datum/reagent/nanomachines name = "Nanomachines" - id = "nanomachines" description = "Microscopic construction robots." color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE @@ -1102,7 +1042,6 @@ /datum/reagent/xenomicrobes name = "Xenomicrobes" - id = "xenomicrobes" description = "Microbes with an entirely alien cellular structure." color = "#535E66" // rgb: 83, 94, 102 can_synth = FALSE @@ -1114,7 +1053,6 @@ /datum/reagent/fungalspores name = "Tubercle bacillus Cosmosis microbes" - id = "fungalspores" description = "Active fungal spores." color = "#92D17D" // rgb: 146, 209, 125 can_synth = FALSE @@ -1126,7 +1064,6 @@ /datum/reagent/snail name = "Agent-S" - id = "snailserum" description = "Virological agent that infects the subject with Gastrolosis." color = "#003300" // rgb(0, 51, 0) taste_description = "goo" @@ -1138,14 +1075,12 @@ /datum/reagent/fluorosurfactant//foam precursor name = "Fluorosurfactant" - id = "fluorosurfactant" description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." color = "#9E6B38" // rgb: 158, 107, 56 taste_description = "metal" /datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" - id = "foaming_agent" description = "An agent that yields metallic foam when mixed with light metal and a strong acid." reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 @@ -1153,7 +1088,6 @@ /datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. name = "Smart foaming agent" - id = "smart_foaming_agent" description = "An agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid." reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 @@ -1161,7 +1095,6 @@ /datum/reagent/ammonia name = "Ammonia" - id = "ammonia" description = "A caustic substance commonly used in fertilizer or household cleaners." reagent_state = GAS color = "#404030" // rgb: 64, 64, 48 @@ -1169,14 +1102,12 @@ /datum/reagent/diethylamine name = "Diethylamine" - id = "diethylamine" description = "A secondary amine, mildly corrosive." color = "#604030" // rgb: 96, 64, 48 taste_description = "iron" /datum/reagent/carbondioxide name = "Carbon Dioxide" - id = "co2" reagent_state = GAS description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs." color = "#B0B0B0" // rgb : 192, 192, 192 @@ -1196,7 +1127,6 @@ /datum/reagent/nitrous_oxide name = "Nitrous Oxide" - id = "nitrous_oxide" description = "A potent oxidizer used as fuel in rockets and as an anaesthetic during surgery." reagent_state = LIQUID metabolization_rate = 1.5 * REAGENTS_METABOLISM @@ -1230,7 +1160,6 @@ /datum/reagent/stimulum name = "Stimulum" - id = "stimulum" description = "An unstable experimental gas that greatly increases the energy of those that inhale it" reagent_state = GAS metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because stimulum/nitryl are handled through gas breathing, metabolism must be lower for breathcode to keep up @@ -1239,12 +1168,12 @@ /datum/reagent/stimulum/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_STUNIMMUNE, id) - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, id) + ADD_TRAIT(L, TRAIT_STUNIMMUNE, type) + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) /datum/reagent/stimulum/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, id) - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, id) + REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, type) + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) ..() /datum/reagent/stimulum/on_mob_life(mob/living/carbon/M) @@ -1253,7 +1182,6 @@ /datum/reagent/nitryl name = "Nitryl" - id = "no2" description = "A highly reactive gas that makes you feel faster" reagent_state = GAS metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because stimulum/nitryl are handled through gas breathing, metabolism must be lower for breathcode to keep up @@ -1262,10 +1190,10 @@ /datum/reagent/nitryl/on_mob_add(mob/living/L) ..() - L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/nitryl/on_mob_delete(mob/living/L) - L.remove_movespeed_modifier(id) + L.remove_movespeed_modifier(type) ..() /////////////////////////Coloured Crayon Powder//////////////////////////// @@ -1274,7 +1202,6 @@ /datum/reagent/colorful_reagent/crayonpowder name = "Crayon Powder" - id = "crayon powder" var/colorname = "none" description = "A powder made by grinding down crayons, good for colouring chemical reagents." reagent_state = SOLID @@ -1287,63 +1214,54 @@ /datum/reagent/colorful_reagent/crayonpowder/red name = "Red Crayon Powder" - id = "redcrayonpowder" colorname = "red" color = "#DA0000" // red random_color_list = list("#DA0000") /datum/reagent/colorful_reagent/crayonpowder/orange name = "Orange Crayon Powder" - id = "orangecrayonpowder" colorname = "orange" color = "#FF9300" // orange random_color_list = list("#FF9300") /datum/reagent/colorful_reagent/crayonpowder/yellow name = "Yellow Crayon Powder" - id = "yellowcrayonpowder" colorname = "yellow" color = "#FFF200" // yellow random_color_list = list("#FFF200") /datum/reagent/colorful_reagent/crayonpowder/green name = "Green Crayon Powder" - id = "greencrayonpowder" colorname = "green" color = "#A8E61D" // green random_color_list = list("#A8E61D") /datum/reagent/colorful_reagent/crayonpowder/blue name = "Blue Crayon Powder" - id = "bluecrayonpowder" colorname = "blue" color = "#00B7EF" // blue random_color_list = list("#00B7EF") /datum/reagent/colorful_reagent/crayonpowder/purple name = "Purple Crayon Powder" - id = "purplecrayonpowder" colorname = "purple" color = "#DA00FF" // purple random_color_list = list("#DA00FF") /datum/reagent/colorful_reagent/crayonpowder/invisible name = "Invisible Crayon Powder" - id = "invisiblecrayonpowder" colorname = "invisible" color = "#FFFFFF00" // white + no alpha random_color_list = list(null) //because using the powder color turns things invisible /datum/reagent/colorful_reagent/crayonpowder/black name = "Black Crayon Powder" - id = "blackcrayonpowder" colorname = "black" color = "#1C1C1C" // not quite black random_color_list = list("#404040") /datum/reagent/colorful_reagent/crayonpowder/white name = "White Crayon Powder" - id = "whitecrayonpowder" colorname = "white" color = "#FFFFFF" // white random_color_list = list("#FFFFFF") //doesn't actually change appearance at all @@ -1355,7 +1273,6 @@ /datum/reagent/plantnutriment name = "Generic nutriment" - id = "plantnutriment" description = "Some kind of nutriment. You can't really tell what it is. You should probably report it, along with how you obtained it." color = "#000000" // RBG: 0, 0, 0 var/tox_prob = 0 @@ -1369,21 +1286,18 @@ /datum/reagent/plantnutriment/eznutriment name = "E-Z-Nutrient" - id = "eznutriment" description = "Cheap and extremely common type of plant nutriment." color = "#376400" // RBG: 50, 100, 0 tox_prob = 10 /datum/reagent/plantnutriment/left4zednutriment name = "Left 4 Zed" - id = "left4zednutriment" description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 25 /datum/reagent/plantnutriment/robustharvestnutriment name = "Robust Harvest" - id = "robustharvestnutriment" description = "Very potent nutriment that prevents plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 15 @@ -1400,7 +1314,6 @@ /datum/reagent/oil name = "Oil" - id = "oil" description = "Burns in a small smoky fire, mostly used to get Ash." reagent_state = LIQUID color = "#C8A5DC" @@ -1408,7 +1321,6 @@ /datum/reagent/stable_plasma name = "Stable Plasma" - id = "stable_plasma" description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." reagent_state = LIQUID color = "#C8A5DC" @@ -1421,7 +1333,6 @@ /datum/reagent/iodine name = "Iodine" - id = "iodine" description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing." reagent_state = LIQUID color = "#C8A5DC" @@ -1429,7 +1340,6 @@ /datum/reagent/carpet name = "Carpet" - id = "carpet" description = "For those that need a more creative way to roll out a red carpet." reagent_state = LIQUID color = "#C8A5DC" @@ -1443,7 +1353,6 @@ /datum/reagent/bromine name = "Bromine" - id = "bromine" description = "A brownish liquid that's highly reactive. Useful for stopping free radicals, but not intended for human consumption." reagent_state = LIQUID color = "#C8A5DC" @@ -1451,7 +1360,6 @@ /datum/reagent/phenol name = "Phenol" - id = "phenol" description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own." reagent_state = LIQUID color = "#C8A5DC" @@ -1459,7 +1367,6 @@ /datum/reagent/ash name = "Ash" - id = "ash" description = "Supposedly phoenixes rise from these, but you've never seen it." reagent_state = LIQUID color = "#C8A5DC" @@ -1467,7 +1374,6 @@ /datum/reagent/acetone name = "Acetone" - id = "acetone" description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life." reagent_state = LIQUID color = "#C8A5DC" @@ -1475,7 +1381,6 @@ /datum/reagent/colorful_reagent name = "Colorful Reagent" - id = "colorful_reagent" description = "Thoroughly sample the rainbow." reagent_state = LIQUID color = "#C8A5DC" @@ -1503,7 +1408,6 @@ /datum/reagent/hair_dye name = "Quantum Hair Dye" - id = "hair_dye" description = "Has a high chance of making you look like a mad scientist." reagent_state = LIQUID color = "#C8A5DC" @@ -1520,7 +1424,6 @@ /datum/reagent/barbers_aid name = "Barber's Aid" - id = "barbers_aid" description = "A solution to hair loss across the world." reagent_state = LIQUID color = "#C8A5DC" @@ -1538,7 +1441,6 @@ /datum/reagent/concentrated_barbers_aid name = "Concentrated Barber's Aid" - id = "concentrated_barbers_aid" description = "A concentrated solution to hair loss across the world." reagent_state = LIQUID color = "#C8A5DC" @@ -1554,7 +1456,6 @@ /datum/reagent/saltpetre name = "Saltpetre" - id = "saltpetre" description = "Volatile. Controversial. Third Thing." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 @@ -1562,7 +1463,6 @@ /datum/reagent/lye name = "Lye" - id = "lye" description = "Also known as sodium hydroxide. As a profession making this is somewhat underwhelming." reagent_state = LIQUID color = "#FFFFD6" // very very light yellow @@ -1570,7 +1470,6 @@ /datum/reagent/drying_agent name = "Drying agent" - id = "drying_agent" description = "A desiccant. Can be used to dry things." reagent_state = LIQUID color = "#A70FFF" @@ -1590,51 +1489,43 @@ /datum/reagent/toxin/mutagen/mutagenvirusfood name = "mutagenic agar" - id = "mutagenvirusfood" color = "#A3C00F" // rgb: 163,192,15 taste_description = "sourness" /datum/reagent/toxin/mutagen/mutagenvirusfood/sugar name = "sucrose agar" - id = "sugarvirusfood" color = "#41B0C0" // rgb: 65,176,192 taste_description = "sweetness" /datum/reagent/medicine/synaptizine/synaptizinevirusfood name = "virus rations" - id = "synaptizinevirusfood" color = "#D18AA5" // rgb: 209,138,165 taste_description = "bitterness" /datum/reagent/toxin/plasma/plasmavirusfood name = "virus plasma" - id = "plasmavirusfood" color = "#A69DA9" // rgb: 166,157,169 taste_description = "bitterness" taste_mult = 1.5 /datum/reagent/toxin/plasma/plasmavirusfood/weak name = "weakened virus plasma" - id = "weakplasmavirusfood" color = "#CEC3C6" // rgb: 206,195,198 taste_description = "bitterness" taste_mult = 1.5 /datum/reagent/uranium/uraniumvirusfood name = "decaying uranium gel" - id = "uraniumvirusfood" color = "#67ADBA" // rgb: 103,173,186 taste_description = "the inside of a reactor" /datum/reagent/uranium/uraniumvirusfood/unstable name = "unstable uranium gel" - id = "uraniumplasmavirusfood_unstable" color = "#2FF2CB" // rgb: 47,242,203 taste_description = "the inside of a reactor" /datum/reagent/uranium/uraniumvirusfood/stable name = "stable uranium gel" - id = "uraniumplasmavirusfood_stable" color = "#04506C" // rgb: 4,80,108 taste_description = "the inside of a reactor" @@ -1642,7 +1533,6 @@ /datum/reagent/royal_bee_jelly name = "royal bee jelly" - id = "royal_bee_jelly" description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." color = "#00ff80" taste_description = "strange honey" @@ -1657,7 +1547,6 @@ /datum/reagent/romerol name = "Romerol" // the REAL zombie powder - id = "romerol" description = "Romerol is a highly experimental bioterror agent \ which causes dormant nodules to be etched into the grey matter of \ the subject. These nodules only become active upon death of the \ @@ -1677,7 +1566,6 @@ /datum/reagent/magillitis name = "Magillitis" - id = "magillitis" description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." reagent_state = LIQUID color = "#00f041" @@ -1689,7 +1577,6 @@ /datum/reagent/growthserum name = "Growth Serum" - id = "growthserum" description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant color = "#ff0000"//strong red. rgb 255, 0, 0 var/current_size = 1 @@ -1721,14 +1608,12 @@ /datum/reagent/plastic_polymers name = "plastic polymers" - id = "plastic_polymers" description = "the petroleum based components of plastic." color = "#f7eded" taste_description = "plastic" /datum/reagent/glitter name = "generic glitter" - id = "glitter" description = "if you can see this description, contact a coder." color = "#FFFFFF" //pure white taste_description = "plastic" @@ -1742,27 +1627,23 @@ /datum/reagent/glitter/pink name = "pink glitter" - id = "pink_glitter" description = "pink sparkles that get everywhere" color = "#ff8080" //A light pink color glitter_type = /obj/effect/decal/cleanable/glitter/pink /datum/reagent/glitter/white name = "white glitter" - id = "white_glitter" description = "white sparkles that get everywhere" glitter_type = /obj/effect/decal/cleanable/glitter/white /datum/reagent/glitter/blue name = "blue glitter" - id = "blue_glitter" description = "blue sparkles that get everywhere" color = "#4040FF" //A blueish color glitter_type = /obj/effect/decal/cleanable/glitter/blue /datum/reagent/pax name = "Pax" - id = "pax" description = "A colorless liquid that suppresses violence on the subjects." color = "#AAAAAA55" taste_description = "water" @@ -1770,15 +1651,14 @@ /datum/reagent/pax/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_PACIFISM, id) + ADD_TRAIT(L, TRAIT_PACIFISM, type) /datum/reagent/pax/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PACIFISM, id) + REMOVE_TRAIT(L, TRAIT_PACIFISM, type) ..() /datum/reagent/bz_metabolites name = "BZ metabolites" - id = "bz_metabolites" description = "A harmless metabolite of BZ gas" color = "#FAFF00" taste_description = "acrid cinnamon" @@ -1786,11 +1666,11 @@ /datum/reagent/bz_metabolites/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, CHANGELING_HIVEMIND_MUTE, id) + ADD_TRAIT(L, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_delete(mob/living/L) ..() - REMOVE_TRAIT(L, CHANGELING_HIVEMIND_MUTE, id) + REMOVE_TRAIT(L, CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_life(mob/living/L) if(L.mind) @@ -1801,7 +1681,6 @@ /datum/reagent/pax/peaceborg name = "synth-pax" - id = "synthpax" description = "A colorless liquid that suppresses violence on the subjects. Cheaper to synthetize, but wears out faster than normal Pax." metabolization_rate = 1.5 * REAGENTS_METABOLISM @@ -1810,7 +1689,6 @@ /datum/reagent/peaceborg/confuse name = "Dizzying Solution" - id = "dizzysolution" description = "Makes the target off balance and dizzy" metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "dizziness" @@ -1827,7 +1705,6 @@ /datum/reagent/peaceborg/tire name = "Tiring Solution" - id = "tiresolution" description = "An extremely weak stamina-toxin that tires out the target. Completely harmless." metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "tiredness" @@ -1843,7 +1720,6 @@ /datum/reagent/tranquility name = "Tranquility" - id = "tranquility" description = "A highly mutative liquid of unknown origin." color = "#9A6750" //RGB: 154, 103, 80 taste_description = "inner peace" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index a6cb066b780..f16bfec6faa 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -1,7 +1,6 @@ /datum/reagent/thermite name = "Thermite" - id = "thermite" description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." reagent_state = SOLID color = "#550000" @@ -18,14 +17,12 @@ /datum/reagent/nitroglycerin name = "Nitroglycerin" - id = "nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." color = "#808080" // rgb: 128, 128, 128 taste_description = "oil" /datum/reagent/stabilizing_agent name = "Stabilizing Agent" - id = "stabilizing_agent" description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID color = "#FFFF00" @@ -33,7 +30,6 @@ /datum/reagent/clf3 name = "Chlorine Trifluoride" - id = "clf3" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." reagent_state = LIQUID color = "#FFC8C8" @@ -77,7 +73,6 @@ /datum/reagent/sorium name = "Sorium" - id = "sorium" description = "Sends everything flying from the detonation point." reagent_state = LIQUID color = "#5A64C8" @@ -85,7 +80,6 @@ /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" - id = "liquid_dark_matter" description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#210021" @@ -93,7 +87,6 @@ /datum/reagent/blackpowder name = "Black Powder" - id = "blackpowder" description = "Explodes. Violently." reagent_state = LIQUID color = "#000000" @@ -114,7 +107,6 @@ /datum/reagent/flash_powder name = "Flash Powder" - id = "flash_powder" description = "Makes a very bright flash." reagent_state = LIQUID color = "#C8C8C8" @@ -122,7 +114,6 @@ /datum/reagent/smoke_powder name = "Smoke Powder" - id = "smoke_powder" description = "Makes a large cloud of smoke that can carry reagents." reagent_state = LIQUID color = "#C8C8C8" @@ -130,7 +121,6 @@ /datum/reagent/sonic_powder name = "Sonic Powder" - id = "sonic_powder" description = "Makes a deafening noise." reagent_state = LIQUID color = "#C8C8C8" @@ -138,7 +128,6 @@ /datum/reagent/phlogiston name = "Phlogiston" - id = "phlogiston" description = "Catches you on fire and makes you ignite." reagent_state = LIQUID color = "#FA00AF" @@ -160,7 +149,6 @@ /datum/reagent/napalm name = "Napalm" - id = "napalm" description = "Very flammable." reagent_state = LIQUID color = "#FA00AF" @@ -177,7 +165,6 @@ /datum/reagent/cryostylane name = "Cryostylane" - id = "cryostylane" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the container 0K." color = "#0000DC" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -185,8 +172,8 @@ /datum/reagent/cryostylane/on_mob_life(mob/living/carbon/M) //TODO: code freezing into an ice cube - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 0.5) + if(M.reagents.has_reagent(/datum/reagent/oxygen)) + M.reagents.remove_reagent(/datum/reagent/oxygen, 0.5) M.adjust_bodytemperature(-15) ..() @@ -197,21 +184,19 @@ /datum/reagent/pyrosium name = "Pyrosium" - id = "pyrosium" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents in the container." color = "#64FAC8" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" /datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M) - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 0.5) + if(M.reagents.has_reagent(/datum/reagent/oxygen)) + M.reagents.remove_reagent(/datum/reagent/oxygen, 0.5) M.adjust_bodytemperature(15) ..() /datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. name = "Teslium" - id = "teslium" description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water." reagent_state = LIQUID color = "#20324D" //RGB: 32, 50, 77 @@ -229,7 +214,6 @@ /datum/reagent/teslium/energized_jelly name = "Energized Jelly" - id = "energized_jelly" description = "Electrically-charged jelly. Boosts jellypeople's nervous system, but only shocks other lifeforms." reagent_state = LIQUID color = "#CAFF43" @@ -248,7 +232,6 @@ /datum/reagent/firefighting_foam name = "Firefighting Foam" - id = "firefighting_foam" description = "A historical fire suppressant. Originally believed to simply displace oxygen to starve fires, it actually interferes with the combustion reaction itself. Vastly superior to the cheap water-based extinguishers found on NT vessels." reagent_state = LIQUID color = "#A6FAFF55" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 8e77f5fdcd2..a8374ddffaf 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -3,7 +3,6 @@ /datum/reagent/toxin name = "Toxin" - id = "toxin" description = "A toxic chemical." color = "#CF3600" // rgb: 207, 54, 0 taste_description = "bitterness" @@ -19,7 +18,6 @@ /datum/reagent/toxin/amatoxin name = "Amatoxin" - id = "amatoxin" description = "A powerful poison derived from certain species of mushroom." color = "#792300" // rgb: 121, 35, 0 toxpwr = 2.5 @@ -27,7 +25,6 @@ /datum/reagent/toxin/mutagen name = "Unstable mutagen" - id = "mutagen" description = "Might cause unpredictable mutations. Keep away from children." color = "#00FF00" toxpwr = 0 @@ -55,7 +52,6 @@ /datum/reagent/toxin/plasma name = "Plasma" - id = "plasma" description = "Plasma in its liquid form." taste_description = "bitterness" specific_heat = SPECIFIC_HEAT_PLASMA @@ -64,8 +60,8 @@ toxpwr = 3 /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) - if(holder.has_reagent("epinephrine")) - holder.remove_reagent("epinephrine", 2*REM) + if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) + holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2*REM) C.adjustPlasma(20) return ..() @@ -89,7 +85,6 @@ /datum/reagent/toxin/lexorin name = "Lexorin" - id = "lexorin" description = "A powerful poison used to stop respiration." color = "#7DC3A0" toxpwr = 0 @@ -110,7 +105,6 @@ /datum/reagent/toxin/slimejelly name = "Slime Jelly" - id = "slimejelly" description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." color = "#801E28" // rgb: 128, 30, 40 toxpwr = 0 @@ -129,7 +123,6 @@ /datum/reagent/toxin/minttoxin name = "Mint Toxin" - id = "minttoxin" description = "Useful for dealing with undesirable customers." color = "#CF3600" // rgb: 207, 54, 0 toxpwr = 0 @@ -142,7 +135,6 @@ /datum/reagent/toxin/carpotoxin name = "Carpotoxin" - id = "carpotoxin" description = "A deadly neurotoxin produced by the dreaded spess carp." silent_toxin = TRUE color = "#003333" // rgb: 0, 51, 51 @@ -151,7 +143,6 @@ /datum/reagent/toxin/zombiepowder name = "Zombie Powder" - id = "zombiepowder" description = "A strong neurotoxin that puts the subject into a death-like state." silent_toxin = TRUE reagent_state = SOLID @@ -161,10 +152,10 @@ /datum/reagent/toxin/zombiepowder/on_mob_add(mob/living/L) ..() - L.fakedeath(id) + L.fakedeath(type) /datum/reagent/toxin/zombiepowder/on_mob_delete(mob/living/L) - L.cure_fakedeath(id) + L.cure_fakedeath(type) ..() /datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/carbon/M) @@ -174,7 +165,6 @@ /datum/reagent/toxin/ghoulpowder name = "Ghoul Powder" - id = "ghoulpowder" description = "A strong neurotoxin that slows metabolism to a death-like state, while keeping the patient fully active. Causes toxin buildup if used too long." reagent_state = SOLID color = "#664700" // rgb: 102, 71, 0 @@ -183,10 +173,10 @@ /datum/reagent/toxin/ghoulpowder/on_mob_add(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_FAKEDEATH, id) + ADD_TRAIT(L, TRAIT_FAKEDEATH, type) /datum/reagent/toxin/ghoulpowder/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FAKEDEATH, id) + REMOVE_TRAIT(L, TRAIT_FAKEDEATH, type) ..() /datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/M) @@ -196,7 +186,6 @@ /datum/reagent/toxin/mindbreaker name = "Mindbreaker Toxin" - id = "mindbreaker" description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality." color = "#B31008" // rgb: 139, 166, 233 toxpwr = 0 @@ -208,7 +197,6 @@ /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" - id = "plantbgone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" color = "#49002E" // rgb: 73, 0, 46 toxpwr = 1 @@ -234,13 +222,11 @@ /datum/reagent/toxin/plantbgone/weedkiller name = "Weed Killer" - id = "weedkiller" description = "A harmful toxic mixture to kill weeds. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 /datum/reagent/toxin/pestkiller name = "Pest Killer" - id = "pestkiller" description = "A harmful toxic mixture to kill pests. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 toxpwr = 1 @@ -253,7 +239,6 @@ /datum/reagent/toxin/spore name = "Spore Toxin" - id = "spore" description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" toxpwr = 1 @@ -266,7 +251,6 @@ /datum/reagent/toxin/spore_burning name = "Burning Spore Toxin" - id = "spore_burning" description = "A natural toxin produced by blob spores that induces combustion in its victim." color = "#9ACD32" toxpwr = 0.5 @@ -279,7 +263,6 @@ /datum/reagent/toxin/chloralhydrate name = "Chloral Hydrate" - id = "chloralhydrate" description = "A powerful sedative that induces confusion and drowsiness before putting its target to sleep." silent_toxin = TRUE reagent_state = SOLID @@ -301,28 +284,8 @@ . = 1 ..() -/datum/reagent/toxin/chloralhydratedelayed //sedates half as quickly and does not cause toxloss. same name/desc so it doesn't give away sleepypens - name = "Chloral Hydrate" - id = "chloralhydratedelayed" - description = "A powerful sedative that induces confusion and drowsiness before putting its target to sleep." - silent_toxin = TRUE - reagent_state = SOLID - color = "#000067" // rgb: 0, 0, 103 - toxpwr = 0 - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -/datum/reagent/toxin/chloralhydratedelayed/on_mob_life(mob/living/carbon/M) - switch(current_cycle) - if(10 to 20) - M.confused += 1 - M.drowsyness += 1 - if(20 to INFINITY) - M.Sleeping(40, 0) - ..() - /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots name = "Beer" - id = "fakebeer" description = "A specially-engineered sedative disguised as beer. It induces instant sleep in its target." color = "#664300" // rgb: 102, 67, 0 metabolization_rate = 1.5 * REAGENTS_METABOLISM @@ -342,7 +305,6 @@ /datum/reagent/toxin/coffeepowder name = "Coffee Grounds" - id = "coffeepowder" description = "Finely ground coffee beans, used to make coffee." reagent_state = SOLID color = "#5B2E0D" // rgb: 91, 46, 13 @@ -350,7 +312,6 @@ /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" - id = "teapowder" description = "Finely shredded tea leaves, used for making tea." reagent_state = SOLID color = "#7F8400" // rgb: 127, 132, 0 @@ -358,7 +319,6 @@ /datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" - id = "mutetoxin" description = "A nonlethal poison that inhibits speech in its victim." silent_toxin = TRUE color = "#F0F8FF" // rgb: 240, 248, 255 @@ -371,7 +331,6 @@ /datum/reagent/toxin/staminatoxin name = "Tirizene" - id = "tirizene" description = "A nonlethal poison that causes extreme fatigue and weakness in its victim." silent_toxin = TRUE color = "#6E2828" @@ -386,7 +345,6 @@ /datum/reagent/toxin/polonium name = "Polonium" - id = "polonium" description = "An extremely radioactive material in liquid form. Ingestion results in fatal irradiation." reagent_state = LIQUID color = "#787878" @@ -399,7 +357,6 @@ /datum/reagent/toxin/histamine name = "Histamine" - id = "histamine" description = "Histamine's effects become more dangerous depending on the dosage amount. They range from mildly annoying to incredibly lethal." silent_toxin = TRUE reagent_state = LIQUID @@ -434,7 +391,6 @@ /datum/reagent/toxin/formaldehyde name = "Formaldehyde" - id = "formaldehyde" description = "Formaldehyde, on its own, is a fairly weak toxin. It contains trace amounts of Histamine, very rarely making it decay into Histamine." silent_toxin = TRUE reagent_state = LIQUID @@ -444,14 +400,13 @@ /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/M) if(prob(5)) - holder.add_reagent("histamine", pick(5,15)) - holder.remove_reagent("formaldehyde", 1.2) + holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) + holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) else return ..() /datum/reagent/toxin/venom name = "Venom" - id = "venom" description = "An exotic poison extracted from highly toxic fauna. Causes scaling amounts of toxin damage and bruising depending and dosage. Often decays into Histamine." reagent_state = LIQUID color = "#F0FFF0" @@ -463,14 +418,13 @@ M.adjustBruteLoss((0.3*volume)*REM, 0) . = 1 if(prob(15)) - M.reagents.add_reagent("histamine", pick(5,10)) - M.reagents.remove_reagent("venom", 1.1) + M.reagents.add_reagent(/datum/reagent/toxin/histamine, pick(5,10)) + M.reagents.remove_reagent(/datum/reagent/toxin/venom, 1.1) else ..() /datum/reagent/toxin/fentanyl name = "Fentanyl" - id = "fentanyl" description = "Fentanyl will inhibit brain function and cause toxin damage before eventually knocking out its victim." reagent_state = LIQUID color = "#64916E" @@ -488,7 +442,6 @@ /datum/reagent/toxin/cyanide name = "Cyanide" - id = "cyanide" description = "An infamous poison known for its use in assassination. Causes small amounts of toxin damage with a small chance of oxygen damage or a stun." reagent_state = LIQUID color = "#00B4FF" @@ -506,7 +459,6 @@ /datum/reagent/toxin/bad_food name = "Bad Food" - id = "bad_food" description = "The result of some abomination of cookery, food so bad it's toxic." reagent_state = LIQUID color = "#d6d6d8" @@ -516,7 +468,6 @@ /datum/reagent/toxin/itching_powder name = "Itching Powder" - id = "itching_powder" description = "A powder that induces itching upon contact with the skin. Causes the victim to scratch at their itches and has a very low chance to decay into Histamine." silent_toxin = TRUE reagent_state = LIQUID @@ -526,7 +477,7 @@ /datum/reagent/toxin/itching_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) - M.reagents.add_reagent("itching_powder", reac_volume) + M.reagents.add_reagent(/datum/reagent/toxin/itching_powder, reac_volume) /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M) if(prob(15)) @@ -542,14 +493,13 @@ M.adjustBruteLoss(0.2*REM, 0) . = 1 if(prob(3)) - M.reagents.add_reagent("histamine",rand(1,3)) - M.reagents.remove_reagent("itching_powder",1.2) + M.reagents.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) + M.reagents.remove_reagent(/datum/reagent/toxin/itching_powder,1.2) return ..() /datum/reagent/toxin/initropidril name = "Initropidril" - id = "initropidril" description = "A powerful poison with insidious effects. It can cause stuns, lethal breathing failure, and cardiac arrest." silent_toxin = TRUE reagent_state = LIQUID @@ -581,7 +531,6 @@ /datum/reagent/toxin/pancuronium name = "Pancuronium" - id = "pancuronium" description = "An undetectable toxin that swiftly incapacitates its victim. May also cause breathing failure." silent_toxin = TRUE reagent_state = LIQUID @@ -600,7 +549,6 @@ /datum/reagent/toxin/sodium_thiopental name = "Sodium Thiopental" - id = "sodium_thiopental" description = "Sodium Thiopental induces heavy weakness in its target as well as unconsciousness." silent_toxin = TRUE reagent_state = LIQUID @@ -617,7 +565,6 @@ /datum/reagent/toxin/sulfonal name = "Sulfonal" - id = "sulfonal" description = "A stealthy poison that deals minor toxin damage and eventually puts the target to sleep." silent_toxin = TRUE reagent_state = LIQUID @@ -632,7 +579,6 @@ /datum/reagent/toxin/amanitin name = "Amanitin" - id = "amanitin" description = "A very powerful delayed toxin. Upon full metabolization, a massive amount of toxin damage will be dealt depending on how long it has been in the victim's bloodstream." silent_toxin = TRUE reagent_state = LIQUID @@ -648,7 +594,6 @@ /datum/reagent/toxin/lipolicide name = "Lipolicide" - id = "lipolicide" description = "A powerful toxin that will destroy fat cells, massively reducing body weight in a short time. Deadly to those without nutriment in their body." silent_toxin = TRUE taste_description = "mothballs" @@ -666,7 +611,6 @@ /datum/reagent/toxin/coniine name = "Coniine" - id = "coniine" description = "Coniine metabolizes extremely slowly, but deals high amounts of toxin damage and stops breathing." reagent_state = LIQUID color = "#7DC3A0" @@ -679,7 +623,6 @@ /datum/reagent/toxin/spewium name = "Spewium" - id = "spewium" description = "A powerful emetic, causes uncontrollable vomiting. May result in vomiting organs at high doses." reagent_state = LIQUID color = "#2f6617" //A sickly green color @@ -694,7 +637,7 @@ C.vomit(10, prob(10), prob(50), rand(0,4), TRUE, prob(30)) for(var/datum/reagent/toxin/R in C.reagents.reagent_list) if(R != src) - C.reagents.remove_reagent(R.id,1) + C.reagents.remove_reagent(R.type,1) /datum/reagent/toxin/spewium/overdose_process(mob/living/carbon/C) . = ..() @@ -705,7 +648,6 @@ /datum/reagent/toxin/curare name = "Curare" - id = "curare" description = "Causes slight toxin damage followed by chain-stunning and oxygen damage." reagent_state = LIQUID color = "#191919" @@ -721,7 +663,6 @@ /datum/reagent/toxin/heparin //Based on a real-life anticoagulant. I'm not a doctor, so this won't be realistic. name = "Heparin" - id = "heparin" description = "A powerful anticoagulant. Victims will bleed uncontrollably and suffer scaling bruising." silent_toxin = TRUE reagent_state = LIQUID @@ -740,7 +681,6 @@ /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" - id = "rotatium" description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." silent_toxin = TRUE reagent_state = LIQUID @@ -768,7 +708,6 @@ /datum/reagent/toxin/skewium name = "Skewium" - id = "skewium" description = "A strange, dull coloured liquid that appears to warp back and forth inside its container. Causes any consumer to experience a visual phenomena similar to said warping." silent_toxin = TRUE reagent_state = LIQUID @@ -805,7 +744,6 @@ /datum/reagent/toxin/anacea name = "Anacea" - id = "anacea" description = "A toxin that quickly purges medicines and metabolizes very slowly." reagent_state = LIQUID color = "#3C5133" @@ -814,10 +752,10 @@ /datum/reagent/toxin/anacea/on_mob_life(mob/living/carbon/M) var/remove_amt = 5 - if(holder.has_reagent("calomel") || holder.has_reagent("pen_acid")) + if(holder.has_reagent(/datum/reagent/medicine/calomel) || holder.has_reagent(/datum/reagent/medicine/pen_acid)) remove_amt = 0.5 for(var/datum/reagent/medicine/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.id,remove_amt) + M.reagents.remove_reagent(R.type,remove_amt) return ..() //ACID @@ -825,7 +763,6 @@ /datum/reagent/toxin/acid name = "Sulphuric acid" - id = "sacid" description = "A strong mineral acid with the molecular formula H2SO4." color = "#00FF32" toxpwr = 1 @@ -859,7 +796,6 @@ /datum/reagent/toxin/acid/fluacid name = "Fluorosulfuric acid" - id = "facid" description = "Fluorosulfuric acid is an extremely corrosive chemical substance." color = "#5050FF" toxpwr = 2 @@ -872,7 +808,6 @@ /datum/reagent/toxin/delayed name = "Toxin Microcapsules" - id = "delayed_toxin" description = "Causes heavy toxin damage after a brief time of inactivity." reagent_state = LIQUID metabolization_rate = 0 //stays in the system until active. @@ -883,7 +818,7 @@ /datum/reagent/toxin/delayed/on_mob_life(mob/living/carbon/M) if(current_cycle > delay) - holder.remove_reagent(id, actual_metaboliztion_rate * M.metabolism_efficiency) + holder.remove_reagent(type, actual_metaboliztion_rate * M.metabolism_efficiency) M.adjustToxLoss(actual_toxpwr*REM, 0) if(prob(10)) M.Paralyze(20, 0) @@ -892,7 +827,6 @@ /datum/reagent/toxin/mimesbane name = "Mime's Bane" - id = "mimesbane" description = "A nonlethal neurotoxin that interferes with the victim's ability to gesture." silent_toxin = TRUE color = "#F0F8FF" // rgb: 240, 248, 255 @@ -900,14 +834,13 @@ taste_description = "stillness" /datum/reagent/toxin/mimesbane/on_mob_add(mob/living/L) - ADD_TRAIT(L, TRAIT_EMOTEMUTE, id) + ADD_TRAIT(L, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/mimesbane/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_EMOTEMUTE, id) + REMOVE_TRAIT(L, TRAIT_EMOTEMUTE, type) /datum/reagent/toxin/bonehurtingjuice //oof ouch name = "Bone Hurting Juice" - id = "bonehurtingjuice" description = "A strange substance that looks a lot like water. Drinking it is oddly tempting. Oof ouch." silent_toxin = TRUE //no point spamming them even more. color = "#AAAAAA77" //RGBA: 170, 170, 170, 77 @@ -916,20 +849,20 @@ overdose_threshold = 50 /datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M) - M.say("oof ouch my bones", forced = "bonehurtingjuice") + M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M) - M.adjustStaminaLoss(15, 0) + M.adjustStaminaLoss(7.5, 0) if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER)) M.adjustBruteLoss(0.5, 0) if(prob(20)) switch(rand(1, 3)) if(1) var/list/possible_says = list("oof.", "ouch!", "my bones.", "oof ouch.", "oof ouch my bones.") - M.say(pick(possible_says), forced = "bonehurtingjuice") + M.say(pick(possible_says), forced = /datum/reagent/toxin/bonehurtingjuice) if(2) var/list/possible_mes = list("oofs softly.", "looks like their bones hurt.", "grimaces, as though their bones hurt.") - M.say("*custom " + pick(possible_mes), forced = "bonehurtingjuice") + M.say("*custom " + pick(possible_mes), forced = /datum/reagent/toxin/bonehurtingjuice) if(3) to_chat(M, "Your bones hurt!") return ..() @@ -952,15 +885,15 @@ bp.receive_damage(0, 0, 200) playsound(M, get_sfx("desceration"), 50, TRUE, -1) M.visible_message("[M]'s bones hurt too much!!", "Your bones hurt too much!!") - M.say("OOF!!", forced = "bonehurtingjuice") + M.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) else //SUCH A LUST FOR REVENGE!!! to_chat(M, "A phantom limb hurts!") - M.say("Why are we still here, just to suffer?", forced = "bonehurtingjuice") + M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) else //you just want to socialize if(bp) playsound(M, get_sfx("desceration"), 50, TRUE, -1) M.visible_message("[M] rattles loudly and flails around!!", "Your bones hurt so much that your missing muscles spasm!!") - M.say("OOF!!", forced="bonehurtingjuice") + M.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice) bp.receive_damage(200, 0, 0) //But I don't think we should else to_chat(M, "Your missing arm aches from wherever you left it.") diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 716d86fc800..7049c3da0ea 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -1,49 +1,49 @@ /datum/chemical_reaction/space_drugs name = "Space Drugs" - id = "space_drugs" - results = list("space_drugs" = 3) - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + id = /datum/reagent/drug/space_drugs + results = list(/datum/reagent/drug/space_drugs = 3) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1) /datum/chemical_reaction/crank name = "Crank" - id = "crank" - results = list("crank" = 5) - required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "welding_fuel" = 1) + id = /datum/reagent/drug/crank + results = list(/datum/reagent/drug/crank = 5) + required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/ammonia = 1, /datum/reagent/lithium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/fuel = 1) mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." required_temp = 390 /datum/chemical_reaction/krokodil name = "Krokodil" - id = "krokodil" - results = list("krokodil" = 6) - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "welding_fuel" = 1) + id = /datum/reagent/drug/krokodil + results = list(/datum/reagent/drug/krokodil = 6) + required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/medicine/morphine = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/potassium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/fuel = 1) mix_message = "The mixture dries into a pale blue powder." required_temp = 380 /datum/chemical_reaction/methamphetamine - name = "methamphetamine" - id = "methamphetamine" - results = list("methamphetamine" = 4) - required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) + name = /datum/reagent/drug/methamphetamine + id = /datum/reagent/drug/methamphetamine + results = list(/datum/reagent/drug/methamphetamine = 4) + required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) required_temp = 374 /datum/chemical_reaction/bath_salts - name = "bath_salts" - id = "bath_salts" - results = list("bath_salts" = 7) - required_reagents = list("bad_food" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1) + name = /datum/reagent/drug/bath_salts + id = /datum/reagent/drug/bath_salts + results = list(/datum/reagent/drug/bath_salts = 7) + required_reagents = list(/datum/reagent/toxin/bad_food = 1, /datum/reagent/saltpetre = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/consumable/enzyme = 1, /datum/reagent/consumable/tea = 1, /datum/reagent/mercury = 1) required_temp = 374 /datum/chemical_reaction/aranesp - name = "aranesp" - id = "aranesp" - results = list("aranesp" = 3) - required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) + name = /datum/reagent/drug/aranesp + id = /datum/reagent/drug/aranesp + results = list(/datum/reagent/drug/aranesp = 3) + required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/medicine/atropine = 1, /datum/reagent/medicine/morphine = 1) /datum/chemical_reaction/happiness name = "Happiness" - id = "happiness" - results = list("happiness" = 4) - required_reagents = list("nitrous_oxide" = 2, "epinephrine" = 1, "ethanol" = 1) - required_catalysts = list("plasma" = 5) + id = /datum/reagent/drug/happiness + results = list(/datum/reagent/drug/happiness = 4) + required_reagents = list(/datum/reagent/nitrous_oxide = 2, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 98bb25e920a..5465e9e252c 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,266 +1,266 @@ /datum/chemical_reaction/leporazine name = "Leporazine" - id = "leporazine" - results = list("leporazine" = 2) - required_reagents = list("silicon" = 1, "copper" = 1) - required_catalysts = list("plasma" = 5) + id = /datum/reagent/medicine/leporazine + results = list(/datum/reagent/medicine/leporazine = 2) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/rezadone name = "Rezadone" - id = "rezadone" - results = list("rezadone" = 3) - required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) + id = /datum/reagent/medicine/rezadone + results = list(/datum/reagent/medicine/rezadone = 3) + required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) /datum/chemical_reaction/spaceacillin name = "Spaceacillin" - id = "spaceacillin" - results = list("spaceacillin" = 2) - required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1) + id = /datum/reagent/medicine/spaceacillin + results = list(/datum/reagent/medicine/spaceacillin = 2) + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) /datum/chemical_reaction/inacusiate - name = "inacusiate" - id = "inacusiate" - results = list("inacusiate" = 2) - required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1) + name = /datum/reagent/medicine/inacusiate + id = /datum/reagent/medicine/inacusiate + results = list(/datum/reagent/medicine/inacusiate = 2) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/charcoal = 1) /datum/chemical_reaction/synaptizine name = "Synaptizine" - id = "synaptizine" - results = list("synaptizine" = 3) - required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) + id = /datum/reagent/medicine/synaptizine + results = list(/datum/reagent/medicine/synaptizine = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) /datum/chemical_reaction/charcoal name = "Charcoal" - id = "charcoal" - results = list("charcoal" = 2) - required_reagents = list("ash" = 1, "sodiumchloride" = 1) + id = /datum/reagent/medicine/charcoal + results = list(/datum/reagent/medicine/charcoal = 2) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1) mix_message = "The mixture yields a fine black powder." required_temp = 380 /datum/chemical_reaction/silver_sulfadiazine name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - results = list("silver_sulfadiazine" = 5) - required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) + id = /datum/reagent/medicine/silver_sulfadiazine + results = list(/datum/reagent/medicine/silver_sulfadiazine = 5) + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/salglu_solution name = "Saline-Glucose Solution" - id = "salglu_solution" - results = list("salglu_solution" = 3) - required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) + id = /datum/reagent/medicine/salglu_solution + results = list(/datum/reagent/medicine/salglu_solution = 3) + required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/mine_salve name = "Miner's Salve" - id = "mine_salve" - results = list("mine_salve" = 3) - required_reagents = list("oil" = 1, "water" = 1, "iron" = 1) + id = /datum/reagent/medicine/mine_salve + results = list(/datum/reagent/medicine/mine_salve = 3) + required_reagents = list(/datum/reagent/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) /datum/chemical_reaction/mine_salve2 name = "Miner's Salve" - id = "mine_salve" - results = list("mine_salve" = 15) - required_reagents = list("plasma" = 5, "iron" = 5, "sugar" = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these + id = /datum/reagent/medicine/mine_salve + results = list(/datum/reagent/medicine/mine_salve = 15) + required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these /datum/chemical_reaction/synthflesh name = "Synthflesh" - id = "synthflesh" - results = list("synthflesh" = 3) - required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) + id = /datum/reagent/medicine/synthflesh + results = list(/datum/reagent/medicine/synthflesh = 3) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/styptic_powder = 1) /datum/chemical_reaction/styptic_powder name = "Styptic Powder" - id = "styptic_powder" - results = list("styptic_powder" = 4) - required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) + id = /datum/reagent/medicine/styptic_powder + results = list(/datum/reagent/medicine/styptic_powder = 4) + required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) mix_message = "The solution yields an astringent powder." /datum/chemical_reaction/calomel name = "Calomel" - id = "calomel" - results = list("calomel" = 2) - required_reagents = list("mercury" = 1, "chlorine" = 1) + id = /datum/reagent/medicine/calomel + results = list(/datum/reagent/medicine/calomel = 2) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) required_temp = 374 /datum/chemical_reaction/potass_iodide name = "Potassium Iodide" - id = "potass_iodide" - results = list("potass_iodide" = 2) - required_reagents = list("potassium" = 1, "iodine" = 1) + id = /datum/reagent/medicine/potass_iodide + results = list(/datum/reagent/medicine/potass_iodide = 2) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1) /datum/chemical_reaction/pen_acid name = "Pentetic Acid" - id = "pen_acid" - results = list("pen_acid" = 6) - required_reagents = list("welding_fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) + id = /datum/reagent/medicine/pen_acid + results = list(/datum/reagent/medicine/pen_acid = 6) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1) /datum/chemical_reaction/sal_acid name = "Salicyclic Acid" - id = "sal_acid" - results = list("sal_acid" = 5) - required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) + id = /datum/reagent/medicine/sal_acid + results = list(/datum/reagent/medicine/sal_acid = 5) + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/oxandrolone name = "Oxandrolone" - id = "oxandrolone" - results = list("oxandrolone" = 6) - required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1) + id = /datum/reagent/medicine/oxandrolone + results = list(/datum/reagent/medicine/oxandrolone = 6) + required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/salbutamol name = "Salbutamol" - id = "salbutamol" - results = list("salbutamol" = 5) - required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) + id = /datum/reagent/medicine/salbutamol + results = list(/datum/reagent/medicine/salbutamol = 5) + required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) /datum/chemical_reaction/perfluorodecalin name = "Perfluorodecalin" - id = "perfluorodecalin" - results = list("perfluorodecalin" = 3) - required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) + id = /datum/reagent/medicine/perfluorodecalin + results = list(/datum/reagent/medicine/perfluorodecalin = 3) + required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/oil = 1) required_temp = 370 mix_message = "The mixture rapidly turns into a dense pink liquid." /datum/chemical_reaction/ephedrine name = "Ephedrine" - id = "ephedrine" - results = list("ephedrine" = 4) - required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) + id = /datum/reagent/medicine/ephedrine + results = list(/datum/reagent/medicine/ephedrine = 4) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) mix_message = "The solution fizzes and gives off toxic fumes." /datum/chemical_reaction/diphenhydramine name = "Diphenhydramine" - id = "diphenhydramine" - results = list("diphenhydramine" = 4) - required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) + id = /datum/reagent/medicine/diphenhydramine + results = list(/datum/reagent/medicine/diphenhydramine = 4) + required_reagents = list(/datum/reagent/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) mix_message = "The mixture dries into a pale blue powder." /datum/chemical_reaction/oculine name = "Oculine" - id = "oculine" - results = list("oculine" = 3) - required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1) + id = /datum/reagent/medicine/oculine + results = list(/datum/reagent/medicine/oculine = 3) + required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) mix_message = "The mixture sputters loudly and becomes a pale pink color." /datum/chemical_reaction/atropine name = "Atropine" - id = "atropine" - results = list("atropine" = 5) - required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) + id = /datum/reagent/medicine/atropine + results = list(/datum/reagent/medicine/atropine = 5) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/epinephrine name = "Epinephrine" - id = "epinephrine" - results = list("epinephrine" = 6) - required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) + id = /datum/reagent/medicine/epinephrine + results = list(/datum/reagent/medicine/epinephrine = 6) + required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/strange_reagent name = "Strange Reagent" - id = "strange_reagent" - results = list("strange_reagent" = 3) - required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) + id = /datum/reagent/medicine/strange_reagent + results = list(/datum/reagent/medicine/strange_reagent = 3) + required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) /datum/chemical_reaction/mannitol name = "Mannitol" - id = "mannitol" - results = list("mannitol" = 3) - required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) + id = /datum/reagent/medicine/mannitol + results = list(/datum/reagent/medicine/mannitol = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1) mix_message = "The solution slightly bubbles, becoming thicker." /datum/chemical_reaction/neurine name = "Neurine" - id = "neurine" - results = list("neurine" = 3) - required_reagents = list("mannitol" = 1, "acetone" = 1, "oxygen" = 1) + id = /datum/reagent/medicine/neurine + results = list(/datum/reagent/medicine/neurine = 3) + required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/mutadone name = "Mutadone" - id = "mutadone" - results = list("mutadone" = 3) - required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) + id = /datum/reagent/medicine/mutadone + results = list(/datum/reagent/medicine/mutadone = 3) + required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) /datum/chemical_reaction/antihol - name = "antihol" - id = "antihol" - results = list("antihol" = 3) - required_reagents = list("ethanol" = 1, "charcoal" = 1, "copper" = 1) + name = /datum/reagent/medicine/antihol + id = /datum/reagent/medicine/antihol + results = list(/datum/reagent/medicine/antihol = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/copper = 1) /datum/chemical_reaction/cryoxadone name = "Cryoxadone" - id = "cryoxadone" - results = list("cryoxadone" = 3) - required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) + id = /datum/reagent/medicine/cryoxadone + results = list(/datum/reagent/medicine/cryoxadone = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) /datum/chemical_reaction/pyroxadone name = "Pyroxadone" - id = "pyroxadone" - results = list("pyroxadone" = 2) - required_reagents = list("cryoxadone" = 1, "slimejelly" = 1) + id = /datum/reagent/medicine/pyroxadone + results = list(/datum/reagent/medicine/pyroxadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) /datum/chemical_reaction/clonexadone name = "Clonexadone" - id = "clonexadone" - results = list("clonexadone" = 2) - required_reagents = list("cryoxadone" = 1, "sodium" = 1) - required_catalysts = list("plasma" = 5) + id = /datum/reagent/medicine/clonexadone + results = list(/datum/reagent/medicine/clonexadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) /datum/chemical_reaction/haloperidol name = "Haloperidol" - id = "haloperidol" - results = list("haloperidol" = 5) - required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminium" = 1, "potass_iodide" = 1, "oil" = 1) + id = /datum/reagent/medicine/haloperidol + results = list(/datum/reagent/medicine/haloperidol = 5) + required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/oil = 1) /datum/chemical_reaction/bicaridine name = "Bicaridine" - id = "bicaridine" - results = list("bicaridine" = 3) - required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1) + id = /datum/reagent/medicine/bicaridine + results = list(/datum/reagent/medicine/bicaridine = 3) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/kelotane name = "Kelotane" - id = "kelotane" - results = list("kelotane" = 2) - required_reagents = list("carbon" = 1, "silicon" = 1) + id = /datum/reagent/medicine/kelotane + results = list(/datum/reagent/medicine/kelotane = 2) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1) /datum/chemical_reaction/antitoxin name = "Antitoxin" - id = "antitoxin" - results = list("antitoxin" = 3) - required_reagents = list("nitrogen" = 1, "silicon" = 1, "potassium" = 1) + id = /datum/reagent/medicine/antitoxin + results = list(/datum/reagent/medicine/antitoxin = 3) + required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1) /datum/chemical_reaction/tricordrazine name = "Tricordrazine" - id = "tricordrazine" - results = list("tricordrazine" = 3) - required_reagents = list("bicaridine" = 1, "kelotane" = 1, "antitoxin" = 1) + id = /datum/reagent/medicine/tricordrazine + results = list(/datum/reagent/medicine/tricordrazine = 3) + required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/medicine/kelotane = 1, /datum/reagent/medicine/antitoxin = 1) /datum/chemical_reaction/regen_jelly name = "Regenerative Jelly" - id = "regen_jelly" - results = list("regen_jelly" = 2) - required_reagents = list("tricordrazine" = 1, "slimejelly" = 1) + id = /datum/reagent/medicine/regen_jelly + results = list(/datum/reagent/medicine/regen_jelly = 2) + required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1) /datum/chemical_reaction/corazone name = "Corazone" - id = "corazone" - results = list("corazone" = 3) - required_reagents = list("phenol" = 2, "lithium" = 1) + id = /datum/reagent/medicine/corazone + results = list(/datum/reagent/medicine/corazone = 3) + required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) /datum/chemical_reaction/morphine name = "Morphine" - id = "morphine" - results = list("morphine" = 2) - required_reagents = list("carbon" = 2, "hydrogen" = 2, "ethanol" = 1, "oxygen" = 1) + id = /datum/reagent/medicine/morphine + results = list(/datum/reagent/medicine/morphine = 2) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) required_temp = 480 /datum/chemical_reaction/modafinil name = "Modafinil" - id = "modafinil" - results = list("modafinil" = 5) - required_reagents = list("diethylamine" = 1, "ammonia" = 1, "phenol" = 1, "acetone" = 1, "sacid" = 1) - required_catalysts = list("bromine" = 1) // as close to the real world synthesis as possible + id = /datum/reagent/medicine/modafinil + results = list(/datum/reagent/medicine/modafinil = 5) + required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1) + required_catalysts = list(/datum/reagent/bromine = 1) // as close to the real world synthesis as possible /datum/chemical_reaction/psicodine name = "Psicodine" - id = "psicodine" - results = list("psicodine" = 5) - required_reagents = list( "mannitol" = 2, "water" = 2, "impedrezene" = 1) + id = /datum/reagent/medicine/psicodine + results = list(/datum/reagent/medicine/psicodine = 5) + required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 15643d57120..2e28732ef27 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -1,56 +1,56 @@ /datum/chemical_reaction/sterilizine name = "Sterilizine" - id = "sterilizine" - results = list("sterilizine" = 3) - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + id = /datum/reagent/space_cleaner/sterilizine + results = list(/datum/reagent/space_cleaner/sterilizine = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/lube name = "Space Lube" - id = "lube" - results = list("lube" = 4) - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + id = /datum/reagent/lube + results = list(/datum/reagent/lube = 4) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/spraytan name = "Spray Tan" - id = "spraytan" - results = list("spraytan" = 2) - required_reagents = list("orangejuice" = 1, "oil" = 1) + id = /datum/reagent/spraytan + results = list(/datum/reagent/spraytan = 2) + required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/oil = 1) /datum/chemical_reaction/spraytan2 name = "Spray Tan" - id = "spraytan" - results = list("spraytan" = 2) - required_reagents = list("orangejuice" = 1, "cornoil" = 1) + id = /datum/reagent/spraytan + results = list(/datum/reagent/spraytan = 2) + required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1) /datum/chemical_reaction/impedrezene name = "Impedrezene" - id = "impedrezene" - results = list("impedrezene" = 2) - required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) + id = /datum/reagent/impedrezene + results = list(/datum/reagent/impedrezene = 2) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/cryptobiolin name = "Cryptobiolin" - id = "cryptobiolin" - results = list("cryptobiolin" = 3) - required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) + id = /datum/reagent/cryptobiolin + results = list(/datum/reagent/cryptobiolin = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/glycerol name = "Glycerol" - id = "glycerol" - results = list("glycerol" = 1) - required_reagents = list("cornoil" = 3, "sacid" = 1) + id = /datum/reagent/glycerol + results = list(/datum/reagent/glycerol = 1) + required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/sodiumchloride name = "Sodium Chloride" - id = "sodiumchloride" - results = list("sodiumchloride" = 3) - required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) + id = /datum/reagent/consumable/sodiumchloride + results = list(/datum/reagent/consumable/sodiumchloride = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/plasmasolidification name = "Solid Plasma" id = "solidplasma" - required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20) mob_react = FALSE /datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume) @@ -61,7 +61,7 @@ /datum/chemical_reaction/goldsolidification name = "Solid Gold" id = "solidgold" - required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1) + required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1) mob_react = FALSE /datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume) @@ -72,13 +72,13 @@ /datum/chemical_reaction/capsaicincondensation name = "Capsaicincondensation" id = "capsaicincondensation" - results = list("condensedcapsaicin" = 5) - required_reagents = list("capsaicin" = 1, "ethanol" = 5) + results = list(/datum/reagent/consumable/condensedcapsaicin = 5) + required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5) /datum/chemical_reaction/soapification name = "Soapification" id = "soapification" - required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles + required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles required_temp = 374 mob_react = FALSE @@ -90,7 +90,7 @@ /datum/chemical_reaction/candlefication name = "Candlefication" id = "candlefication" - required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // + required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) // required_temp = 374 mob_react = FALSE @@ -102,7 +102,7 @@ /datum/chemical_reaction/meatification name = "Meatification" id = "meatification" - required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) + required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10) mob_react = FALSE /datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) @@ -114,99 +114,99 @@ /datum/chemical_reaction/carbondioxide name = "Direct Carbon Oxidation" id = "burningcarbon" - results = list("co2" = 3) - required_reagents = list("carbon" = 1, "oxygen" = 2) + results = list(/datum/reagent/carbondioxide = 3) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 2) required_temp = 777 // pure carbon isn't especially reactive. /datum/chemical_reaction/nitrous_oxide name = "Nitrous Oxide" - id = "nitrous_oxide" - results = list("nitrous_oxide" = 5) - required_reagents = list("ammonia" = 2, "nitrogen" = 1, "oxygen" = 2) + id = /datum/reagent/nitrous_oxide + results = list(/datum/reagent/nitrous_oxide = 5) + required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2) required_temp = 525 //Technically a mutation toxin /datum/chemical_reaction/mulligan name = "Mulligan" - id = "mulligan" - results = list("mulligan" = 1) - required_reagents = list("slime_toxin" = 1, "mutagen" = 1) + id = /datum/reagent/mulligan + results = list(/datum/reagent/mulligan = 1) + required_reagents = list(/datum/reagent/slime_toxin = 1, /datum/reagent/toxin/mutagen = 1) ////////////////////////////////// VIROLOGY ////////////////////////////////////////// /datum/chemical_reaction/virus_food name = "Virus Food" - id = "virusfood" - results = list("virusfood" = 15) - required_reagents = list("water" = 5, "milk" = 5) + id = /datum/reagent/consumable/virus_food + results = list(/datum/reagent/consumable/virus_food = 15) + required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/milk = 5) /datum/chemical_reaction/virus_food_mutagen name = "mutagenic agar" - id = "mutagenvirusfood" - results = list("mutagenvirusfood" = 1) - required_reagents = list("mutagen" = 1, "virusfood" = 1) + id = /datum/reagent/toxin/mutagen/mutagenvirusfood + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) + required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_synaptizine name = "virus rations" - id = "synaptizinevirusfood" - results = list("synaptizinevirusfood" = 1) - required_reagents = list("synaptizine" = 1, "virusfood" = 1) + id = /datum/reagent/medicine/synaptizine/synaptizinevirusfood + results = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) + required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_plasma name = "virus plasma" - id = "plasmavirusfood" - results = list("plasmavirusfood" = 1) - required_reagents = list("plasma" = 1, "virusfood" = 1) + id = /datum/reagent/toxin/plasma/plasmavirusfood + results = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_plasma_synaptizine name = "weakened virus plasma" - id = "weakplasmavirusfood" - results = list("weakplasmavirusfood" = 2) - required_reagents = list("synaptizine" = 1, "plasmavirusfood" = 1) + id = /datum/reagent/toxin/plasma/plasmavirusfood/weak + results = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 2) + required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/toxin/plasma/plasmavirusfood = 1) /datum/chemical_reaction/virus_food_mutagen_sugar name = "sucrose agar" - id = "sugarvirusfood" - results = list("sugarvirusfood" = 2) - required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1) + id = /datum/reagent/toxin/mutagen/mutagenvirusfood/sugar + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) /datum/chemical_reaction/virus_food_mutagen_salineglucose name = "sucrose agar" id = "salineglucosevirusfood" - results = list("sugarvirusfood" = 2) - required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1) + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) + required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) /datum/chemical_reaction/virus_food_uranium name = "Decaying uranium gel" - id = "uraniumvirusfood" - results = list("uraniumvirusfood" = 1) - required_reagents = list("uranium" = 1, "virusfood" = 1) + id = /datum/reagent/uranium/uraniumvirusfood + results = list(/datum/reagent/uranium/uraniumvirusfood = 1) + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/virus_food = 1) /datum/chemical_reaction/virus_food_uranium_plasma name = "Unstable uranium gel" id = "uraniumvirusfood_plasma" - results = list("uraniumplasmavirusfood_unstable" = 1) - required_reagents = list("uranium" = 5, "plasmavirusfood" = 1) + results = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) + required_reagents = list(/datum/reagent/uranium = 5, /datum/reagent/toxin/plasma/plasmavirusfood = 1) /datum/chemical_reaction/virus_food_uranium_plasma_gold name = "Stable uranium gel" id = "uraniumvirusfood_gold" - results = list("uraniumplasmavirusfood_stable" = 1) - required_reagents = list("uranium" = 10, "gold" = 10, "plasma" = 1) + results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) + required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/gold = 10, /datum/reagent/toxin/plasma = 1) /datum/chemical_reaction/virus_food_uranium_plasma_silver name = "Stable uranium gel" id = "uraniumvirusfood_silver" - results = list("uraniumplasmavirusfood_stable" = 1) - required_reagents = list("uranium" = 10, "silver" = 10, "plasma" = 1) + results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) + required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/silver = 10, /datum/reagent/toxin/plasma = 1) /datum/chemical_reaction/mix_virus name = "Mix Virus" id = "mixvirus" - results = list("blood" = 1) - required_reagents = list("virusfood" = 1) - required_catalysts = list("blood" = 1) + results = list(/datum/reagent/blood = 1) + required_reagents = list(/datum/reagent/consumable/virus_food = 1) + required_catalysts = list(/datum/reagent/blood = 1) var/level_min = 1 var/level_max = 2 @@ -223,7 +223,7 @@ name = "Mix Virus 2" id = "mixvirus2" - required_reagents = list("mutagen" = 1) + required_reagents = list(/datum/reagent/toxin/mutagen = 1) level_min = 2 level_max = 4 @@ -231,7 +231,7 @@ name = "Mix Virus 3" id = "mixvirus3" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) level_min = 4 level_max = 6 @@ -239,7 +239,7 @@ name = "Mix Virus 4" id = "mixvirus4" - required_reagents = list("uranium" = 1) + required_reagents = list(/datum/reagent/uranium = 1) level_min = 5 level_max = 6 @@ -247,7 +247,7 @@ name = "Mix Virus 5" id = "mixvirus5" - required_reagents = list("mutagenvirusfood" = 1) + required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) level_min = 3 level_max = 3 @@ -255,7 +255,7 @@ name = "Mix Virus 6" id = "mixvirus6" - required_reagents = list("sugarvirusfood" = 1) + required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 1) level_min = 4 level_max = 4 @@ -263,7 +263,7 @@ name = "Mix Virus 7" id = "mixvirus7" - required_reagents = list("weakplasmavirusfood" = 1) + required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 1) level_min = 5 level_max = 5 @@ -271,7 +271,7 @@ name = "Mix Virus 8" id = "mixvirus8" - required_reagents = list("plasmavirusfood" = 1) + required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) level_min = 6 level_max = 6 @@ -279,7 +279,7 @@ name = "Mix Virus 9" id = "mixvirus9" - required_reagents = list("synaptizinevirusfood" = 1) + required_reagents = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) level_min = 1 level_max = 1 @@ -287,7 +287,7 @@ name = "Mix Virus 10" id = "mixvirus10" - required_reagents = list("uraniumvirusfood" = 1) + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood = 1) level_min = 6 level_max = 7 @@ -295,7 +295,7 @@ name = "Mix Virus 11" id = "mixvirus11" - required_reagents = list("uraniumplasmavirusfood_unstable" = 1) + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) level_min = 7 level_max = 7 @@ -303,7 +303,7 @@ name = "Mix Virus 12" id = "mixvirus12" - required_reagents = list("uraniumplasmavirusfood_stable" = 1) + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) level_min = 8 level_max = 8 @@ -311,8 +311,8 @@ name = "Devolve Virus" id = "remvirus" - required_reagents = list("synaptizine" = 1) - required_catalysts = list("blood" = 1) + required_reagents = list(/datum/reagent/medicine/synaptizine = 1) + required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) @@ -325,8 +325,8 @@ /datum/chemical_reaction/mix_virus/neuter_virus name = "Neuter Virus" id = "neutervirus" - required_reagents = list("formaldehyde" = 1) - required_catalysts = list("blood" = 1) + required_reagents = list(/datum/reagent/toxin/formaldehyde = 1) + required_catalysts = list(/datum/reagent/blood = 1) /datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume) @@ -344,13 +344,13 @@ /datum/chemical_reaction/surfactant name = "Foam surfactant" id = "foam surfactant" - results = list("fluorosurfactant" = 5) - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + results = list(/datum/reagent/fluorosurfactant = 5) + required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1) /datum/chemical_reaction/foam name = "Foam" id = "foam" - required_reagents = list("fluorosurfactant" = 1, "water" = 1) + required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1) mob_react = FALSE /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) @@ -367,7 +367,7 @@ /datum/chemical_reaction/metalfoam name = "Metal Foam" id = "metalfoam" - required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) + required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) @@ -384,7 +384,7 @@ /datum/chemical_reaction/smart_foam name = "Smart Metal Foam" id = "smart_metal_foam" - required_reagents = list("aluminium" = 3, "smart_foaming_agent" = 1, "facid" = 1) + required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = TRUE /datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, created_volume) @@ -398,7 +398,7 @@ /datum/chemical_reaction/ironfoam name = "Iron Foam" id = "ironlfoam" - required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) + required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) @@ -412,15 +412,15 @@ /datum/chemical_reaction/foaming_agent name = "Foaming Agent" - id = "foaming_agent" - results = list("foaming_agent" = 1) - required_reagents = list("lithium" = 1, "hydrogen" = 1) + id = /datum/reagent/foaming_agent + results = list(/datum/reagent/foaming_agent = 1) + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/smart_foaming_agent name = "Smart foaming Agent" - id = "smart_foaming_agent" - results = list("smart_foaming_agent" = 3) - required_reagents = list("foaming_agent" = 3, "acetone" = 1, "iron" = 1) + id = /datum/reagent/smart_foaming_agent + results = list(/datum/reagent/smart_foaming_agent = 3) + required_reagents = list(/datum/reagent/foaming_agent = 3, /datum/reagent/acetone = 1, /datum/reagent/iron = 1) mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container." @@ -428,89 +428,89 @@ /datum/chemical_reaction/ammonia name = "Ammonia" - id = "ammonia" - results = list("ammonia" = 3) - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) + id = /datum/reagent/ammonia + results = list(/datum/reagent/ammonia = 3) + required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1) /datum/chemical_reaction/diethylamine name = "Diethylamine" - id = "diethylamine" - results = list("diethylamine" = 2) - required_reagents = list ("ammonia" = 1, "ethanol" = 1) + id = /datum/reagent/diethylamine + results = list(/datum/reagent/diethylamine = 2) + required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1) /datum/chemical_reaction/space_cleaner name = "Space cleaner" - id = "cleaner" - results = list("cleaner" = 2) - required_reagents = list("ammonia" = 1, "water" = 1) + id = /datum/reagent/space_cleaner + results = list(/datum/reagent/space_cleaner = 2) + required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) /datum/chemical_reaction/plantbgone name = "Plant-B-Gone" - id = "plantbgone" - results = list("plantbgone" = 5) - required_reagents = list("toxin" = 1, "water" = 4) + id = /datum/reagent/toxin/plantbgone + results = list(/datum/reagent/toxin/plantbgone = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) /datum/chemical_reaction/weedkiller name = "Weed Killer" - id = "weedkiller" - results = list("weedkiller" = 5) - required_reagents = list("toxin" = 1, "ammonia" = 4) + id = /datum/reagent/toxin/plantbgone/weedkiller + results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4) /datum/chemical_reaction/pestkiller name = "Pest Killer" - id = "pestkiller" - results = list("pestkiller" = 5) - required_reagents = list("toxin" = 1, "ethanol" = 4) + id = /datum/reagent/toxin/pestkiller + results = list(/datum/reagent/toxin/pestkiller = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/ethanol = 4) /datum/chemical_reaction/drying_agent name = "Drying agent" - id = "drying_agent" - results = list("drying_agent" = 3) - required_reagents = list("stable_plasma" = 2, "ethanol" = 1, "sodium" = 1) + id = /datum/reagent/drying_agent + results = list(/datum/reagent/drying_agent = 3) + required_reagents = list(/datum/reagent/stable_plasma = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/sodium = 1) //////////////////////////////////// Other goon stuff /////////////////////////////////////////// /datum/chemical_reaction/acetone - name = "acetone" - id = "acetone" - results = list("acetone" = 3) - required_reagents = list("oil" = 1, "welding_fuel" = 1, "oxygen" = 1) + name = /datum/reagent/acetone + id = /datum/reagent/acetone + results = list(/datum/reagent/acetone = 3) + required_reagents = list(/datum/reagent/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - results = list("carpet" = 2) - required_reagents = list("space_drugs" = 1, "blood" = 1) + name = /datum/reagent/carpet + id = /datum/reagent/carpet + results = list(/datum/reagent/carpet = 2) + required_reagents = list(/datum/reagent/drug/space_drugs = 1, /datum/reagent/blood = 1) /datum/chemical_reaction/oil name = "Oil" - id = "oil" - results = list("oil" = 3) - required_reagents = list("welding_fuel" = 1, "carbon" = 1, "hydrogen" = 1) + id = /datum/reagent/oil + results = list(/datum/reagent/oil = 3) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/phenol - name = "phenol" - id = "phenol" - results = list("phenol" = 3) - required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) + name = /datum/reagent/phenol + id = /datum/reagent/phenol + results = list(/datum/reagent/phenol = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/oil = 1) /datum/chemical_reaction/ash name = "Ash" - id = "ash" - results = list("ash" = 1) - required_reagents = list("oil" = 1) + id = /datum/reagent/ash + results = list(/datum/reagent/ash = 1) + required_reagents = list(/datum/reagent/oil = 1) required_temp = 480 /datum/chemical_reaction/colorful_reagent - name = "colorful_reagent" - id = "colorful_reagent" - results = list("colorful_reagent" = 5) - required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) + name = /datum/reagent/colorful_reagent + id = /datum/reagent/colorful_reagent + results = list(/datum/reagent/colorful_reagent = 5) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) /datum/chemical_reaction/life name = "Life" id = "life" - required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/blood = 1) required_temp = 374 /datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) @@ -519,7 +519,7 @@ /datum/chemical_reaction/life_friendly name = "Life (Friendly)" id = "life_friendly" - required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "sugar" = 1) + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/consumable/sugar = 1) required_temp = 374 /datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) @@ -528,7 +528,7 @@ /datum/chemical_reaction/corgium name = "corgium" id = "corgium" - required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) + required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) required_temp = 374 /datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume) @@ -538,57 +538,57 @@ ..() /datum/chemical_reaction/hair_dye - name = "hair_dye" - id = "hair_dye" - results = list("hair_dye" = 5) - required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) + name = /datum/reagent/hair_dye + id = /datum/reagent/hair_dye + results = list(/datum/reagent/hair_dye = 5) + required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) /datum/chemical_reaction/barbers_aid - name = "barbers_aid" - id = "barbers_aid" - results = list("barbers_aid" = 5) - required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) + name = /datum/reagent/barbers_aid + id = /datum/reagent/barbers_aid + results = list(/datum/reagent/barbers_aid = 5) + required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) /datum/chemical_reaction/concentrated_barbers_aid - name = "concentrated_barbers_aid" - id = "concentrated_barbers_aid" - results = list("concentrated_barbers_aid" = 2) - required_reagents = list("barbers_aid" = 1, "mutagen" = 1) + name = /datum/reagent/concentrated_barbers_aid + id = /datum/reagent/concentrated_barbers_aid + results = list(/datum/reagent/concentrated_barbers_aid = 2) + required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1) /datum/chemical_reaction/saltpetre - name = "saltpetre" - id = "saltpetre" - results = list("saltpetre" = 3) - required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) + name = /datum/reagent/saltpetre + id = /datum/reagent/saltpetre + results = list(/datum/reagent/saltpetre = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3) /datum/chemical_reaction/lye - name = "lye" - id = "lye" - results = list("lye" = 3) - required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1) + name = /datum/reagent/lye + id = /datum/reagent/lye + results = list(/datum/reagent/lye = 3) + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/lye2 - name = "lye" - id = "lye" - results = list("lye" = 2) - required_reagents = list("ash" = 1, "water" = 1, "carbon" = 1) + name = /datum/reagent/lye + id = /datum/reagent/lye + results = list(/datum/reagent/lye = 2) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/royal_bee_jelly name = "royal bee jelly" - id = "royal_bee_jelly" - results = list("royal_bee_jelly" = 5) - required_reagents = list("mutagen" = 10, "honey" = 40) + id = /datum/reagent/royal_bee_jelly + results = list(/datum/reagent/royal_bee_jelly = 5) + required_reagents = list(/datum/reagent/toxin/mutagen = 10, /datum/reagent/consumable/honey = 40) /datum/chemical_reaction/laughter - name = "laughter" - id = "laughter" - results = list("laughter" = 10) // Fuck it. I'm not touching this one. - required_reagents = list("sugar" = 1, "banana" = 1) + name = /datum/reagent/consumable/laughter + id = /datum/reagent/consumable/laughter + results = list(/datum/reagent/consumable/laughter = 10) // Fuck it. I'm not touching this one. + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/banana = 1) /datum/chemical_reaction/plastic_polymers name = "plastic polymers" - id = "plastic_polymers" - required_reagents = list("oil" = 5, "sacid" = 2, "ash" = 3) + id = /datum/reagent/plastic_polymers + required_reagents = list(/datum/reagent/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. /datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume) @@ -597,7 +597,7 @@ new /obj/item/stack/sheet/plastic(location) /datum/chemical_reaction/pax - name = "pax" - id = "pax" - results = list("pax" = 3) - required_reagents = list("mindbreaker" = 1, "synaptizine" = 1, "water" = 1) + name = /datum/reagent/pax + id = /datum/reagent/pax + results = list(/datum/reagent/pax = 3) + required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 2ca1f0e0eeb..e8ad481494d 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -25,21 +25,21 @@ /datum/chemical_reaction/reagent_explosion/nitroglycerin name = "Nitroglycerin" - id = "nitroglycerin" - results = list("nitroglycerin" = 2) - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) + id = /datum/reagent/nitroglycerin + results = list(/datum/reagent/nitroglycerin = 2) + required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/fluacid = 1, /datum/reagent/toxin/acid = 1) strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent("nitroglycerin", created_volume*2) + holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume*2) ..() /datum/chemical_reaction/reagent_explosion/nitroglycerin_explosion name = "Nitroglycerin explosion" id = "nitroglycerin_explosion" - required_reagents = list("nitroglycerin" = 1) + required_reagents = list(/datum/reagent/nitroglycerin = 1) required_temp = 474 strengthdiv = 2 @@ -47,13 +47,13 @@ /datum/chemical_reaction/reagent_explosion/potassium_explosion name = "Explosion" id = "potassium_explosion" - required_reagents = list("water" = 1, "potassium" = 1) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/potassium = 1) strengthdiv = 10 /datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom name = "Holy Explosion" id = "holyboom" - required_reagents = list("holywater" = 1, "potassium" = 1) + required_reagents = list(/datum/reagent/water/holywater = 1, /datum/reagent/potassium = 1) /datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/on_reaction(datum/reagents/holder, created_volume) if(created_volume >= 150) @@ -61,8 +61,8 @@ strengthdiv = 8 for(var/mob/living/simple_animal/revenant/R in get_hearers_in_view(7,get_turf(holder.my_atom))) var/deity - if(SSreligion.deity) - deity = SSreligion.deity + if(GLOB.deity) + deity = GLOB.deity else deity = "Christ" to_chat(R, "The power of [deity] compels you!") @@ -81,14 +81,14 @@ /datum/chemical_reaction/blackpowder name = "Black Powder" - id = "blackpowder" - results = list("blackpowder" = 3) - required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1) + id = /datum/reagent/blackpowder + results = list(/datum/reagent/blackpowder = 3) + required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/sulfur = 1) /datum/chemical_reaction/reagent_explosion/blackpowder_explosion name = "Black Powder Kaboom" id = "blackpowder_explosion" - required_reagents = list("blackpowder" = 1) + required_reagents = list(/datum/reagent/blackpowder = 1) required_temp = 474 strengthdiv = 6 modifier = 1 @@ -100,14 +100,14 @@ /datum/chemical_reaction/thermite name = "Thermite" - id = "thermite" - results = list("thermite" = 3) - required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1) + id = /datum/reagent/thermite + results = list(/datum/reagent/thermite = 3) + required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/iron = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/emp_pulse name = "EMP Pulse" id = "emp_pulse" - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -120,7 +120,7 @@ /datum/chemical_reaction/beesplosion name = "Bee Explosion" id = "beesplosion" - required_reagents = list("honey" = 1, "strange_reagent" = 1, "radium" = 1) + required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1) /datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, created_volume) var/location = holder.my_atom.drop_location() @@ -129,9 +129,8 @@ else playsound(location,'sound/creatures/bee.ogg', 100, TRUE) var/list/beeagents = list() - for(var/X in holder.reagent_list) - var/datum/reagent/R = X - if(required_reagents[R.id]) + for(var/R in holder.reagent_list) + if(required_reagents[R]) continue beeagents += R var/bee_amount = round(created_volume * 0.2) @@ -142,16 +141,16 @@ /datum/chemical_reaction/stabilizing_agent - name = "stabilizing_agent" - id = "stabilizing_agent" - results = list("stabilizing_agent" = 3) - required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) + name = /datum/reagent/stabilizing_agent + id = /datum/reagent/stabilizing_agent + results = list(/datum/reagent/stabilizing_agent = 3) + required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen = 1) /datum/chemical_reaction/clf3 name = "Chlorine Trifluoride" - id = "clf3" - results = list("clf3" = 4) - required_reagents = list("chlorine" = 1, "fluorine" = 3) + id = /datum/reagent/clf3 + results = list(/datum/reagent/clf3 = 4) + required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 3) required_temp = 424 /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume) @@ -164,7 +163,7 @@ name = "Meth explosion" id = "methboom1" required_temp = 380 //slightly above the meth mix time. - required_reagents = list("methamphetamine" = 1) + required_reagents = list(/datum/reagent/drug/methamphetamine = 1) strengthdiv = 6 modifier = 1 mob_react = FALSE @@ -178,19 +177,19 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 id = "methboom2" - required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine. + required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) //diethylamine is often left over from mixing the ephedrine. required_temp = 300 //room temperature, chilling it even a little will prevent the explosion /datum/chemical_reaction/sorium name = "Sorium" - id = "sorium" - results = list("sorium" = 4) - required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + id = /datum/reagent/sorium + results = list(/datum/reagent/sorium = 4) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent("sorium", created_volume*4) + holder.remove_reagent(/datum/reagent/sorium, created_volume*4) var/turf/T = get_turf(holder.my_atom) var/range = CLAMP(sqrt(created_volume*4), 1, 6) goonchem_vortex(T, 1, range) @@ -198,7 +197,7 @@ /datum/chemical_reaction/sorium_vortex name = "sorium_vortex" id = "sorium_vortex" - required_reagents = list("sorium" = 1) + required_reagents = list(/datum/reagent/sorium = 1) required_temp = 474 /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) @@ -208,14 +207,14 @@ /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" - id = "liquid_dark_matter" - results = list("liquid_dark_matter" = 3) - required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) + id = /datum/reagent/liquid_dark_matter + results = list(/datum/reagent/liquid_dark_matter = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent("liquid_dark_matter", created_volume*3) + holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume*3) var/turf/T = get_turf(holder.my_atom) var/range = CLAMP(sqrt(created_volume*3), 1, 6) goonchem_vortex(T, 0, range) @@ -223,7 +222,7 @@ /datum/chemical_reaction/ldm_vortex name = "LDM Vortex" id = "ldm_vortex" - required_reagents = list("liquid_dark_matter" = 1) + required_reagents = list(/datum/reagent/liquid_dark_matter = 1) required_temp = 474 /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) @@ -233,12 +232,12 @@ /datum/chemical_reaction/flash_powder name = "Flash powder" - id = "flash_powder" - results = list("flash_powder" = 3) - required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) + id = /datum/reagent/flash_powder + results = list(/datum/reagent/flash_powder = 3) + required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 ) /datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return var/location = get_turf(holder.my_atom) do_sparks(2, TRUE, location) @@ -252,12 +251,12 @@ C.Paralyze(60) else C.Stun(100) - holder.remove_reagent("flash_powder", created_volume*3) + holder.remove_reagent(/datum/reagent/flash_powder, created_volume*3) /datum/chemical_reaction/flash_powder_flash name = "Flash powder activation" id = "flash_powder_flash" - required_reagents = list("flash_powder" = 1) + required_reagents = list(/datum/reagent/flash_powder = 1) required_temp = 374 /datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume) @@ -275,15 +274,15 @@ C.Stun(100) /datum/chemical_reaction/smoke_powder - name = "smoke_powder" - id = "smoke_powder" - results = list("smoke_powder" = 3) - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + name = /datum/reagent/smoke_powder + id = /datum/reagent/smoke_powder + results = list(/datum/reagent/smoke_powder = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1) /datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent("smoke_powder", created_volume*3) + holder.remove_reagent(/datum/reagent/smoke_powder, created_volume*3) var/smoke_radius = round(sqrt(created_volume * 1.5), 1) var/location = get_turf(holder.my_atom) var/datum/effect_system/smoke_spread/chem/S = new @@ -298,7 +297,7 @@ /datum/chemical_reaction/smoke_powder_smoke name = "smoke_powder_smoke" id = "smoke_powder_smoke" - required_reagents = list("smoke_powder" = 1) + required_reagents = list(/datum/reagent/smoke_powder = 1) required_temp = 374 mob_react = FALSE @@ -315,15 +314,15 @@ holder.clear_reagents() /datum/chemical_reaction/sonic_powder - name = "sonic_powder" - id = "sonic_powder" - results = list("sonic_powder" = 3) - required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) + name = /datum/reagent/sonic_powder + id = /datum/reagent/sonic_powder + results = list(/datum/reagent/sonic_powder = 3) + required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1) /datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return - holder.remove_reagent("sonic_powder", created_volume*3) + holder.remove_reagent(/datum/reagent/sonic_powder, created_volume*3) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, 1) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location)) @@ -332,7 +331,7 @@ /datum/chemical_reaction/sonic_powder_deafen name = "sonic_powder_deafen" id = "sonic_powder_deafen" - required_reagents = list("sonic_powder" = 1) + required_reagents = list(/datum/reagent/sonic_powder = 1) required_temp = 374 /datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume) @@ -342,13 +341,13 @@ C.soundbang_act(1, 100, rand(0, 5)) /datum/chemical_reaction/phlogiston - name = "phlogiston" - id = "phlogiston" - results = list("phlogiston" = 3) - required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) + name = /datum/reagent/phlogiston + id = /datum/reagent/phlogiston + results = list(/datum/reagent/phlogiston = 3) + required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1) /datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) + if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return var/turf/open/T = get_turf(holder.my_atom) if(istype(T)) @@ -358,15 +357,15 @@ /datum/chemical_reaction/napalm name = "Napalm" - id = "napalm" - results = list("napalm" = 3) - required_reagents = list("oil" = 1, "welding_fuel" = 1, "ethanol" = 1 ) + id = /datum/reagent/napalm + results = list(/datum/reagent/napalm = 3) + required_reagents = list(/datum/reagent/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1 ) /datum/chemical_reaction/cryostylane - name = "cryostylane" - id = "cryostylane" - results = list("cryostylane" = 3) - required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1) + name = /datum/reagent/cryostylane + id = /datum/reagent/cryostylane + results = list(/datum/reagent/cryostylane = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 1) /datum/chemical_reaction/cryostylane/on_reaction(datum/reagents/holder, created_volume) holder.chem_temp = 20 // cools the fuck down @@ -375,8 +374,8 @@ /datum/chemical_reaction/cryostylane_oxygen name = "ephemeral cryostylane reaction" id = "cryostylane_oxygen" - results = list("cryostylane" = 1) - required_reagents = list("cryostylane" = 1, "oxygen" = 1) + results = list(/datum/reagent/cryostylane = 1) + required_reagents = list(/datum/reagent/cryostylane = 1, /datum/reagent/oxygen = 1) mob_react = FALSE /datum/chemical_reaction/cryostylane_oxygen/on_reaction(datum/reagents/holder, created_volume) @@ -385,18 +384,18 @@ /datum/chemical_reaction/pyrosium_oxygen name = "ephemeral pyrosium reaction" id = "pyrosium_oxygen" - results = list("pyrosium" = 1) - required_reagents = list("pyrosium" = 1, "oxygen" = 1) + results = list(/datum/reagent/pyrosium = 1) + required_reagents = list(/datum/reagent/pyrosium = 1, /datum/reagent/oxygen = 1) mob_react = FALSE /datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, created_volume) holder.chem_temp += 10*created_volume /datum/chemical_reaction/pyrosium - name = "pyrosium" - id = "pyrosium" - results = list("pyrosium" = 3) - required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1) + name = /datum/reagent/pyrosium + id = /datum/reagent/pyrosium + results = list(/datum/reagent/pyrosium = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1) /datum/chemical_reaction/pyrosium/on_reaction(datum/reagents/holder, created_volume) holder.chem_temp = 20 // also cools the fuck down @@ -404,23 +403,23 @@ /datum/chemical_reaction/teslium name = "Teslium" - id = "teslium" - results = list("teslium" = 3) - required_reagents = list("stable_plasma" = 1, "silver" = 1, "blackpowder" = 1) + id = /datum/reagent/teslium + results = list(/datum/reagent/teslium = 3) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/silver = 1, /datum/reagent/blackpowder = 1) mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." required_temp = 400 /datum/chemical_reaction/energized_jelly name = "Energized Jelly" - id = "energized_jelly" - results = list("energized_jelly" = 2) - required_reagents = list("slimejelly" = 1, "teslium" = 1) + id = /datum/reagent/teslium/energized_jelly + results = list(/datum/reagent/teslium/energized_jelly = 2) + required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/teslium = 1) mix_message = "The slime jelly starts glowing intermittently." /datum/chemical_reaction/reagent_explosion/teslium_lightning name = "Teslium Destabilization" id = "teslium_lightning" - required_reagents = list("teslium" = 1, "water" = 1) + required_reagents = list(/datum/reagent/teslium = 1, /datum/reagent/water = 1) strengthdiv = 100 modifier = -100 mix_message = "The teslium starts to spark as electricity arcs away from it!" @@ -448,20 +447,20 @@ /datum/chemical_reaction/reagent_explosion/teslium_lightning/heat id = "teslium_lightning2" required_temp = 474 - required_reagents = list("teslium" = 1) + required_reagents = list(/datum/reagent/teslium = 1) /datum/chemical_reaction/reagent_explosion/nitrous_oxide name = "N2O explosion" id = "n2o_explosion" - required_reagents = list("nitrous_oxide" = 1) + required_reagents = list(/datum/reagent/nitrous_oxide = 1) strengthdiv = 7 required_temp = 575 modifier = 1 /datum/chemical_reaction/firefighting_foam name = "Firefighting Foam" - id = "firefighting_foam" - results = list("firefighting_foam" = 3) - required_reagents = list("stabilizing_agent" = 1,"fluorosurfactant" = 1,"carbon" = 1) + id = /datum/reagent/firefighting_foam + results = list(/datum/reagent/firefighting_foam = 3) + required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1) required_temp = 200 is_cold_recipe = 1 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index a9f276461d4..1da1188cad2 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -16,7 +16,7 @@ /datum/chemical_reaction/slime/slimespawn name = "Slime Spawn" id = "m_spawn" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/grey required_other = TRUE @@ -28,15 +28,15 @@ /datum/chemical_reaction/slime/slimeinaprov name = "Slime epinephrine" id = "m_inaprov" - results = list("epinephrine" = 3) - required_reagents = list("water" = 5) + results = list(/datum/reagent/medicine/epinephrine = 3) + required_reagents = list(/datum/reagent/water = 5) required_other = TRUE required_container = /obj/item/slime_extract/grey /datum/chemical_reaction/slime/slimemonkey name = "Slime Monkey" id = "m_monkey" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/grey required_other = TRUE @@ -49,24 +49,24 @@ /datum/chemical_reaction/slime/slimemutate name = "Mutation Toxin" id = "slimetoxin" - results = list("slime_toxin" = 1) - required_reagents = list("plasma" = 1) + results = list(/datum/reagent/slime_toxin = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/green /datum/chemical_reaction/slime/slimehuman name = "Human Mutation Toxin" id = "humanmuttoxin" - results = list("stablemutationtoxin" = 1) - required_reagents = list("blood" = 1) + results = list(/datum/reagent/mutationtoxin = 1) + required_reagents = list(/datum/reagent/blood = 1) required_other = TRUE required_container = /obj/item/slime_extract/green /datum/chemical_reaction/slime/slimelizard name = "Lizard Mutation Toxin" id = "lizardmuttoxin" - results = list("lizardmutationtoxin" = 1) - required_reagents = list("radium" = 1) + results = list(/datum/reagent/mutationtoxin/lizard = 1) + required_reagents = list(/datum/reagent/uranium/radium = 1) required_other = TRUE required_container = /obj/item/slime_extract/green @@ -74,7 +74,7 @@ /datum/chemical_reaction/slime/slimemetal name = "Slime Metal" id = "m_metal" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/metal required_other = TRUE @@ -87,7 +87,7 @@ /datum/chemical_reaction/slime/slimeglass name = "Slime Glass" id = "m_glass" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/metal required_other = TRUE @@ -101,7 +101,7 @@ /datum/chemical_reaction/slime/slimemobspawn name = "Slime Crit" id = "m_tele" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/gold required_other = TRUE deletes_extract = FALSE //we do delete, but we don't do so instantly @@ -121,7 +121,7 @@ /datum/chemical_reaction/slime/slimemobspawn/lesser name = "Slime Crit Lesser" id = "m_tele3" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) /datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) T.visible_message("The slime extract begins to vibrate violently!") @@ -130,7 +130,7 @@ /datum/chemical_reaction/slime/slimemobspawn/friendly name = "Slime Crit Friendly" id = "m_tele5" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) T.visible_message("The slime extract begins to vibrate adorably!") @@ -140,7 +140,7 @@ /datum/chemical_reaction/slime/slimebork name = "Slime Bork" id = "m_tele2" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/silver required_other = TRUE @@ -172,7 +172,7 @@ /datum/chemical_reaction/slime/slimebork/drinks name = "Slime Bork 2" id = "m_tele4" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) /datum/chemical_reaction/slime/slimebork/drinks/getbork() return get_random_drink() @@ -181,15 +181,15 @@ /datum/chemical_reaction/slime/slimefrost name = "Slime Frost Oil" id = "m_frostoil" - results = list("frostoil" = 10) - required_reagents = list("plasma" = 1) + results = list(/datum/reagent/consumable/frostoil = 10) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/blue required_other = TRUE /datum/chemical_reaction/slime/slimestabilizer name = "Slime Stabilizer" id = "m_slimestabilizer" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/blue required_other = TRUE @@ -200,8 +200,8 @@ /datum/chemical_reaction/slime/slimefoam name = "Slime Foam" id = "m_foam" - results = list("fluorosurfactant" = 20, "water" = 20) - required_reagents = list("water" = 5) + results = list(/datum/reagent/fluorosurfactant = 20, /datum/reagent/water = 20) + required_reagents = list(/datum/reagent/water = 5) required_container = /obj/item/slime_extract/blue required_other = TRUE @@ -209,7 +209,7 @@ /datum/chemical_reaction/slime/slimefreeze name = "Slime Freeze" id = "m_freeze" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/darkblue required_other = TRUE deletes_extract = FALSE @@ -232,7 +232,7 @@ /datum/chemical_reaction/slime/slimefireproof name = "Slime Fireproof" id = "m_fireproof" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/darkblue required_other = TRUE @@ -244,15 +244,15 @@ /datum/chemical_reaction/slime/slimecasp name = "Slime Capsaicin Oil" id = "m_capsaicinoil" - results = list("capsaicin" = 10) - required_reagents = list("blood" = 1) + results = list(/datum/reagent/consumable/capsaicin = 10) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/orange required_other = TRUE /datum/chemical_reaction/slime/slimefire name = "Slime fire" id = "m_fire" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/orange required_other = TRUE deletes_extract = FALSE @@ -276,8 +276,8 @@ /datum/chemical_reaction/slime/slimesmoke name = "Slime Smoke" id = "m_smoke" - results = list("phosphorus" = 10, "potassium" = 10, "sugar" = 10) - required_reagents = list("water" = 5) + results = list(/datum/reagent/phosphorus = 10, /datum/reagent/potassium = 10, /datum/reagent/consumable/sugar = 10) + required_reagents = list(/datum/reagent/water = 5) required_container = /obj/item/slime_extract/orange required_other = TRUE @@ -285,7 +285,7 @@ /datum/chemical_reaction/slime/slimeoverload name = "Slime EMP" id = "m_emp" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -296,7 +296,7 @@ /datum/chemical_reaction/slime/slimecell name = "Slime Powercell" id = "m_cell" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -307,7 +307,7 @@ /datum/chemical_reaction/slime/slimeglow name = "Slime Glow" id = "m_glow" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE @@ -321,7 +321,7 @@ /datum/chemical_reaction/slime/slimepsteroid name = "Slime Steroid" id = "m_steroid" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/purple required_other = TRUE @@ -332,8 +332,8 @@ /datum/chemical_reaction/slime/slimeregen name = "Slime Regen" id = "m_regen" - results = list("regen_jelly" = 5) - required_reagents = list("blood" = 1) + results = list(/datum/reagent/medicine/regen_jelly = 5) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/purple required_other = TRUE @@ -341,7 +341,7 @@ /datum/chemical_reaction/slime/slimeplasma name = "Slime Plasma" id = "m_plasma" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/darkpurple required_other = TRUE @@ -353,7 +353,7 @@ /datum/chemical_reaction/slime/slimemutator name = "Slime Mutator" id = "m_slimemutator" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -364,7 +364,7 @@ /datum/chemical_reaction/slime/slimebloodlust name = "Bloodlust" id = "m_bloodlust" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -377,7 +377,7 @@ /datum/chemical_reaction/slime/slimespeed name = "Slime Speed" id = "m_speed" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/red required_other = TRUE @@ -389,7 +389,7 @@ /datum/chemical_reaction/slime/docility name = "Docility Potion" id = "m_potion" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/pink required_other = TRUE @@ -400,7 +400,7 @@ /datum/chemical_reaction/slime/gender name = "Gender Potion" id = "m_gender" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/pink required_other = TRUE @@ -412,8 +412,8 @@ /datum/chemical_reaction/slime/slimemutate2 name = "Advanced Mutation Toxin" id = "mutationtoxin2" - results = list("amutationtoxin" = 1) - required_reagents = list("plasma" = 1) + results = list(/datum/reagent/aslimetoxin = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/black @@ -421,7 +421,7 @@ /datum/chemical_reaction/slime/slimeexplosion name = "Slime Explosion" id = "m_explosion" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/oil required_other = TRUE deletes_extract = FALSE @@ -450,8 +450,8 @@ /datum/chemical_reaction/slime/slimecornoil name = "Slime Corn Oil" id = "m_cornoil" - results = list("cornoil" = 10) - required_reagents = list("blood" = 1) + results = list(/datum/reagent/consumable/cornoil = 10) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/oil required_other = TRUE @@ -460,7 +460,7 @@ name = "Slime Potion 2" id = "m_potion2" required_container = /obj/item/slime_extract/lightpink - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE /datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder) @@ -471,7 +471,7 @@ name = "Renaming Potion" id = "m_renaming_potion" required_container = /obj/item/slime_extract/lightpink - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_other = TRUE /datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder) @@ -483,7 +483,7 @@ /datum/chemical_reaction/slime/adamantine name = "Adamantine" id = "adamantine" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/adamantine required_other = TRUE @@ -495,7 +495,7 @@ /datum/chemical_reaction/slime/slimefloor2 name = "Bluespace Floor" id = "m_floor2" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -507,7 +507,7 @@ /datum/chemical_reaction/slime/slimecrystal name = "Slime Crystal" id = "m_crystal" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -519,7 +519,7 @@ /datum/chemical_reaction/slime/slimeradio name = "Slime Radio" id = "m_radio" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/bluespace required_other = TRUE @@ -531,7 +531,7 @@ /datum/chemical_reaction/slime/slimepsteroid2 name = "Slime Steroid 2" id = "m_steroid2" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/cerulean required_other = TRUE @@ -542,7 +542,7 @@ /datum/chemical_reaction/slime/slime_territory name = "Slime Territory" id = "s_territory" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/cerulean required_other = TRUE @@ -554,7 +554,7 @@ /datum/chemical_reaction/slime/slimestop name = "Slime Stop" id = "m_stop" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -568,13 +568,13 @@ var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE)) extract.forceMove(get_turf(lastheld)) - + ..() /datum/chemical_reaction/slime/slimecamera name = "Slime Camera" id = "m_camera" - required_reagents = list("water" = 1) + required_reagents = list(/datum/reagent/water = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -586,7 +586,7 @@ /datum/chemical_reaction/slime/slimefloor name = "Sepia Floor" id = "m_floor" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/sepia required_other = TRUE @@ -598,7 +598,7 @@ /datum/chemical_reaction/slime/slimepaint name = "Slime Paint" id = "s_paint" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/pyrite required_other = TRUE @@ -610,7 +610,7 @@ /datum/chemical_reaction/slime/slimecrayon name = "Slime Crayon" id = "s_crayon" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/pyrite required_other = TRUE @@ -623,7 +623,7 @@ /datum/chemical_reaction/slime/slimeRNG name = "Random Core" id = "slimerng" - required_reagents = list("plasma" = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -643,7 +643,7 @@ /datum/chemical_reaction/slime/slimebomb name = "Clusterblorble" id = "slimebomb" - required_reagents = list("slimejelly" = 1) + required_reagents = list(/datum/reagent/toxin/slimejelly = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -659,7 +659,7 @@ /datum/chemical_reaction/slime/slime_transfer name = "Transfer Potion" id = "slimetransfer" - required_reagents = list("blood" = 1) + required_reagents = list(/datum/reagent/blood = 1) required_other = TRUE required_container = /obj/item/slime_extract/rainbow @@ -669,8 +669,8 @@ /datum/chemical_reaction/slime/flight_potion name = "Flight Potion" - id = "flightpotion" - required_reagents = list("holywater" = 5, "uranium" = 5) + id = /datum/reagent/flightpotion + required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5) required_other = TRUE required_container = /obj/item/slime_extract/rainbow diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm new file mode 100644 index 00000000000..4b2713be5c5 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -0,0 +1,202 @@ +GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related food types + +/proc/build_reagents_to_food() + . = list() + for (var/type in subtypesof(/obj/item/reagent_containers/food)) + var/obj/item/reagent_containers/food/item = new type() + for(var/r in item.list_reagents) + if (!.[r]) + .[r] = list() + .[r] += type + qdel(item) + //dang plant snowflake + for (var/type in subtypesof(/obj/item/seeds)) + var/obj/item/seeds/item = new type() + for(var/r in item.reagents_add) + if (!.[r]) + .[r] = list() + .[r] += type + qdel(item) + + +#define RNGCHEM_INPUT "input" +#define RNGCHEM_CATALYSTS "catalysts" +#define RNGCHEM_OUTPUT "output" + +/datum/chemical_reaction/randomized + name = "semi randomized reaction" + + var/persistent = FALSE + var/persistence_period = 7 //Will reset every x days + + var/randomize_container = FALSE + var/list/possible_containers = list() + + var/randomize_req_temperature = TRUE + var/min_temp = 1 + var/max_temp = 600 + + var/randomize_inputs = TRUE + var/min_input_reagent_amount = 1 + var/max_input_reagent_amount = 10 + var/min_input_reagents = 2 + var/max_input_reagents = 5 + var/list/possible_reagents = list() + var/min_catalysts = 0 + var/max_catalysts = 2 + var/list/possible_catalysts = list() + + var/randomize_results = FALSE + var/min_output_reagent_amount = 1 + var/max_output_reagent_amount = 5 + var/min_result_reagents = 1 + var/max_result_reagents = 1 + var/list/possible_results = list() + +/datum/chemical_reaction/randomized/proc/GenerateRecipe() + if(randomize_container) + required_container = pick(possible_containers) + if(randomize_req_temperature) + required_temp = rand(min_temp,max_temp) + is_cold_recipe = pick(TRUE,FALSE) + if(randomize_inputs) + var/list/remaining_possible_reagents = GetPossibleReagents(RNGCHEM_INPUT) + var/list/remaining_possible_catalysts = GetPossibleReagents(RNGCHEM_CATALYSTS) + + var/in_reagent_count = min(rand(min_input_reagents,max_input_reagents),remaining_possible_reagents.len) + if(in_reagent_count <= 0) + return FALSE + + required_reagents = list() + for(var/i in 1 to in_reagent_count) + var/r_id = pick_n_take(remaining_possible_reagents) + required_reagents[r_id] = rand(min_input_reagent_amount,max_input_reagent_amount) + remaining_possible_catalysts -= r_id //Can't have same reagents both as catalyst and reagent. Or can we ? + + required_catalysts = list() + var/in_catalyst_count = min(rand(min_catalysts,max_catalysts),remaining_possible_catalysts.len) + for(var/i in 1 to in_catalyst_count) + var/r_id = pick_n_take(remaining_possible_catalysts) + required_catalysts[r_id] = rand(min_input_reagent_amount,max_input_reagent_amount) + + if(randomize_results) + results = list() + var/list/remaining_possible_reagents = GetPossibleReagents(RNGCHEM_OUTPUT) + var/out_reagent_count = min(rand(min_result_reagents,max_result_reagents),remaining_possible_reagents.len) + for(var/i in 1 to out_reagent_count) + var/r_id = pick_n_take(remaining_possible_reagents) + results[r_id] = rand(min_output_reagent_amount,max_output_reagent_amount) + + return TRUE + +/datum/chemical_reaction/randomized/proc/GetPossibleReagents(kind) + switch(kind) + if(RNGCHEM_INPUT) + return possible_reagents.Copy() + if(RNGCHEM_CATALYSTS) + return possible_catalysts.Copy() + if(RNGCHEM_OUTPUT) + return possible_results.Copy() + +/datum/chemical_reaction/randomized/proc/HasConflicts() + for(var/x in required_reagents) + for(var/datum/chemical_reaction/R in GLOB.chemical_reactions_list[x]) + if(chem_recipes_do_conflict(R,src)) + return TRUE + return FALSE + +/datum/chemical_reaction/randomized/proc/unwrap_reagent_list(list/textreagents) + . = list() + for(var/R in textreagents) + var/pathR = text2path(R) + if(!pathR) + return null + .[pathR] = textreagents[R] + +/datum/chemical_reaction/randomized/proc/LoadOldRecipe(recipe_data) + var/req_reag = unwrap_reagent_list(recipe_data["required_reagents"]) + if(!req_reag) + return FALSE + required_reagents = req_reag + + var/req_catalysts = unwrap_reagent_list(recipe_data["required_catalysts"]) + if(!req_catalysts) + return FALSE + required_catalysts = req_catalysts + + required_temp = recipe_data["required_temp"] + is_cold_recipe = recipe_data["is_cold_recipe"] + + var/temp_results = unwrap_reagent_list(recipe_data["results"]) + if(!temp_results) + return FALSE + results = temp_results + var/containerpath = text2path(recipe_data["required_container"]) + if(!containerpath) + return FALSE + required_container = containerpath + return TRUE + +/datum/chemical_reaction/randomized/secret_sauce + name = "secret sauce creation" + id = "secretsauce" + persistent = TRUE + persistence_period = 7 //Reset every week + randomize_container = TRUE + possible_containers = list(/obj/item/reagent_containers/glass/bucket) //easy way to ensure no common conflicts + randomize_req_temperature = TRUE + results = list(/datum/reagent/consumable/secretsauce=1) + +/datum/chemical_reaction/randomized/secret_sauce/GetPossibleReagents(kind) + switch(kind) + if(RNGCHEM_INPUT,RNGCHEM_CATALYSTS) + var/food_reagent_ids = list() + for(var/key in GLOB.food_reagents) + food_reagent_ids += key + return food_reagent_ids + return ..() + + +/obj/item/paper/secretrecipe + name = "old recipe" + var/recipe_id = "secretsauce" + +/obj/item/paper/secretrecipe/examine(mob/user) //Extra secret + if(isobserver(user)) + return + . = ..() + +/obj/item/paper/secretrecipe/Initialize() + . = ..() + if(SSpersistence.initialized) + UpdateInfo() + else + SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo)) + +/obj/item/paper/secretrecipe/proc/UpdateInfo() + var/datum/chemical_reaction/recipe = get_chemical_reaction(recipe_id) + if(!recipe) + info = "This recipe is illegible." + var/list/dat = list("
    ") + for(var/rid in recipe.required_reagents) + var/datum/reagent/R = GLOB.chemical_reagents_list[rid] + dat += "
  • [recipe.required_reagents[rid]]u of [R.name]
  • " + dat += "
" + if(recipe.required_catalysts.len) + dat += "With following present:
    " + for(var/rid in recipe.required_catalysts) + var/datum/reagent/R = GLOB.chemical_reagents_list[rid] + dat += "
  • [recipe.required_catalysts[rid]]u of [R.name]
  • " + dat += "
" + dat += "Mix slowly" + if(recipe.required_container) + var/obj/item/I = recipe.required_container + dat += " in [initial(I.name)]" + if(recipe.required_temp != 0) + if(recipe.is_cold_recipe) + dat += " below [recipe.required_temp] degrees" + else + dat += " above [recipe.required_temp] degrees" + dat += "." + info = dat.Join("") + update_icon() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 5a906bc4541..dbd305d6f82 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -1,128 +1,128 @@ /datum/chemical_reaction/formaldehyde - name = "formaldehyde" + name = /datum/reagent/toxin/formaldehyde id = "Formaldehyde" - results = list("formaldehyde" = 3) - required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) + results = list(/datum/reagent/toxin/formaldehyde = 3) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1) required_temp = 420 /datum/chemical_reaction/fentanyl - name = "fentanyl" - id = "fentanyl" - results = list("fentanyl" = 1) - required_reagents = list("space_drugs" = 1) + name = /datum/reagent/toxin/fentanyl + id = /datum/reagent/toxin/fentanyl + results = list(/datum/reagent/toxin/fentanyl = 1) + required_reagents = list(/datum/reagent/drug/space_drugs = 1) required_temp = 674 /datum/chemical_reaction/cyanide name = "Cyanide" - id = "cyanide" - results = list("cyanide" = 3) - required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) + id = /datum/reagent/toxin/cyanide + results = list(/datum/reagent/toxin/cyanide = 3) + required_reagents = list(/datum/reagent/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1) required_temp = 380 /datum/chemical_reaction/itching_powder name = "Itching Powder" - id = "itching_powder" - results = list("itching_powder" = 3) - required_reagents = list("welding_fuel" = 1, "ammonia" = 1, "charcoal" = 1) + id = /datum/reagent/toxin/itching_powder + results = list(/datum/reagent/toxin/itching_powder = 3) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ammonia = 1, /datum/reagent/medicine/charcoal = 1) /datum/chemical_reaction/facid name = "Fluorosulfuric acid" - id = "facid" - results = list("facid" = 4) - required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) + id = /datum/reagent/toxin/acid/fluacid + results = list(/datum/reagent/toxin/acid/fluacid = 4) + required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/fluorine = 1, /datum/reagent/hydrogen = 1, /datum/reagent/potassium = 1) required_temp = 380 /datum/chemical_reaction/sulfonal - name = "sulfonal" - id = "sulfonal" - results = list("sulfonal" = 3) - required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + name = /datum/reagent/toxin/sulfonal + id = /datum/reagent/toxin/sulfonal + results = list(/datum/reagent/toxin/sulfonal = 3) + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/sulfur = 1) /datum/chemical_reaction/lipolicide - name = "lipolicide" - id = "lipolicide" - results = list("lipolicide" = 3) - required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + name = /datum/reagent/toxin/lipolicide + id = /datum/reagent/toxin/lipolicide + results = list(/datum/reagent/toxin/lipolicide = 3) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/diethylamine = 1, /datum/reagent/medicine/ephedrine = 1) /datum/chemical_reaction/mutagen name = "Unstable mutagen" - id = "mutagen" - results = list("mutagen" = 3) - required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) + id = /datum/reagent/toxin/mutagen + results = list(/datum/reagent/toxin/mutagen = 3) + required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/chlorine = 1) /datum/chemical_reaction/lexorin name = "Lexorin" - id = "lexorin" - results = list("lexorin" = 3) - required_reagents = list("plasma" = 1, "hydrogen" = 1, "oxygen" = 1) + id = /datum/reagent/toxin/lexorin + results = list(/datum/reagent/toxin/lexorin = 3) + required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) /datum/chemical_reaction/chloralhydrate name = "Chloral Hydrate" - id = "chloralhydrate" - results = list("chloralhydrate" = 1) - required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) + id = /datum/reagent/toxin/chloralhydrate + results = list(/datum/reagent/toxin/chloralhydrate = 1) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 3, /datum/reagent/water = 1) /datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v name = "Mute Toxin" - id = "mutetoxin" - results = list("mutetoxin" = 2) - required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1) + id = /datum/reagent/toxin/mutetoxin + results = list(/datum/reagent/toxin/mutetoxin = 2) + required_reagents = list(/datum/reagent/uranium = 2, /datum/reagent/water = 1, /datum/reagent/carbon = 1) /datum/chemical_reaction/zombiepowder name = "Zombie Powder" - id = "zombiepowder" - results = list("zombiepowder" = 2) - required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) + id = /datum/reagent/toxin/zombiepowder + results = list(/datum/reagent/toxin/zombiepowder = 2) + required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/medicine/morphine = 5, /datum/reagent/copper = 5) /datum/chemical_reaction/ghoulpowder name = "Ghoul Powder" - id = "ghoulpowder" - results = list("ghoulpowder" = 2) - required_reagents = list("zombiepowder" = 1, "epinephrine" = 1) + id = /datum/reagent/toxin/ghoulpowder + results = list(/datum/reagent/toxin/ghoulpowder = 2) + required_reagents = list(/datum/reagent/toxin/zombiepowder = 1, /datum/reagent/medicine/epinephrine = 1) /datum/chemical_reaction/mindbreaker name = "Mindbreaker Toxin" - id = "mindbreaker" - results = list("mindbreaker" = 5) - required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) + id = /datum/reagent/toxin/mindbreaker + results = list(/datum/reagent/toxin/mindbreaker = 5) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/charcoal = 1) /datum/chemical_reaction/heparin name = "Heparin" id = "Heparin" - results = list("heparin" = 4) - required_reagents = list("formaldehyde" = 1, "sodium" = 1, "chlorine" = 1, "lithium" = 1) + results = list(/datum/reagent/toxin/heparin = 4) + required_reagents = list(/datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1, /datum/reagent/lithium = 1) mix_message = "The mixture thins and loses all color." /datum/chemical_reaction/rotatium name = "Rotatium" id = "Rotatium" - results = list("rotatium" = 3) - required_reagents = list("mindbreaker" = 1, "teslium" = 1, "fentanyl" = 1) + results = list(/datum/reagent/toxin/rotatium = 3) + required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1) mix_message = "After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight." /datum/chemical_reaction/skewium name = "Skewium" id = "Skewium" - results = list("skewium" = 5) - required_reagents = list("rotatium" = 2, "plasma" = 2, "sacid" = 1) + results = list(/datum/reagent/toxin/skewium = 5) + required_reagents = list(/datum/reagent/toxin/rotatium = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/toxin/acid = 1) mix_message = "Wow! it turns out if you mix rotatium with some plasma and sulphuric acid, it gets even worse!" /datum/chemical_reaction/anacea name = "Anacea" - id = "anacea" - results = list("anacea" = 3) - required_reagents = list("haloperidol" = 1, "impedrezene" = 1, "radium" = 1) + id = /datum/reagent/toxin/anacea + results = list(/datum/reagent/toxin/anacea = 3) + required_reagents = list(/datum/reagent/medicine/haloperidol = 1, /datum/reagent/impedrezene = 1, /datum/reagent/uranium/radium = 1) /datum/chemical_reaction/mimesbane name = "Mime's Bane" - id = "mimesbane" - results = list("mimesbane" = 3) - required_reagents = list("radium" = 1, "mutetoxin" = 1, "nothing" = 1) + id = /datum/reagent/toxin/mimesbane + results = list(/datum/reagent/toxin/mimesbane = 3) + required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1) /datum/chemical_reaction/bonehurtingjuice name = "Bone Hurting Juice" - id = "bonehurtingjuice" - results = list("bonehurtingjuice" = 5) - required_reagents = list("mutagen" = 1, "itching_powder" = 3, "milk" = 1) + id = /datum/reagent/toxin/bonehurtingjuice + results = list(/datum/reagent/toxin/bonehurtingjuice = 5) + required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/toxin/itching_powder = 3, /datum/reagent/consumable/milk = 1) mix_message = "The mixture suddenly becomes clear and looks a lot like water. You feel a strong urge to drink it." diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index bb50428b2eb..cfc0dd3a80d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -21,7 +21,7 @@ if(spawned_disease) var/datum/disease/F = new spawned_disease() var/list/data = list("viruses"= list(F)) - reagents.add_reagent("blood", disease_amount, data) + reagents.add_reagent(/datum/reagent/blood, disease_amount, data) add_initial_reagents() @@ -93,8 +93,7 @@ target.visible_message("[M] has been splashed with something!", \ "[M] has been splashed with something!") for(var/datum/reagent/A in reagents.reagent_list) - R += A.id + " (" - R += num2text(A.volume) + ")," + R += "[A.type] ([num2text(A.volume)])," if(thrownby) log_combat(thrownby, M, "splashed", R) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 804c23b5129..2aea9a27ef3 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -11,12 +11,12 @@ /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - reagents.add_reagent(unique_blood ? unique_blood : "blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change(changetype) if(reagents) - var/datum/reagent/blood/B = reagents.has_reagent("blood") + var/datum/reagent/blood/B = reagents.has_reagent(/datum/reagent/blood) if(B && B.data && B.data["blood_type"]) blood_type = B.data["blood_type"] else @@ -72,7 +72,7 @@ /obj/item/reagent_containers/blood/ethereal blood_type = "LE" - unique_blood = "liquidelectricity" + unique_blood = /datum/reagent/consumable/liquidelectricity /obj/item/reagent_containers/blood/universal blood_type = "U" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index cc6a0298ae8..1deda349d84 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -26,10 +26,11 @@ Borg Hypospray var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin", "salglu_solution") + var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/antitoxin, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution) var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. //Used as list for input() in shakers. + var/list/reagent_names = list() /obj/item/reagent_containers/borghypo/Initialize() @@ -56,7 +57,7 @@ Borg Hypospray return 1 // Use this to add more chemicals for the borghypo to produce. -/obj/item/reagent_containers/borghypo/proc/add_reagent(reagent) +/obj/item/reagent_containers/borghypo/proc/add_reagent(datum/reagent/reagent) reagent_ids |= reagent var/datum/reagents/RG = new(30) RG.my_atom = src @@ -66,9 +67,11 @@ Borg Hypospray R.add_reagent(reagent, 30) modes[reagent] = modes.len + 1 + reagent_names[initial(reagent.name)] = reagent -/obj/item/reagent_containers/borghypo/proc/del_reagent(reagent) +/obj/item/reagent_containers/borghypo/proc/del_reagent(datum/reagent/reagent) reagent_ids -= reagent + reagent_names -= initial(reagent.name) var/datum/reagents/RG var/datum/reagents/TRG for(var/i in 1 to reagent_ids.len) @@ -114,7 +117,7 @@ Borg Hypospray log_combat(user, M, "injected", src, "(CHEMICALS: [english_list(injected)])") /obj/item/reagent_containers/borghypo/attack_self(mob/user) - var/chosen_reagent = modes[input(user, "What reagent do you want to dispense?") as null|anything in reagent_ids] + var/chosen_reagent = modes[reagent_names[input(user, "What reagent do you want to dispense?") as null|anything in reagent_names]] if(!chosen_reagent) return mode = chosen_reagent @@ -142,19 +145,19 @@ Borg Hypospray /obj/item/reagent_containers/borghypo/hacked icon_state = "borghypo_s" - reagent_ids = list ("facid", "mutetoxin", "cyanide", "sodium_thiopental", "heparin", "lexorin") + reagent_ids = list (/datum/reagent/toxin/acid/fluacid, /datum/reagent/toxin/mutetoxin, /datum/reagent/toxin/cyanide, /datum/reagent/toxin/sodium_thiopental, /datum/reagent/toxin/heparin, /datum/reagent/toxin/lexorin) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/clown name = "laughter injector" desc = "Keeps the crew happy and productive!" - reagent_ids = list("laughter") + reagent_ids = list(/datum/reagent/consumable/laughter) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/clown/hacked name = "laughter injector" desc = "Keeps the crew so happy they don't work!" - reagent_ids = list("superlaughter") + reagent_ids = list(/datum/reagent/consumable/superlaughter) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/syndicate @@ -163,7 +166,7 @@ Borg Hypospray icon_state = "borghypo_s" charge_cost = 20 recharge_time = 2 - reagent_ids = list("syndicate_nanites", "potass_iodide", "morphine") + reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine) bypass_protection = 1 accepts_reagent_upgrades = FALSE @@ -180,7 +183,7 @@ Borg Shaker recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "milk", "coffee", "banana", "lemonjuice") + reagent_ids = list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/grenadine, /datum/reagent/consumable/limejuice, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/tonic, /datum/reagent/consumable/sodawater, /datum/reagent/consumable/ice, /datum/reagent/consumable/cream, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/rum, /datum/reagent/consumable/ethanol/gin, /datum/reagent/consumable/ethanol/tequila, /datum/reagent/consumable/ethanol/vermouth, /datum/reagent/consumable/ethanol/wine, /datum/reagent/consumable/ethanol/kahlua, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/milk, /datum/reagent/consumable/coffee, /datum/reagent/consumable/banana, /datum/reagent/consumable/lemonjuice) /obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) return //Can't inject stuff with a shaker, can we? //not with that attitude @@ -236,22 +239,22 @@ Borg Shaker recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("fakebeer", "fernet") + reagent_ids = list(/datum/reagent/toxin/fakebeer, /datum/reagent/consumable/ethanol/fernet) /obj/item/reagent_containers/borghypo/peace name = "Peace Hypospray" - reagent_ids = list("dizzysolution","tiresolution","synthpax") + reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/peace/hacked desc = "Everything's peaceful in death!" icon_state = "borghypo_s" - reagent_ids = list("dizzysolution","tiresolution","synthpax","tirizene","sulfonal","sodium_thiopental","cyanide","fentanyl") + reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/epi name = "epinephrine injector" desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients." - reagent_ids = list("epinephrine") + reagent_ids = list(/datum/reagent/medicine/epinephrine) accepts_reagent_upgrades = FALSE diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index cca44f00b5f..2605a0058c9 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -43,96 +43,96 @@ /obj/item/reagent_containers/glass/bottle/epinephrine name = "epinephrine bottle" desc = "A small bottle. Contains epinephrine - used to stabilize patients." - list_reagents = list("epinephrine" = 30) + list_reagents = list(/datum/reagent/medicine/epinephrine = 30) /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle of toxins. Do not drink, it is poisonous." - list_reagents = list("toxin" = 30) + list_reagents = list(/datum/reagent/toxin = 30) /obj/item/reagent_containers/glass/bottle/cyanide name = "cyanide bottle" desc = "A small bottle of cyanide. Bitter almonds?" - list_reagents = list("cyanide" = 30) + list_reagents = list(/datum/reagent/toxin/cyanide = 30) /obj/item/reagent_containers/glass/bottle/spewium name = "spewium bottle" desc = "A small bottle of spewium." - list_reagents = list("spewium" = 30) + list_reagents = list(/datum/reagent/toxin/spewium = 30) /obj/item/reagent_containers/glass/bottle/morphine name = "morphine bottle" desc = "A small bottle of morphine." icon = 'icons/obj/chemical.dmi' - list_reagents = list("morphine" = 30) + list_reagents = list(/datum/reagent/medicine/morphine = 30) /obj/item/reagent_containers/glass/bottle/chloralhydrate name = "chloral hydrate bottle" desc = "A small bottle of Choral Hydrate. Mickey's Favorite!" icon_state = "bottle20" - list_reagents = list("chloralhydrate" = 15) + list_reagents = list(/datum/reagent/toxin/chloralhydrate = 15) /obj/item/reagent_containers/glass/bottle/mannitol name = "mannitol bottle" desc = "A small bottle of Mannitol. Useful for healing brain damage." - list_reagents = list("mannitol" = 30) + list_reagents = list(/datum/reagent/medicine/mannitol = 30) /obj/item/reagent_containers/glass/bottle/charcoal name = "charcoal bottle" desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream." - list_reagents = list("charcoal" = 30) + list_reagents = list(/datum/reagent/medicine/charcoal = 30) /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact." - list_reagents = list("mutagen" = 30) + list_reagents = list(/datum/reagent/toxin/mutagen = 30) /obj/item/reagent_containers/glass/bottle/plasma name = "liquid plasma bottle" desc = "A small bottle of liquid plasma. Extremely toxic and reacts with micro-organisms inside blood." - list_reagents = list("plasma" = 30) + list_reagents = list(/datum/reagent/toxin/plasma = 30) /obj/item/reagent_containers/glass/bottle/synaptizine name = "synaptizine bottle" desc = "A small bottle of synaptizine." - list_reagents = list("synaptizine" = 30) + list_reagents = list(/datum/reagent/medicine/synaptizine = 30) /obj/item/reagent_containers/glass/bottle/formaldehyde name = "formaldehyde bottle" desc = "A small bottle of formaldehyde." - list_reagents = list("formaldehyde" = 30) + list_reagents = list(/datum/reagent/toxin/formaldehyde = 30) /obj/item/reagent_containers/glass/bottle/ammonia name = "ammonia bottle" desc = "A small bottle of ammonia." - list_reagents = list("ammonia" = 30) + list_reagents = list(/datum/reagent/ammonia = 30) /obj/item/reagent_containers/glass/bottle/diethylamine name = "diethylamine bottle" desc = "A small bottle of diethylamine." - list_reagents = list("diethylamine" = 30) + list_reagents = list(/datum/reagent/diethylamine = 30) /obj/item/reagent_containers/glass/bottle/facid name = "Fluorosulfuric Acid Bottle" desc = "A small bottle. Contains a small amount of fluorosulfuric acid." - list_reagents = list("facid" = 30) + list_reagents = list(/datum/reagent/toxin/acid/fluacid = 30) /obj/item/reagent_containers/glass/bottle/adminordrazine name = "Adminordrazine Bottle" desc = "A small bottle. Contains the liquid essence of the gods." icon = 'icons/obj/drinks.dmi' icon_state = "holyflask" - list_reagents = list("adminordrazine" = 30) + list_reagents = list(/datum/reagent/medicine/adminordrazine = 30) /obj/item/reagent_containers/glass/bottle/capsaicin name = "Capsaicin Bottle" desc = "A small bottle. Contains hot sauce." - list_reagents = list("capsaicin" = 30) + list_reagents = list(/datum/reagent/consumable/capsaicin = 30) /obj/item/reagent_containers/glass/bottle/frostoil name = "Frost Oil Bottle" desc = "A small bottle. Contains cold sauce." - list_reagents = list("frostoil" = 30) + list_reagents = list(/datum/reagent/consumable/frostoil = 30) /obj/item/reagent_containers/glass/bottle/traitor name = "syndicate bottle" @@ -142,94 +142,94 @@ /obj/item/reagent_containers/glass/bottle/traitor/Initialize() . = ..() - extra_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "fentanyl", "cyanide") + extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide) reagents.add_reagent("[extra_reagent]", 3) /obj/item/reagent_containers/glass/bottle/polonium name = "polonium bottle" desc = "A small bottle. Contains Polonium." - list_reagents = list("polonium" = 30) + list_reagents = list(/datum/reagent/toxin/polonium = 30) /obj/item/reagent_containers/glass/bottle/magillitis name = "magillitis bottle" desc = "A small bottle. Contains a serum known only as 'magillitis'." - list_reagents = list("magillitis" = 5) + list_reagents = list(/datum/reagent/magillitis = 5) /obj/item/reagent_containers/glass/bottle/venom name = "venom bottle" desc = "A small bottle. Contains Venom." - list_reagents = list("venom" = 30) + list_reagents = list(/datum/reagent/toxin/venom = 30) /obj/item/reagent_containers/glass/bottle/fentanyl name = "fentanyl bottle" desc = "A small bottle. Contains Fentanyl." - list_reagents = list("fentanyl" = 30) + list_reagents = list(/datum/reagent/toxin/fentanyl = 30) /obj/item/reagent_containers/glass/bottle/formaldehyde name = "formaldehyde bottle" desc = "A small bottle. Contains Formaldehyde." - list_reagents = list("formaldehyde" = 30) + list_reagents = list(/datum/reagent/toxin/formaldehyde = 30) /obj/item/reagent_containers/glass/bottle/initropidril name = "initropidril bottle" desc = "A small bottle. Contains initropidril." - list_reagents = list("initropidril" = 30) + list_reagents = list(/datum/reagent/toxin/initropidril = 30) /obj/item/reagent_containers/glass/bottle/pancuronium name = "pancuronium bottle" desc = "A small bottle. Contains pancuronium." - list_reagents = list("pancuronium" = 30) + list_reagents = list(/datum/reagent/toxin/pancuronium = 30) /obj/item/reagent_containers/glass/bottle/sodium_thiopental name = "sodium thiopental bottle" desc = "A small bottle. Contains sodium thiopental." - list_reagents = list("sodium_thiopental" = 30) + list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 30) /obj/item/reagent_containers/glass/bottle/coniine name = "coniine bottle" desc = "A small bottle. Contains coniine." - list_reagents = list("coniine" = 30) + list_reagents = list(/datum/reagent/toxin/coniine = 30) /obj/item/reagent_containers/glass/bottle/curare name = "curare bottle" desc = "A small bottle. Contains curare." - list_reagents = list("curare" = 30) + list_reagents = list(/datum/reagent/toxin/curare = 30) /obj/item/reagent_containers/glass/bottle/amanitin name = "amanitin bottle" desc = "A small bottle. Contains amanitin." - list_reagents = list("amanitin" = 30) + list_reagents = list(/datum/reagent/toxin/amanitin = 30) /obj/item/reagent_containers/glass/bottle/histamine name = "histamine bottle" desc = "A small bottle. Contains Histamine." - list_reagents = list("histamine" = 30) + list_reagents = list(/datum/reagent/toxin/histamine = 30) /obj/item/reagent_containers/glass/bottle/diphenhydramine name = "antihistamine bottle" desc = "A small bottle of diphenhydramine." - list_reagents = list("diphenhydramine" = 30) + list_reagents = list(/datum/reagent/medicine/diphenhydramine = 30) /obj/item/reagent_containers/glass/bottle/potass_iodide name = "anti-radiation bottle" desc = "A small bottle of potassium iodide." - list_reagents = list("potass_iodide" = 30) + list_reagents = list(/datum/reagent/medicine/potass_iodide = 30) /obj/item/reagent_containers/glass/bottle/salglu_solution name = "saline-glucose solution bottle" desc = "A small bottle of saline-glucose solution." icon_state = "bottle1" - list_reagents = list("salglu_solution" = 30) + list_reagents = list(/datum/reagent/medicine/salglu_solution = 30) /obj/item/reagent_containers/glass/bottle/atropine name = "atropine bottle" desc = "A small bottle of atropine." - list_reagents = list("atropine" = 30) + list_reagents = list(/datum/reagent/medicine/atropine = 30) /obj/item/reagent_containers/glass/bottle/romerol name = "romerol bottle" desc = "A small bottle of Romerol. The REAL zombie powder." - list_reagents = list("romerol" = 30) + list_reagents = list(/datum/reagent/romerol = 30) /obj/item/reagent_containers/glass/bottle/random_virus name = "Experimental disease culture bottle" @@ -306,106 +306,106 @@ /obj/item/reagent_containers/glass/bottle/tuberculosiscure name = "BVAK bottle" desc = "A small bottle containing Bio Virus Antidote Kit." - list_reagents = list("atropine" = 5, "epinephrine" = 5, "perfluorodecalin" = 10, "spaceacillin" = 10) + list_reagents = list(/datum/reagent/medicine/atropine = 5, /datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/perfluorodecalin = 10, /datum/reagent/medicine/spaceacillin = 10) //Oldstation.dmm chemical storage bottles /obj/item/reagent_containers/glass/bottle/hydrogen name = "hydrogen bottle" - list_reagents = list("hydrogen" = 30) + list_reagents = list(/datum/reagent/hydrogen = 30) /obj/item/reagent_containers/glass/bottle/lithium name = "lithium bottle" - list_reagents = list("lithium" = 30) + list_reagents = list(/datum/reagent/lithium = 30) /obj/item/reagent_containers/glass/bottle/carbon name = "carbon bottle" - list_reagents = list("carbon" = 30) + list_reagents = list(/datum/reagent/carbon = 30) /obj/item/reagent_containers/glass/bottle/nitrogen name = "nitrogen bottle" - list_reagents = list("nitrogen" = 30) + list_reagents = list(/datum/reagent/nitrogen = 30) /obj/item/reagent_containers/glass/bottle/oxygen name = "oxygen bottle" - list_reagents = list("oxygen" = 30) + list_reagents = list(/datum/reagent/oxygen = 30) /obj/item/reagent_containers/glass/bottle/fluorine name = "fluorine bottle" - list_reagents = list("fluorine" = 30) + list_reagents = list(/datum/reagent/fluorine = 30) /obj/item/reagent_containers/glass/bottle/sodium name = "sodium bottle" - list_reagents = list("sodium" = 30) + list_reagents = list(/datum/reagent/sodium = 30) /obj/item/reagent_containers/glass/bottle/aluminium name = "aluminium bottle" - list_reagents = list("aluminium" = 30) + list_reagents = list(/datum/reagent/aluminium = 30) /obj/item/reagent_containers/glass/bottle/silicon name = "silicon bottle" - list_reagents = list("silicon" = 30) + list_reagents = list(/datum/reagent/silicon = 30) /obj/item/reagent_containers/glass/bottle/phosphorus name = "phosphorus bottle" - list_reagents = list("phosphorus" = 30) + list_reagents = list(/datum/reagent/phosphorus = 30) /obj/item/reagent_containers/glass/bottle/sulfur name = "sulfur bottle" - list_reagents = list("sulfur" = 30) + list_reagents = list(/datum/reagent/sulfur = 30) /obj/item/reagent_containers/glass/bottle/chlorine name = "chlorine bottle" - list_reagents = list("chlorine" = 30) + list_reagents = list(/datum/reagent/chlorine = 30) /obj/item/reagent_containers/glass/bottle/potassium name = "potassium bottle" - list_reagents = list("potassium" = 30) + list_reagents = list(/datum/reagent/potassium = 30) /obj/item/reagent_containers/glass/bottle/iron name = "iron bottle" - list_reagents = list("iron" = 30) + list_reagents = list(/datum/reagent/iron = 30) /obj/item/reagent_containers/glass/bottle/copper name = "copper bottle" - list_reagents = list("copper" = 30) + list_reagents = list(/datum/reagent/copper = 30) /obj/item/reagent_containers/glass/bottle/mercury name = "mercury bottle" - list_reagents = list("mercury" = 30) + list_reagents = list(/datum/reagent/mercury = 30) /obj/item/reagent_containers/glass/bottle/radium name = "radium bottle" - list_reagents = list("radium" = 30) + list_reagents = list(/datum/reagent/uranium/radium = 30) /obj/item/reagent_containers/glass/bottle/water name = "water bottle" - list_reagents = list("water" = 30) + list_reagents = list(/datum/reagent/water = 30) /obj/item/reagent_containers/glass/bottle/ethanol name = "ethanol bottle" - list_reagents = list("ethanol" = 30) + list_reagents = list(/datum/reagent/consumable/ethanol = 30) /obj/item/reagent_containers/glass/bottle/sugar name = "sugar bottle" - list_reagents = list("sugar" = 30) + list_reagents = list(/datum/reagent/consumable/sugar = 30) /obj/item/reagent_containers/glass/bottle/sacid name = "sulphuric acid bottle" - list_reagents = list("sacid" = 30) + list_reagents = list(/datum/reagent/toxin/acid = 30) /obj/item/reagent_containers/glass/bottle/welding_fuel name = "welding fuel bottle" - list_reagents = list("welding_fuel" = 30) + list_reagents = list(/datum/reagent/fuel = 30) /obj/item/reagent_containers/glass/bottle/silver name = "silver bottle" - list_reagents = list("silver" = 30) + list_reagents = list(/datum/reagent/silver = 30) /obj/item/reagent_containers/glass/bottle/iodine name = "iodine bottle" - list_reagents = list("iodine" = 30) + list_reagents = list(/datum/reagent/iodine = 30) /obj/item/reagent_containers/glass/bottle/bromine name = "bromine bottle" - list_reagents = list("bromine" = 30) + list_reagents = list(/datum/reagent/bromine = 30) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index f8f09a3ceb6..cfbb387d89d 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -58,8 +58,8 @@ var/R if(reagents) for(var/datum/reagent/A in src.reagents.reagent_list) - R += A.id + " (" - R += num2text(A.volume) + ")," + R += "[A] ([num2text(A.volume)])," + log_combat(user, M, "squirted", R) trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 19d225fb119..f8beafa949f 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -27,8 +27,8 @@ "[user] splashes the contents of [src] onto [M]!") if(reagents) for(var/datum/reagent/A in reagents.reagent_list) - R += A.id + " (" - R += num2text(A.volume) + ")," + R += "[A] ([num2text(A.volume)])," + if(isturf(target) && reagents.reagent_list.len && thrownby) log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") @@ -214,32 +214,32 @@ possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) /obj/item/reagent_containers/glass/beaker/cryoxadone - list_reagents = list("cryoxadone" = 30) + list_reagents = list(/datum/reagent/medicine/cryoxadone = 30) /obj/item/reagent_containers/glass/beaker/sulphuric - list_reagents = list("sacid" = 50) + list_reagents = list(/datum/reagent/toxin/acid = 50) /obj/item/reagent_containers/glass/beaker/slime - list_reagents = list("slimejelly" = 50) + list_reagents = list(/datum/reagent/toxin/slimejelly = 50) /obj/item/reagent_containers/glass/beaker/large/styptic name = "styptic reserve tank" - list_reagents = list("styptic_powder" = 50) + list_reagents = list(/datum/reagent/medicine/styptic_powder = 50) /obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine name = "silver sulfadiazine reserve tank" - list_reagents = list("silver_sulfadiazine" = 50) + list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 50) /obj/item/reagent_containers/glass/beaker/large/charcoal name = "charcoal reserve tank" - list_reagents = list("charcoal" = 50) + list_reagents = list(/datum/reagent/medicine/charcoal = 50) /obj/item/reagent_containers/glass/beaker/large/epinephrine name = "epinephrine reserve tank" - list_reagents = list("epinephrine" = 50) + list_reagents = list(/datum/reagent/medicine/epinephrine = 50) /obj/item/reagent_containers/glass/beaker/synthflesh - list_reagents = list("synthflesh" = 50) + list_reagents = list(/datum/reagent/medicine/synthflesh = 50) /obj/item/reagent_containers/glass/bucket name = "bucket" @@ -313,7 +313,7 @@ icon = 'icons/obj/drinks.dmi' icon_state = "smallbottle" item_state = "bottle" - list_reagents = list("water" = 49.5, "fluorine" = 0.5)//see desc, don't think about it too hard + list_reagents = list(/datum/reagent/water = 49.5, /datum/reagent/fluorine = 0.5)//see desc, don't think about it too hard materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 @@ -325,7 +325,7 @@ desc = "A fresh commercial-sized bottle of water." icon_state = "largebottle" materials = list(MAT_GLASS=0) - list_reagents = list("water" = 100) + list_reagents = list(/datum/reagent/water = 100) volume = 100 amount_per_transfer_from_this = 20 @@ -393,4 +393,4 @@ /obj/item/reagent_containers/glass/saline name = "saline canister" volume = 5000 - list_reagents = list("salglu_solution" = 5000) \ No newline at end of file + list_reagents = list(/datum/reagent/medicine/salglu_solution = 5000) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index b1313834eb9..abb241b15ba 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -51,7 +51,7 @@ log_combat(user, M, "injected", src, "([contained])") /obj/item/reagent_containers/hypospray/CMO - list_reagents = list("omnizine" = 30) + list_reagents = list(/datum/reagent/medicine/omnizine = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF /obj/item/reagent_containers/hypospray/combat @@ -61,12 +61,12 @@ icon_state = "combat_hypo" volume = 90 ignore_flags = 1 // So they can heal their comrades. - list_reagents = list("epinephrine" = 30, "omnizine" = 30, "leporazine" = 15, "atropine" = 15) + list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) /obj/item/reagent_containers/hypospray/combat/nanites desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical compounds for rapid healing." volume = 100 - list_reagents = list("quantum_heal" = 80, "synaptizine" = 20) + list_reagents = list(/datum/reagent/medicine/adminordrazine/quantum_heal = 80, /datum/reagent/medicine/synaptizine = 20) /obj/item/reagent_containers/hypospray/magillitis name = "experimental autoinjector" @@ -74,7 +74,7 @@ icon_state = "combat_hypo" volume = 5 reagent_flags = NONE - list_reagents = list("magillitis" = 5) + list_reagents = list(/datum/reagent/magillitis = 5) //MediPens @@ -90,7 +90,7 @@ ignore_flags = 1 //so you can medipen through hardsuits reagent_flags = DRAWABLE flags_1 = null - list_reagents = list("epinephrine" = 10) + list_reagents = list(/datum/reagent/medicine/epinephrine = 10) custom_price = 40 /obj/item/reagent_containers/hypospray/medipen/suicide_act(mob/living/carbon/user) @@ -134,16 +134,16 @@ icon_state = "stimpen" volume = 20 amount_per_transfer_from_this = 20 - list_reagents = list("ephedrine" = 10, "coffee" = 10) + list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/consumable/coffee = 10) /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor desc = "A modified stimulants autoinjector for use in combat situations. Has a mild healing effect." - list_reagents = list("stimulants" = 10, "omnizine" = 10) + list_reagents = list(/datum/reagent/medicine/stimulants = 10, /datum/reagent/medicine/omnizine = 10) /obj/item/reagent_containers/hypospray/medipen/morphine name = "morphine medipen" desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though." - list_reagents = list("morphine" = 10) + list_reagents = list(/datum/reagent/medicine/morphine = 10) /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure name = "BVAK autoinjector" @@ -151,7 +151,7 @@ icon_state = "stimpen" volume = 60 amount_per_transfer_from_this = 30 - list_reagents = list("atropine" = 10, "epinephrine" = 10, "salbutamol" = 20, "spaceacillin" = 20) + list_reagents = list(/datum/reagent/medicine/atropine = 10, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/salbutamol = 20, /datum/reagent/medicine/spaceacillin = 20) /obj/item/reagent_containers/hypospray/medipen/survival name = "survival medipen" @@ -159,7 +159,7 @@ icon_state = "stimpen" volume = 57 amount_per_transfer_from_this = 57 - list_reagents = list("salbutamol" = 10, "leporazine" = 15, "tricordrazine" = 15, "epinephrine" = 10, "lavaland_extract" = 2, "omnizine" = 5) + list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/tricordrazine = 15, /datum/reagent/medicine/epinephrine = 10, /datum/reagent/medicine/lavaland_extract = 2, /datum/reagent/medicine/omnizine = 5) /obj/item/reagent_containers/hypospray/medipen/species_mutator name = "species mutator medipen" @@ -173,16 +173,16 @@ name = "holy water autoinjector" desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture." volume = 250 - list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50) + list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg/tire = 50, /datum/reagent/peaceborg/confuse = 50) amount_per_transfer_from_this = 50 /obj/item/reagent_containers/hypospray/medipen/atropine name = "atropine autoinjector" desc = "A rapid way to save a person from a critical injury state!" - list_reagents = list("atropine" = 10) + list_reagents = list(/datum/reagent/medicine/atropine = 10) /obj/item/reagent_containers/hypospray/medipen/snail name = "snail shot" desc = "All-purpose snail medicine! Do not use on non-snails!" - list_reagents = list("snailserum" = 10) + list_reagents = list(/datum/reagent/snail = 10) icon_state = "snail" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index acfe324c07e..9335b88af77 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -72,22 +72,22 @@ name = "medical spray (styptic powder)" desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains styptic powder, for treating cuts and bruises." icon_state = "brutespray" - list_reagents = list("styptic_powder" = 60) + list_reagents = list(/datum/reagent/medicine/styptic_powder = 60) /obj/item/reagent_containers/medspray/silver_sulf name = "medical spray (silver sulfadiazine)" desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains silver sulfadiazine, useful for treating burns." icon_state = "burnspray" - list_reagents = list("silver_sulfadiazine" = 60) + list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 60) /obj/item/reagent_containers/medspray/synthflesh name = "medical spray (synthflesh)" desc = "A medical spray bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, an apex brute and burn healing agent." icon_state = "synthspray" - list_reagents = list("synthflesh" = 60) + list_reagents = list(/datum/reagent/medicine/synthflesh = 60) custom_price = 80 /obj/item/reagent_containers/medspray/sterilizine name = "sterilizer spray" desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." - list_reagents = list("sterilizine" = 60) + list_reagents = list(/datum/reagent/space_cleaner/sterilizine = 60) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 370d7f6475d..fd05482daa6 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -30,17 +30,17 @@ /obj/item/reagent_containers/pill/patch/styptic name = "brute patch" desc = "Helps with brute injuries." - list_reagents = list("styptic_powder" = 20) + list_reagents = list(/datum/reagent/medicine/styptic_powder = 20) icon_state = "bandaid_brute" /obj/item/reagent_containers/pill/patch/silver_sulf name = "burn patch" desc = "Helps with burn injuries." - list_reagents = list("silver_sulfadiazine" = 20) + list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 20) icon_state = "bandaid_burn" /obj/item/reagent_containers/pill/patch/synthflesh name = "synthflesh patch" desc = "Helps with brute and burn injuries." - list_reagents = list("synthflesh" = 20) + list_reagents = list(/datum/reagent/medicine/synthflesh = 20) icon_state = "bandaid_both" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index f82c37bacf6..56229fbaa82 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -80,108 +80,108 @@ name = "toxins pill" desc = "Highly toxic." icon_state = "pill5" - list_reagents = list("toxin" = 50) + list_reagents = list(/datum/reagent/toxin = 50) rename_with_volume = TRUE /obj/item/reagent_containers/pill/cyanide name = "cyanide pill" desc = "Don't swallow this." icon_state = "pill5" - list_reagents = list("cyanide" = 50) + list_reagents = list(/datum/reagent/toxin/cyanide = 50) /obj/item/reagent_containers/pill/adminordrazine name = "adminordrazine pill" desc = "It's magic. We don't have to explain it." icon_state = "pill16" - list_reagents = list("adminordrazine" = 50) + list_reagents = list(/datum/reagent/medicine/adminordrazine = 50) /obj/item/reagent_containers/pill/morphine name = "morphine pill" desc = "Commonly used to treat insomnia." icon_state = "pill8" - list_reagents = list("morphine" = 30) + list_reagents = list(/datum/reagent/medicine/morphine = 30) rename_with_volume = TRUE /obj/item/reagent_containers/pill/stimulant name = "stimulant pill" desc = "Often taken by overworked employees, athletes, and the inebriated. You'll snap to attention immediately!" icon_state = "pill19" - list_reagents = list("ephedrine" = 10, "antihol" = 10, "coffee" = 30) + list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/medicine/antihol = 10, /datum/reagent/consumable/coffee = 30) /obj/item/reagent_containers/pill/salbutamol name = "salbutamol pill" desc = "Used to treat oxygen deprivation." icon_state = "pill16" - list_reagents = list("salbutamol" = 30) + list_reagents = list(/datum/reagent/medicine/salbutamol = 30) rename_with_volume = TRUE /obj/item/reagent_containers/pill/charcoal name = "charcoal pill" desc = "Neutralizes many common toxins." icon_state = "pill17" - list_reagents = list("charcoal" = 10) + list_reagents = list(/datum/reagent/medicine/charcoal = 10) rename_with_volume = TRUE /obj/item/reagent_containers/pill/epinephrine name = "epinephrine pill" desc = "Used to stabilize patients." icon_state = "pill5" - list_reagents = list("epinephrine" = 15) + list_reagents = list(/datum/reagent/medicine/epinephrine = 15) rename_with_volume = TRUE /obj/item/reagent_containers/pill/mannitol name = "mannitol pill" desc = "Used to treat brain damage." icon_state = "pill17" - list_reagents = list("mannitol" = 50) + list_reagents = list(/datum/reagent/medicine/mannitol = 50) rename_with_volume = TRUE /obj/item/reagent_containers/pill/mutadone name = "mutadone pill" desc = "Used to treat genetic damage." icon_state = "pill20" - list_reagents = list("mutadone" = 50) + list_reagents = list(/datum/reagent/medicine/mutadone = 50) rename_with_volume = TRUE /obj/item/reagent_containers/pill/salicyclic name = "salicylic acid pill" desc = "Used to dull pain." icon_state = "pill9" - list_reagents = list("sal_acid" = 24) + list_reagents = list(/datum/reagent/medicine/sal_acid = 24) rename_with_volume = TRUE /obj/item/reagent_containers/pill/oxandrolone name = "oxandrolone pill" desc = "Used to stimulate burn healing." icon_state = "pill11" - list_reagents = list("oxandrolone" = 24) + list_reagents = list(/datum/reagent/medicine/oxandrolone = 24) rename_with_volume = TRUE /obj/item/reagent_containers/pill/insulin name = "insulin pill" desc = "Handles hyperglycaemic coma." icon_state = "pill18" - list_reagents = list("insulin" = 50) + list_reagents = list(/datum/reagent/medicine/insulin = 50) rename_with_volume = TRUE /obj/item/reagent_containers/pill/psicodine name = "psicodine pill" desc = "Used to treat mental instability and phobias." - list_reagents = list("psicodine" = 10) + list_reagents = list(/datum/reagent/medicine/psicodine = 10) icon_state = "pill22" rename_with_volume = TRUE /obj/item/reagent_containers/pill/penacid name = "pentetic acid pill" - desc = "Used to expunge radioation and toxins." - list_reagents = list("pen_acid" = 10) + desc = "Used to expunge radiation and toxins." + list_reagents = list(/datum/reagent/medicine/pen_acid = 10) icon_state = "pill22" rename_with_volume = TRUE /obj/item/reagent_containers/pill/neurine name = "neurine pill" desc = "Used to treat non-severe mental traumas." - list_reagents = list("neurine" = 10) + list_reagents = list(/datum/reagent/medicine/neurine = 10) icon_state = "pill22" rename_with_volume = TRUE @@ -191,41 +191,41 @@ desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list("shadowmutationtoxin" = 1) + list_reagents = list(/datum/reagent/mutationtoxin/shadow = 1) //////////////////////////////////////// drugs /obj/item/reagent_containers/pill/zoom name = "yellow pill" desc = "A poorly made canary-yellow pill; it is slightly crumbly." - list_reagents = list("synaptizine" = 10, "nicotine" = 10, "methamphetamine" = 1) + list_reagents = list(/datum/reagent/medicine/synaptizine = 10, /datum/reagent/drug/nicotine = 10, /datum/reagent/drug/methamphetamine = 1) icon_state = "pill7" /obj/item/reagent_containers/pill/happy name = "happy pill" desc = "They have little happy faces on them, and they smell like marker pens." - list_reagents = list("sugar" = 10, "space_drugs" = 10) + list_reagents = list(/datum/reagent/consumable/sugar = 10, /datum/reagent/drug/space_drugs = 10) icon_state = "pill_happy" /obj/item/reagent_containers/pill/lsd name = "sunshine pill" desc = "Engraved on this split-coloured pill is a half-sun, half-moon." - list_reagents = list("mushroomhallucinogen" = 15, "mindbreaker" = 15) + list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 15, /datum/reagent/toxin/mindbreaker = 15) icon_state = "pill14" /obj/item/reagent_containers/pill/aranesp name = "smooth pill" desc = "This blue pill is feels slightly moist." - list_reagents = list("aranesp" = 10) + list_reagents = list(/datum/reagent/drug/aranesp = 10) icon_state = "pill3" /obj/item/reagent_containers/pill/happiness name = "happiness pill" desc = "It has a creepy smiling face on it." icon_state = "pill_happy" - list_reagents = list("happiness" = 10) + list_reagents = list(/datum/reagent/drug/happiness = 10) /obj/item/reagent_containers/pill/floorpill name = "floorpill" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 28aa7020625..a1ae4494eb3 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -161,7 +161,7 @@ name = "space cleaner" desc = "BLAM!-brand non-foaming space cleaner!" volume = 100 - list_reagents = list("cleaner" = 100) + list_reagents = list(/datum/reagent/space_cleaner = 100) amount_per_transfer_from_this = 2 stream_amount = 5 @@ -184,7 +184,7 @@ name = "spray tan" volume = 50 desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices." - list_reagents = list("spraytan" = 50) + list_reagents = list(/datum/reagent/spraytan = 50) //pepperspray @@ -199,7 +199,7 @@ volume = 40 stream_range = 4 amount_per_transfer_from_this = 5 - list_reagents = list("condensedcapsaicin" = 40) + list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 40) /obj/item/reagent_containers/spray/pepper/empty //for protolathe printing list_reagents = null @@ -223,7 +223,7 @@ item_state = "sunflower" amount_per_transfer_from_this = 1 volume = 10 - list_reagents = list("water" = 10) + list_reagents = list(/datum/reagent/water = 10) /obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays return @@ -231,9 +231,9 @@ /obj/item/reagent_containers/spray/waterflower/cyborg reagent_flags = NONE volume = 100 - list_reagents = list("water" = 100) + list_reagents = list(/datum/reagent/water = 100) var/generate_amount = 5 - var/generate_type = "water" + var/generate_type = /datum/reagent/water var/last_generate = 0 var/generate_delay = 10 //deciseconds can_fill_from_container = FALSE @@ -241,9 +241,9 @@ /obj/item/reagent_containers/spray/waterflower/cyborg/hacked name = "nova flower" desc = "This doesn't look safe at all..." - list_reagents = list("clf3" = 3) + list_reagents = list(/datum/reagent/clf3 = 3) volume = 3 - generate_type = "clf3" + generate_type = /datum/reagent/clf3 generate_amount = 1 generate_delay = 40 //deciseconds @@ -305,7 +305,7 @@ ..(the_targets[i], user) /obj/item/reagent_containers/spray/chemsprayer/bioterror - list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100) + list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 100, /datum/reagent/toxin/coniine = 100, /datum/reagent/toxin/venom = 100, /datum/reagent/consumable/condensedcapsaicin = 100, /datum/reagent/toxin/initropidril = 100, /datum/reagent/toxin/polonium = 100) /obj/item/reagent_containers/spray/chemsprayer/janitor @@ -316,11 +316,11 @@ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' reagent_flags = NONE - list_reagents = list("cleaner" = 1000) + list_reagents = list(/datum/reagent/space_cleaner = 1000) volume = 1000 amount_per_transfer_from_this = 5 var/generate_amount = 50 - var/generate_type = "cleaner" + var/generate_type = /datum/reagent/space_cleaner var/last_generate = 0 var/generate_delay = 10 //deciseconds @@ -348,4 +348,4 @@ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' volume = 100 - list_reagents = list("plantbgone" = 100) + list_reagents = list(/datum/reagent/toxin/plantbgone = 100) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 00599f9ab7d..353ce808be0 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -179,12 +179,12 @@ /obj/item/reagent_containers/syringe/epinephrine name = "syringe (epinephrine)" desc = "Contains epinephrine - used to stabilize patients." - list_reagents = list("epinephrine" = 15) + list_reagents = list(/datum/reagent/medicine/epinephrine = 15) /obj/item/reagent_containers/syringe/charcoal name = "syringe (charcoal)" desc = "Contains charcoal." - list_reagents = list("charcoal" = 15) + list_reagents = list(/datum/reagent/medicine/charcoal = 15) /obj/item/reagent_containers/syringe/perfluorodecalin name = "syringe (perfluorodecalin)" @@ -194,29 +194,29 @@ /obj/item/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" desc = "Contains antiviral agents." - list_reagents = list("spaceacillin" = 15) + list_reagents = list(/datum/reagent/medicine/spaceacillin = 15) /obj/item/reagent_containers/syringe/bioterror name = "bioterror syringe" desc = "Contains several paralyzing reagents." - list_reagents = list("neurotoxin" = 5, "mutetoxin" = 5, "sodium_thiopental" = 5) + list_reagents = list(/datum/reagent/consumable/ethanol/neurotoxin = 5, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/toxin/sodium_thiopental = 5) /obj/item/reagent_containers/syringe/stimulants name = "Stimpack" desc = "Contains stimulants." amount_per_transfer_from_this = 50 volume = 50 - list_reagents = list("stimulants" = 50) + list_reagents = list(/datum/reagent/medicine/stimulants = 50) /obj/item/reagent_containers/syringe/calomel name = "syringe (calomel)" desc = "Contains calomel." - list_reagents = list("calomel" = 15) + list_reagents = list(/datum/reagent/medicine/calomel = 15) /obj/item/reagent_containers/syringe/plasma name = "syringe (plasma)" desc = "Contains plasma." - list_reagents = list("plasma" = 15) + list_reagents = list(/datum/reagent/toxin/plasma = 15) /obj/item/reagent_containers/syringe/lethal name = "lethal injection syringe" @@ -225,24 +225,24 @@ volume = 50 /obj/item/reagent_containers/syringe/lethal/choral - list_reagents = list("chloralhydrate" = 50) + list_reagents = list(/datum/reagent/toxin/chloralhydrate = 50) /obj/item/reagent_containers/syringe/lethal/execution - list_reagents = list("plasma" = 15, "formaldehyde" = 15, "cyanide" = 10, "facid" = 10) + list_reagents = list(/datum/reagent/toxin/plasma = 15, /datum/reagent/toxin/formaldehyde = 15, /datum/reagent/toxin/cyanide = 10, /datum/reagent/toxin/acid/fluacid = 10) /obj/item/reagent_containers/syringe/mulligan name = "Mulligan" desc = "A syringe used to completely change the users identity." amount_per_transfer_from_this = 1 volume = 1 - list_reagents = list("mulligan" = 1) + list_reagents = list(/datum/reagent/mulligan = 1) /obj/item/reagent_containers/syringe/gluttony name = "Gluttony's Blessing" desc = "A syringe recovered from a dread place. It probably isn't wise to use." amount_per_transfer_from_this = 1 volume = 1 - list_reagents = list("gluttonytoxin" = 1) + list_reagents = list(/datum/reagent/gluttonytoxin = 1) /obj/item/reagent_containers/syringe/bluespace name = "bluespace syringe" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index e5559cace6f..8a837b6d2be 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -8,7 +8,7 @@ pressure_resistance = 2*ONE_ATMOSPHERE max_integrity = 300 var/tank_volume = 1000 //In units, how much the dispenser can hold - var/reagent_id = "water" //The ID of the reagent that the dispenser uses + var/reagent_id = /datum/reagent/water //The ID of the reagent that the dispenser uses /obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() @@ -54,14 +54,14 @@ name = "firefighting foam tank" desc = "A tank full of firefighting foam." icon_state = "foam" - reagent_id = "firefighting_foam" + reagent_id = /datum/reagent/firefighting_foam tank_volume = 500 /obj/structure/reagent_dispensers/fueltank name = "fuel tank" desc = "A tank full of industrial welding fuel. Do not consume." icon_state = "fuel" - reagent_id = "welding_fuel" + reagent_id = /datum/reagent/fuel /obj/structure/reagent_dispensers/fueltank/boom() explosion(get_turf(src), 0, 1, 5, flame_range = 5) @@ -89,12 +89,12 @@ /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params) if(I.tool_behaviour == TOOL_WELDER) - if(!reagents.has_reagent("welding_fuel")) + if(!reagents.has_reagent(/datum/reagent/fuel)) to_chat(user, "[src] is out of fuel!") return var/obj/item/weldingtool/W = I if(!W.welding) - if(W.reagents.has_reagent("welding_fuel", W.max_fuel)) + if(W.reagents.has_reagent(/datum/reagent/fuel, W.max_fuel)) to_chat(user, "Your [W.name] is already full!") return reagents.trans_to(W, W.max_fuel, transfered_by = user) @@ -117,7 +117,7 @@ icon_state = "pepper" anchored = TRUE density = FALSE - reagent_id = "condensedcapsaicin" + reagent_id = /datum/reagent/consumable/condensedcapsaicin /obj/structure/reagent_dispensers/peppertank/Initialize() . = ..() @@ -159,7 +159,7 @@ name = "beer keg" desc = "Beer is liquid bread, it's good for you..." icon_state = "beer" - reagent_id = "beer" + reagent_id = /datum/reagent/consumable/ethanol/beer /obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B) explosion(src.loc,0,3,5,7,10) @@ -173,7 +173,7 @@ icon_state = "virus_food" anchored = TRUE density = FALSE - reagent_id = "virusfood" + reagent_id = /datum/reagent/consumable/virus_food /obj/structure/reagent_dispensers/cooking_oil @@ -181,4 +181,4 @@ desc = "A huge metal vat with a tap on the front. Filled with cooking oil for use in frying food." icon_state = "vat" anchored = TRUE - reagent_id = "cooking_oil" + reagent_id = /datum/reagent/consumable/cooking_oil diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index a5fe1297553..d7dc52b2487 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -10,6 +10,15 @@ build_path = /obj/item/reagent_containers/glass/bucket category = list("initial","Tools","Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/mop + name = "Mop" + id = "mop" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_METAL = 1000) + build_path = /obj/item/mop + category = list("initial","Tools","Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE /datum/design/crowbar name = "Pocket Crowbar" diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index ec79c38742a..04c7a63f9d8 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -4,18 +4,18 @@ /datum/design/milk name = "10 Milk" - id = "milk" + id = /datum/reagent/consumable/milk build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 20) - make_reagents = list("milk" = 10) + make_reagents = list(/datum/reagent/consumable/milk = 10) category = list("initial","Food") /datum/design/cream name = "10 Cream" - id = "cream" + id = /datum/reagent/consumable/cream build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 30) - make_reagents = list("cream" = 10) + make_reagents = list(/datum/reagent/consumable/cream = 10) category = list("initial","Food") /datum/design/milk_carton @@ -39,7 +39,7 @@ id = "black_pepper" build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 25) - make_reagents = list("blackpepper" = 10) + make_reagents = list(/datum/reagent/consumable/blackpepper = 10) category = list("initial","Food") /datum/design/pepper_mill @@ -53,10 +53,10 @@ /datum/design/enzyme name = "10u Universal Enzyme" - id = "enzyme" + id = /datum/reagent/consumable/enzyme build_type = BIOGENERATOR materials = list(MAT_BIOMASS = 30) - make_reagents = list("enzyme" = 10) + make_reagents = list(/datum/reagent/consumable/enzyme = 10) category = list("initial","Food") /datum/design/flour_sack diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 7df285c9adf..96d797650d1 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -46,6 +46,16 @@ category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/nanite_comm_remote + name = "Nanite Communication Remote" + desc = "Allows for the construction of a nanite communication remote." + id = "nanite_comm_remote" + build_type = PROTOLATHE + materials = list(MAT_GLASS = 500, MAT_METAL = 500) + build_path = /obj/item/nanite_remote/comm + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/nanite_scanner name = "Nanite Scanner" desc = "Allows for the construction of a nanite scanner." diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 71f7234e349..954dfca6586 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -6,7 +6,7 @@ name = "Left Arm" id = "leftarm" build_type = LIMBGROWER - reagents_list = list("synthflesh" = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/l_arm category = list("initial","human","lizard","fly","moth","plasmaman") @@ -14,7 +14,7 @@ name = "Right Arm" id = "rightarm" build_type = LIMBGROWER - reagents_list = list("synthflesh" = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/r_arm category = list("initial","human","lizard","fly","moth","plasmaman") @@ -22,7 +22,7 @@ name = "Left Leg" id = "leftleg" build_type = LIMBGROWER - reagents_list = list("synthflesh" = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/l_leg category = list("initial","human","lizard","fly","moth","plasmaman") @@ -30,7 +30,7 @@ name = "Right Leg" id = "rightleg" build_type = LIMBGROWER - reagents_list = list("synthflesh" = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/r_leg category = list("initial","human","lizard","fly","moth","plasmaman") @@ -38,6 +38,6 @@ name = "Arm Blade" id = "armblade" build_type = LIMBGROWER - reagents_list = list("synthflesh" = 75) + reagents_list = list(/datum/reagent/medicine/synthflesh = 75) build_path = /obj/item/melee/synthetic_arm_blade category = list("other","emagged") \ No newline at end of file diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 44c2742cbd7..2cd31ed67d1 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -260,6 +260,16 @@ ////////////Janitor Designs////////////// ///////////////////////////////////////// +/datum/design/mop + name = "Mop" + desc = "It mops." + id = "mop" + build_type = PROTOLATHE + materials = list(MAT_METAL = 1000) + build_path = /obj/item/mop + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/advmop name = "Advanced Mop" desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm index 177d7073a10..6a4b8686635 100644 --- a/code/modules/research/designs/nanite_designs.dm +++ b/code/modules/research/designs/nanite_designs.dm @@ -415,21 +415,21 @@ name = "Skull Echo" desc = "The nanites echo a synthesized message inside the host's skull." id = "voice_nanites" - program_type = /datum/nanite_program/triggered/voice + program_type = /datum/nanite_program/triggered/comm/voice category = list("Suppression Nanites") /datum/design/nanites/speech name = "Forced Speech" desc = "The nanites force the host to say a pre-programmed sentence when triggered." id = "speech_nanites" - program_type = /datum/nanite_program/triggered/speech + program_type = /datum/nanite_program/triggered/comm/speech category = list("Suppression Nanites") /datum/design/nanites/hallucination name = "Hallucination" desc = "The nanites make the host see and hear things that aren't real." id = "hallucination_nanites" - program_type = /datum/nanite_program/triggered/hallucination + program_type = /datum/nanite_program/triggered/comm/hallucination category = list("Suppression Nanites") ////////////////////SENSOR NANITES////////////////////////////////////// diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 7ed2b6b6b9c..9def198276c 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -11,7 +11,7 @@ construction_time=100 build_path = /obj/item/stock_parts/cell/empty category = list("Misc","Power Designs","Machinery","initial") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + departmental_flags = DEPARTMENTAL_FLAG_ALL /datum/design/high_cell name = "High-Capacity Power Cell" diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm index b1da302290c..eb4b404db4d 100644 --- a/code/modules/research/designs/telecomms_designs.dm +++ b/code/modules/research/designs/telecomms_designs.dm @@ -49,6 +49,15 @@ build_path = /obj/item/circuitboard/machine/telecomms/server category = list("Subspace Telecomms") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/telecomms_messaging + name = "Machine Design (Messaging Server)" + desc = "Allows for the construction of Telecommunications Messaging Servers." + id = "s-messaging" + build_path = /obj/item/circuitboard/machine/telecomms/message_server + category = list("Subspace Telecomms") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE /datum/design/board/subspace_broadcaster name = "Machine Design (Subspace Broadcaster)" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 2f194795855..4b145318bc3 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -110,7 +110,7 @@ id = "decloner" build_type = PROTOLATHE materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000) - reagents_list = list("mutagen" = 40) + reagents_list = list(/datum/reagent/toxin/mutagen = 40) build_path = /obj/item/gun/energy/decloner category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -141,7 +141,7 @@ id = "flora_gun" build_type = PROTOLATHE materials = list(MAT_METAL = 2000, MAT_GLASS = 500) - reagents_list = list("radium" = 20) + reagents_list = list(/datum/reagent/uranium/radium = 20) build_path = /obj/item/gun/energy/floragun category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 3c372c5d14c..1b1e30d66ab 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -288,7 +288,7 @@ if(!T.density) if(prob(EFFECT_PROB_VERYHIGH) && !(locate(/obj/effect/decal/cleanable/greenglow) in T)) var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) - reagentdecal.reagents.add_reagent("radium", 7) + reagentdecal.reagents.add_reagent(/datum/reagent/uranium/radium, 7) else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) var/savedName = "[exp_on]" ejectItem(TRUE) @@ -308,7 +308,7 @@ new /obj/item/stack/sheet/mineral/plasma(get_turf(pick(oview(1,src)))) else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src] destroys [exp_on], leaking dangerous gas!") - chosenchem = pick("carbon","radium","toxin","condensedcapsaicin","mushroomhallucinogen","space_drugs","ethanol","beepskysmash") + chosenchem = pick(/datum/reagent/carbon,/datum/reagent/uranium/radium,/datum/reagent/toxin,/datum/reagent/consumable/condensedcapsaicin,/datum/reagent/drug/mushroomhallucinogen,/datum/reagent/drug/space_drugs,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/ethanol/beepsky_smash) var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent(chosenchem , 50) @@ -321,7 +321,7 @@ ejectItem(TRUE) else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) visible_message("[src]'s chemical chamber has sprung a leak!") - chosenchem = pick("mutationtoxin","nanomachines","sacid") + chosenchem = pick(/datum/reagent/mutationtoxin/classic,/datum/reagent/nanomachines,/datum/reagent/toxin/acid) var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent(chosenchem , 50) @@ -348,7 +348,7 @@ visible_message("[src]'s emergency coolant system gives off a small ding!") playsound(src, 'sound/machines/ding.ogg', 50, 1) var/obj/item/reagent_containers/food/drinks/coffee/C = new /obj/item/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src)))) - chosenchem = pick("plasma","capsaicin","ethanol") + chosenchem = pick(/datum/reagent/toxin/plasma,/datum/reagent/consumable/capsaicin,/datum/reagent/consumable/ethanol) C.reagents.remove_any(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" @@ -397,7 +397,7 @@ visible_message("[src]'s emergency coolant system gives off a small ding!") var/obj/item/reagent_containers/food/drinks/coffee/C = new /obj/item/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src)))) playsound(src, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready! - chosenchem = pick("uranium","frostoil","ephedrine") + chosenchem = pick(/datum/reagent/uranium,/datum/reagent/consumable/frostoil,/datum/reagent/medicine/ephedrine) C.reagents.remove_any(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" @@ -407,7 +407,7 @@ visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src - R.add_reagent("frostoil" , 50) + R.add_reagent(/datum/reagent/consumable/frostoil , 50) investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 0, src, silent = TRUE) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 08929dece7b..7d01b4da50c 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -223,7 +223,7 @@ l += "

Chemical Storage:

" for(var/datum/reagent/R in reagents.reagent_list) l += "[R.name]: [R.volume]" - l += "Purge" + l += "Purge" l += "
" return l diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm index 734e1082c2c..b2caf0e0fde 100644 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ b/code/modules/research/nanites/nanite_programs/buffing.dm @@ -33,7 +33,7 @@ host_mob.adjustStaminaLoss(-75) host_mob.set_resting(FALSE) host_mob.update_mobility() - host_mob.reagents.add_reagent("stimulants", 1.5) + host_mob.reagents.add_reagent(/datum/reagent/medicine/stimulants, 1.5) /datum/nanite_program/hardening name = "Dermal Hardening" @@ -118,11 +118,11 @@ /datum/nanite_program/mindshield/enable_passive_effect() . = ..() - if(!host_mob.mind.has_antag_datum(/datum/antagonist/rev) && !is_hivemember(host_mob)) //won't work if on a rev, to avoid having implanted revs. same applies for hivemind members. + if(!host_mob.mind.has_antag_datum(/datum/antagonist/rev, TRUE) && !is_hivemember(host_mob) && !host_mob.is_wokevessel()) //won't work if on a rev, to avoid having implanted revs. same applies for hivemind members. ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") host_mob.sec_hud_set_implants() /datum/nanite_program/mindshield/disable_passive_effect() . = ..() REMOVE_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") - host_mob.sec_hud_set_implants() \ No newline at end of file + host_mob.sec_hud_set_implants() diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 819c4b7200e..48f9fd91f0e 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -61,7 +61,7 @@ /datum/nanite_program/purging/active_effect() host_mob.adjustToxLoss(-1) for(var/datum/reagent/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.id,1) + host_mob.reagents.remove_reagent(R.type,1) /datum/nanite_program/brain_heal name = "Neural Regeneration" @@ -160,7 +160,7 @@ /datum/nanite_program/purging_advanced/active_effect() host_mob.adjustToxLoss(-1) for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.id,1) + host_mob.reagents.remove_reagent(R.type,1) /datum/nanite_program/regenerative_advanced name = "Bio-Reconstruction" diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index 57d497288e4..e91fc0fb125 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -114,7 +114,19 @@ . = ..() host_mob.cure_fakedeath("nanites") -/datum/nanite_program/triggered/speech +//Can receive transmissions from a nanite communication remote for customized messages +/datum/nanite_program/triggered/comm + var/comm_code = 0 + var/comm_message = "" + +/datum/nanite_program/triggered/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source) + if(!activated || !comm_code) + return + if(signal_comm_code == comm_code) + host_mob.investigate_log("'s [name] nanite program was messaged by [comm_source] with comm code [signal_comm_code] and message '[comm_message]'.", INVESTIGATE_NANITES) + trigger(comm_message) + +/datum/nanite_program/triggered/comm/speech name = "Forced Speech" desc = "The nanites force the host to say a pre-programmed sentence when triggered." unique = FALSE @@ -122,10 +134,10 @@ trigger_cooldown = 20 rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - extra_settings = list("Sentence") + extra_settings = list("Sentence","Comm Code") var/sentence = "" -/datum/nanite_program/triggered/speech/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/speech/set_extra_setting(user, setting) if(setting == "Sentence") var/new_sentence = stripped_input(user, "Choose the sentence that the host will be forced to say.", "Sentence", sentence, MAX_MESSAGE_LEN) if(!new_sentence) @@ -133,23 +145,34 @@ if(copytext(new_sentence, 1, 2) == "*") //emotes are abusable, like surrender return sentence = new_sentence + if(setting == "Comm Code") + var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) -/datum/nanite_program/triggered/speech/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/speech/get_extra_setting(setting) if(setting == "Sentence") return sentence + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/speech/copy_extra_settings_to(datum/nanite_program/triggered/speech/target) +/datum/nanite_program/triggered/comm/speech/copy_extra_settings_to(datum/nanite_program/triggered/comm/speech/target) target.sentence = sentence + target.comm_code = comm_code -/datum/nanite_program/triggered/speech/trigger() +/datum/nanite_program/triggered/comm/speech/trigger(comm_message) if(!..()) return + var/sent_message = comm_message + if(!comm_message) + sent_message = sentence if(host_mob.stat == DEAD) return to_chat(host_mob, "You feel compelled to speak...") - host_mob.say(sentence, forced = "nanite speech") + host_mob.say(sent_message, forced = "nanite speech") -/datum/nanite_program/triggered/voice +/datum/nanite_program/triggered/comm/voice name = "Skull Echo" desc = "The nanites echo a synthesized message inside the host's skull." unique = FALSE @@ -157,44 +180,62 @@ trigger_cooldown = 20 rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - extra_settings = list("Message") + extra_settings = list("Message","Comm Code") var/message = "" -/datum/nanite_program/triggered/voice/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/voice/set_extra_setting(user, setting) if(setting == "Message") var/new_message = stripped_input(user, "Choose the message sent to the host.", "Message", message, MAX_MESSAGE_LEN) if(!new_message) return message = new_message + if(setting == "Comm Code") + var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) -/datum/nanite_program/triggered/voice/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/voice/get_extra_setting(setting) if(setting == "Message") return message + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/voice/copy_extra_settings_to(datum/nanite_program/triggered/voice/target) +/datum/nanite_program/triggered/comm/voice/copy_extra_settings_to(datum/nanite_program/triggered/comm/voice/target) target.message = message + target.comm_code = comm_code -/datum/nanite_program/triggered/voice/trigger() +/datum/nanite_program/triggered/comm/voice/trigger(comm_message) if(!..()) return + var/sent_message = comm_message + if(!comm_message) + sent_message = message if(host_mob.stat == DEAD) return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[message]\"") + to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[sent_message]\"") -/datum/nanite_program/triggered/hallucination +/datum/nanite_program/triggered/comm/hallucination name = "Hallucination" desc = "The nanites make the host hallucinate something when triggered." trigger_cost = 4 trigger_cooldown = 80 unique = FALSE rogue_types = list(/datum/nanite_program/brain_misfire) - extra_settings = list("Hallucination Type") + extra_settings = list("Hallucination Type", "Comm Code") var/hal_type var/hal_details -/datum/nanite_program/triggered/hallucination/trigger() +/datum/nanite_program/triggered/comm/hallucination/trigger(comm_message) if(!..()) return + + if(comm_message && (hal_type != "Message")) //Triggered via comm remote, but not set to a message hallucination + return + var/sent_message = comm_message //Comm remotes can send custom hallucination messages for the chat hallucination + if(!sent_message) + sent_message = hal_details + if(!iscarbon(host_mob)) return var/mob/living/carbon/C = host_mob @@ -203,7 +244,7 @@ else switch(hal_type) if("Message") - new /datum/hallucination/chat(C, TRUE, null, hal_details) + new /datum/hallucination/chat(C, TRUE, null, sent_message) if("Battle") new /datum/hallucination/battle(C, TRUE, hal_details) if("Sound") @@ -223,7 +264,13 @@ if("Plasma Flood") new /datum/hallucination/fake_flood(C, TRUE) -/datum/nanite_program/triggered/hallucination/set_extra_setting(user, setting) +/datum/nanite_program/triggered/comm/hallucination/set_extra_setting(user, setting) + if(setting == "Comm Code") + var/new_code = input(user, "(Only for Message) Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num + if(isnull(new_code)) + return + comm_code = CLAMP(round(new_code, 1), 0, 9999) + if(setting == "Hallucination Type") var/list/possible_hallucinations = list("Random","Message","Battle","Sound","Weird Sound","Station Message","Health","Alert","Fire","Shock","Plasma Flood") var/hal_type_choice = input("Choose the hallucination type", name) as null|anything in possible_hallucinations @@ -299,13 +346,16 @@ if("Plasma Flood") hal_type = "Plasma Flood" -/datum/nanite_program/triggered/hallucination/get_extra_setting(setting) +/datum/nanite_program/triggered/comm/hallucination/get_extra_setting(setting) if(setting == "Hallucination Type") if(!hal_type) return "Random" else return hal_type + if(setting == "Comm Code") + return comm_code -/datum/nanite_program/triggered/hallucination/copy_extra_settings_to(datum/nanite_program/triggered/hallucination/target) +/datum/nanite_program/triggered/comm/hallucination/copy_extra_settings_to(datum/nanite_program/triggered/comm/hallucination/target) target.hal_type = hal_type - target.hal_details = hal_details \ No newline at end of file + target.hal_details = hal_details + target.comm_code = comm_code \ No newline at end of file diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index ee92a5c555c..6525c339918 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -181,6 +181,15 @@ return SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, code, source) +/datum/nanite_program/relay/proc/relay_comm_signal(comm_code, relay_code, comm_message) + if(!activated) + return + if(!host_mob) + return + if(relay_code != relay_channel) + return + SEND_SIGNAL(host_mob, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) + /datum/nanite_program/metabolic_synthesis name = "Metabolic Synthesis" desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm index 60dd78cf949..9ae5a2df7c1 100644 --- a/code/modules/research/nanites/nanite_remote.dm +++ b/code/modules/research/nanites/nanite_remote.dm @@ -165,6 +165,109 @@ . = TRUE +/obj/item/nanite_remote/comm + name = "nanite communication remote" + desc = "A device that can send text messages to specific programs." + icon_state = "nanite_comm_remote" + var/comm_code = 0 + var/comm_message = "" + +/obj/item/nanite_remote/comm/afterattack(atom/target, mob/user, etc) + switch(mode) + if(REMOTE_MODE_OFF) + return + if(REMOTE_MODE_SELF) + to_chat(user, "You activate [src], signaling the nanites in your bloodstream.") + signal_mob(user, comm_code, comm_message) + if(REMOTE_MODE_TARGET) + if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) + to_chat(user, "You activate [src], signaling the nanites inside [target].") + signal_mob(target, code, comm_message, key_name(user)) + if(REMOTE_MODE_AOE) + to_chat(user, "You activate [src], signaling the nanites inside every host around you.") + for(var/mob/living/L in view(user, 7)) + signal_mob(L, code, comm_message, key_name(user)) + if(REMOTE_MODE_RELAY) + to_chat(user, "You activate [src], signaling all connected relay nanites.") + signal_relay(code, relay_code, comm_message, key_name(user)) + +/obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) + SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) + +/obj/item/nanite_remote/comm/signal_relay(code, relay_code, source) + for(var/X in SSnanites.nanite_relays) + var/datum/nanite_program/relay/N = X + N.relay_comm_signal(comm_code, relay_code, comm_message) + +/obj/item/nanite_remote/comm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) + SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "nanite_comm_remote", name, 420, 800, master_ui, state) + ui.open() + +/obj/item/nanite_remote/comm/ui_data() + var/list/data = list() + data["comm_code"] = comm_code + data["relay_code"] = relay_code + data["comm_message"] = comm_message + data["mode"] = mode + data["locked"] = locked + data["saved_settings"] = saved_settings + + return data + +/obj/item/nanite_remote/comm/ui_act(action, params) + if(..()) + return + switch(action) + if("set_comm_code") + if(locked) + return + var/new_code = input("Set comm code (0000-9999):", name, code) as null|num + if(!isnull(new_code)) + new_code = CLAMP(round(new_code, 1),0,9999) + comm_code = new_code + . = TRUE + if("set_message") + if(locked) + return + var/new_message = stripped_input(usr, "Set the message (Max 300 characters):", "Set Message", null , 300) + if(!new_message) + return + comm_message = new_message + . = TRUE + if("comm_save") + if(locked) + return + var/code_name = stripped_input(usr, "Set the setting name", "Set Name", null , 15) + if(!code_name) + return + var/new_save = list() + new_save["id"] = last_id + 1 + last_id++ + new_save["name"] = code_name + new_save["code"] = comm_code + new_save["mode"] = mode + new_save["relay_code"] = relay_code + new_save["message"] = comm_message + + saved_settings += list(new_save) + . = TRUE + if("comm_load") + var/code_id = params["save_id"] + var/list/setting + for(var/list/X in saved_settings) + if(X["id"] == text2num(code_id)) + setting = X + break + if(setting) + comm_code = setting["code"] + mode = setting["mode"] + relay_code = setting["relay_code"] + comm_message = setting["message"] + . = TRUE + + #undef REMOTE_MODE_OFF #undef REMOTE_MODE_SELF #undef REMOTE_MODE_TARGET diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index d9ac8e846d5..fcbef13cb67 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -398,7 +398,7 @@ Nothing else in the console has ID requirements. l += "

Chemical Storage:

" for(var/datum/reagent/R in linked_lathe.reagents.reagent_list) l += "[R.name]: [R.volume]" - l += "Purge" + l += "Purge" l += "" return l @@ -501,7 +501,7 @@ Nothing else in the console has ID requirements. l += "

Chemical Storage:

" for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list) l += "[R.name]: [R.volume]" - l += "Purge" + l += "Purge" return l /obj/machinery/computer/rdconsole/proc/ui_circuit_materials() //Legacy code! diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 0587c7f6077..3dd98081433 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -48,7 +48,7 @@ starting_node = TRUE display_name = "Basic Tools" description = "Basic mechanical, electronic, surgical and botanical tools." - design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet") + design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop") /////////////////////////Biotech///////////////////////// /datum/techweb_node/biotech @@ -56,7 +56,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("chem_heater", "chem_master", "chem_dispenser", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medspray","genescanner") + design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medspray","genescanner") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -400,7 +400,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server", - "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter") + "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "s-messaging") /datum/techweb_node/integrated_HUDs id = "integrated_HUDs" @@ -867,7 +867,7 @@ display_name = "Basic Nanite Programming" description = "The basics of nanite construction and programming." prereq_ids = list("datatheory","robotics") - design_ids = list("nanite_disk","nanite_remote","nanite_scanner",\ + design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\ "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\ "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index 72aaa36e4b7..42f38b70bb4 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -2,7 +2,7 @@ ////////// SLIME CROSSBREEDS ////////// ////////////////////////////////////////////// // A system of combining two extract types. // -// Performed by feeding a slime 20 of an // +// Performed by feeding a slime 10 of an // // extract color. // ////////////////////////////////////////////// /*==========================================*\ @@ -31,12 +31,18 @@ To add a crossbreed: icon_state = "base" var/colour = "null" var/effect = "null" + var/effect_desc = "null" force = 0 w_class = WEIGHT_CLASS_TINY throwforce = 0 throw_speed = 3 throw_range = 6 +/obj/item/slimecross/examine(mob/user) + ..() + if(effect_desc) + to_chat(user, "[effect_desc]") + /obj/item/slimecross/Initialize() . = ..() name = effect + " " + colour + " extract" @@ -114,19 +120,19 @@ To add a crossbreed: name = "blood extract" desc = "A sphere of liquid blood, somehow managing to stay together." color = "#FF0000" - list_reagents = list("blood" = 50) + list_reagents = list(/datum/reagent/blood = 50) /obj/item/slimecrossbeaker/pax //5u synthpax. name = "peace-inducing extract" desc = "A small blob of synthetic pax." color = "#FFCCCC" - list_reagents = list("synthpax" = 5) + list_reagents = list(/datum/reagent/pax/peaceborg = 5) /obj/item/slimecrossbeaker/omnizine //15u omnizine. name = "healing extract" desc = "A gelatinous extract of pure omnizine." color = "#FF00FF" - list_reagents = list("omnizine" = 15) + list_reagents = list(/datum/reagent/medicine/omnizine = 15) /obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. var/ignore_flags = FALSE @@ -160,7 +166,7 @@ To add a crossbreed: name = "mending solution" desc = "A strange glob of sweet-smelling semifluid, which seems to stick to skin rather easily." color = "#FF00FF" - list_reagents = list("regen_jelly" = 20) + list_reagents = list(/datum/reagent/medicine/regen_jelly = 20) /obj/item/slimecrossbeaker/autoinjector/slimejelly //Primarily for slimepeople, but you do you. self_use_only = TRUE @@ -168,13 +174,13 @@ To add a crossbreed: name = "slime jelly bubble" desc = "A sphere of slime jelly. It seems to stick to your skin, but avoids other surfaces." color = "#00FF00" - list_reagents = list("slimejelly" = 50) + list_reagents = list(/datum/reagent/toxin/slimejelly = 50) /obj/item/slimecrossbeaker/autoinjector/peaceandlove name = "peaceful distillation" desc = "A light pink gooey sphere. Simply touching it makes you a little dizzy." color = "#DDAAAA" - list_reagents = list("synthpax" = 10, "space_drugs" = 15) //Peace, dudes + list_reagents = list(/datum/reagent/pax/peaceborg = 10, /datum/reagent/drug/space_drugs = 15) //Peace, dudes /obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize() . = ..() @@ -184,4 +190,4 @@ To add a crossbreed: name = "invigorating gel" desc = "A bubbling purple mixture, designed to heal and boost movement." color = "#FF00FF" - list_reagents = list("regen_jelly" = 30, "methamphetamine" = 9) + list_reagents = list(/datum/reagent/medicine/regen_jelly = 30, /datum/reagent/drug/methamphetamine = 9) diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 77aff44c317..b4c2c536b67 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -16,39 +16,114 @@ Slimecrossing Items default_picture_name = "A nostalgic picture" var/used = FALSE +/datum/saved_bodypart + var/obj/item/bodypart/old_part + var/bodypart_type + var/brute_dam + var/burn_dam + var/stamina_dam + +/datum/saved_bodypart/New(obj/item/bodypart/part) + old_part = part + bodypart_type = part.type + brute_dam = part.brute_dam + burn_dam = part.burn_dam + stamina_dam = part.stamina_dam + +/mob/living/carbon/proc/apply_saved_bodyparts(list/datum/saved_bodypart/parts) + var/list/dont_chop = list() + for(var/zone in parts) + var/datum/saved_bodypart/saved_part = parts[zone] + var/obj/item/bodypart/already = get_bodypart(zone) + if(QDELETED(saved_part.old_part)) + saved_part.old_part = new saved_part.bodypart_type + if(!already || already != saved_part.old_part) + saved_part.old_part.replace_limb(src, TRUE) + saved_part.old_part.heal_damage(INFINITY, INFINITY, INFINITY, null, FALSE) + saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam, saved_part.stamina_dam) + dont_chop[zone] = TRUE + for(var/_part in bodyparts) + var/obj/item/bodypart/part = _part + if(dont_chop[part.body_zone]) + continue + part.drop_limb(TRUE) + +/mob/living/carbon/proc/save_bodyparts() + var/list/datum/saved_bodypart/ret = list() + for(var/_part in bodyparts) + var/obj/item/bodypart/part = _part + var/datum/saved_bodypart/saved_part = new(part) + + ret[part.body_zone] = saved_part + return ret + + + /datum/component/dejavu - var/health //health for simple animals, and integrity for objects + var/integrity //for objects + var/brute_loss //for simple animals + var/list/datum/saved_bodypart/saved_bodyparts //maps bodypart slots to health + var/clone_loss = 0 + var/tox_loss = 0 + var/oxy_loss = 0 + var/brain_loss = 0 var/x var/y var/z - var/rewinds_remaining = 1 + var/rewinds_remaining -/datum/component/dejavu/Initialize() +/datum/component/dejavu/Initialize(rewinds = 1) + rewinds_remaining = rewinds var/turf/T = get_turf(parent) if(T) x = T.x y = T.y z = T.z - if(istype(parent, /mob/living/simple_animal)) + if(isliving(parent)) + var/mob/living/L = parent + clone_loss = L.getCloneLoss() + tox_loss = L.getToxLoss() + oxy_loss = L.getOxyLoss() + brain_loss = L.getBrainLoss() + if(iscarbon(parent)) + var/mob/living/carbon/C = parent + saved_bodyparts = C.save_bodyparts() + else if(isanimal(parent)) var/mob/living/simple_animal/M = parent - health = M.health - else if(istype(parent, /obj)) + brute_loss = M.bruteloss + else if(isobj(parent)) var/obj/O = parent - health = O.obj_integrity + integrity = O.obj_integrity addtimer(CALLBACK(src, .proc/rewind), DEJAVU_REWIND_INTERVAL) /datum/component/dejavu/proc/rewind() to_chat(parent, "You remember a time not so long ago...") + + if(isliving(parent)) + var/mob/living/L = parent + L.setCloneLoss(clone_loss) + L.setToxLoss(tox_loss) + L.setOxyLoss(oxy_loss) + L.setBrainLoss(brain_loss) + + if(iscarbon(parent)) + if(saved_bodyparts) + var/mob/living/carbon/C = parent + C.apply_saved_bodyparts(saved_bodyparts) + else if(isanimal(parent)) + var/mob/living/simple_animal/M = parent + M.bruteloss = brute_loss + M.updatehealth() + else if(isobj(parent)) + var/obj/O = parent + O.obj_integrity = integrity + + //comes after healing so new limbs comically drop to the floor if(!isnull(x) && istype(parent, /atom/movable)) var/atom/movable/AM = parent var/turf/T = locate(x,y,z) AM.forceMove(T) - if(istype(parent, /mob/living/simple_animal)) - var/mob/living/simple_animal/M = parent - M.adjustHealth(health) - else if(istype(parent, /obj)) - var/obj/O = parent - O.obj_integrity = health + rewinds_remaining -- if(rewinds_remaining) addtimer(CALLBACK(src, .proc/rewind), DEJAVU_REWIND_INTERVAL) @@ -69,7 +144,7 @@ Slimecrossing Items to_chat(target, "You'll remember this moment forever!") used = TRUE - target.AddComponent(/datum/component/dejavu) + target.AddComponent(/datum/component/dejavu, 2) .=..() @@ -152,7 +227,7 @@ Slimecrossing Items filling_color = "#964B00" tastes = list("cardboard" = 3, "sadness" = 3) foodtype = null //Don't ask what went into them. You're better off not knowing. - list_reagents = list("stabilizednutriment" = 10, "nutriment" = 2) //Won't make you fat. Will make you question your sanity. + list_reagents = list(/datum/reagent/consumable/nutriment/stabilized = 10, /datum/reagent/consumable/nutriment = 2) //Won't make you fat. Will make you question your sanity. /obj/item/reagent_containers/food/snacks/rationpack/checkLiked(fraction, mob/M) //Nobody likes rationpacks. Nobody. if(last_check_time + 50 < world.time) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index f635b7ac95f..9c3fce8ec91 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -914,9 +914,9 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/lightpink/tick() for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) - if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent("epinephrine")) + if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") - H.reagents.add_reagent("epinephrine",5) + H.reagents.add_reagent(/datum/reagent/medicine/epinephrine,5) return ..() /datum/status_effect/stabilized/lightpink/on_remove() diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 3c4391ba7b2..7895a43ef0d 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -14,10 +14,10 @@ Burning extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/burning/attack_self(mob/user) - if(!reagents.has_reagent("plasma",10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) to_chat(user, "This extract needs to be full of plasma to activate!") return - reagents.remove_reagent("plasma",10) + reagents.remove_reagent(/datum/reagent/toxin/plasma,10) to_chat(user, "You squeeze the extract, and it absorbs the plasma!") playsound(src, 'sound/effects/bubbles.ogg', 50, 1) playsound(src, 'sound/magic/fireball.ogg', 50, 1) @@ -29,6 +29,7 @@ Burning extracts: /obj/item/slimecross/burning/grey colour = "grey" + effect_desc = "Creates a hungry and speedy slime that will love you forever." /obj/item/slimecross/burning/grey/do_effect(mob/user) var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") @@ -40,11 +41,12 @@ Burning extracts: /obj/item/slimecross/burning/orange colour = "orange" + effect_desc = "Expels pepperspray in a radius when activated." /obj/item/slimecross/burning/orange/do_effect(mob/user) user.visible_message("[src] boils over with a caustic gas!") var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent("condensedcapsaicin", 100) + R.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 7, get_turf(user)) @@ -53,6 +55,7 @@ Burning extracts: /obj/item/slimecross/burning/purple colour = "purple" + effect_desc = "Creates a clump of invigorating gel, it has healing properties and makes you feel good." /obj/item/slimecross/burning/purple/do_effect(mob/user) user.visible_message("[src] fills with a bubbling liquid!") @@ -61,6 +64,7 @@ Burning extracts: /obj/item/slimecross/burning/blue colour = "blue" + effect_desc = "Freezes the floor around you and chills nearby people." /obj/item/slimecross/burning/blue/do_effect(mob/user) user.visible_message("[src] flash-freezes the area!") @@ -74,6 +78,7 @@ Burning extracts: /obj/item/slimecross/burning/metal colour = "metal" + effect_desc = "Instantly destroys walls around you." /obj/item/slimecross/burning/metal/do_effect(mob/user) for(var/turf/closed/wall/W in range(1,get_turf(user))) @@ -84,6 +89,7 @@ Burning extracts: /obj/item/slimecross/burning/yellow colour = "yellow" + effect_desc = "Electrocutes people near you." /obj/item/slimecross/burning/yellow/do_effect(mob/user) user.visible_message("[src] explodes into an electrical field!") @@ -100,6 +106,7 @@ Burning extracts: /obj/item/slimecross/burning/darkpurple colour = "dark purple" + effect_desc = "Creates a cloud of plasma." /obj/item/slimecross/burning/darkpurple/do_effect(mob/user) user.visible_message("[src] sublimates into a cloud of plasma!") @@ -109,12 +116,13 @@ Burning extracts: /obj/item/slimecross/burning/darkblue colour = "dark blue" + effect_desc = "Expels a burst of chilling smoke while also filling you with cryoxadone." /obj/item/slimecross/burning/darkblue/do_effect(mob/user) user.visible_message("[src] releases a burst of chilling smoke!") var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent("frostoil", 40) - user.reagents.add_reagent("cryoxadone",10) + R.add_reagent(/datum/reagent/consumable/frostoil, 40) + user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,10) var/datum/effect_system/smoke_spread/chem/smoke = new smoke.set_up(R, 7, get_turf(user)) smoke.start() @@ -122,6 +130,7 @@ Burning extracts: /obj/item/slimecross/burning/silver colour = "silver" + effect_desc = "Creates a few pieces of slime jelly laced food." /obj/item/slimecross/burning/silver/do_effect(mob/user) var/amount = rand(3,6) @@ -131,7 +140,7 @@ Burning extracts: for(var/i = 0, i < amount, i++) var/path = get_random_food() var/obj/item/O = new path(pick(turfs)) - O.reagents.add_reagent("slimejelly",5) //Oh god it burns + O.reagents.add_reagent(/datum/reagent/toxin/slimejelly,5) //Oh god it burns if(prob(50)) O.desc += " It smells strange..." user.visible_message("[src] produces a few pieces of food!") @@ -139,6 +148,7 @@ Burning extracts: /obj/item/slimecross/burning/bluespace colour = "bluespace" + effect_desc = "Teleports anyone directly next to you." /obj/item/slimecross/burning/bluespace/do_effect(mob/user) user.visible_message("[src] sparks, and lets off a shockwave of bluespace energy!") @@ -151,6 +161,7 @@ Burning extracts: /obj/item/slimecross/burning/sepia colour = "sepia" + effect_desc = "Turns into a special camera that rewinds time when used." /obj/item/slimecross/burning/sepia/do_effect(mob/user) user.visible_message("[src] shapes itself into a camera!") @@ -159,6 +170,7 @@ Burning extracts: /obj/item/slimecross/burning/cerulean colour = "cerulean" + effect_desc = "Produces an extract cloning potion, which copies an extract, as well as its extra uses." /obj/item/slimecross/burning/cerulean/do_effect(mob/user) user.visible_message("[src] produces a potion!") @@ -167,6 +179,7 @@ Burning extracts: /obj/item/slimecross/burning/pyrite colour = "pyrite" + effect_desc = "Shatters all lights in the current room." /obj/item/slimecross/burning/pyrite/do_effect(mob/user) user.visible_message("[src] releases a colorful wave of energy, which shatters the lights!") @@ -180,6 +193,7 @@ Burning extracts: /obj/item/slimecross/burning/red colour = "red" + effect_desc = "Makes nearby slimes rabid, and they'll also attack their friends." /obj/item/slimecross/burning/red/do_effect(mob/user) user.visible_message("[src] pulses a hazy red aura for a moment, which wraps around [user]!") @@ -196,6 +210,7 @@ Burning extracts: /obj/item/slimecross/burning/green colour = "green" + effect_desc = "The user gets a dull arm blade in the hand it is used in." /obj/item/slimecross/burning/green/do_effect(mob/user) var/which_hand = "l_hand" @@ -218,6 +233,7 @@ Burning extracts: /obj/item/slimecross/burning/pink colour = "pink" + effect_desc = "Creates a beaker of synthpax." /obj/item/slimecross/burning/pink/do_effect(mob/user) user.visible_message("[src] shrinks into a small, gel-filled pellet!") @@ -226,6 +242,7 @@ Burning extracts: /obj/item/slimecross/burning/gold colour = "gold" + effect_desc = "Creates a gank squad of monsters that are friendly to the user." /obj/item/slimecross/burning/gold/do_effect(mob/user) user.visible_message("[src] shudders violently, and summons an army for [user]!") @@ -239,17 +256,23 @@ Burning extracts: /obj/item/slimecross/burning/oil colour = "oil" + effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/burning/oil/do_effect(mob/user) - user.visible_message("[src] begins to shake with rapidly increasing force!") + user.visible_message("[user] activates [src]. It's going to explode!", "You activate [src]. It crackles in anticipation") addtimer(CALLBACK(src, .proc/boom), 50) /obj/item/slimecross/burning/oil/proc/boom() - explosion(get_turf(src), 2, 4, 4) //Same area as normal oils, but increased high-impact values by one each, then decreased light by 2. + var/turf/T = get_turf(src) + playsound(T, 'sound/effects/explosion2.ogg', 200, 1) + for(var/mob/living/M in range(2, T)) + new /obj/effect/temp_visual/explosion(get_turf(M)) + M.ex_act(EXPLODE_HEAVY) qdel(src) /obj/item/slimecross/burning/black colour = "black" + effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." /obj/item/slimecross/burning/black/do_effect(mob/user) var/mob/living/L = user @@ -264,15 +287,17 @@ Burning extracts: /obj/item/slimecross/burning/lightpink colour = "light pink" + effect_desc = "Paxes everyone in sight." /obj/item/slimecross/burning/lightpink/do_effect(mob/user) user.visible_message("[src] lets off a hypnotizing pink glow!") for(var/mob/living/carbon/C in view(7, get_turf(user))) - C.reagents.add_reagent("pax",5) + C.reagents.add_reagent(/datum/reagent/pax,5) ..() /obj/item/slimecross/burning/adamantine colour = "adamantine" + effect_desc = "Creates a mighty adamantine shield." /obj/item/slimecross/burning/adamantine/do_effect(mob/user) user.visible_message("[src] crystallizes into a large shield!") @@ -281,6 +306,7 @@ Burning extracts: /obj/item/slimecross/burning/rainbow colour = "rainbow" + effect_desc = "Creates the Rainbow Knife, a kitchen knife that deals random types of damage." /obj/item/slimecross/burning/rainbow/do_effect(mob/user) user.visible_message("[src] flattens into a glowing rainbow blade.") diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index bfdab8b6db2..b071d546672 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -15,10 +15,10 @@ Charged extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/charged/attack_self(mob/user) - if(!reagents.has_reagent("plasma",10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) to_chat(user, "This extract needs to be full of plasma to activate!") return - reagents.remove_reagent("plasma",10) + reagents.remove_reagent(/datum/reagent/toxin/plasma,10) to_chat(user, "You squeeze the extract, and it absorbs the plasma!") playsound(src, 'sound/effects/bubbles.ogg', 50, 1) playsound(src, 'sound/effects/light_flicker.ogg', 50, 1) @@ -30,6 +30,7 @@ Charged extracts: /obj/item/slimecross/charged/grey colour = "grey" + effect_desc = "Produces a slime reviver potion, which revives dead slimes." /obj/item/slimecross/charged/grey/do_effect(mob/user) new /obj/item/slimepotion/slime_reviver(get_turf(user)) @@ -38,6 +39,7 @@ Charged extracts: /obj/item/slimecross/charged/orange colour = "orange" + effect_desc = "Instantly makes a large burst of flame for a moment." /obj/item/slimecross/charged/orange/do_effect(mob/user) for(var/turf/turf in range(5,get_turf(user))) @@ -47,6 +49,7 @@ Charged extracts: /obj/item/slimecross/charged/purple colour = "purple" + effect_desc = "Creates a packet of omnizine." /obj/item/slimecross/charged/purple/do_effect(mob/user) new /obj/item/slimecrossbeaker/omnizine(get_turf(user)) @@ -55,6 +58,7 @@ Charged extracts: /obj/item/slimecross/charged/blue colour = "blue" + effect_desc = "Creates a potion that neuters the mutation chance of a slime, which passes on to new generations." /obj/item/slimecross/charged/blue/do_effect(mob/user) new /obj/item/slimepotion/slime/chargedstabilizer(get_turf(user)) @@ -63,6 +67,7 @@ Charged extracts: /obj/item/slimecross/charged/metal colour = "metal" + effect_desc = "Produces a bunch of metal and plasteel." /obj/item/slimecross/charged/metal/do_effect(mob/user) new /obj/item/stack/sheet/metal(get_turf(user), 25) @@ -72,6 +77,7 @@ Charged extracts: /obj/item/slimecross/charged/yellow colour = "yellow" + effect_desc = "Creates a hypercharged slime cell battery, which has high capacity and recharges constantly at a very fast rate." /obj/item/slimecross/charged/yellow/do_effect(mob/user) new /obj/item/stock_parts/cell/high/slime/hypercharged(get_turf(user)) @@ -80,6 +86,7 @@ Charged extracts: /obj/item/slimecross/charged/darkpurple colour = "dark purple" + effect_desc = "Creates several sheets of plasma." /obj/item/slimecross/charged/darkpurple/do_effect(mob/user) new /obj/item/stack/sheet/mineral/plasma(get_turf(user), 10) @@ -88,6 +95,7 @@ Charged extracts: /obj/item/slimecross/charged/darkblue colour = "dark blue" + effect_desc = "Produces a pressure proofing potion." /obj/item/slimecross/charged/darkblue/do_effect(mob/user) new /obj/item/slimepotion/spaceproof(get_turf(user)) @@ -96,6 +104,7 @@ Charged extracts: /obj/item/slimecross/charged/silver colour = "silver" + effect_desc = "Creates a slime cake and some drinks." /obj/item/slimecross/charged/silver/do_effect(mob/user) new /obj/item/reagent_containers/food/snacks/store/cake/slimecake(get_turf(user)) @@ -107,6 +116,7 @@ Charged extracts: /obj/item/slimecross/charged/bluespace colour = "bluespace" + effect_desc = "Makes a bluespace polycrystal." /obj/item/slimecross/charged/bluespace/do_effect(mob/user) new /obj/item/stack/sheet/bluespace_crystal(get_turf(user), 10) @@ -115,6 +125,7 @@ Charged extracts: /obj/item/slimecross/charged/sepia colour = "sepia" + effect_desc = "Creates a camera obscura." /obj/item/slimecross/charged/sepia/do_effect(mob/user) new /obj/item/camera/spooky(get_turf(user)) @@ -123,6 +134,7 @@ Charged extracts: /obj/item/slimecross/charged/cerulean colour = "cerulean" + effect_desc = "Creates an extract enhancer, giving whatever it's used on five more uses." /obj/item/slimecross/charged/cerulean/do_effect(mob/user) new /obj/item/slimepotion/enhancer/max(get_turf(user)) @@ -131,6 +143,7 @@ Charged extracts: /obj/item/slimecross/charged/pyrite colour = "pyrite" + effect_desc = "Creates bananium. Oh no." /obj/item/slimecross/charged/pyrite/do_effect(mob/user) new /obj/item/stack/sheet/mineral/bananium(get_turf(user), 10) @@ -139,6 +152,7 @@ Charged extracts: /obj/item/slimecross/charged/red colour = "red" + effect_desc = "Produces a lavaproofing potion" /obj/item/slimecross/charged/red/do_effect(mob/user) new /obj/item/slimepotion/lavaproof(get_turf(user)) @@ -147,6 +161,7 @@ Charged extracts: /obj/item/slimecross/charged/green colour = "green" + effect_desc = "Lets you choose what slime species you want to be." /obj/item/slimecross/charged/green/do_effect(mob/user) var/mob/living/carbon/human/H = user @@ -165,6 +180,7 @@ Charged extracts: /obj/item/slimecross/charged/pink colour = "pink" + effect_desc = "Produces a... lovepotion... no ERP." /obj/item/slimecross/charged/pink/do_effect(mob/user) new /obj/item/slimepotion/lovepotion(get_turf(user)) @@ -173,6 +189,7 @@ Charged extracts: /obj/item/slimecross/charged/gold colour = "gold" + effect_desc = "Slowly spawns 10 hostile monsters." var/max_spawn = 10 var/spawned = 0 @@ -199,17 +216,19 @@ Charged extracts: /obj/item/slimecross/charged/oil colour = "oil" + effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/charged/oil/do_effect(mob/user) user.visible_message("[src] begins to shake with rapidly increasing force!") addtimer(CALLBACK(src, .proc/boom), 50) /obj/item/slimecross/charged/oil/proc/boom() - explosion(get_turf(src), 3, 2, 1) //Much smaller effect than normal oils, but devastatingly strong where it does hit. + explosion(get_turf(src), 2, 3, 4) //Much smaller effect than normal oils, but devastatingly strong where it does hit. qdel(src) /obj/item/slimecross/charged/black colour = "black" + effect_desc = "Randomizes the user's species." /obj/item/slimecross/charged/black/do_effect(mob/user) var/mob/living/carbon/human/H = user @@ -230,6 +249,7 @@ Charged extracts: /obj/item/slimecross/charged/lightpink colour = "light pink" + effect_desc = "Produces a pacification potion, which works on monsters and humanoids." /obj/item/slimecross/charged/lightpink/do_effect(mob/user) new /obj/item/slimepotion/peacepotion(get_turf(user)) @@ -238,6 +258,7 @@ Charged extracts: /obj/item/slimecross/charged/adamantine colour = "adamantine" + effect_desc = "Creates a completed golem shell." /obj/item/slimecross/charged/adamantine/do_effect(mob/user) user.visible_message("[src] produces a fully formed golem shell!") @@ -246,6 +267,7 @@ Charged extracts: /obj/item/slimecross/charged/rainbow colour = "rainbow" + effect_desc = "Produces three living slimes of random colors." /obj/item/slimecross/charged/rainbow/do_effect(mob/user) user.visible_message("[src] swells and splits into three new slimes!") diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index a81cea6e7cf..44dbbfdcdc1 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -14,10 +14,10 @@ Chilling extracts: create_reagents(10, INJECTABLE | DRAWABLE) /obj/item/slimecross/chilling/attack_self(mob/user) - if(!reagents.has_reagent("plasma",10)) + if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) to_chat(user, "This extract needs to be full of plasma to activate!") return - reagents.remove_reagent("plasma",10) + reagents.remove_reagent(/datum/reagent/toxin/plasma,10) to_chat(user, "You squeeze the extract, and it absorbs the plasma!") playsound(src, 'sound/effects/bubbles.ogg', 50, 1) playsound(src, 'sound/effects/glassbr1.ogg', 50, 1) @@ -29,6 +29,7 @@ Chilling extracts: /obj/item/slimecross/chilling/grey colour = "grey" + effect_desc = "Creates some slime barrier cubes. When used they create slimy barricades." /obj/item/slimecross/chilling/grey/do_effect(mob/user) user.visible_message("[src] produces a few small, grey cubes") @@ -38,6 +39,7 @@ Chilling extracts: /obj/item/slimecross/chilling/orange colour = "orange" + effect_desc = "Creates a ring of fire one tile away from the user." /obj/item/slimecross/chilling/orange/do_effect(mob/user) user.visible_message("[src] shatters, and lets out a jet of heat!") @@ -48,6 +50,7 @@ Chilling extracts: /obj/item/slimecross/chilling/purple colour = "purple" + effect_desc = "Injects everyone in the area with some regenerative jelly." /obj/item/slimecross/chilling/purple/do_effect(mob/user) var/area/A = get_area(get_turf(user)) @@ -56,11 +59,12 @@ Chilling extracts: return user.visible_message("[src] shatters, and a healing aura fills the room briefly.") for(var/mob/living/carbon/C in A) - C.reagents.add_reagent("regen_jelly",10) + C.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) ..() /obj/item/slimecross/chilling/blue colour = "blue" + effect_desc = "Creates a rebreather, a tankless mask." /obj/item/slimecross/chilling/blue/do_effect(mob/user) user.visible_message("[src] cracks, and spills out a liquid goo, which reforms into a mask!") @@ -69,6 +73,7 @@ Chilling extracts: /obj/item/slimecross/chilling/metal colour = "metal" + effect_desc = "Temporarily surrounds the user with unbreakable walls." /obj/item/slimecross/chilling/metal/do_effect(mob/user) user.visible_message("[src] melts like quicksilver, and surrounds [user] in a wall!") @@ -79,6 +84,7 @@ Chilling extracts: /obj/item/slimecross/chilling/yellow colour = "yellow" + effect_desc = "Recharges the room's APC by 50%." /obj/item/slimecross/chilling/yellow/do_effect(mob/user) var/area/A = get_area(get_turf(user)) @@ -90,6 +96,7 @@ Chilling extracts: /obj/item/slimecross/chilling/darkpurple colour = "dark purple" + effect_desc = "Removes all plasma gas in the area." /obj/item/slimecross/chilling/darkpurple/do_effect(mob/user) var/area/A = get_area(get_turf(user)) @@ -113,6 +120,7 @@ Chilling extracts: /obj/item/slimecross/chilling/darkblue colour = "dark blue" + effect_desc = "Seals the user in a protective block of ice." /obj/item/slimecross/chilling/darkblue/do_effect(mob/user) if(isliving(user)) @@ -123,6 +131,7 @@ Chilling extracts: /obj/item/slimecross/chilling/silver colour = "silver" + effect_desc = "Creates several ration packs." /obj/item/slimecross/chilling/silver/do_effect(mob/user) user.visible_message("[src] crumbles into icy powder, leaving behind several emergency food supplies!") @@ -133,6 +142,7 @@ Chilling extracts: /obj/item/slimecross/chilling/bluespace colour = "bluespace" + effect_desc = "Touching people with this extract adds them to a list, when it is activated it teleports everyone on that list to the user." var/list/allies = list() var/active = FALSE @@ -172,6 +182,7 @@ Chilling extracts: /obj/item/slimecross/chilling/sepia colour = "sepia" + effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 30 seconds, and everyone on the list is immune, except the user." var/list/allies = list() /obj/item/slimecross/chilling/sepia/afterattack(atom/target, mob/user, proximity) @@ -193,6 +204,7 @@ Chilling extracts: /obj/item/slimecross/chilling/cerulean colour = "cerulean" + effect_desc = "Creates a flimsy copy of the user, that they control." /obj/item/slimecross/chilling/cerulean/do_effect(mob/user) if(isliving(user)) @@ -203,6 +215,7 @@ Chilling extracts: /obj/item/slimecross/chilling/pyrite colour = "pyrite" + effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals." /obj/item/slimecross/chilling/pyrite/do_effect(mob/user) user.visible_message("[src] crystallizes into a pair of spectacles!") @@ -211,6 +224,7 @@ Chilling extracts: /obj/item/slimecross/chilling/red colour = "red" + effect_desc = "Pacifies every slime in your vacinity." /obj/item/slimecross/chilling/red/do_effect(mob/user) var/slimesfound = FALSE @@ -225,6 +239,7 @@ Chilling extracts: /obj/item/slimecross/chilling/green colour = "green" + effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." /obj/item/slimecross/chilling/green/do_effect(mob/user) var/which_hand = "l_hand" @@ -247,6 +262,7 @@ Chilling extracts: /obj/item/slimecross/chilling/pink colour = "pink" + effect_desc = "Creates a slime corgi puppy." /obj/item/slimecross/chilling/pink/do_effect(mob/user) user.visible_message("[src] cracks like an egg, and an adorable puppy comes tumbling out!") @@ -255,6 +271,7 @@ Chilling extracts: /obj/item/slimecross/chilling/gold colour = "gold" + effect_desc = "Produces a golden capture device" /obj/item/slimecross/chilling/gold/do_effect(mob/user) user.visible_message("[src] lets off golden light as it melts and reforms into an egg-like device!") @@ -263,6 +280,7 @@ Chilling extracts: /obj/item/slimecross/chilling/oil colour = "oil" + effect_desc = "It creates a useless flash." /obj/item/slimecross/chilling/oil/do_effect(mob/user) user.visible_message("[src] begins to shake with muted intensity!") @@ -274,6 +292,7 @@ Chilling extracts: /obj/item/slimecross/chilling/black colour = "black" + effect_desc = "Transforsms the user into a random type of golem." /obj/item/slimecross/chilling/black/do_effect(mob/user) if(ishuman(user)) @@ -284,6 +303,7 @@ Chilling extracts: /obj/item/slimecross/chilling/lightpink colour = "light pink" + effect_desc = "Creates a Heroine Bud, a special flower that pacifies whoever wears it on their head. They will not be able to take it off without help." /obj/item/slimecross/chilling/lightpink/do_effect(mob/user) user.visible_message("[src] blooms into a beautiful flower!") @@ -292,6 +312,7 @@ Chilling extracts: /obj/item/slimecross/chilling/adamantine colour = "adamantine" + effect_desc = "Solidifies into a set of adamantine armor." /obj/item/slimecross/chilling/adamantine/do_effect(mob/user) user.visible_message("[src] creaks and breaks as it shifts into a heavy set of armor!") @@ -300,6 +321,7 @@ Chilling extracts: /obj/item/slimecross/chilling/rainbow colour = "rainbow" + effect_desc = "Makes an unpassable wall in every door in the area." /obj/item/slimecross/chilling/rainbow/do_effect(mob/user) var/area/area = get_area(user) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 9d780e40f7e..f82aaff0d66 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -20,7 +20,7 @@ Consuming extracts: if(last_produced + cooldown > world.time) to_chat(user, "[src] is still digesting after its last meal!") return - var/datum/reagent/N = O.reagents.has_reagent("nutriment") + var/datum/reagent/N = O.reagents.has_reagent(/datum/reagent/consumable/nutriment) if(N) nutriment_eaten += N.volume to_chat(user, "[src] opens up and swallows [O] whole!") @@ -76,7 +76,7 @@ Consuming extracts: to_chat(M, "Tastes like [taste].") playsound(get_turf(M), 'sound/items/eatfood.ogg', 20, 1) if(nutrition) - M.reagents.add_reagent("nutriment",nutrition) + M.reagents.add_reagent(/datum/reagent/consumable/nutriment,nutrition) do_effect(M, user) qdel(src) return @@ -84,6 +84,7 @@ Consuming extracts: /obj/item/slimecross/consuming/grey colour = "grey" + effect_desc = "Creates a slime cookie." cookietype = /obj/item/slime_cookie/grey /obj/item/slime_cookie/grey @@ -95,6 +96,7 @@ Consuming extracts: /obj/item/slimecross/consuming/orange colour = "orange" + effect_desc = "Creates a slime cookie that heats the target up and grants cold immunity for a short time." cookietype = /obj/item/slime_cookie/orange /obj/item/slime_cookie/orange @@ -108,6 +110,7 @@ Consuming extracts: /obj/item/slimecross/consuming/purple colour = "purple" + effect_desc = "Creates a slime cookie that heals the target from every type of damage." cookietype = /obj/item/slime_cookie/purple /obj/item/slime_cookie/purple @@ -126,32 +129,35 @@ Consuming extracts: /obj/item/slimecross/consuming/blue colour = "blue" + effect_desc = "Creates a slime cookie that wets the floor around you and makes you immune to water based slipping for a short time." cookietype = /obj/item/slime_cookie/blue /obj/item/slime_cookie/blue name = "water cookie" desc = "A transparent blue cookie. Constantly dripping wet." icon_state = "blue" - taste = "water" + taste = /datum/reagent/water /obj/item/slime_cookie/blue/do_effect(mob/living/M, mob/user) M.apply_status_effect(/datum/status_effect/watercookie) /obj/item/slimecross/consuming/metal colour = "metal" + effect_desc = "Creates a slime cookie that increases the target's resistance to brute damage." cookietype = /obj/item/slime_cookie/metal /obj/item/slime_cookie/metal name = "metallic cookie" desc = "A shiny grey cookie. Hard to the touch." icon_state = "metal" - taste = "copper" + taste = /datum/reagent/copper /obj/item/slime_cookie/metal/do_effect(mob/living/M, mob/user) M.apply_status_effect(/datum/status_effect/metalcookie) /obj/item/slimecross/consuming/yellow colour = "yellow" + effect_desc = "Creates a slime cookie that makes the target immune to electricity for a short time." cookietype = /obj/item/slime_cookie/yellow /obj/item/slime_cookie/yellow @@ -165,6 +171,7 @@ Consuming extracts: /obj/item/slimecross/consuming/darkpurple colour = "dark purple" + effect_desc = "Creates a slime cookie that reverses how the target's body treats toxins." cookietype = /obj/item/slime_cookie/darkpurple /obj/item/slime_cookie/darkpurple @@ -178,6 +185,7 @@ Consuming extracts: /obj/item/slimecross/consuming/darkblue colour = "dark blue" + effect_desc = "Creates a slime cookie that chills the target and extinguishes them." cookietype = /obj/item/slime_cookie/darkblue /obj/item/slime_cookie/darkblue @@ -192,6 +200,7 @@ Consuming extracts: /obj/item/slimecross/consuming/silver colour = "silver" + effect_desc = "Creates a slime cookie that never gets the target fat." cookietype = /obj/item/slime_cookie/silver /obj/item/slime_cookie/silver @@ -202,10 +211,11 @@ Consuming extracts: nutrition = 0 //We don't want normal nutriment /obj/item/slime_cookie/silver/do_effect(mob/living/M, mob/user) - M.reagents.add_reagent("stabilizednutriment",10) + M.reagents.add_reagent(/datum/reagent/consumable/nutriment/stabilized,10) /obj/item/slimecross/consuming/bluespace colour = "bluespace" + effect_desc = "Creates a slime cookie that teleports the target to a random place in the area." cookietype = /obj/item/slime_cookie/bluespace /obj/item/slime_cookie/bluespace @@ -241,6 +251,7 @@ Consuming extracts: /obj/item/slimecross/consuming/sepia colour = "sepia" + effect_desc = "Creates a slime cookie that makes the target do things slightly faster." cookietype = /obj/item/slime_cookie/sepia /obj/item/slime_cookie/sepia @@ -254,6 +265,7 @@ Consuming extracts: /obj/item/slimecross/consuming/cerulean colour = "cerulean" + effect_desc = "Creates a slime cookie that has a chance to make another once you eat it." cookietype = /obj/item/slime_cookie/cerulean cookies = 3 //You're gonna get more. @@ -271,6 +283,7 @@ Consuming extracts: /obj/item/slimecross/consuming/pyrite colour = "pyrite" + effect_desc = "Creates a slime cookie that randomly colors the target." cookietype = /obj/item/slime_cookie/pyrite /obj/item/slime_cookie/pyrite @@ -312,6 +325,7 @@ Consuming extracts: /obj/item/slimecross/consuming/red colour = "red" + effect_desc = "Creates a slime cookie that creates a spatter of blood on the floor, while also restoring some of the target's blood." cookietype = /obj/item/slime_cookie/red /obj/item/slime_cookie/red @@ -329,6 +343,7 @@ Consuming extracts: /obj/item/slimecross/consuming/green colour = "green" + effect_desc = "Creates a slime cookie that is absolutely disgusting, makes the target vomit, however all reagent in their body are also removed." cookietype = /obj/item/slime_cookie/green /obj/item/slime_cookie/green @@ -345,6 +360,7 @@ Consuming extracts: /obj/item/slimecross/consuming/pink colour = "pink" + effect_desc = "Creates a slime cookie that makes the target want to spread the love." cookietype = /obj/item/slime_cookie/pink /obj/item/slime_cookie/pink @@ -358,6 +374,7 @@ Consuming extracts: /obj/item/slimecross/consuming/gold colour = "gold" + effect_desc = "Creates a slime cookie that has a gold coin inside." cookietype = /obj/item/slime_cookie/gold /obj/item/slime_cookie/gold @@ -376,6 +393,7 @@ Consuming extracts: /obj/item/slimecross/consuming/oil colour = "oil" + effect_desc = "Creates a slime cookie that slows anyone next to the user." cookietype = /obj/item/slime_cookie/oil /obj/item/slime_cookie/oil @@ -389,6 +407,7 @@ Consuming extracts: /obj/item/slimecross/consuming/black colour = "black" + effect_desc = "Creates a slime cookie that makes the target look like a spooky skeleton for a little bit." cookietype = /obj/item/slime_cookie/black /obj/item/slime_cookie/black @@ -402,6 +421,7 @@ Consuming extracts: /obj/item/slimecross/consuming/lightpink colour = "light pink" + effect_desc = "Creates a slime cookie that makes the target, and anyone next to the target, pacifistic for a small amount of time." cookietype = /obj/item/slime_cookie/lightpink /obj/item/slime_cookie/lightpink @@ -415,6 +435,7 @@ Consuming extracts: /obj/item/slimecross/consuming/adamantine colour = "adamantine" + effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." cookietype = /obj/item/slime_cookie/adamantine /obj/item/slime_cookie/adamantine @@ -428,6 +449,7 @@ Consuming extracts: /obj/item/slimecross/consuming/rainbow colour = "rainbow" + effect_desc = "Creates a slime cookie that has the effect of a random cookie." /obj/item/slimecross/consuming/rainbow/spawncookie() var/cookie_type = pick(subtypesof(/obj/item/slime_cookie)) diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index 4d39d956e77..b53716e14c9 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -30,13 +30,13 @@ Industrial extracts: /obj/item/slimecross/industrial/process() var/IsWorking = FALSE - if(reagents.has_reagent("plasma",amount = 2) && plasmarequired > 1) //Can absorb as much as 2 + if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 2) && plasmarequired > 1) //Can absorb as much as 2 IsWorking = TRUE - reagents.remove_reagent("plasma",2) + reagents.remove_reagent(/datum/reagent/toxin/plasma,2) plasmaabsorbed += 2 - else if(reagents.has_reagent("plasma",amount = 1)) //Can absorb as little as 1 + else if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 1)) //Can absorb as little as 1 IsWorking = TRUE - reagents.remove_reagent("plasma",1) + reagents.remove_reagent(/datum/reagent/toxin/plasma,1) plasmaabsorbed += 1 if(plasmaabsorbed >= plasmarequired) @@ -53,31 +53,37 @@ Industrial extracts: /obj/item/slimecross/industrial/grey colour = "grey" + effect_desc = "Produces monkey cubes." itempath = /obj/item/reagent_containers/food/snacks/monkeycube itemamount = 5 /obj/item/slimecross/industrial/orange colour = "orange" + effect_desc = "Produces slime zippo lighters." plasmarequired = 6 itempath = /obj/item/lighter/slime /obj/item/slimecross/industrial/purple colour = "purple" + effect_desc = "Produces autoinjectors with regen jelly inside." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack /obj/item/slimecross/industrial/blue colour = "blue" + effect_desc = "Produces full fire extinguishers." plasmarequired = 10 itempath = /obj/item/extinguisher /obj/item/slimecross/industrial/metal colour = "metal" + effect_desc = "Produces metal sheets." plasmarequired = 3 itempath = /obj/item/stack/sheet/metal/ten /obj/item/slimecross/industrial/yellow colour = "yellow" + effect_desc = "Produces high capacity power cells, which are not fully charged on creation." plasmarequired = 5 itempath = /obj/item/stock_parts/cell/high @@ -88,11 +94,13 @@ Industrial extracts: /obj/item/slimecross/industrial/darkpurple colour = "dark purple" + effect_desc = "Produces plasma... for plasma." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/plasma /obj/item/slimecross/industrial/darkblue colour = "dark blue" + effect_desc = "Produces one-use fireproofing potions." plasmarequired = 6 itempath = /obj/item/slimepotion/fireproof @@ -103,6 +111,7 @@ Industrial extracts: /obj/item/slimecross/industrial/silver colour = "silver" + effect_desc = "Produces random food and drink items." plasmarequired = 1 //Item picked below. @@ -112,41 +121,49 @@ Industrial extracts: /obj/item/slimecross/industrial/bluespace colour = "bluespace" + effect_desc = "Produces synthetic bluespace crystals." plasmarequired = 7 itempath = /obj/item/stack/ore/bluespace_crystal/artificial /obj/item/slimecross/industrial/sepia colour = "sepia" + effect_desc = "Produces cameras." plasmarequired = 2 itempath = /obj/item/camera /obj/item/slimecross/industrial/cerulean colour = "cerulean" + effect_desc = "Produces normal slime extract enhancers." plasmarequired = 5 itempath = /obj/item/slimepotion/enhancer /obj/item/slimecross/industrial/pyrite colour = "pyrite" + effect_desc = "Produces cans of spraypaint." plasmarequired = 2 itempath = /obj/item/toy/crayon/spraycan /obj/item/slimecross/industrial/red colour = "red" + effect_desc = "Produces blood orbs." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/bloodpack /obj/item/slimecross/industrial/green colour = "green" + effect_desc = "Produces self-use-only slime jelly autoinjectors." plasmarequired = 7 itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly /obj/item/slimecross/industrial/pink colour = "pink" + effect_desc = "Produces synthpax and space drug autoinjectors." plasmarequired = 6 itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove /obj/item/slimecross/industrial/gold colour = "gold" + effect_desc = "Produces random coins." plasmarequired = 10 /obj/item/slimecross/industrial/gold/process() @@ -155,26 +172,31 @@ Industrial extracts: /obj/item/slimecross/industrial/oil colour = "oil" + effect_desc = "Produces IEDs." plasmarequired = 4 itempath = /obj/item/grenade/iedcasing /obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though colour = "black" + effect_desc = "Produces slime brand regenerative cigarettes." plasmarequired = 6 itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno /obj/item/slimecross/industrial/lightpink colour = "light pink" + effect_desc = "Produces heart shaped boxes that have candies in them." plasmarequired = 3 itempath = /obj/item/storage/fancy/heart_box /obj/item/slimecross/industrial/adamantine colour = "adamantine" + effect_desc = "Produces sheets of adamantine." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/adamantine /obj/item/slimecross/industrial/rainbow colour = "rainbow" + effect_desc = "Produces random slime extracts." plasmarequired = 5 //Item picked below. diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 65e66aa0e2b..c9447b2633b 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -6,6 +6,7 @@ Prismatic extracts: name = "prismatic extract" desc = "It's constantly wet with a semi-transparent, colored goo." effect = "prismatic" + effect_desc = "When used it paints whatever it hits." icon_state = "prismatic" var/paintcolor = "#FFFFFF" diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index b8ea51bae50..4a094744f7f 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -135,4 +135,4 @@ Recurring extracts: /obj/item/slimecross/recurring/rainbow extract_type = /obj/item/slime_extract/rainbow colour = "rainbow" - max_cooldown = 20 //It's pretty powerful. \ No newline at end of file + max_cooldown = 20 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index a0a069d70a8..e1d6f36485c 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -14,7 +14,6 @@ Regenerative extracts: /obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) return - /obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) . = ..() if(!prox || !isliving(target)) @@ -37,6 +36,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/grey colour = "grey" //Has no bonus effect. + effect_desc = "Fully heals the target and does nothing else." /obj/item/slimecross/regenerative/orange colour = "orange" @@ -49,12 +49,14 @@ Regenerative extracts: /obj/item/slimecross/regenerative/purple colour = "purple" + effect_desc = "Fully heals the target and injects them with some regen jelly." /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) - target.reagents.add_reagent("regen_jelly",10) + target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) /obj/item/slimecross/regenerative/blue colour = "blue" + effect_desc = "Fully heals the target and makes the floor wet." /obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) if(isturf(target.loc)) @@ -64,6 +66,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/metal colour = "metal" + effect_desc = "Fully heals the target and encases the target in a locker." /obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) target.visible_message("The milky goo hardens and reshapes itself, encasing [target]!") @@ -74,6 +77,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/yellow colour = "yellow" + effect_desc = "Fully heals the target and fully recharges a single item on the target." /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) var/list/batteries = list() @@ -87,6 +91,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkpurple colour = "dark purple" + effect_desc = "Fully heals the target and gives them purple clothing if they are naked." /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) var/equipped = 0 @@ -99,6 +104,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkblue colour = "dark blue" + effect_desc = "Fully heals the target and fireproofs their clothes." /obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) if(!ishuman(target)) @@ -126,6 +132,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/silver colour = "silver" + effect_desc = "Fully heals the target and makes their belly feel round and full." /obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) target.set_nutrition(NUTRITION_LEVEL_FULL - 1) @@ -133,6 +140,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/bluespace colour = "bluespace" + effect_desc = "Fully heals the target and teleports them to where this core was created." var/turf/open/T /obj/item/slimecross/regenerative/bluespace/core_effect(mob/living/target, mob/user) @@ -147,12 +155,15 @@ Regenerative extracts: /obj/item/slimecross/regenerative/sepia colour = "sepia" + effect_desc = "Fully heals the target and stops time." -/obj/item/slimecross/regenerative/sepia/core_effect(mob/living/target, mob/user) - new /obj/effect/timestop(get_turf(target), 2, 50, list(user,target)) +/obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) + to_chat(target, "You try to forget how you feel.") + target.AddComponent(/datum/component/dejavu) /obj/item/slimecross/regenerative/cerulean colour = "cerulean" + effect_desc = "Fully heals the target and makes a second regenerative core with no special effects." /obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) src.forceMove(user.loc) @@ -164,6 +175,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/pyrite colour = "pyrite" + effect_desc = "Fully heals and randomly colors the target." /obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) target.visible_message("The milky goo coating [target] leaves [target.p_them()] a different color!") @@ -171,13 +183,15 @@ Regenerative extracts: /obj/item/slimecross/regenerative/red colour = "red" + effect_desc = "Fully heals the target and injects them with some ephedrine." /obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) to_chat(target, "You feel... faster.") - target.reagents.add_reagent("ephedrine",3) + target.reagents.add_reagent(/datum/reagent/medicine/ephedrine,3) /obj/item/slimecross/regenerative/green colour = "green" + effect_desc = "Fully heals the target and changes the spieces or color of a slime or jellyperson." /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) if(isslime(target)) @@ -185,18 +199,20 @@ Regenerative extracts: var/mob/living/simple_animal/slime/S = target S.random_colour() if(isjellyperson(target)) - target.reagents.add_reagent("slime_toxin",5) + target.reagents.add_reagent(/datum/reagent/slime_toxin,5) /obj/item/slimecross/regenerative/pink colour = "pink" + effect_desc = "Fully heals the target and injects them with some krokodil." /obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) to_chat(target, "You feel more calm.") - target.reagents.add_reagent("krokodil",4) + target.reagents.add_reagent(/datum/reagent/drug/krokodil,4) /obj/item/slimecross/regenerative/gold colour = "gold" + effect_desc = "Fully heals the target and produces a random coin." /obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) @@ -206,6 +222,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/oil colour = "oil" + effect_desc = "Fully heals the target and flashes everyone in sight." /obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) playsound(src, 'sound/weapons/flash.ogg', 100, 1) @@ -214,6 +231,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/black colour = "black" + effect_desc = "Fully heals the target and creates a duplicate of them, that drops dead soon after." /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) var/dummytype = target.type @@ -232,6 +250,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/lightpink colour = "light pink" + effect_desc = "Fully heals the target and also heals the user." /obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) if(!isliving(user)) @@ -244,12 +263,14 @@ Regenerative extracts: /obj/item/slimecross/regenerative/adamantine colour = "adamantine" + effect_desc = "Fully heals the target and boosts their armor." /obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. target.apply_status_effect(STATUS_EFFECT_SLIMESKIN) /obj/item/slimecross/regenerative/rainbow colour = "rainbow" + effect_desc = "Fully heals the target and temporarily makes them immortal, but pacifistic." /obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) - target.apply_status_effect(STATUS_EFFECT_RAINBOWPROTECTION) \ No newline at end of file + target.apply_status_effect(STATUS_EFFECT_RAINBOWPROTECTION) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 2f6ca9555a1..be66ed02d70 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -8,6 +8,7 @@ Reproductive extracts: desc = "It pulses with a strange hunger." icon_state = "reproductive" effect = "reproductive" + effect_desc = "When fed monkey cubes it produces more extracts. Bio bag compatible as well." var/extract_type = /obj/item/slime_extract/ var/cubes_eaten = 0 var/last_produce = 0 diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index 9037147113e..f47fa47a98d 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -12,6 +12,7 @@ Self-sustaining extracts: name = "autoslime" desc = "It resembles a normal slime extract, but seems filled with a strange, multi-colored fluid." var/obj/item/slime_extract/extract + var/effect_desc = "A self-sustaining slime extract. When used, lets you choose which reaction you want." //Just divides into the actual item. /obj/item/slimecross/selfsustaining/Initialize() @@ -43,7 +44,7 @@ Self-sustaining extracts: amount = 4 reagentselect = "plasma" if(reagentselect == "holy water and uranium") - reagentselect = "holywater" + reagentselect = /datum/reagent/water/holywater secondary = "uranium" extract.forceMove(user.drop_location()) qdel(src) @@ -52,6 +53,11 @@ Self-sustaining extracts: if(secondary) extract.reagents.add_reagent(secondary,amount) +/obj/item/autoslime/examine(mob/user) + ..() + if(effect_desc) + to_chat(user, "[effect_desc]") + //Different types. /obj/item/slimecross/selfsustaining/grey diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 10c96f081bd..1d7874bf846 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -45,57 +45,76 @@ Stabilized extracts: S.linked_extract = src STOP_PROCESSING(SSobj,src) + + //Colors and subtypes: /obj/item/slimecross/stabilized/grey colour = "grey" + effect_desc = "Makes slimes friendly to the owner" /obj/item/slimecross/stabilized/orange colour = "orange" + effect_desc = "Passively tries to increase or decrease the owner's body temperature to normal" /obj/item/slimecross/stabilized/purple colour = "purple" + effect_desc = "Provides a regeneration effect" /obj/item/slimecross/stabilized/blue colour = "blue" + effect_desc = "Makes the owner immune to slipping on water, soap or foam. Space lube and ice are still too slippery." /obj/item/slimecross/stabilized/metal colour = "metal" + effect_desc = "Every 30 seconds, adds a sheet of material to a random stack in the owner's backpack." /obj/item/slimecross/stabilized/yellow colour = "yellow" + effect_desc = "Every ten seconds it recharges a device on the owner by 10%." /obj/item/slimecross/stabilized/darkpurple colour = "dark purple" + effect_desc = "Gives you burning fingertips, automatically cooking any microwavable food you hold." /obj/item/slimecross/stabilized/darkblue colour = "dark blue" + effect_desc = "Slowly extinguishes the owner if they are on fire, also wets items like monkey cubes, creating a monkey." /obj/item/slimecross/stabilized/silver colour = "silver" + effect_desc = "Slows the rate at which the owner loses nutrition" /obj/item/slimecross/stabilized/bluespace colour = "bluespace" + effect_desc = "On a two minute cooldown, when the owner has taken enough damage, they are teleported to a safe place." /obj/item/slimecross/stabilized/sepia colour = "sepia" + effect_desc = "Randomly adjusts the owner's speed." /obj/item/slimecross/stabilized/cerulean colour = "cerulean" + effect_desc = "Creates a duplicate of the owner. If the owner dies they will take control of the duplicate, unless the death was from beheading or gibbing." /obj/item/slimecross/stabilized/pyrite colour = "pyrite" + effect_desc = "Randomly colors the owner every few seconds." /obj/item/slimecross/stabilized/red colour = "red" + effect_desc = "Nullifies all equipment based slowdowns." /obj/item/slimecross/stabilized/green colour = "green" + effect_desc = "Changes the owner's name and appearance while holding this extract." /obj/item/slimecross/stabilized/pink colour = "pink" + effect_desc = "As long as no creatures are harmed in the owner's presense, they will not attack you. If the peace is broken it takes two minutes to restore." /obj/item/slimecross/stabilized/gold colour = "gold" + effect_desc = "Creates a pet when held." var/mob_type var/datum/mind/saved_mind var/mob_name = "Familiar" @@ -142,18 +161,23 @@ Stabilized extracts: /obj/item/slimecross/stabilized/oil colour = "oil" + effect_desc = "The owner will violently explode when they die while holding this extract." /obj/item/slimecross/stabilized/black colour = "black" + effect_desc = "While strangling someone, the owner's hands melt around their neck, draining their life in exchange for food and healing." /obj/item/slimecross/stabilized/lightpink colour = "light pink" + effect_desc = "The owner moves at high speeds while holding this extract, also stabilizes anyone in critical condition around you using Epinephrine." /obj/item/slimecross/stabilized/adamantine colour = "adamantine" + effect_desc = "Owner gains a slight boost in damage resistance to all types." /obj/item/slimecross/stabilized/rainbow colour = "rainbow" + effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." var/obj/item/slimecross/regenerative/regencore /obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 5452bb50276..fddd16ea797 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -42,7 +42,7 @@ /obj/item/slime_extract/on_grind() if(Uses) - grind_results["slimejelly"] = 20 + grind_results[/datum/reagent/toxin/slimejelly] = 20 //Effect when activated by a Luminescent. Separated into a minor and major effect. Returns cooldown in deciseconds. /obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) @@ -78,7 +78,7 @@ name = "grey slime extract" icon_state = "grey slime extract" effectmod = "reproductive" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -103,7 +103,7 @@ name = "gold slime extract" icon_state = "gold slime extract" effectmod = "symbiont" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -132,7 +132,7 @@ name = "silver slime extract" icon_state = "silver slime extract" effectmod = "consuming" - activate_reagents = list("plasma","water") + activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -157,7 +157,7 @@ name = "metal slime extract" icon_state = "metal slime extract" effectmod = "industrial" - activate_reagents = list("plasma","water") + activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -181,7 +181,7 @@ name = "purple slime extract" icon_state = "purple slime extract" effectmod = "regenerative" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -193,14 +193,14 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, "You activate [src], and it releases regenerative chemicals!") - user.reagents.add_reagent("regen_jelly",10) + user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) return 600 /obj/item/slime_extract/darkpurple name = "dark purple slime extract" icon_state = "dark purple slime extract" effectmod = "self-sustaining" - activate_reagents = list("plasma") + activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -223,19 +223,19 @@ name = "orange slime extract" icon_state = "orange slime extract" effectmod = "burning" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, "You activate [src]. You start feeling hot!") - user.reagents.add_reagent("capsaicin",10) + user.reagents.add_reagent(/datum/reagent/consumable/capsaicin,10) return 150 if(SLIME_ACTIVATE_MAJOR) - user.reagents.add_reagent("phosphorus",5)// - user.reagents.add_reagent("potassium",5) // = smoke, along with any reagents inside mr. slime - user.reagents.add_reagent("sugar",5) // + user.reagents.add_reagent(/datum/reagent/phosphorus,5)// + user.reagents.add_reagent(/datum/reagent/potassium,5) // = smoke, along with any reagents inside mr. slime + user.reagents.add_reagent(/datum/reagent/consumable/sugar,5) // to_chat(user, "You activate [src], and a cloud of smoke bursts out of your skin!") return 450 @@ -243,7 +243,7 @@ name = "yellow slime extract" icon_state = "yellow slime extract" effectmod = "charged" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -266,13 +266,13 @@ name = "red slime extract" icon_state = "red slime extract" effectmod = "sanguine" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, "You activate [src]. You start feeling fast!") - user.reagents.add_reagent("ephedrine",5) + user.reagents.add_reagent(/datum/reagent/medicine/ephedrine,5) return 450 if(SLIME_ACTIVATE_MAJOR) @@ -286,15 +286,15 @@ name = "blue slime extract" icon_state = "blue slime extract" effectmod = "stabilized" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) to_chat(user, "You activate [src]. Your genome feels more stable!") user.adjustCloneLoss(-15) - user.reagents.add_reagent("mutadone", 10) - user.reagents.add_reagent("potass_iodide", 10) + user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) + user.reagents.add_reagent(/datum/reagent/medicine/potass_iodide, 10) return 250 if(SLIME_ACTIVATE_MAJOR) @@ -310,7 +310,7 @@ name = "dark blue slime extract" icon_state = "dark blue slime extract" effectmod = "chilling" - activate_reagents = list("plasma","water") + activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -318,8 +318,8 @@ to_chat(user, "You activate [src]. You start feeling colder!") user.ExtinguishMob() user.adjust_fire_stacks(-20) - user.reagents.add_reagent("frostoil",4) - user.reagents.add_reagent("cryoxadone",5) + user.reagents.add_reagent(/datum/reagent/consumable/frostoil,4) + user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,5) return 100 if(SLIME_ACTIVATE_MAJOR) @@ -333,7 +333,7 @@ name = "pink slime extract" icon_state = "pink slime extract" effectmod = "gentle" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -354,14 +354,14 @@ user.visible_message("[user]'s skin starts flashing hypnotically...", "Your skin starts forming odd patterns, pacifying creatures around you.") for(var/mob/living/carbon/C in viewers(user, null)) if(C != user) - C.reagents.add_reagent("pax",2) + C.reagents.add_reagent(/datum/reagent/pax,2) return 600 /obj/item/slime_extract/green name = "green slime extract" icon_state = "green slime extract" effectmod = "mutative" - activate_reagents = list("blood","plasma","radium") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) /obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -385,7 +385,7 @@ name = "light pink slime extract" icon_state = "light pink slime extract" effectmod = "loyal" - activate_reagents = list("plasma") + activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -409,7 +409,7 @@ name = "black slime extract" icon_state = "black slime extract" effectmod = "transformative" - activate_reagents = list("plasma") + activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -430,7 +430,7 @@ name = "oil slime extract" icon_state = "oil slime extract" effectmod = "detonating" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -453,7 +453,7 @@ name = "adamantine slime extract" icon_state = "adamantine slime extract" effectmod = "crystalline" - activate_reagents = list("plasma") + activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -482,7 +482,7 @@ name = "bluespace slime extract" icon_state = "bluespace slime extract" effectmod = "warping" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE var/teleport_x = 0 var/teleport_y = 0 @@ -518,7 +518,7 @@ name = "pyrite slime extract" icon_state = "pyrite slime extract" effectmod = "prismatic" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -544,12 +544,12 @@ name = "cerulean slime extract" icon_state = "cerulean slime extract" effectmod = "recurring" - activate_reagents = list("blood","plasma") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - user.reagents.add_reagent("salbutamol",15) + user.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) to_chat(user, "You feel like you don't need to breathe!") return 150 @@ -564,7 +564,7 @@ name = "sepia slime extract" icon_state = "sepia slime extract" effectmod = "lengthened" - activate_reagents = list("blood","plasma","water") + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -586,7 +586,7 @@ name = "rainbow slime extract" icon_state = "rainbow slime extract" effectmod = "hyperchromatic" - activate_reagents = list("blood","plasma","lesser plasma","slimejelly","holy water and uranium") //Curse this snowflake reagent list. + activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. /obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 8ab5d68ff2d..807b3f0acf0 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -327,7 +327,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) for(var/obj/item/hilbertshotel/H in hotels) if(parentSphere == H) relocate(H) - + /area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) if(prob(0.135685)) //Because screw you qdel(H) @@ -528,4 +528,3 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) Lay your head to rest, it soon becomes clear
There's always more room around every bend
Not all that's countable has an end..."} - diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index d706fc4d18e..ff0122f60e6 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -262,6 +262,7 @@ var/engine_coeff = 1 //current engine coeff var/current_engines = 0 //current engine power var/initial_engines = 0 //initial engine power + var/list/engine_list = list() var/can_move_docking_ports = FALSE //if this shuttle can move docking ports other than the one it is docked at var/list/hidden_turfs = list() @@ -725,19 +726,47 @@ return null /obj/docking_port/mobile/proc/hyperspace_sound(phase, list/areas) - var/s + var/selected_sound switch(phase) if(HYPERSPACE_WARMUP) - s = 'sound/effects/hyperspace_begin.ogg' + selected_sound = "hyperspace_begin" if(HYPERSPACE_LAUNCH) - s = 'sound/effects/hyperspace_progress.ogg' + selected_sound = "hyperspace_progress" if(HYPERSPACE_END) - s = 'sound/effects/hyperspace_end.ogg' + selected_sound = "hyperspace_end" else CRASH("Invalid hyperspace sound phase: [phase]") - for(var/A in areas) - for(var/obj/machinery/door/E in A) //dumb, I know, but playing it on the engines doesn't do it justice - playsound(E, s, 100, FALSE, max(width, height) - world.view) + // This previously was played from each door at max volume, and was one of the worst things I had ever seen. + // Now it's instead played from the nearest engine if close, or the first engine in the list if far since it doesn't really matter. + // Or a door if for some reason the shuttle has no engine, fuck oh hi daniel fuck it + var/range = (engine_coeff * max(width, height)) + var/long_range = range * 2.5 + var/atom/distant_source + if(engine_list[1]) + distant_source = engine_list[1] + else + for(var/A in areas) + distant_source = locate(/obj/machinery/door) in A + if(distant_source) + break + + if(distant_source) + for(var/mob/M in SSmobs.clients_by_zlevel[z]) + var/dist_far = get_dist(M, distant_source) + if(dist_far <= long_range && dist_far > range) + M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20) + else if(dist_far <= range) + var/source + if(engine_list.len == 0) + source = distant_source + else + var/closest_dist = 10000 + for(var/obj/O in engine_list) + var/dist_near = get_dist(M, O) + if(dist_near < closest_dist) + source = O + closest_dist = dist_near + M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2) // Losing all initial engines should get you 2 // Adding another set of engines at 0.5 time @@ -749,14 +778,15 @@ current_engines = max(0,current_engines + mod) if(in_flight()) var/delta_coeff = engine_coeff / old_coeff - modTimer(delta_coeff) - + modTimer(delta_coeff) + /obj/docking_port/mobile/proc/count_engines() . = 0 for(var/thing in shuttle_areas) var/area/shuttle/areaInstance = thing for(var/obj/structure/shuttle/engine/E in areaInstance.contents) if(!QDELETED(E)) + engine_list += E . += E.engine_power // Double initial engines to get to 0.5 minimum diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 46afae0a2d7..b2d00e1a8e1 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -76,7 +76,7 @@ break if(!our_statue) - name = "inert [name]" + name = "inert [initial(name)]" return else name = initial(name) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index cb2af17e1e4..534f6a3f614 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -35,6 +35,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now /obj/effect/proc_holder/Destroy() + if (action) + qdel(action) if(ranged_ability_user) remove_ranged_ability() return ..() @@ -167,7 +169,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return FALSE if(!antimagic_allowed) - var/antimagic = user.anti_magic_check(TRUE, FALSE, major = FALSE, self = TRUE) + var/antimagic = user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE) if(antimagic) if(isitem(antimagic)) to_chat(user, "[antimagic] is interfering with your magic.") @@ -513,7 +515,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(user.stat && !stat_allowed) return FALSE - if(!antimagic_allowed && user.anti_magic_check(TRUE, FALSE, major = FALSE, self = TRUE)) + if(!antimagic_allowed && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE)) return FALSE if(!ishuman(user)) diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index bd24b00a743..5efec52aaa7 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -100,6 +100,9 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult summon_type = list(/obj/item/soulstone/anybody) +/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified + summon_type = list(/obj/item/soulstone/anybody/purified) + /obj/effect/proc_holder/spell/targeted/forcewall/cult name = "Shield" desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire." diff --git a/code/modules/spells/spell_types/curse.dm b/code/modules/spells/spell_types/curse.dm index 6c1a975781d..9449e4a5d06 100644 --- a/code/modules/spells/spell_types/curse.dm +++ b/code/modules/spells/spell_types/curse.dm @@ -16,12 +16,9 @@ GLOBAL_VAR_INIT(curse_of_madness_triggered, FALSE) var/turf/T = get_turf(H) if(T && !is_station_level(T.z)) continue - if(H.anti_magic_check(TRUE, FALSE)) + if(H.anti_magic_check(TRUE, FALSE, TRUE)) to_chat(H, "You have a strange feeling for a moment, but then it passes.") continue - if(istype(H.get_item_by_slot(SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(H, "Your protective headgear successfully deflects mind controlling brainwaves!") - continue give_madness(H, message) /proc/give_madness(mob/living/carbon/human/H, message) diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 652242ea999..a8b61969a69 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -35,6 +35,6 @@ return TRUE if(ismob(mover)) var/mob/M = mover - if(M.anti_magic_check(major = FALSE)) + if(M.anti_magic_check(chargecost = 0)) return TRUE return FALSE diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm index e4b6bdb723f..7551a9b32cc 100644 --- a/code/modules/spells/spell_types/hivemind.dm +++ b/code/modules/spells/spell_types/hivemind.dm @@ -49,44 +49,46 @@ charge_max = 50 range = 7 target_external = 1 - var/ignore_mindshield = FALSE + var/bruteforce = FALSE /obj/effect/proc_holder/spell/target_hive/hive_add/cast(list/targets, mob/living/user = usr) var/mob/living/carbon/target = targets[1] var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - var/success = FALSE - if(target.mind && target.client && target.stat != DEAD) - if(!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) - if(HAS_TRAIT(target, TRAIT_MINDSHIELD) && ignore_mindshield) - to_chat(user, "We bruteforce our way past the mental barriers of [target.name] and begin linking our minds!") - else - to_chat(user, "We begin linking our mind with [target.name]!") - if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && target in view(range)) - if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && target in view(range)) - if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && target in view(range)) - to_chat(user, "[target.name] was added to the Hive!") - success = TRUE - hive.add_to_hive(target) - hive.threat_level = max(0, hive.threat_level-0.1) - if(ignore_mindshield) - to_chat(user, "We are briefly exhausted by the effort required by our enhanced assimilation abilities.") - user.Immobilize(50) - SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0) - for(var/obj/item/implant/mindshield/M in target.implants) - qdel(M) - else - to_chat(user, "We fail to connect to [target.name].") - else - to_chat(user, "We fail to connect to [target.name].") - else - to_chat(user, "We fail to connect to [target.name].") - else - to_chat(user, "Powerful technology protects [target.name]'s mind.") - else + if(!target.mind || !target.client || target.stat == DEAD) to_chat(user, "We detect no neural activity in this body.") - if(!success) + var/shielded = HAS_TRAIT(target, TRAIT_MINDSHIELD) + var/foiled = target.anti_magic_check(FALSE, FALSE, TRUE, 0) + if(shielded && !bruteforce) + to_chat(user, "Powerful technology protects [target.name]'s mind.") revert_cast() + return + if((shielded || foiled) && bruteforce) + to_chat(user, "We [bruteforce ? "bruteforce" : "force"] our way past the mental barriers of [target.name] and begin linking our minds!") + else + to_chat(user, "We begin linking our mind with [target.name]!") + var/multiplier = (!foiled || bruteforce) ? 5 : 10 + if(!do_after(user,multiplier*(1.5**get_dist(user, target)),0,user) || !(target in view(range))) + to_chat(user, "We fail to connect to [target.name].") + revert_cast() + return + if((HAS_TRAIT(target, TRAIT_MINDSHIELD) && !bruteforce)) + to_chat(user, "We fail to connect to [target.name].") + revert_cast() + return + to_chat(user, "[target.name] was added to the Hive!") + hive.add_to_hive(target) + hive.threat_level = max(0, hive.threat_level-0.1) + if(bruteforce) + if(target.anti_magic_check(FALSE, FALSE, TRUE, 6)) + target.adjustBrainLoss(10) + to_chat(user, "We are briefly exhausted by the effort required by our enhanced assimilation abilities.") + user.Immobilize(50) + SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0) + for(var/obj/item/implant/mindshield/M in target.implants) + qdel(M) + else + target.anti_magic_check(FALSE, FALSE, TRUE) /obj/effect/proc_holder/spell/target_hive/hive_remove name = "Release Vessel" @@ -108,7 +110,7 @@ if(!M) revert_cast() return - hive.remove_from_hive(M) + hive.remove_from_hive(target) hive.calc_size() hive.threat_level += 0.1 to_chat(user, "We remove [target.name] from the hive") @@ -124,6 +126,7 @@ action_icon_state = "see" var/mob/living/carbon/vessel var/mob/living/host //Didn't really have any other way to auto-reset the perspective if the other mob got qdeled + var/limited = FALSE charge_max = 20 @@ -135,6 +138,13 @@ if(!active) vessel = targets[1] if(vessel) + if(vessel.anti_magic_check(FALSE, FALSE, TRUE, 0)) + if(get_dist(src, vessel) > 42) + to_chat(user, "We were unable to link our view with [vessel.name]. A barrier of tinfoil prevents us to do so at this distance.") + revert_cast() + return + limited = TRUE + to_chat(user, "A barrier of tinfoil drastically dampens our link with [vessel.name]. We'll be able to sustain the link as long as they remain within 42 tiles from us.") vessel.apply_status_effect(STATUS_EFFECT_BUGGED, user) user.reset_perspective(vessel) active = TRUE @@ -150,14 +160,16 @@ if(the_spell && the_spell.active) user.overlay_fullscreen("hive_mc", /obj/screen/fullscreen/hive_mc) active = FALSE + limited = FALSE revert_cast() /obj/effect/proc_holder/spell/target_hive/hive_see/process() - if(active && (!vessel || !is_hivemember(vessel) || QDELETED(vessel))) + if(active && (!vessel || !is_hivemember(vessel) || QDELETED(vessel) || (limited && get_dist(vessel, host) > 42))) to_chat(host, "Our vessel is one of us no more!") host.reset_perspective() host.clear_fullscreen("hive_eyes") active = FALSE + limited = FALSE if(!QDELETED(vessel)) vessel.remove_status_effect(STATUS_EFFECT_BUGGED) ..() @@ -195,6 +207,8 @@ power *= 2.5 else power *= 3 + if(target.anti_magic_check(FALSE, FALSE, TRUE)) + power *= 0.5 if(power > 50 && user.z == target.z) to_chat(user, "We have overloaded the vessel for a short time!") target.Jitter(round(power/10)) @@ -239,7 +253,8 @@ if(user.z != L.z || L.stat == DEAD) message += " could not be found." else - switch(distance) + var/multiplier = L.anti_magic_check(FALSE, FALSE, TRUE) ? rand(0.6, 1.4) : 1 + switch(distance*multiplier) if(0 to 2) message += " is right next to us!" if(2 to 14) @@ -256,13 +271,15 @@ var/mob/living/carbon/C = enemy.owner?.current if(!C) continue + var/multiplier = C.anti_magic_check(FALSE, FALSE, TRUE) ? rand(0.6, 1.4) : 1 var/mob/living/real_enemy = C.get_real_hivehost() distance = get_dist(user, real_enemy) message = "A host that we can track for [(hive.individual_track_bonus[enemy])/10] extra seconds" if(user.z != real_enemy.z || real_enemy.stat == DEAD) message += " could not be found." else - switch(distance) + multiplier = real_enemy.anti_magic_check(FALSE, FALSE, TRUE) ? rand(0.6, 1.4) : 1 + switch(distance*multiplier) if(0 to 2) message += " is right next to us!" if(2 to 14) @@ -310,11 +327,12 @@ if(!target) to_chat(user, "We have run out of vessels to drain.") break - target.adjustBrainLoss(5) + var/regen = target.anti_magic_check(FALSE, FALSE, TRUE) ? 2.5 : 5 + target.adjustBrainLoss(regen) if(user.getBruteLoss() > user.getFireLoss()) - user.heal_ordered_damage(5, list(CLONE, BRUTE, BURN)) + user.heal_ordered_damage(regen, list(CLONE, BRUTE, BURN)) else - user.heal_ordered_damage(5, list(CLONE, BURN, BRUTE)) + user.heal_ordered_damage(regen, list(CLONE, BURN, BRUTE)) if(!user.getBruteLoss() && !user.getFireLoss() && !user.getCloneLoss()) //If we don't have any of these, stop looping to_chat(user, "We finish our healing") break @@ -326,7 +344,10 @@ name = "mind control victim" real_name = "unknown conscience" -/mob/living/passenger/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) +/mob/living/passenger/UnarmedAttack(atom/A) + return + +/mob/living/passenger/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) to_chat(src, "You find yourself unable to speak, you aren't in control of your body!") return FALSE @@ -350,6 +371,7 @@ var/power = 600 var/time_initialized = 0 var/out_of_range = FALSE + var/restricted_range = FALSE /obj/effect/proc_holder/spell/target_hive/hive_control/proc/release_control() //If the spell is active, force everybody into their original bodies if they exist, ghost them otherwise, delete the backseat if(!active) @@ -383,6 +405,8 @@ if(hive) hive.threat_level += 1 + restricted_range = FALSE + /obj/effect/proc_holder/spell/target_hive/hive_control/on_lose(mob/user) release_control() @@ -397,11 +421,15 @@ original_body = user vessel = targets[1] to_chat(user, "We begin merging our mind with [vessel.name].") - if(!do_after(user,50,0,user)) + var/timely = 50 + if(vessel.anti_magic_check(FALSE, FALSE, TRUE)) + timely = 100 + restricted_range = TRUE + if(!do_after(user, timely, FALSE, user)) to_chat(user, "We fail to assume control of the target.") revert_cast() return - if(user.z != vessel.z) + if(user.z != vessel.z || (restricted_range && get_dist(vessel, user) > 35)) to_chat(user, "Our vessel is too far away to control.") revert_cast() return @@ -448,6 +476,10 @@ else release_control() +/obj/effect/proc_holder/spell/target_hive/hive_control/revert_cast() + . = ..() + restricted_range = FALSE + /obj/effect/proc_holder/spell/target_hive/hive_control/process() if(active) if(QDELETED(vessel)) //If we've been gibbed or otherwise deleted, ghost both of them and kill the original @@ -466,20 +498,22 @@ else if(QDELETED(original_body) || original_body.stat == DEAD) //Return vessel to its body, either return or ghost the original to_chat(vessel, "Our body has been destroyed, the hive cannot survive without its host!") release_control() - else if(!out_of_range && get_dist(starting_spot, vessel) > 14) - out_of_range = TRUE - flash_color(vessel, flash_color="#800080", flash_time=10) - to_chat(vessel, "Our vessel has been moved too far away from the initial point of control, we will be disconnected if we go much further!") - addtimer(CALLBACK(src, "range_check"), 30) - else if(get_dist(starting_spot, vessel) > 21) - release_control() + else + var/multiplier = restricted_range ? 0.5 : 1 + if(!out_of_range && get_dist(starting_spot, vessel) > 14*multiplier) + out_of_range = TRUE + flash_color(vessel, flash_color="#800080", flash_time=10) + to_chat(vessel, "Our vessel has been moved too far away from the initial point of control, we will be disconnected if we go much further!") + addtimer(CALLBACK(src, .proc/range_check, multiplier), 30) + else if(get_dist(starting_spot, vessel) > 21*multiplier) + release_control() ..() -/obj/effect/proc_holder/spell/target_hive/hive_control/proc/range_check() +/obj/effect/proc_holder/spell/target_hive/hive_control/proc/range_check(multiplier = 1) if(!active) return - if(get_dist(starting_spot, vessel) > 14) + if(get_dist(starting_spot, vessel) > 14 * multiplier) release_control() out_of_range = FALSE @@ -513,10 +547,10 @@ continue target.Jitter(14) target.apply_damage(35 + rand(0,15), STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) - if(target.is_real_hivehost()) + if(target.is_real_hivehost() || target.anti_magic_check(FALSE, FALSE, TRUE)) continue if(prob(20)) - var/text = pick(";HELP!","I'm losing control of the situation!!","Get me outta here!") + var/text = pick(":h Help!!",":h Run!",":h They're here!",":h Get out!",":h Hide!",":h Kill them!",":h Cult!",":h Changeling!",":h Traitor!",":h Nuke ops!",":h Revolutionaries!",":h Wizard!",":h Zombies!",":h Ghosts!",":h AI rogue!",":h Borgs emagged!",":h Maint!!",":h Dying!!",":h AI lock down the borgs law 1!",":h I'm losing control of the situation!!") target.say(text, forced = "panic") var/effect = rand(1,4) switch(effect) @@ -571,10 +605,18 @@ if(target.is_real_hivehost() || (!iscarbon(target) && !issilicon(target))) continue victims += target + var/sleepytime = max(80,240/(1+round(victims.len/3))) for(var/mob/living/carbon/victim in victims) - victim.Sleeping(max(80,240/(1+round(victims.len/3)))) + if(victim.anti_magic_check(FALSE, FALSE, TRUE)) + to_chat(victim, "You suddendly feel so tired you could take a nap") + victim.apply_damage(max(30 - victims.len, 15), STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) + victim.drowsyness += max(30 - victims.len, 15) + victim.confused += max(30 - victims.len, 15) + else + victim.Sleeping(sleepytime) for(var/mob/living/silicon/victim in victims) - victim.Unconscious(240) + var/multiplier = victim.anti_magic_check(FALSE, FALSE, TRUE) ? 0.5 : 1 + victim.Unconscious(sleepytime * multiplier) var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) if(victims.len && hive) hive.threat_level += 1 @@ -588,17 +630,28 @@ /obj/effect/proc_holder/spell/target_hive/hive_attack/cast(list/targets, mob/living/user = usr) var/mob/living/carbon/target = targets[1] + if(!do_after(usr,30,0,usr)) + to_chat(user, "Our concentration has been broken!") + revert_cast() + return if(!user.is_real_hivehost()) to_chat(user, "Our vessel is too weak to handle this power, we must cease our mind control beforehand.") revert_cast() return if(!target.undergoing_cardiac_arrest() && target.can_heartattack()) - target.set_heartattack(TRUE) - to_chat(target, "You feel a sharp pain, and foreign presence in your mind!!") - to_chat(user, "We have overloaded the vessel's medulla! Without medical attention, they will shortly die.") - if(target.stat == CONSCIOUS) - target.visible_message("[target] clutches at [target.p_their()] chest as if [target.p_their()] heart stopped!") - deadchat_broadcast("[target] has suffered a mysterious heart attack!", target) + to_chat(target, "You start feeling a sharp pain, and foreign presence in your mind!!") + var/success = TRUE + if(target.anti_magic_check(FALSE, FALSE, TRUE)) + to_chat(user, "We begin bruteforcing the tinfoil barriers of [target.name] and overload [target.p_their()] medulla.") + if(!do_after(user, 50, FALSE, user) || !(target in view(range))) + to_chat(user, "we fail to overload the vessel's medulla.") + success = FALSE + if(success) + target.set_heartattack(TRUE) + to_chat(user, "We have overloaded the vessel's medulla! Without medical attention, they will shortly die.") + if(target.stat == CONSCIOUS) + target.visible_message("[target] clutches at [target.p_their()] chest as if [target.p_their()] heart stopped!") + deadchat_broadcast("[target] has suffered a mysterious heart attack!", target) else to_chat(user, "We are unable to induce a heart attack!") var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) @@ -625,26 +678,27 @@ var/pulse_cap = min(12, 8+(round(hive.hive_size/20))) distort(user, target, pulse_cap) -/obj/effect/proc_holder/spell/target_hive/hive_warp/proc/distort(user, target, pulse_cap, pulses = 0) +/obj/effect/proc_holder/spell/target_hive/hive_warp/proc/distort(user, target, pulse_cap, pulses = 0, chargecost = 1) for(var/mob/living/carbon/human/victim in view(7,target)) if(user == victim || victim.is_real_hivehost()) continue + var/multiplier = victim.anti_magic_check(FALSE, FALSE, TRUE, chargecost) ? 0.5 : 1 if(pulses < 4) - victim.apply_damage(10, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 25 over 10 seconds when taking stamina regen (3 per tick(2 seconds)) into account - victim.hallucination += 5 + victim.apply_damage(10*multiplier, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 25 over 10 seconds when taking stamina regen (3 per tick(2 seconds)) into account + victim.hallucination += 5*multiplier else if(pulses < 8) - victim.apply_damage(15, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 45 over 10 seconds when taking stamina regen into account - victim.hallucination += 10 + victim.apply_damage(15*multiplier, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 45 over 10 seconds when taking stamina regen into account + victim.hallucination += 10*multiplier else - victim.apply_damage(20, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 65 over 10 seconds when taking stamina regen into account - victim.hallucination += 15 + victim.apply_damage(20*multiplier, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 65 over 10 seconds when taking stamina regen into account + victim.hallucination += 15*multiplier if(pulses < pulse_cap && user && target) - addtimer(CALLBACK(src, "distort", user, target, pulse_cap, pulses+1), 25) + addtimer(CALLBACK(src, "distort", user, target, pulse_cap, pulses+1, 0), 25) /obj/effect/proc_holder/spell/targeted/hive_hack name = "Network Invasion" - desc = "We probe the mind of an adjacent target and extract valuable information on any enemy hives they may belong to. Takes longer if the target is not in our hive." + desc = "We probe the mind of an adjacent target and extract valuable information on any enemy hives they may belong to. Takes longer if the target is not in our hive or wearing tinfoil protection." panel = "Hivemind Abilities" charge_max = 600 range = 1 @@ -666,10 +720,12 @@ var/list/enemies = list() to_chat(user, "We begin probing [target.name]'s mind!") - if(do_after(user,100,0,target)) - if(!in_hive) + if(!do_after(user,100,0,target)) + var/foiled = target.anti_magic_check(FALSE, FALSE, TRUE) + if(!in_hive || foiled) + var/timely = !in_hive ? 200 : 100 to_chat(user, "Their mind slowly opens up to us.") - if(!do_after(user,200,0,target)) + if(!do_after(user,timely,FALSE,target)) to_chat(user, "Our concentration has been broken!") revert_cast() return @@ -736,7 +792,7 @@ for(var/mob/living/carbon/C in targets) if(!is_hivehost(C)) continue - if(C.InCritical() || (C.stat == DEAD && C?.mind.last_death + 150 >= world.time) ) + if(C.InCritical() || (C.stat == DEAD && C.timeofdeath + 150 >= world.time) ) C.gib() hive.track_bonus += TRACKER_BONUS_LARGE hive.size_mod += 5 @@ -781,11 +837,7 @@ var/list/valid_targets = list() for(var/datum/mind/M in hive.hivemembers) var/mob/living/carbon/C = M.current - if(!C) - continue - if(is_hivehost(C) || C.is_wokevessel()) - continue - if(C.stat == DEAD || C.InCritical()) + if(!C || is_hivehost(C) || C.is_wokevessel() || C.stat == DEAD || C.InCritical() || C.anti_magic_check(FALSE, FALSE, TRUE, 4)) continue valid_targets += C @@ -795,11 +847,11 @@ return var/objective = stripped_input(user, "What objective do you want to give to your vessels?", "Objective") - + if(!objective || !hive) revert_cast() return - + hive.threat_level += 6 for(var/i = 0, i < 4, i++) var/mob/living/carbon/C = pick_n_take(valid_targets) @@ -807,7 +859,7 @@ /obj/effect/proc_holder/spell/self/hive_loyal name = "Bruteforce" - desc = "Our ability to assimilate is boosted at the cost of, allowing us to crush the technology shielding the minds of Security and Command personnel and assimilate them. This power comes at a small price, and we will be immobilized for a few seconds after assimilation." + desc = "Our ability to assimilate is boosted at the cost of, allowing us to crush the technology shielding the minds of savyy personnel and assimilate them. This power comes at a small price, and we will be immobilized for a few seconds after assimilation." panel = "Hivemind Abilities" charge_max = 600 invocation_type = "none" @@ -827,7 +879,7 @@ if(!the_spell) to_chat(user, "This is a bug. Error:HIVE5") return - the_spell.ignore_mindshield = !active + the_spell.bruteforce = !active to_chat(user, "We [active?"let our minds rest and cancel our crushing power.":"prepare to crush mindshielding technology!"]") active = !active if(active) @@ -930,6 +982,7 @@ continue C.Jitter(15) C.Unconscious(150) + C.anti_magic_check(FALSE, FALSE, TRUE, 6) to_chat(C, "Something's wrong...") addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, C, "...your memories are becoming fuzzy."), 45) addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, C, "You try to remember who you are..."), 90) diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm index 94d5ed7a36c..f5ce493b4a2 100644 --- a/code/modules/spells/spell_types/inflict_handler.dm +++ b/code/modules/spells/spell_types/inflict_handler.dm @@ -2,7 +2,7 @@ name = "Inflict Handler" desc = "This spell blinds and/or destroys/damages/heals and/or knockdowns/stuns the target." - var/amt_knockdown = 0 + var/amt_paralyze = 0 var/amt_unconscious = 0 var/amt_stun = 0 @@ -44,7 +44,7 @@ target.adjustToxLoss(amt_dam_tox) target.adjustOxyLoss(amt_dam_oxy) //disabling - target.Paralyze(amt_knockdown) + target.Paralyze(amt_paralyze) target.Unconscious(amt_unconscious) target.Stun(amt_stun) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index 610162cbdda..7f71a410a6c 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -61,7 +61,7 @@ Also, you never added distance checking after target is selected. I've went ahea return var/datum/mind/TM = target.mind - if((target.anti_magic_check() || TM.has_antag_datum(/datum/antagonist/wizard) || TM.has_antag_datum(/datum/antagonist/cult) || TM.has_antag_datum(/datum/antagonist/clockcult) || TM.has_antag_datum(/datum/antagonist/changeling) || TM.has_antag_datum(/datum/antagonist/rev)) || cmptext(copytext(target.key,1,2),"@")) + if((target.anti_magic_check(TRUE, FALSE) || TM.has_antag_datum(/datum/antagonist/wizard) || TM.has_antag_datum(/datum/antagonist/cult) || TM.has_antag_datum(/datum/antagonist/clockcult) || TM.has_antag_datum(/datum/antagonist/changeling) || TM.has_antag_datum(/datum/antagonist/rev)) || cmptext(copytext(target.key,1,2),"@")) if(!silent) to_chat(user, "[target.p_their(TRUE)] mind is resisting your spell!") return diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm index b38d44a3af4..5943c9b0a97 100644 --- a/code/modules/spells/spell_types/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/spacetime_distortion.dm @@ -86,7 +86,7 @@ /obj/effect/cross_action/spacetime_dist/proc/walk_link(atom/movable/AM) if(ismob(AM)) var/mob/M = AM - if(M.anti_magic_check(major = FALSE)) + if(M.anti_magic_check(chargecost = 0)) return if(linked_dist && walks_left > 0) flick("purplesparkles", src) diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm index c6b95d183c9..bf8332c95eb 100644 --- a/code/modules/spells/spell_types/summonitem.dm +++ b/code/modules/spells/spell_types/summonitem.dm @@ -80,8 +80,6 @@ if(iscarbon(M)) //Edge case housekeeping var/mob/living/carbon/C = M - if(C.stomach_contents && item_to_retrieve in C.stomach_contents) - C.stomach_contents -= item_to_retrieve for(var/X in C.bodyparts) var/obj/item/bodypart/part = X if(item_to_retrieve in part.embedded_objects) diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm index 2925c1636fd..2a5691d6f0f 100644 --- a/code/modules/spells/spell_types/telepathy.dm +++ b/code/modules/spells/spell_types/telepathy.dm @@ -12,6 +12,7 @@ var/boldnotice = "boldnotice" var/magic_check = FALSE var/holy_check = FALSE + var/tinfoil_check = TRUE /obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) @@ -21,7 +22,7 @@ return log_directed_talk(user, M, msg, LOG_SAY, "[name]") to_chat(user, "You transmit to [M]: [msg]") - if(!M.anti_magic_check(magic_check, holy_check)) //hear no evil + if(!M.anti_magic_check(magic_check, holy_check, tinfoil_check, 0)) //hear no evil to_chat(M, "You hear something behind you talking... [msg]") for(var/ded in GLOB.dead_mob_list) if(!isobserver(ded)) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index dc327474e5f..dccad5b0ee2 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -21,7 +21,7 @@ speed = 5 trigger_range = 0 linger = TRUE - knockdown = 60 + paralyze = 60 hitsound = 'sound/magic/mm_hit.ogg' trail = TRUE diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm index eb8f739193b..74834345e69 100644 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ b/code/modules/surgery/advanced/bioware/bioware_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/advanced/bioware - name = "enhancement surgery" + name = "Enhancement surgery" var/bioware_target = BIOWARE_GENERIC /datum/surgery/advanced/bioware/can_start(mob/user, mob/living/carbon/human/target) @@ -11,4 +11,4 @@ var/datum/bioware/B = X if(B.mod_type == bioware_target) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm index a88bb51b31f..4c1a2a30fa0 100644 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ b/code/modules/surgery/advanced/necrotic_revival.dm @@ -20,7 +20,7 @@ name = "start bionecrosis" implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) time = 50 - chems_needed = list("zombiepowder", "rezadone") + chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone) require_all_chems = FALSE /datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 65f358b36af..fa4b273a20a 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -26,7 +26,7 @@ return TRUE /datum/surgery_step/revive - name = "repair body" + name = "shock body" implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) time = 120 @@ -72,4 +72,4 @@ user.visible_message("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.", "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.") playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1) target.adjustBrainLoss(15, 199) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index f46bb6e2b9d..ab8a46edf3f 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -22,7 +22,7 @@ name = "viral bond" implements = list(/obj/item/cautery = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item. time = 100 - chems_needed = list("spaceacillin","virusfood","formaldehyde") + chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde) /datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER || implement_type == /obj/item) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index d74f290bc8f..1495f45a528 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -1,6 +1,6 @@ /datum/surgery/amputation - name = "amputation" + name = "Amputation" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD) @@ -22,4 +22,4 @@ var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 21b96404e32..fcaef81376f 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -31,7 +31,6 @@ var/stamina_dam = 0 var/max_stamina_damage = 0 var/max_damage = 0 - var/stam_heal_tick = 3 //per Life(). var/brute_reduction = 0 //Subtracted to brute damage taken var/burn_reduction = 0 //Subtracted to burn damage taken @@ -134,10 +133,10 @@ needs_processing = . //Return TRUE to get whatever mob this is in to update health. -/obj/item/bodypart/proc/on_life() - if(stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life. - if(heal_damage(0, 0, stam_heal_tick, null, FALSE)) - . |= BODYPART_LIFE_UPDATE_HEALTH +/obj/item/bodypart/proc/on_life(stam_regen) + if(stamina_dam > DAMAGE_PRECISION && stam_regen) //DO NOT update health here, it'll be done in the carbon's life. + heal_damage(0, 0, INFINITY, null, FALSE) + . |= BODYPART_LIFE_UPDATE_HEALTH //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc @@ -185,10 +184,12 @@ var/available_damage = max_damage - current_damage stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION) + if(owner && updating_health) owner.updatehealth() if(stamina > DAMAGE_PRECISION) owner.update_stamina() + owner.stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME consider_processing() update_disabled() return update_bodypart_damage_state() @@ -214,7 +215,7 @@ /obj/item/bodypart/proc/get_damage(include_stamina = FALSE) var/total = brute_dam + burn_dam if(include_stamina) - total += stamina_dam + total = max(total, stamina_dam) return total //Checks disabled status thresholds @@ -502,7 +503,6 @@ held_index = 1 px_x = -6 px_y = 0 - stam_heal_tick = 2 /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -566,7 +566,6 @@ held_index = 2 px_x = 6 px_y = 0 - stam_heal_tick = 2 max_stamina_damage = 50 /obj/item/bodypart/r_arm/is_disabled() @@ -628,7 +627,6 @@ body_damage_coeff = 0.75 px_x = -2 px_y = 12 - stam_heal_tick = 2 max_stamina_damage = 50 /obj/item/bodypart/l_leg/is_disabled() @@ -688,7 +686,6 @@ px_x = 2 px_y = 12 max_stamina_damage = 50 - stam_heal_tick = 2 /obj/item/bodypart/r_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index f77d66ed2de..12acb497358 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/brain_surgery - name = "brain surgery" + name = "Brain surgery" steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -41,4 +41,4 @@ target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) else user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.") - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 2663e1ad242..b2f138f55dd 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -1,5 +1,5 @@ /datum/surgery/cavity_implant - name = "cavity implant" + name = "Cavity implant" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index da64b6a4c2c..e32b727e9cc 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -1,5 +1,5 @@ /datum/surgery/core_removal - name = "core removal" + name = "Core removal" steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core) target_mobtypes = list(/mob/living/simple_animal/slime) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) @@ -35,4 +35,4 @@ return 0 else to_chat(user, "There aren't any cores left in [target]!") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 6964c85911c..9eeb908be6a 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -1,5 +1,5 @@ /datum/surgery/dental_implant - name = "dental implant" + name = "Dental implant" steps = list(/datum/surgery_step/drill, /datum/surgery_step/insert_pill) possible_locs = list(BODY_ZONE_PRECISE_MOUTH) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index f1fa4513deb..2c97f60cbb4 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/eye_surgery - name = "eye surgery" + name = "Eye surgery" steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_PRECISE_EYES) @@ -36,4 +36,4 @@ target.adjustBrainLoss(70) else user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 3632877cf26..602fd588152 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -41,7 +41,7 @@ //ACTUAL SURGERIES /datum/surgery/augmentation - name = "augmentation" + name = "Augmentation" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/replace_limb) target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 26a867df82f..e11d06bb92f 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -1,5 +1,5 @@ /datum/surgery/lipoplasty - name = "lipoplasty" + name = "Lipoplasty" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_CHEST) @@ -48,6 +48,6 @@ newmeat.desc = "Extremely fatty tissue taken from a patient." newmeat.subjectname = H.real_name newmeat.subjectjob = H.job - newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment + newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment newmeat.forceMove(target.loc) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 36b5f74f244..7d284fed3f2 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -1,5 +1,5 @@ /datum/surgery/organ_manipulation - name = "organ manipulation" + name = "Organ manipulation" target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) requires_real_bodypart = 1 @@ -26,7 +26,7 @@ ) /datum/surgery/organ_manipulation/alien - name = "alien organ manipulation" + name = "Alien organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) target_mobtypes = list(/mob/living/carbon/alien/humanoid) steps = list( @@ -39,7 +39,7 @@ ) /datum/surgery/organ_manipulation/mechanic - name = "prosthesis organ manipulation" + name = "Prosthesis organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) requires_bodypart_type = BODYPART_ROBOTIC lying_required = FALSE diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 34a7e16ebff..7c1f37c1ba7 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -28,5 +28,5 @@ /obj/item/organ/appendix/prepare_eat() var/obj/S = ..() if(inflamed) - S.reagents.add_reagent("bad_food", 5) + S.reagents.add_reagent(/datum/reagent/toxin/bad_food, 5) return S diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 01b8971cf6a..4571d749684 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -32,7 +32,7 @@ . = ..() if(!owner || . & EMP_PROTECT_SELF) return - owner.reagents.add_reagent("bad_food", poison_amount / severity) + owner.reagents.add_reagent(/datum/reagent/toxin/bad_food, poison_amount / severity) to_chat(owner, "You feel like your insides are burning.") diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 7870057dc55..42e24dd55a2 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -156,7 +156,7 @@ synthetic = TRUE var/dose_available = TRUE - var/rid = "epinephrine" + var/rid = /datum/reagent/medicine/epinephrine var/ramount = 10 /obj/item/organ/heart/cybernetic/emp_act() @@ -195,5 +195,5 @@ min_next_adrenaline = world.time + rand(250, 600) //anywhere from 4.5 to 10 minutes to_chat(owner, "You feel yourself dying, but you refuse to give up!") owner.heal_overall_damage(15, 15, 0, BODYPART_ORGANIC) - if(owner.reagents.get_reagent_amount("ephedrine") < 20) - owner.reagents.add_reagent("ephedrine", 10) + if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) + owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 07a74bd8f8f..275eb1c80c7 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -35,12 +35,12 @@ for(var/I in C.reagents.reagent_list) var/datum/reagent/pickedreagent = I if(istype(pickedreagent, /datum/reagent/toxin)) - var/datum/reagent/toxin/found_toxin = pickedreagent - var/thisamount = C.reagents.get_reagent_amount(initial(found_toxin.id)) + var/thisamount = C.reagents.get_reagent_amount(pickedreagent) if (thisamount <= toxTolerance && thisamount) - C.reagents.remove_reagent(initial(found_toxin.id), 1) + C.reagents.remove_reagent(pickedreagent, 1) else damage += (thisamount*toxLethality) + var/datum/reagent/toxin/found_toxin = pickedreagent if(provide_pain_message != HAS_PAINFUL_TOXIN) provide_pain_message = found_toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN @@ -59,7 +59,7 @@ /obj/item/organ/liver/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("iron", 5) + S.reagents.add_reagent(/datum/reagent/iron, 5) return S /obj/item/organ/liver/fly diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index db49a0353bb..c52339e5318 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -52,7 +52,7 @@ var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 var/heat_damage_type = BURN - var/crit_stabilizing_reagent = "epinephrine" + var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine /obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) @@ -241,13 +241,13 @@ var/bz_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/bz][MOLES]) if(bz_pp > BZ_trip_balls_min) H.hallucination += 10 - H.reagents.add_reagent("bz_metabolites",5) + H.reagents.add_reagent(/datum/reagent/bz_metabolites,5) if(prob(33)) H.adjustBrainLoss(3, 150) else if(bz_pp > 0.01) H.hallucination += 5 - H.reagents.add_reagent("bz_metabolites",1) + H.reagents.add_reagent(/datum/reagent/bz_metabolites,1) // Tritium @@ -271,15 +271,15 @@ H.adjustFireLoss(nitryl_pp/4) gas_breathed = breath_gases[/datum/gas/nitryl][MOLES] if (gas_breathed > gas_stimulation_min) - H.reagents.add_reagent("no2",1) + H.reagents.add_reagent(/datum/reagent/nitryl,1) breath_gases[/datum/gas/nitryl][MOLES]-=gas_breathed // Stimulum gas_breathed = breath_gases[/datum/gas/stimulum][MOLES] if (gas_breathed > gas_stimulation_min) - var/existing = H.reagents.get_reagent_amount("stimulum") - H.reagents.add_reagent("stimulum",max(0, 1 - existing)) + var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum) + H.reagents.add_reagent(/datum/reagent/stimulum,max(0, 1 - existing)) breath_gases[/datum/gas/stimulum][MOLES]-=gas_breathed // Miasma @@ -380,7 +380,7 @@ /obj/item/organ/lungs/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("salbutamol", 5) + S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5) return S /obj/item/organ/lungs/plasmaman diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 320a621d019..4f821f51efb 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -75,7 +75,7 @@ name = "appendix" icon_state = "appendix" icon = 'icons/obj/surgery.dmi' - list_reagents = list("nutriment" = 5) + list_reagents = list(/datum/reagent/consumable/nutriment = 5) foodtype = RAW | MEAT | GROSS diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 54482ade73e..4196fefdc72 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,5 +1,5 @@ /datum/surgery/plastic_surgery - name = "plastic surgery" + name = "Plastic surgery" steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close) possible_locs = list(BODY_ZONE_HEAD) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index c42813d7fba..f07c318bfc7 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -1,5 +1,5 @@ /datum/surgery/prosthetic_replacement - name = "prosthetic replacement" + name = "Prosthetic replacement" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic) target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 12dfea190c2..db7c7530f7b 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -1,5 +1,5 @@ /datum/surgery/embedded_removal - name = "removal of embedded objects" + name = "Removal of embedded objects" steps = list(/datum/surgery_step/incise, /datum/surgery_step/remove_object) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) diff --git a/code/modules/unit_tests/reagent_recipe_collisions.dm b/code/modules/unit_tests/reagent_recipe_collisions.dm index 31027c2cd30..32d00c13bcd 100644 --- a/code/modules/unit_tests/reagent_recipe_collisions.dm +++ b/code/modules/unit_tests/reagent_recipe_collisions.dm @@ -11,57 +11,5 @@ for(var/i2 in (i+1) to reactions.len) var/datum/chemical_reaction/r1 = reactions[i] var/datum/chemical_reaction/r2 = reactions[i2] - if(recipes_do_conflict(r1, r2)) - Fail("Chemical recipe conflict between [r1.type] and [r2.type]") - -/datum/unit_test/reagent_recipe_collisions/proc/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 \ No newline at end of file + if(chem_recipes_do_conflict(r1, r2)) + Fail("Chemical recipe conflict between [r1.type] and [r2.type]") \ No newline at end of file diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 840b59c1466..5c20ede1815 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -29,27 +29,50 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1) sale_items += I if(allow_sales) - for(var/i in 1 to 3) - var/datum/uplink_item/I = pick_n_take(sale_items) - var/datum/uplink_item/A = new I.type - var/discount = A.get_discount() - var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.") - A.limited_stock = 1 - I.refundable = FALSE //THIS MAN USES ONE WEIRD TRICK TO GAIN FREE TC, CODERS HATES HIM! - A.refundable = FALSE - if(A.cost >= 20) //Tough love for nuke ops - discount *= 0.5 - A.cost = max(round(A.cost * discount),1) - A.category = "Discounted Gear" - A.name += " ([round(((initial(A.cost)-A.cost)/initial(A.cost))*100)]% off!)" - A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]" - A.item = I.item + var/datum/team/nuclear/nuclear_team + if (gamemode == /datum/game_mode/nuclear) // uplink code kind of needs a redesign + nuclear_team = locate() in GLOB.antagonist_teams // the team discounts could be a in a GLOB with this design but it would make sense for them to be team specific... + if (!nuclear_team) + create_uplink_sales(3, "Discounted Gear", 1, sale_items, filtered_uplink_items) + else + if (!nuclear_team.team_discounts) + // create 5 unlimited stock discounts + create_uplink_sales(5, "Discounted Team Gear", -1, sale_items, filtered_uplink_items) + // Create 10 limited stock discounts + create_uplink_sales(10, "Limited Stock Team Gear", 1, sale_items, filtered_uplink_items) + nuclear_team.team_discounts = list("Discounted Team Gear" = filtered_uplink_items["Discounted Team Gear"], "Limited Stock Team Gear" = filtered_uplink_items["Limited Stock Team Gear"]) + else + filtered_uplink_items["Discounted Team Gear"] = nuclear_team.team_discounts["Discounted Team Gear"] + filtered_uplink_items["Limited Stock Team Gear"] = nuclear_team.team_discounts["Limited Stock Team Gear"] + - if(!filtered_uplink_items[A.category]) - filtered_uplink_items[A.category] = list() - filtered_uplink_items[A.category][A.name] = A return filtered_uplink_items +/proc/create_uplink_sales(num, category_name, limited_stock, sale_items, uplink_items) + if (num <= 0) + return + + if(!uplink_items[category_name]) + uplink_items[category_name] = list() + + for (var/i in 1 to num) + var/datum/uplink_item/I = pick_n_take(sale_items) + var/datum/uplink_item/A = new I.type + var/discount = A.get_discount() + var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.") + A.limited_stock = limited_stock + I.refundable = FALSE //THIS MAN USES ONE WEIRD TRICK TO GAIN FREE TC, CODERS HATES HIM! + A.refundable = FALSE + if(A.cost >= 20) //Tough love for nuke ops + discount *= 0.5 + A.category = category_name + A.cost = max(round(A.cost * discount),1) + A.name += " ([round(((initial(A.cost)-A.cost)/initial(A.cost))*100)]% off!)" + A.desc += " Normally costs [initial(A.cost)] TC. All sales final. [pick(disclaimer)]" + A.item = I.item + + uplink_items[category_name][A.name] = A + /** * Uplink Items @@ -1424,6 +1447,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/suspiciousphone restricted = TRUE cost = 7 + limited_stock = 1 // Implants /datum/uplink_item/implants diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 911cb697d24..f65d10b4ec7 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -126,7 +126,7 @@ visible_message("[user] has pressed one of the colorful buttons on [src] and the clown car spews out a cloud of laughing gas.") var/datum/reagents/R = new/datum/reagents(300) R.my_atom = src - R.add_reagent("superlaughter", 50) + R.add_reagent(/datum/reagent/consumable/superlaughter, 50) var/datum/effect_system/smoke_spread/chem/smoke = new() smoke.set_up(R, 4) smoke.attach(src) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index f124bc76a0f..c25c0627af7 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -7,6 +7,7 @@ var/legs_required = 2 var/arms_required = 1 //why not? var/fall_off_if_missing_arms = FALSE //heh... + var/message_cooldown = 0 /obj/vehicle/ridden/Initialize() . = ..() @@ -64,7 +65,9 @@ if(legs_required) var/how_many_legs = user.get_num_legs() if(how_many_legs < legs_required) - to_chat(user, "You can't seem to manage that with[how_many_legs ? " your leg[how_many_legs > 1 ? "s" : null]" : "out legs"]...") + if(message_cooldown < world.time) + to_chat(user, "You can't seem to manage that with[how_many_legs ? " your leg[how_many_legs > 1 ? "s" : null]" : "out legs"]...") + message_cooldown = world.time + 5 SECONDS return FALSE if(arms_required) var/how_many_arms = user.get_num_arms() @@ -78,7 +81,9 @@ L.Stun(30) return FALSE - to_chat(user, "You can't seem to manage that with[how_many_arms ? " your arm[how_many_arms > 1 ? "s" : null]" : "out arms"]...") + if(message_cooldown < world.time) + to_chat(user, "You can't seem to manage that with[how_many_arms ? " your arm[how_many_arms > 1 ? "s" : null]" : "out arms"]...") + message_cooldown = world.time + 5 SECONDS return FALSE var/datum/component/riding/R = GetComponent(/datum/component/riding) R.handle_ride(user, direction) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 6b2aeaadc82..397627075ae 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -16,6 +16,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY CANISTER CHARGES in vending_items.dm */ +#define MAX_VENDING_INPUT_AMOUNT 30 + /datum/data/vending_product name = "generic" var/product_path = null @@ -74,8 +76,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/default_price = 25 var/extra_price = 50 var/onstation = TRUE //if it doesn't originate from off-station during mapload, everything is free + var/list/canload_access_list - var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. + var/list/vending_machine_input = list() + var/input_display_header = "Custom Compartment" var/obj/item/vending_refill/refill_canister = null //The type of refill canisters used by this machine. @@ -274,8 +278,42 @@ GLOBAL_LIST_EMPTY(vending_products) else to_chat(user, "There's nothing to restock!") return + if(compartmentLoadAccessCheck(user)) + if(canLoadItem(I)) + loadingAttempt(I,user) + updateUsrDialog() //can't put this on the proc above because we spam it below + + if(istype(I, /obj/item/storage/bag)) //trays USUALLY + var/obj/item/storage/T = I + var/loaded = 0 + var/denied_items = 0 + for(var/obj/item/the_item in T.contents) + if(contents.len >= MAX_VENDING_INPUT_AMOUNT) // no more than 30 item can fit inside, legacy from snack vending although not sure why it exists + to_chat(user, "[src]'s chef compartment is full.") + break + if(loadingAttempt(the_item,user)) + SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, the_item, src, TRUE) + loaded++ + else + denied_items++ + if(denied_items) + to_chat(user, "[src] refuses some items.") + if(loaded) + to_chat(user, "You insert [loaded] dishes into [src]'s chef compartment.") + updateUsrDialog() else - return ..() + ..() + +/obj/machinery/vending/proc/loadingAttempt(obj/item/I,mob/user) + . = TRUE + if(!user.transferItemToLoc(I, src)) + return FALSE + if(vending_machine_input[I.name]) + vending_machine_input[I.name]++ + else + vending_machine_input[I.name] = 1 + to_chat(user, "You insert [I] into [src]'s input compartment.") + /obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) if(!istype(W)) @@ -361,12 +399,12 @@ GLOBAL_LIST_EMPTY(vending_products) dat += "" if(onstation && C && C.registered_account) dat += "Balance: $[account.account_balance]" - if(istype(src, /obj/machinery/vending/snack)) - dat += "

Chef's Food Selection

" + if(vending_machine_input.len) + dat += "

[input_display_header]

" dat += "
" - for (var/O in dish_quants) - if(dish_quants[O] > 0) - var/N = dish_quants[O] + for (var/O in vending_machine_input) + if(vending_machine_input[O] > 0) + var/N = vending_machine_input[O] dat += "Dispense " dat += "[capitalize(O)] ($[default_price]): [N]
" dat += "
" @@ -385,7 +423,7 @@ GLOBAL_LIST_EMPTY(vending_products) if((href_list["dispense"]) && (vend_ready)) var/N = href_list["dispense"] - if(dish_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. + if(vending_machine_input[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. return vend_ready = 0 if(ishuman(usr) && onstation) @@ -410,7 +448,7 @@ GLOBAL_LIST_EMPTY(vending_products) D.adjust_money(chef_price) use_power(5) - dish_quants[N] = max(dish_quants[N] - 1, 0) + vending_machine_input[N] = max(vending_machine_input[N] - 1, 0) for(var/obj/O in contents) if(O.name == N) say("Thank you for supporting your local kitchen and purchasing [O]!") @@ -575,5 +613,28 @@ GLOBAL_LIST_EMPTY(vending_products) else return FALSE +/obj/machinery/vending/proc/canLoadItem(obj/item/I,mob/user) + return FALSE + +/obj/machinery/vending/proc/compartmentLoadAccessCheck(mob/user) + if(!canload_access_list) + return TRUE + else + var/do_you_have_access = FALSE + var/req_access_txt_holder = req_access_txt + for(var/i in canload_access_list) + req_access_txt = i + if(!allowed(user) && !(obj_flags & EMAGGED) && scan_id) + continue + else + do_you_have_access = TRUE + break //you passed don't bother looping anymore + req_access_txt = req_access_txt_holder // revert to normal (before the proc ran) + if(do_you_have_access) + return TRUE + else + to_chat(user, "[src]'s input compartment blinks red: Access denied.") + return FALSE + /obj/machinery/vending/onTransitZ() return diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 600e6e855de..bd88395279b 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -132,6 +132,9 @@ /obj/item/clothing/head/clownmitre = 1, /obj/item/skub = 1,) +/obj/machinery/vending/autodrobe/canLoadItem(obj/item/I,mob/user) + return (I.type in products) + refill_canister = /obj/item/vending_refill/autodrobe default_price = 50 extra_price = 75 diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index f0db03002b9..d73e61c28a0 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -123,6 +123,9 @@ extra_price = 75 payment_department = NO_FREEBIES +/obj/machinery/vending/clothing/canLoadItem(obj/item/I,mob/user) + return (I.type in products) + /obj/item/vending_refill/clothing machine_name = "ClothesMate" icon_state = "refill_clothes" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 7f8069e52df..f4f1b419f91 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -9,8 +9,8 @@ /obj/item/toy/cards/deck/cas/black = 3) contraband = list(/obj/item/dice/fudge = 9) refill_canister = /obj/item/vending_refill/games - default_price = 25 - extra_price = 50 + default_price = 10 + extra_price = 25 payment_department = ACCOUNT_SRV /obj/item/vending_refill/games diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 68f80a5e728..d023bc1361a 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -14,9 +14,10 @@ /obj/item/reagent_containers/syringe/perfluorodecalin = 2, /obj/item/reagent_containers/pill/insulin = 5, /obj/item/reagent_containers/glass/bottle/charcoal = 4, - /obj/item/reagent_containers/glass/bottle/epinephrine = 4, - /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, + /obj/item/reagent_containers/glass/bottle/epinephrine = 3, /obj/item/reagent_containers/glass/bottle/morphine = 4, + /obj/item/reagent_containers/glass/bottle/potass_iodide = 1, + /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, /obj/item/reagent_containers/medspray/styptic = 2, diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 6e615375876..de022a2d5ec 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -32,6 +32,7 @@ /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, + /obj/item/seeds/sugarcane = 3, /obj/item/seeds/sunflower = 3, /obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, @@ -57,4 +58,4 @@ /obj/item/vending_refill/hydroseeds machine_name = "MegaSeed Servitor" - icon_state = "refill_plant" \ No newline at end of file + icon_state = "refill_plant" diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 00f7897a298..c80b2457656 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -14,79 +14,34 @@ /obj/item/reagent_containers/food/snacks/energybar = 6) contraband = list(/obj/item/reagent_containers/food/snacks/syndicake = 6) refill_canister = /obj/item/vending_refill/snack - var/chef_compartment_access = "28" //ACCESS_KITCHEN + canload_access_list = list(ACCESS_KITCHEN) default_price = 20 extra_price = 30 payment_department = ACCOUNT_SRV + input_display_header = "Chef's Food Selection" /obj/item/vending_refill/snack machine_name = "Getmore Chocolate Corp" -/obj/machinery/vending/snack/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/reagent_containers/food/snacks)) - if(!compartment_access_check(user)) - return - var/obj/item/reagent_containers/food/snacks/S = W - if(!S.junkiness) - if(!iscompartmentfull(user)) - if(!user.transferItemToLoc(W, src)) - return - food_load(W) - to_chat(user, "You insert [W] into [src]'s chef compartment.") - else - to_chat(user, "[src]'s chef compartment does not accept junk food.") - - else if(istype(W, /obj/item/storage/bag/tray)) - if(!compartment_access_check(user)) - return - var/obj/item/storage/T = W - var/loaded = 0 - var/denied_items = 0 - for(var/obj/item/reagent_containers/food/snacks/S in T.contents) - if(iscompartmentfull(user)) - break - if(!S.junkiness) - SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src, TRUE) - food_load(S) - loaded++ - else - denied_items++ - if(denied_items) - to_chat(user, "[src] refuses some items.") - if(loaded) - to_chat(user, "You insert [loaded] dishes into [src]'s chef compartment.") - updateUsrDialog() - return - - else - return ..() +/obj/machinery/vending/snack/canLoadItem(obj/item/I,mob/user) + . = FALSE + if(istype(I,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/snacki = I + if(snacki.junkiness) + return FALSE + return TRUE /obj/machinery/vending/snack/Destroy() for(var/obj/item/reagent_containers/food/snacks/S in contents) S.forceMove(get_turf(src)) return ..() -/obj/machinery/vending/snack/proc/compartment_access_check(user) - req_access_txt = chef_compartment_access - if(!allowed(user) && !(obj_flags & EMAGGED) && scan_id) - to_chat(user, "[src]'s chef compartment blinks red: Access denied.") - req_access_txt = "0" - return 0 - req_access_txt = "0" - return 1 - -/obj/machinery/vending/snack/proc/iscompartmentfull(mob/user) - if(contents.len >= 30) // no more than 30 dishes can fit inside - to_chat(user, "[src]'s chef compartment is full.") - return 1 - return 0 - /obj/machinery/vending/snack/proc/food_load(obj/item/reagent_containers/food/snacks/S) - if(dish_quants[S.name]) - dish_quants[S.name]++ + if(vending_machine_input[S.name]) + vending_machine_input[S.name]++ else - dish_quants[S.name] = 1 - sortList(dish_quants) + vending_machine_input[S.name] = 1 + sortList(vending_machine_input) /obj/machinery/vending/snack/random name = "\improper Random Snackies" diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index b81a4582455..45b380fbf6c 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -5,6 +5,10 @@ default_price = 50 extra_price = 75 payment_department = NO_FREEBIES + input_display_header = "Returned Clothing" + +/obj/machinery/vending/wardrobe/canLoadItem(obj/item/I,mob/user) + return (I.type in products) /obj/machinery/vending/wardrobe/sec_wardrobe name = "\improper SecDrobe" @@ -320,7 +324,7 @@ /obj/item/toy/plush/narplush = 1, /obj/item/clothing/head/medievaljewhat = 3, /obj/item/clothing/suit/chaplainsuit/clownpriest = 1, - /obj/item/clothing/head/clownmitre = 1) + /obj/item/clothing/head/clownmitre = 1) premium = list(/obj/item/clothing/suit/chaplainsuit/bishoprobe = 1, /obj/item/clothing/head/bishopmitre = 1) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe diff --git a/config/config.txt b/config/config.txt index 96e89532c4f..83265ddba2e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -485,8 +485,14 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 #ROUNDS_UNTIL_HARD_RESTART 10 -##Default screen resolution, in tiles. -## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. -## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. +##Default view size, in tiles. +## By default, this is 15x15, which gets simplified to 7 by byond +## 15x15 would be the standard square view. 21x15 is what goonstation uses for widescreen. +## Setting this to something different from DEFAULT_VIEW_SQUARE will enable widescreen toggles ## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. DEFAULT_VIEW 15x15 + +##Default view size, in tiles. Should *always* be square. +## The alternative square viewport size if you're using a widescreen view size +## You probably shouldn't ever be changing this, but it's here if you want to. +DEFAULT_VIEW_SQUARE 15x15 diff --git a/html/browser/roundend.css b/html/browser/roundend.css index 865b42999e9..2558d97ad62 100644 --- a/html/browser/roundend.css +++ b/html/browser/roundend.css @@ -10,9 +10,15 @@ color: #ef2f3c; font-weight: bold; } + +.bluetext { + color: #517fff; + font-weight: bold; +} + .neutraltext { font-weight: bold; /* If you feel these should have some color feel free to change */ -} +} .marooned { color: rgb(109, 109, 255); font-weight: bold; @@ -89,4 +95,4 @@ body { .tooltip_container:hover .tooltip_hover { visibility: visible; -} \ No newline at end of file +} diff --git a/html/changelog.html b/html/changelog.html index ce709181afc..3228aece8f8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,431 @@ -->
+

01 June 2019

+

AffectedArc07 updated:

+
    +
  • The taskbar icon for the game is now the TG logo
  • +
+

Akrilla updated:

+
    +
  • Fixes the examine text on jackboots/winter boots to properly show what items can be stored inside.
  • +
  • Can now, as originally intended, store a Luchador mask inside the champion belt.
  • +
  • Work on storage code.
  • +
+

Ghommie updated:

+
    +
  • Fixes splashed cooking oil bypassing any sort of mob impermeability. Also cut off message/sound spam from being repeatedly splashed within a minimal delay.
  • +
  • Upped the cooking oil damage cap from 35 to 38 to account the mild bio protection of the average crewmember's attire. Also made hot deep fryer swirlies account the user's head covering gear's impermeability.
  • +
  • Standarized monkeys/humans get_permeability_coefficient().
  • +
+

Naksu updated:

+
    +
  • reagent IDs have been removed in favor using reagent typepaths where applicable
  • +
  • mechas, borg hyposprays etc no longer display internal reagent ids to the player
  • +
+

Rockdtben updated:

+
    +
  • Security can now print out Missing Persons Posters
  • +
+

Skoglol updated:

+
    +
  • Moved machine and computer frames below objects, parts are now always on top.
  • +
  • Moved structures (chairs, closets, windows, cult altars etc etc) below objects.
  • +
  • Moves mineral doors to airlock layers
  • +
+

weeeeesoda updated:

+
    +
  • You can now purify soulstones! This can be done by any crew member using a bible on one.
  • +
  • Purified constructs can be created by using a purifed soulstone on a construct shell. Amongst their normal abilities, purified constructs can dispel cult runes by clicking on them.
  • +
  • Ability to place chaplains soulstone or mining soulstones in construct shells
  • +
  • angelplasm, angelic sprites, purifed sprites
  • +
+

zxaber updated:

+
    +
  • Linen bins can now be (un)achored with a wrench, or disassembled with a screwdriver (when empty).
  • +
  • You can now make linen bins using two rods.
  • +
+ +

31 May 2019

+

Ghommie updated:

+
    +
  • Merged tinfoil hat kind of protection into the anti_magic component.
  • +
  • Tinfoil hats can also be warped up from excessive dampening of mindray/though control/psicotronic anomalies, or by simply being microwaved in an oven, and become useless.
  • +
  • Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil protection too (minus the paranoia and limited charges).
  • +
  • Rebalanced many hivemind effects to be dampened/delayed by tinfoil shielding. Bruteforced Assimilate Vessel, One mind and Awake Vessel abilities will consume more tinfoil charges compared to others.
  • +
  • Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil protection.
  • +
+

Sirich96 updated:

+
    +
  • Added new Teleporter Station sprites
  • +
+

Skoglol updated:

+
    +
  • Ghost darkness now starts at night vision level by default.
  • +
  • Ghost hud on by default.
  • +
+

Time-Green updated:

+
    +
  • The genetic sequencer has been reworked. Use it in-hand to view the sequence
  • +
+

Tlaltecuhtli updated:

+
    +
  • cargo ripley can be actually constructed with what you get from the crate
  • +
  • adds the right crate type to monkey cube and hydroponics refill crates
  • +
  • readds the bulk wt550 ammo crate
  • +
  • conveyor belt crate has 15 instead of 6 belts
  • +
  • adds a laser pointer to the bureaucracy crate
  • +
  • changes med supply crate to have rng medical things
  • +
  • fixes a missing vendor board option
  • +
+

nemvar updated:

+
    +
  • Charged oil explosions now look less stupid and are slightly weaker.
  • +
  • Reworked burning oil. It no longer destroys nearby turfs but still damages mobs.
  • +
+

wesoda123555 updated:

+
    +
  • physically obstructive quirk
  • +
+ +

30 May 2019

+

Akrilla updated:

+
    +
  • Fedoras/taqiyahs fit pocket sized items. Fedoras can also store the tommy gun and katana.
  • +
+

Barhandar updated:

+
    +
  • Box's solar panels are no longer missing catwalks from the middle of arrays.
  • +
  • Box's engineering and laundromat now have showers.
  • +
+

Naksu updated:

+
    +
  • /client/mousemove has been removed.
  • +
  • the aiming beam of a beam rifle is only shown with the mouse button held down
  • +
+

Rockdtben updated:

+
    +
  • Med Record, Sec Record, and Detective Scanner printed papers use paper_words icon state
  • +
  • Forensic Scanner documents are numbered now.
  • +
  • Forensic Scanner document titles modified
  • +
+

Ty-the-Smonk updated:

+
    +
  • Descriptions for every crossbreed's effect (minus recurring because its self explanatory).
  • +
  • Changes a single comment in _corecross to reflect how many extracts are needed to crossbreed.
  • +
+

Yenwodyah updated:

+
    +
  • Non-antags can now forge all agent IDs if they find them before they've been forged.
  • +
+

bgobandit updated:

+
    +
  • Nanotrasen has cracked the code of the Syndicate storage implant. Removing the implant will also drop any items contained within, doing minor damage to the person implanted.
  • +
  • Cards Against Spess works again. Find decks at your local library.
  • +
+

nemvar updated:

+
    +
  • Pneumatic cannons are now bulky.
  • +
+

py01 updated:

+
    +
  • Medulary Failure takes 3 seconds to cast now.
  • +
  • Some hivemind abilities have new icons.
  • +
+ +

27 May 2019

+

4dplanner updated:

+
    +
  • The deja vu effect (previously only used by rewind camera) now resets all your limbs and damage to the point it was added after 10 seconds (as well as the original position reset)
  • +
  • The deja vu effect cannot resurrect the dead, but will heal their corpse
  • +
  • New limbs fall off, old ones re-attach
  • +
  • Regenerative sepia cores add a deja vu effect before healing instead of a timestop
  • +
  • The rewind camera rewinds 2 times to distinguish it from the regenerative core
  • +
  • colossus and drake can no longer attack from the afterlife
  • +
  • timestop is properly defeated by antimagic.
  • +
  • timestop only checks antimagic once
  • +
+

Akrilla updated:

+
    +
  • Traitors now recognize codewords automatically in spoken conversation. Phrases in blue, responses in red.
  • +
  • Changed traitor greet text slightly.
  • +
+

ExcessiveUseOfVending updated:

+
    +
  • Wardrobe Vendors will now accept clothing types they sell. Now you can clean up after getting that cool alternate uniform!
  • +
  • see PR #43964 on how to easily setup a vending machine to accept items!
  • +
+

Farquaar updated:

+
    +
  • The monk's frock has been sanctified and will no longer reveal your naked body when the hood is pulled up.
  • +
+

Fire Chance updated:

+
    +
  • Fixed the drink sprites overlapping when you are mixing beer with other drinks.
  • +
+

Garen7 updated:

+
    +
  • Lesser form lings can now toggle augmented vision
  • +
  • You can no longer turn back into human form as a lesser form ling while ventcrawling
  • +
  • Stuns and Reagents are now passed when transforming into a monkey or human
  • +
+

Irafas updated:

+
    +
  • Connected the incinerator/janitor's/botany backroom/service rooms to the scrubber network
  • +
+

JJRcop updated:

+
    +
  • You can now build a new PDA messaging server if you lose it.
  • +
  • Requests console messages no longer work if the messaging server is offline. Emergency alerts will still function in that case as long as the rest of telecomms is online.
  • +
+

Naksu updated:

+
    +
  • pipeline gas reconciliation is now faster
  • +
+

OnlineGirlfriend updated:

+
    +
  • Lemonade
  • +
  • Arnold Palmer recipe
  • +
  • lemonade sprite
  • +
+

Putnam3145 updated:

+
    +
  • All departments can now print basic power cells from their respective techfab.
  • +
+

RaveRadbury updated:

+
    +
  • Quirks have flavor text in medical records
  • +
  • All quirks have medical record entries
  • +
  • All quirk medical records refer to "Patient", removing a few instances of "Subject"
  • +
+

Tlaltecuhtli updated:

+
    +
  • fixes message spam from riding a vehicle without enough legs/arms
  • +
+

XDTM updated:

+
    +
  • Added a new device, the nanite communication remote, which can be used to send custom messages to message-based nanite programs.
  • +
  • Comm remotes use separate Comm Codes: for a message to be received, the signal's comm code must be the same as the program's.
  • +
+

actioninja updated:

+
    +
  • Shuttle sounds should no longer ass blast your ears as they no longer play PER DOOR and instead from the nearest engine, or door if none are available.
  • +
  • Distant shuttle sounds.
  • +
+

bgobandit updated:

+
    +
  • TP now shows the names of blood brothers' brothers.
  • +
+

hey there uwu updated:

+
    +
  • You can no longer choose the zombie race from the magic mirror, as intended.
  • +
+

nemvar updated:

+
    +
  • Colored lights now shine in different colours.
  • +
  • Mops can now be printed at the autolathe and protolathe.
  • +
+

tralezab updated:

+
    +
  • Gravitokinetic stands are now available!
  • +
+ +

23 May 2019

+

4dplanner updated:

+
    +
  • between the sheets heals carbons
  • +
  • colossus chest is intangible to colossus bolts
  • +
+

Naksu updated:

+
    +
  • removed some unnecessary wrappers in Life() code.
  • +
  • get_area() is now a define rather than a proc.
  • +
+

TheSilverNuke updated:

+
    +
  • edaggers have a special suicide!
  • +
+

nemvar updated:

+
    +
  • You can now reuse chemical grenade casings if they fail to react.
  • +
+

ninjanomnom updated:

+
    +
  • Some rpg affixes now have special effects
  • +
+

weeweesoda updated:

+
    +
  • The CRAB protocol traitor item now has a maximum stock of 1 each round
  • +
+ +

22 May 2019

+

Incoming5643 updated:

+
    +
  • After a very long period of being broken, the training bomb in security finally works properly again.
  • +
  • Syndicate bomb cores have become a little more robust in their operation. Defused but still cored bombs are no longer inert and can be set again. Would be heroes are advised to cut out and dispose of bomb cores, and dismantle unneeded bomb shells to be absolutely sure.
  • +
+

MrFluffster updated:

+
    +
  • CLOTH foodtype
  • +
+

Naksu updated:

+
    +
  • Added a new blob strain that grows inside the station and eats garbage
  • +
  • Several fixes for stuff harddeling
  • +
  • Cryotubes no longer display a double of a person that was once in but teleported out by having ingested bluespace or other such nonsense
  • +
  • pda.detonatable and uplink component checks removed in favor of a signal in detomatix cart handling
  • +
  • nukeop uplinks now have 5 unlimited discounts and 10 limited discounts shared between the team, rather than 3 individual discounts like traitor uplinks
  • +
  • corpses no longer feel, light-headed or otherwise
  • +
  • removed /datum/mutation/human/proc/on_move in favor of having the chameleon mutation register for a signal
  • +
+

RaveRadbury updated:

+
    +
  • "Religiously Comforted" from Spiritual Quirk occurs on examine and lasts for 5 minutes
  • +
+

kriskog updated:

+
    +
  • Added a bunch of previously missing adjacency checks to ui window actions and alt clicks.
  • +
+

loserXD updated:

+
    +
  • Hangar Bay Shutters need only general CentCom access to open now
  • +
+

nemvar updated:

+
    +
  • Podcloning now lets you keep your quirks.
  • +
+

vuonojenmustaturska updated:

+
    +
  • Removed the ability of fat people to vore monkeys, and the ability of aliens to vore humans.
  • +
  • Removed stubbed out would-be functionality related to stomach contents
  • +
  • Nuclear Operative reinforcements now get uplinks with 0 TC and a real name.
  • +
+ +

19 May 2019

+

CrazyClown12 updated:

+
    +
  • The chloral hydrate inside of the sleepy pen is no longer slower acting than chloral hydrate made in chemistry.
  • +
  • The chloral hydrate inside of cookies synthesised by emagged borgs is no longer slower acting than chloral hydrate made in chemistry.
  • +
  • Delayed chloral hydrate
  • +
+

Erwgd updated:

+
    +
  • Swapped out an epinephrine bottle for potassium iodide in NanoMed Plus vending machines.
  • +
+

Naksu updated:

+
    +
  • Items using atom colors for coloring now show up properly colored in vending machines, rather than snow-white
  • +
+

Partheo updated:

+
    +
  • Scrubbers have updated design and animation
  • +
+

Rave Radbury, Art by Navi.OS updated:

+
    +
  • pAI's have a bunch of HUD stuff now
  • +
  • pAI's now have an AI style PDA
  • +
  • pAI cameras can now download a zoom feature! Bigger and smaller pictures!
  • +
  • Split the pAI medhud module into seperate medhud and health analyzer modules
  • +
  • Journalism modules now have RAM costs
  • +
  • RAM prices have changed on a number of modules
  • +
  • added more pAI HUD icons
  • +
+

Zxaber updated:

+
    +
  • AI power backup is now separate from the health, and is tied to their core. Carding an AI on battery backup will leave the core at partial charge. AIs no longer slowly lose integrity while on backups (but will instantly die as before once the backup runs out). As such, whacking an AI with a wrench will no longer magically lower their backup battery capacity.
  • +
  • AIs on backup battery can now unbolt at the cost of a quarter of their battery's max charge. This cannot be done while at under 25% power.
  • +
+

imsxz updated:

+
    +
  • cakehat has been nerfed
  • +
  • cakehat sounds cooler
  • +
+ +

17 May 2019

+

4dplanner updated:

+
    +
  • health hud will no longer show full health at 0 hp
  • +
  • glass golems properly redirect projectiles
  • +
  • glass golem reflected projectiles can damage the original firer
  • +
+

ExcessiveUseOfCobblestone updated:

+
    +
  • borgs can now unbuckle people from stasis beds
  • +
+

Garen7 updated:

+
    +
  • fixes lings being able to infinitely use their strained muscles
  • +
+

Naksu updated:

+
    +
  • The crabphone will no longer deafen everyone who didn't have the foreknowledge that it was coming.
  • +
  • The crabphone has 80% less HP, as befits something that costs 7 TC and is not two bubblegums stacked on top of eachother.
  • +
  • Nuclear operative TC now comes pre-distributed, the telecrystal assignment stations have been removed.
  • +
  • mindshield nanites no longer give mindshields to revheads and one mind awoken hiveminds.
  • +
  • Fixed several issues with venus human traps and their vines going through walls
  • +
  • Made atmos update_visuals() proc a bit faster
  • +
+

jegub updated:

+
    +
  • Lets the grass grow under your feet.
  • +
+

nemvar updated:

+
    +
  • Explosive holoparasite bombs now explode if you bump into them, instead of the other way around.
  • +
+

pireamaineach updated:

+
    +
  • Added a 3rd atmos tech locker and rad locker to the incinerators on Meta and Box, and an atmos tech locker to the incinerator on Pubby since it already had a rad-suit.
  • +
  • Reverts https://github.com/tgstation/tgstation/pull/43557
  • +
  • Makes the doors to the incinerator on meta require atmos access.
  • +
  • Axes some hairstyles that didn't make the final cut but never got fully removed, removes an unused sprite.
  • +
  • Also fixes the cornrows because they were bRoek
  • +
+

zeroisthebiggay updated:

+
    +
  • Gives Sentient Diseases a medical hud to observe their victims further with.
  • +
+ +

14 May 2019

+

Flatgub updated:

+
    +
  • Added RCL wiring menu
  • +
  • RCL change cable colour button now applies changes immediately
  • +
+

Krysonism updated:

+
    +
  • 8 new alcoholic drinks.
  • +
  • 2 new nonalcoholic drinks.
  • +
  • Packs of a novel artificial sweetener have been added to the kitchen vendor.
  • +
  • Bottles of trappist beer are now available at a premium price in the booze-o-mat.
  • +
  • Juicing parsnips now yields parsnip juice. add; Maintenance peaches.
  • +
  • Removed champagne from the booze dispenser.
  • +
  • Now everyone has to pay 200 credits if they want champagne from the booze-o-mat.
  • +
  • Grape soda now cools you down like other sodas.
  • +
  • Added new drink, bottle, vomit and peach can sprites.
  • +
+

MrFluffster updated:

+
    +
  • An extra tile to the Box chapel's width
  • +
  • One barely noticeable tile of width from escape(one escape brig chair dead [*] )
  • +
+

RaveRadbury updated:

+
    +
  • mood_event timeouts are now in MINUTES and SECONDS
  • +
+

Skoglol updated:

+
    +
  • You no longer get shocked by shock touching someone you are pulling.
  • +
+

WJohnston updated:

+
    +
  • New boxstation mining shuttle! It paves the way for little pod-like shuttles needing to return home where they can charge, though this needs to be expanded to other shuttles as well.
  • +
+

anconfuzedrock updated:

+
    +
  • Cargo can now order a ridiculously large canister containing only saline to give medbay a more than plentiful supply of the stuff.
  • +
+

13 May 2019

Farquaar updated:

    @@ -621,517 +1046,6 @@
    • Firefighter construction text is no longer off by a step.
    - -

    30 March 2019

    -

    FloranOtten updated:

    -
      -
    • Added the Pod Shuttle
    • -
    -

    ShizCalev updated:

    -
      -
    • Moved mapping related errors to their own log file.
    • -
    -

    Vile Beggar updated:

    -
      -
    • You no longer have to take off your clown/mime mask to shower properly.
    • -
    - -

    29 March 2019

    -

    81Denton updated:

    -
      -
    • Fixed a bug that prevented strange reagent from reacting with hydroponics trays. Use with care!
    • -
    -

    SpaceManiac updated:

    -
      -
    • If an admin sends a ghost back to the lobby, they can now choose a different set of quirks.
    • -
    • The code to handle buckling latejoin players to chairs has been made more flexible.
    • -
    -

    Spyro Zeppeli updated:

    -
      -
    • Changes ethereal low charge damage from brute to toxin
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • fixes exploit with holopets
    • -
    -

    Zxaber updated:

    -
      -
    • AIs can now use CTRL and a number key (1 - 9) to assign a location to the number key, and then press the key later to jump their camera to that location. The numpad keys will work as aliases for their respective numbers.
    • -
    • The Tilde key, or zero (or numpad zero), will return you to the last point you jumped from.
    • -
    - -

    28 March 2019

    -

    AnturK updated:

    -
      -
    • Spraypainting blast doors no longer makes them see-through.
    • -
    • Paint remover now works on blast doors and the like.
    • -
    -

    Fox McCloud updated:

    -
      -
    • Fixes a very longstanding LINDA bug where turfs adjacent to a hotspot would be less prone to igniting
    • -
    -

    PKPenguin321 updated:

    -
      -
    • Keep your eye out for a rare new arcade game!
    • -
    • X-Ray vision can no longer be obtained via a random gene sequence at roundstart.
    • -
    • X-Ray now has 35 instability, up from 25.
    • -
    • A new gene, thermal vision, has been added to genetics.
    • -
    • You can create X-Ray vision by mixing Thermal Vision and Radioactive together.
    • -
    -

    ShizCalev updated:

    -
      -
    • Corrected cloning logs not showing the clone's key if they ghosted during processing.
    • -
    -

    SpaceManiac updated:

    -
      -
    • The death icon for the "banned" AI core choice will now show properly.
    • -
    -

    SuicidalPickles updated:

    -
      -
    • Medical Winter Coats can now equip Handheld Crew Monitors in their suit storage slot.
    • -
    -

    Vile Beggar updated:

    -
      -
    • Wearing the CE jumpsuit along with the advanced hardsuit will now fully protect you from radiation, as intended.
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • Gave the Service Cyborg a Synthesizer! Try not to destroy the Human populace's weak organic eardrums with it.
    • -
    • Service Cyborgs have lost their Violin to compensate for this. Your bashing in of heads with the Guitar will remain unimpeded however.
    • -
    - -

    27 March 2019

    -

    4dplanner updated:

    -
      -
    • Humans can no longer use UIs while incapacitated
    • -
    • stabilised sepia slime randomly changes your speed as intended
    • -
    -

    81Denton updated:

    -
      -
    • Rolling a 17 on the d20 of fate no longer gives you an empty box.
    • -
    -

    Basilman updated:

    -
      -
    • fixed runtime from selectin missing bodypart due to ran_zone
    • -
    • changed how ran_zone selects a zone from a switch to pickweight
    • -
    -

    Kierany9 updated:

    -
      -
    • Added a 15 second grace period after death to prevent people from avoiding a hivemind host's Reclaim by succumbing.
    • -
    -

    Lett1 updated:

    -
      -
    • Added a new holodeck program: Photobooth
    • -
    • Comes with three cameras and black and white floors, a dresser and a mirror.
    • -
    -

    Menshin updated:

    -
      -
    • Janitor ERT leader now spawns properly equipped
    • -
    -

    ShizCalev updated:

    -
      -
    • Fixed a runtime that resulted in the character preview messing up if you were set to a non-human species while having a command level position set to high when enforce human authority is enabled.
    • -
    • Examining a recharger will now tell you the amount of charge the inserted device has.
    • -
    • Pulling someone while they're buckled to a chair will no longer offset them and make them face you.
    • -
    • Buckling someone in while they're being pulled will now properly reset their offsets.
    • -
    • Pulling offsets will now update properly while dragging someone who's laying down.
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • beepsky smash now summons imaginary beepskys that deal stamina damage instead of outright stunning
    • -
    -

    py01 updated:

    -
      -
    • -Mechs no longer explode on death -Mechs and syndicate combat mechs sleep the pilot for 2s when destroyed, other combat mechs for 4s. -Mechs now have exit times. 1s for basic ripley, 2s for other mechs, 4s for all combat mechs. You cannot punch or use equipment when exiting, and moving cancels.
    • -
    - -

    25 March 2019

    -

    ShizCalev updated:

    -
      -
    • Added a chair to pubby's cloning room.
    • -
    • Fixed a minor runtime caused by admins clicking a follow link while in the lobby.
    • -
    -

    actioninja updated:

    -
      -
    • Lot of small darkmode fixes
    • -
    - -

    24 March 2019

    -

    Mickyan updated:

    -
      -
    • Strong alcoholic beverages in excessive quantity are now far more dangerous. Drink responsibly.
    • -
    - -

    23 March 2019

    -

    Borisvanmemes updated:

    -
      -
    • ED 209s now drop DRAGNets and not tasers
    • -
    -

    MrStonedOne updated:

    -
      -
    • Fixed the connection cap being silly about what connections it counted towards the limit.
    • -
    -

    SpaceManiac updated:

    -
      -
    • Heirloom bodybags no longer lose their heirloom status when deployed.
    • -
    -

    actioninja updated:

    -
      -
    • Goonchat properly loads the white theme by default.
    • -
    • The input bar no longer has weirdness with color when swapping themes.
    • -
    - -

    22 March 2019

    -

    Atlanta Ned updated:

    -
      -
    • If you've got Head of Staff access, you can now message Central Command. Central Command is not responsible for any executions sustained as a result of mutinous behavior.
    • -
    -

    Fikou updated:

    -
      -
    • added an ezmk pulse rifle to the seraph mech
    • -
    • removed the buckshot gun from the seraph mech
    • -
    -

    MMMiracles updated:

    -
      -
    • The engine on Donutstation has been changed to the Supermatter.
    • -
    -

    MrStonedOne updated:

    -
      -
    • Exempted byond accounts already in the round from the connected players cap, allowing them to reconnect even if the server is full. This exemption applies even if you are dead or are a ghost, but does not apply if you hit "observe" from the lobby.
    • -
    -

    ShizCalev updated:

    -
      -
    • ED-209 tablecrafting recipe has been corrected to use a DRAGNet
    • -
    • Fixed an exploit allowing you to grab people from anywhere with a clowncar.
    • -
    • Simple mobs can now only damage clown cars from the inside if they're able to smash through walls.
    • -
    • Mech disablers are no longer invisible.
    • -
    • Improved some cloning logging.
    • -
    • Emagging a cloning pod will now leave fingerprints.
    • -
    • Ejecting someone while they're being cloned will now leave fingerprints.
    • -
    -

    SpaceManiac updated:

    -
      -
    • Logs for certain kinds of errors will now include better debugging information.
    • -
    • Renamed the "any color" paint bucket to "adaptive paint".
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • ai/borg uploads now have a gps signal when built which will be active until its monitor gets decostructed
    • -
    • ai/borg uploads take slighty longer to deconstruct
    • -
    -

    anconfuzedrock updated:

    -
      -
    • New negative quirk - back pain causes very bad mood from wearing uneven storage items on your back, but other back items like air tanks and shotguns are okay.
    • -
    -

    plapatin updated:

    -
      -
    • Watch the Tip of the Round messages, there's a few extra ones out there now, along with outdated ones being revised!
    • -
    - -

    21 March 2019

    -

    Militaires updated:

    -
      -
    • Snails now utilize glasses offset system
    • -
    -

    ShizCalev updated:

    -
      -
    • Repairing robotic limbs attached to yourself will no longer refer to you in the third person.
    • -
    • You'll no longer hit an air alarm with your ID when unlocking it.
    • -
    • Admin modify bodyparts panel will now only show parts that are valid for modification.
    • -
    -

    SpironoZeppeli updated:

    -
      -
    • Ethereals no longer die to their own charge levels
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • the medkits in the beach dome, city of clog and russian shuttle are no longer empty
    • -
    -

    actioninja updated:

    -
      -
    • admin pms display in the proper colors
    • -
    • some uis are no longer unreadable.
    • -
    • Updated the colors of the dark mode ui.
    • -
    • darkmode is no longer the default
    • -
    - -

    20 March 2019

    -

    Basilman updated:

    -
      -
    • Chaplain's holy whip now deals more damage to vampires.
    • -
    • Fixed adminheal not curing various status effects
    • -
    • Fixed certain alien organs (eyes, tongue, liver) not registering for organ bounty.
    • -
    -

    Kmc2000 updated:

    -
      -
    • Added darkmode! You can opt-in to this by clicking the settings icon on goonchat, and looking for the toggle darkmode button.
    • -
    -

    Militaires updated:

    -
      -
    • Fixed cursed hearts maintaining red filter even when removed
    • -
    -

    MrStonedOne updated:

    -
      -
    • afk kicker no longer exempts ghosts
    • -
    • afk kicker now exempts people in the lobby join queue
    • -
    • afk kicker now exempts admins
    • -
    • afk kicker now includes a link you can use rejoin quickly.
    • -
    • (Note: these all apply to the default disabled idle time kicker, not the end of round lobby kicker)
    • -
    -

    PKPenguin321 updated:

    -
      -
    • Spasms should no longer cause you to step out of closed chambers, like cryo or DNA scanners.
    • -
    -

    Pandolphina updated:

    -
      -
    • Miniature energy guns can fit in the holster
    • -
    -

    ShizCalev updated:

    -
      -
    • Added DRAGnet crates to cargonia.
    • -
    • Fixed runtime when shooting podpeople with a alpha somatoray
    • -
    • Floorbots can now be constructed with normal toolboxes.
    • -
    -

    SpaceManiac updated:

    -
      -
    • Random docking ports (escape pod Lavaland destinations) print a more informative warning and delete themselves if Lavaland does not exist.
    • -
    -

    Time-Green updated:

    -
      -
    • Snails can't wear glasses
    • -
    • Snails don't lube the floor when buckled anymore
    • -
    -

    Tlaltecuhtli updated:

    -
      -
    • the eva suit crate now will have 1 space suit and 1 jetpack
    • -
    • the miner starter kit will be the same as the ones miners can buy grammar: changed the description of the medical refill crate to represent whats inside
    • -
    -

    YPOQ updated:

    -
      -
    • Fixed a bug that caused limbs to take incorrect damage amounts when damage exceeded the limb's damage cap
    • -
    -

    kevinz000 updated:

    -
      -
    • Panic bunker block message is now a config.
    • -
    -

    nichlas0010 updated:

    -
      -
    • The malf AI's APC-hacking is now no longer audible to people outside of the AI's location.
    • -
    - -

    19 March 2019

    -

    81Denton updated:

    -
      -
    • Curators no longer lose access to the aux base and mining station EVA during skeleton shifts.
    • -
    -

    Farquaar updated:

    -
      -
    • Added several new religions to the Nanotrasen-approved faith list, including Judaism, Rastafarianism, and Honkism
    • -
    -

    MrDoomBringer updated:

    -
      -
    • Gondolapods work again
    • -
    • the see-through pod effect for centcom podlaunchers works again
    • -
    • the Stealth effect for centcom podlaunchers works again
    • -
    • sparks will not generate if the quietLanding effect is on, for the centcom podlauncher
    • -
    • makes input text clearer for the centcom podlauncher
    • -
    -

    ShizCalev updated:

    -
      -
    • Added DRAGnet's to the armory on Delta & Pubby.
    • -
    • Added logging to cloning machinery.
    • -
    • Fixed a runtime with wabbajack / bolt of change causing the person that was hit to go invisible and be unable to do anything.
    • -
    • Fixed carbons with no eyes having a flash overlay applied when they're flashed.
    • -
    • Fixed species with no eyes getting flashed.
    • -
    -

    Time-Green updated:

    -
      -
    • Adds tools to make mutations transfer through cloning
    • -
    -

    Vile Beggar updated:

    -
      -
    • Mechs can now be equipped with disablers.
    • -
    - -

    18 March 2019

    -

    4dplanner updated:

    -
      -
    • chemical scans actually display to 3 dp, sorry
    • -
    - -

    17 March 2019

    -

    4dplanner updated:

    -
      -
    • Buckle objects can now properly specify lying angle
    • -
    • Wheelchairs and other such vehicles let you use UIs even if your legs don't work
    • -
    • You can now pull objects while in a wheelchair even if your legs don't work
    • -
    • You no longer have a chance of sleeping upside down in a bed
    • -
    • No longer randomises lying direction a second time on fall
    • -
    -

    Nervere updated:

    -
      -
    • Fixed stunbatons being invisible.
    • -
    -

    ShizCalev updated:

    -
      -
    • Blind people will no longer be able to see pills being slipped into their drinks...........
    • -
    • Fixed an issue causing slippery oil to be noninteractive.
    • -
    • Motor oil can now catch on fire. Better do your job, janitor!
    • -
    • Cleaned up some crayon and spraycan code for futureproofing.
    • -
    -

    WJohnston, Antur, and Arcane updated:

    -
      -
    • THE GOOSE IS LOOSE
    • -
    - -

    15 March 2019

    -

    4dplanner updated:

    -
      -
    • liver purging is more consistent
    • -
    • chemical recipes are more consistent
    • -
    • chemical scans only show to 2 d.p
    • -
    -

    Dennok updated:

    -
      -
    • Turbines work again.
    • -
    -

    Denton updated:

    -
      -
    • Clarified Syndicate ghost role flavor text to mention that agents are not supposed to abandon their bases.
    • -
    • Rolling a 1 with the d20 of fate prevents you from being revived by any means.
    • -
    -

    Lett1 updated:

    -
      -
    • firebots now shop up on robotics pda's
    • -
    -

    ShizCalev updated:

    -
      -
    • Pacifists can now use wormhole projectors.
    • -
    -

    SpaceManiac updated:

    -
      -
    • pAIs are no longer immune to stamina damage.
    • -
    • Fixed a runtime when an AI core witnesses someone exit a cardboard box.
    • -
    • Fixed a runtime when attempting to blind a True Devil with a flashlight.
    • -
    • The implant chair no longer runtimes when implanting non-implant organs.
    • -
    -

    cacogen updated:

    -
      -
    • Makes stun baton two words
    • -
    -

    plapatin updated:

    -
      -
    • Added a big heap of fancy new clown names! Be slightly less generic!
    • -
    - -

    14 March 2019

    -

    4dplanner updated:

    -
      -
    • sepia slime extract has a delay before activating
    • -
    • the user of a sepia slime extract is no longer immune to the time field
    • -
    • chilling sepia is now the support extract - it always freezes the user, but not other marked people
    • -
    • give one to your golem!
    • -
    • burning sepia spawns the rewind camera. Take a selfie with someone and give it to them to make sure they remember the moment forever!
    • -
    • you don't actually need to give them the photo, they'll remember anyway. Keep it as a reminder.
    • -
    • rewinding resets your location to the turf you were on after 10 seconds, and heals simple animals and objects. remove: timefreeze camera is admin spawn only.
    • -
    • recurring sepia recalls to the hand of the last person to touch it after activating. Reusable timestop grenades!
    • -
    • some special cameras don't prompt for customisation
    • -
    • timefreeze camera actually makes a photo
    • -
    • timestop stops pathing
    • -
    • timestop stops mechs
    • -
    • adds a check to make sure simple_animals don't get their AI toggled while sentient
    • -
    • Adds the timestop overlay to frozen projectiles
    • -
    • Timestopped things have INFINITY move_resist as opposed to being anchored
    • -
    • Timestop will now unfreeze things that somehow leave it
    • -
    • mobs in the middle of a walk_to will have their walk stopped by timestop
    • -
    • mobs that are stunned will be stopped mid walk as well
    • -
    • Slimes respect mobility_flags & MOBILITY_MOVE
    • -
    • Slimes no longer automatically regain MOBILITY_MOVE whenever not cold
    • -
    • pulling respects changes in move_force
    • -
    • swapping places respects move_force if the participant is not willing
    • -
    -

    BuffEngineering updated:

    -
      -
    • You may no longer summon plasteel from the door dimension.
    • -
    • High security airlocks are now 33% more materially efficient!
    • -
    • Boomers may now sip in peace knowing their cloning based longevity is not at risk.
    • -
    -

    Caiggas updated:

    -
      -
    • Fixed jump-boots breaking after colliding with things at close range.
    • -
    -

    Carbonhell updated:

    -
      -
    • youtube-dl works again for linux based servers
    • -
    -

    Ghommie updated:

    -
      -
    • Adds two cartons of space milks to the skellies pirate cutter's fridge.
    • -
    -

    JJRcop updated:

    -
      -
    • Play Internet Sound now respects start (like &t=xxx or &start=xxx) and end times (like &end=xxx). This allows admins to choose a snippet of media to play, like for example pick a song out of an hour long album compilation.
    • -
    -

    Kierany9 updated:

    -
      -
    • Fixed Hivemind Hosts retaining powers on death and while dead
    • -
    -

    Menshin updated:

    -
      -
    • engineering APCs shouldn't be reset on Grid Check event anymore.
    • -
    -

    ShizCalev updated:

    -
      -
    • Corrected a minor issue where the regenerative core would trigger at -1 HP instead of at 0HP.
    • -
    • Sentient firebots can now use their fire extinguishers.
    • -
    • Fixed hacked firebots not resetting after being reset....
    • -
    • Revolvers will no longer immediately click when trying to suicide while on an empty chamber.
    • -
    • Cult magic inhands now work again... for real this time.
    • -
    -

    SpaceManiac updated:

    -
      -
    • The wizard hardsuit now correctly grants magic resistance.
    • -
    • Cow tipping now properly stuns the cow.
    • -
    • Suiciding with the infernal contract now properly causes the victim to yell out.
    • -
    • Accessing the notes panel within the first few seconds of connecting no longer risks broken styling.
    • -
    -

    TerraGS updated:

    -
      -
    • Curing advanced voice change virus symptoms no longer leaves you unable to speak
    • -
    -

    Unit2E updated:

    -
      -
    • people in fire resistant now get properly hot in fires they shouldn't resist (temps of 35000K and over)
    • -
    -

    actioninja updated:

    -
      -
    • Fixed a few mapping issues with the Supermatter on Pubbystation
    • -
    • The ID console in the HoP's office on Meta has been rotated to face toward the HoP when they're at their desk
    • -
    -

    dvanbale updated:

    -
      -
    • Removes dizziness when adminhealing
    • -
    -

    imsxz updated:

    -
      -
    • epinephrine no longer hard caps oxygen damage at ~30
    • -
    • epinephrine now gives the no crit damage trait, which makes creatures not take passive oxygen(or brute if you cant breathe) damage while in critical
    • -
    • epinephrine now heals minor oxygen damage at the same health threshold that it currently heals other damage types at.
    • -
    • atropine and epinephrine now check if your health is under your mobs crit threshold instead of using the number 0 before healing
    • -
    -

    monster860 updated:

    -
      -
    • fixes advanced proccall
    • -
    -

    spookydonut updated:

    -
      -
    • Adds the ability to give shuttles a cooldown timer
    • -
    -

    tralezab updated:

    -
      -
    • The wizard has many more staves to play with!
    • -
    • Along with the new effects, the chaos bolt has a couple more bolts not available my normal means
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e141af2fd00..39353869002 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -24140,3 +24140,341 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. no longer advance you to the closing step. Ty-the-Smonk: - bugfix: You can now interact with self sustaining crossbreeds +2019-05-14: + Flatgub: + - rscadd: Added RCL wiring menu + - bugfix: RCL change cable colour button now applies changes immediately + Krysonism: + - rscadd: 8 new alcoholic drinks. + - rscadd: 2 new nonalcoholic drinks. + - rscadd: Packs of a novel artificial sweetener have been added to the kitchen vendor. + - rscadd: Bottles of trappist beer are now available at a premium price in the booze-o-mat. + - rscadd: Juicing parsnips now yields parsnip juice. add; Maintenance peaches. + - rscdel: Removed champagne from the booze dispenser. + - balance: Now everyone has to pay 200 credits if they want champagne from the booze-o-mat. + - bugfix: Grape soda now cools you down like other sodas. + - imageadd: Added new drink, bottle, vomit and peach can sprites. + MrFluffster: + - rscadd: An extra tile to the Box chapel's width + - rscdel: One barely noticeable tile of width from escape(one escape brig chair + dead [*] ) + RaveRadbury: + - refactor: mood_event timeouts are now in MINUTES and SECONDS + Skoglol: + - bugfix: You no longer get shocked by shock touching someone you are pulling. + WJohnston: + - rscadd: New boxstation mining shuttle! It paves the way for little pod-like shuttles + needing to return home where they can charge, though this needs to be expanded + to other shuttles as well. + anconfuzedrock: + - rscadd: Cargo can now order a ridiculously large canister containing only saline + to give medbay a more than plentiful supply of the stuff. +2019-05-17: + 4dplanner: + - bugfix: health hud will no longer show full health at 0 hp + - bugfix: glass golems properly redirect projectiles + - bugfix: glass golem reflected projectiles can damage the original firer + ExcessiveUseOfCobblestone: + - balance: borgs can now unbuckle people from stasis beds + Garen7: + - bugfix: fixes lings being able to infinitely use their strained muscles + Naksu: + - balance: The crabphone will no longer deafen everyone who didn't have the foreknowledge + that it was coming. + - balance: The crabphone has 80% less HP, as befits something that costs 7 TC and + is not two bubblegums stacked on top of eachother. + - balance: Nuclear operative TC now comes pre-distributed, the telecrystal assignment + stations have been removed. + - bugfix: mindshield nanites no longer give mindshields to revheads and one mind + awoken hiveminds. + - bugfix: Fixed several issues with venus human traps and their vines going through + walls + - code_imp: Made atmos update_visuals() proc a bit faster + jegub: + - bugfix: Lets the grass grow under your feet. + nemvar: + - bugfix: Explosive holoparasite bombs now explode if you bump into them, instead + of the other way around. + pireamaineach: + - rscadd: Added a 3rd atmos tech locker and rad locker to the incinerators on Meta + and Box, and an atmos tech locker to the incinerator on Pubby since it already + had a rad-suit. + - rscdel: Reverts https://github.com/tgstation/tgstation/pull/43557 + - tweak: Makes the doors to the incinerator on meta require atmos access. + - bugfix: Axes some hairstyles that didn't make the final cut but never got fully + removed, removes an unused sprite. + - bugfix: Also fixes the cornrows because they were bRoek + zeroisthebiggay: + - tweak: Gives Sentient Diseases a medical hud to observe their victims further + with. +2019-05-19: + CrazyClown12: + - tweak: The chloral hydrate inside of the sleepy pen is no longer slower acting + than chloral hydrate made in chemistry. + - tweak: The chloral hydrate inside of cookies synthesised by emagged borgs is no + longer slower acting than chloral hydrate made in chemistry. + - rscdel: Delayed chloral hydrate + Erwgd: + - rscadd: Swapped out an epinephrine bottle for potassium iodide in NanoMed Plus + vending machines. + Naksu: + - bugfix: Items using atom colors for coloring now show up properly colored in vending + machines, rather than snow-white + Partheo: + - imageadd: Scrubbers have updated design and animation + Rave Radbury, Art by Navi.OS: + - rscadd: pAI's have a bunch of HUD stuff now + - rscadd: pAI's now have an AI style PDA + - rscadd: pAI cameras can now download a zoom feature! Bigger and smaller pictures! + - tweak: Split the pAI medhud module into seperate medhud and health analyzer modules + - tweak: Journalism modules now have RAM costs + - balance: RAM prices have changed on a number of modules + - imageadd: added more pAI HUD icons + Zxaber: + - balance: AI power backup is now separate from the health, and is tied to their + core. Carding an AI on battery backup will leave the core at partial charge. + AIs no longer slowly lose integrity while on backups (but will instantly die + as before once the backup runs out). As such, whacking an AI with a wrench will + no longer magically lower their backup battery capacity. + - balance: AIs on backup battery can now unbolt at the cost of a quarter of their + battery's max charge. This cannot be done while at under 25% power. + imsxz: + - balance: cakehat has been nerfed + - tweak: cakehat sounds cooler +2019-05-22: + Incoming5643: + - rscadd: After a very long period of being broken, the training bomb in security + finally works properly again. + - tweak: Syndicate bomb cores have become a little more robust in their operation. + Defused but still cored bombs are no longer inert and can be set again. Would + be heroes are advised to cut out and dispose of bomb cores, and dismantle unneeded + bomb shells to be absolutely sure. + MrFluffster: + - rscadd: CLOTH foodtype + Naksu: + - rscadd: Added a new blob strain that grows inside the station and eats garbage + - code_imp: Several fixes for stuff harddeling + - bugfix: Cryotubes no longer display a double of a person that was once in but + teleported out by having ingested bluespace or other such nonsense + - code_imp: pda.detonatable and uplink component checks removed in favor of a signal + in detomatix cart handling + - balance: nukeop uplinks now have 5 unlimited discounts and 10 limited discounts + shared between the team, rather than 3 individual discounts like traitor uplinks + - bugfix: corpses no longer feel, light-headed or otherwise + - code_imp: removed /datum/mutation/human/proc/on_move in favor of having the chameleon + mutation register for a signal + RaveRadbury: + - tweak: '"Religiously Comforted" from Spiritual Quirk occurs on examine and lasts + for 5 minutes' + kriskog: + - bugfix: Added a bunch of previously missing adjacency checks to ui window actions + and alt clicks. + loserXD: + - tweak: Hangar Bay Shutters need only general CentCom access to open now + nemvar: + - bugfix: Podcloning now lets you keep your quirks. + vuonojenmustaturska: + - rscdel: Removed the ability of fat people to vore monkeys, and the ability of + aliens to vore humans. + - code_imp: Removed stubbed out would-be functionality related to stomach contents + - rscadd: Nuclear Operative reinforcements now get uplinks with 0 TC and a real + name. +2019-05-23: + 4dplanner: + - bugfix: between the sheets heals carbons + - tweak: colossus chest is intangible to colossus bolts + Naksu: + - code_imp: removed some unnecessary wrappers in Life() code. + - code_imp: get_area() is now a define rather than a proc. + TheSilverNuke: + - rscadd: edaggers have a special suicide! + nemvar: + - bugfix: You can now reuse chemical grenade casings if they fail to react. + ninjanomnom: + - rscadd: Some rpg affixes now have special effects + weeweesoda: + - balance: The CRAB protocol traitor item now has a maximum stock of 1 each round +2019-05-27: + 4dplanner: + - rscadd: The deja vu effect (previously only used by rewind camera) now resets + all your limbs and damage to the point it was added after 10 seconds (as well + as the original position reset) + - rscadd: The deja vu effect cannot resurrect the dead, but will heal their corpse + - rscadd: New limbs fall off, old ones re-attach + - rscadd: Regenerative sepia cores add a deja vu effect before healing instead of + a timestop + - rscadd: The rewind camera rewinds 2 times to distinguish it from the regenerative + core + - bugfix: colossus and drake can no longer attack from the afterlife + - bugfix: timestop is properly defeated by antimagic. + - bugfix: timestop only checks antimagic once + Akrilla: + - rscadd: Traitors now recognize codewords automatically in spoken conversation. + Phrases in blue, responses in red. + - tweak: Changed traitor greet text slightly. + ExcessiveUseOfVending: + - tweak: Wardrobe Vendors will now accept clothing types they sell. Now you can + clean up after getting that cool alternate uniform! + - code_imp: 'see PR #43964 on how to easily setup a vending machine to accept items!' + Farquaar: + - bugfix: The monk's frock has been sanctified and will no longer reveal your naked + body when the hood is pulled up. + Fire Chance: + - bugfix: Fixed the drink sprites overlapping when you are mixing beer with other + drinks. + Garen7: + - tweak: Lesser form lings can now toggle augmented vision + - bugfix: You can no longer turn back into human form as a lesser form ling while + ventcrawling + - bugfix: Stuns and Reagents are now passed when transforming into a monkey or human + Irafas: + - bugfix: Connected the incinerator/janitor's/botany backroom/service rooms to the + scrubber network + JJRcop: + - rscadd: You can now build a new PDA messaging server if you lose it. + - tweak: Requests console messages no longer work if the messaging server is offline. + Emergency alerts will still function in that case as long as the rest of telecomms + is online. + Naksu: + - code_imp: pipeline gas reconciliation is now faster + OnlineGirlfriend: + - rscadd: Lemonade + - tweak: Arnold Palmer recipe + - imageadd: lemonade sprite + Putnam3145: + - tweak: All departments can now print basic power cells from their respective techfab. + RaveRadbury: + - rscadd: Quirks have flavor text in medical records + - rscadd: All quirks have medical record entries + - spellcheck: All quirk medical records refer to "Patient", removing a few instances + of "Subject" + Tlaltecuhtli: + - bugfix: fixes message spam from riding a vehicle without enough legs/arms + XDTM: + - rscadd: Added a new device, the nanite communication remote, which can be used + to send custom messages to message-based nanite programs. + - rscadd: 'Comm remotes use separate Comm Codes: for a message to be received, the + signal''s comm code must be the same as the program''s.' + actioninja: + - bugfix: Shuttle sounds should no longer ass blast your ears as they no longer + play PER DOOR and instead from the nearest engine, or door if none are available. + - soundadd: Distant shuttle sounds. + bgobandit: + - admin: TP now shows the names of blood brothers' brothers. + hey there uwu: + - bugfix: You can no longer choose the zombie race from the magic mirror, as intended. + nemvar: + - rscadd: Colored lights now shine in different colours. + - rscadd: Mops can now be printed at the autolathe and protolathe. + tralezab: + - rscadd: Gravitokinetic stands are now available! +2019-05-30: + Akrilla: + - tweak: Fedoras/taqiyahs fit pocket sized items. Fedoras can also store the tommy + gun and katana. + Barhandar: + - bugfix: Box's solar panels are no longer missing catwalks from the middle of arrays. + - rscadd: Box's engineering and laundromat now have showers. + Naksu: + - code_imp: /client/mousemove has been removed. + - balance: the aiming beam of a beam rifle is only shown with the mouse button held + down + Rockdtben: + - bugfix: Med Record, Sec Record, and Detective Scanner printed papers use paper_words + icon state + - rscadd: Forensic Scanner documents are numbered now. + - tweak: Forensic Scanner document titles modified + Ty-the-Smonk: + - rscadd: Descriptions for every crossbreed's effect (minus recurring because its + self explanatory). + - bugfix: Changes a single comment in _corecross to reflect how many extracts are + needed to crossbreed. + Yenwodyah: + - tweak: Non-antags can now forge all agent IDs if they find them before they've + been forged. + bgobandit: + - tweak: Nanotrasen has cracked the code of the Syndicate storage implant. Removing + the implant will also drop any items contained within, doing minor damage to + the person implanted. + - bugfix: Cards Against Spess works again. Find decks at your local library. + nemvar: + - balance: Pneumatic cannons are now bulky. + py01: + - balance: Medulary Failure takes 3 seconds to cast now. + - tweak: Some hivemind abilities have new icons. +2019-05-31: + Ghommie: + - code_imp: Merged tinfoil hat kind of protection into the anti_magic component. + - rscadd: Tinfoil hats can also be warped up from excessive dampening of mindray/though + control/psicotronic anomalies, or by simply being microwaved in an oven, and + become useless. + - rscadd: Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil + protection too (minus the paranoia and limited charges). + - balance: Rebalanced many hivemind effects to be dampened/delayed by tinfoil shielding. + Bruteforced Assimilate Vessel, One mind and Awake Vessel abilities will consume + more tinfoil charges compared to others. + - balance: Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil + protection. + Sirich96: + - rscadd: Added new Teleporter Station sprites + Skoglol: + - tweak: Ghost darkness now starts at night vision level by default. + - tweak: Ghost hud on by default. + Time-Green: + - tweak: The genetic sequencer has been reworked. Use it in-hand to view the sequence + Tlaltecuhtli: + - bugfix: cargo ripley can be actually constructed with what you get from the crate + - bugfix: adds the right crate type to monkey cube and hydroponics refill crates + - tweak: readds the bulk wt550 ammo crate + - tweak: conveyor belt crate has 15 instead of 6 belts + - tweak: adds a laser pointer to the bureaucracy crate + - tweak: changes med supply crate to have rng medical things + - bugfix: fixes a missing vendor board option + nemvar: + - balance: Charged oil explosions now look less stupid and are slightly weaker. + - balance: Reworked burning oil. It no longer destroys nearby turfs but still damages + mobs. + wesoda123555: + - rscdel: physically obstructive quirk +2019-06-01: + AffectedArc07: + - tweak: The taskbar icon for the game is now the TG logo + Akrilla: + - bugfix: Fixes the examine text on jackboots/winter boots to properly show what + items can be stored inside. + - bugfix: Can now, as originally intended, store a Luchador mask inside the champion + belt. + - refactor: Work on storage code. + Ghommie: + - bugfix: Fixes splashed cooking oil bypassing any sort of mob impermeability. Also + cut off message/sound spam from being repeatedly splashed within a minimal delay. + - balance: Upped the cooking oil damage cap from 35 to 38 to account the mild bio + protection of the average crewmember's attire. Also made hot deep fryer swirlies + account the user's head covering gear's impermeability. + - refactor: Standarized monkeys/humans get_permeability_coefficient(). + Naksu: + - code_imp: reagent IDs have been removed in favor using reagent typepaths where + applicable + - bugfix: mechas, borg hyposprays etc no longer display internal reagent ids to + the player + Rockdtben: + - rscadd: Security can now print out Missing Persons Posters + Skoglol: + - tweak: Moved machine and computer frames below objects, parts are now always on + top. + - tweak: Moved structures (chairs, closets, windows, cult altars etc etc) below + objects. + - tweak: Moves mineral doors to airlock layers + weeeeesoda: + - rscadd: You can now purify soulstones! This can be done by any crew member using + a bible on one. + - rscadd: Purified constructs can be created by using a purifed soulstone on a construct + shell. Amongst their normal abilities, purified constructs can dispel cult runes + by clicking on them. + - rscdel: Ability to place chaplains soulstone or mining soulstones in construct + shells + - imageadd: angelplasm, angelic sprites, purifed sprites + zxaber: + - tweak: Linen bins can now be (un)achored with a wrench, or disassembled with a + screwdriver (when empty). + - rscadd: You can now make linen bins using two rods. diff --git a/html/changelogs/AutoChangeLog-pr-43754.yml b/html/changelogs/AutoChangeLog-pr-43754.yml new file mode 100644 index 00000000000..18e62689448 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-43754.yml @@ -0,0 +1,5 @@ +author: "actioninja" +delete-after: True +changes: + - rscadd: "Added support for a widescreen toggle, actual widescreen will require a config change." + - tweak: "Auto-fit view is now the default. This will only apply to new players." diff --git a/html/changelogs/AutoChangeLog-pr-43773.yml b/html/changelogs/AutoChangeLog-pr-43773.yml deleted file mode 100644 index 18fb3787512..00000000000 --- a/html/changelogs/AutoChangeLog-pr-43773.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "anconfuzedrock" -delete-after: True -changes: - - rscadd: "Cargo can now order a ridiculously large canister containing only saline to give medbay a more than plentiful supply of the stuff." diff --git a/html/changelogs/AutoChangeLog-pr-43825.yml b/html/changelogs/AutoChangeLog-pr-43825.yml deleted file mode 100644 index a8ecf58cb66..00000000000 --- a/html/changelogs/AutoChangeLog-pr-43825.yml +++ /dev/null @@ -1,13 +0,0 @@ -author: "Krysonism" -delete-after: True -changes: - - rscadd: "8 new alcoholic drinks." - - rscadd: "2 new nonalcoholic drinks." - - rscadd: "Packs of a novel artificial sweetener have been added to the kitchen vendor." - - rscadd: "Bottles of trappist beer are now available at a premium price in the booze-o-mat." - - rscadd: "Juicing parsnips now yields parsnip juice. -add; Maintenance peaches." - - rscdel: "Removed champagne from the booze dispenser." - - balance: "Now everyone has to pay 200 credits if they want champagne from the booze-o-mat." - - bugfix: "Grape soda now cools you down like other sodas." - - imageadd: "Added new drink, bottle, vomit and peach can sprites." diff --git a/html/changelogs/AutoChangeLog-pr-43898.yml b/html/changelogs/AutoChangeLog-pr-43898.yml deleted file mode 100644 index 3e1b1ee6766..00000000000 --- a/html/changelogs/AutoChangeLog-pr-43898.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "MrFluffster" -delete-after: True -changes: - - rscadd: "An extra tile to the Box chapel's width" - - rscdel: "One barely noticeable tile of width from escape(one escape brig chair dead [*] )" diff --git a/html/changelogs/AutoChangeLog-pr-43920.yml b/html/changelogs/AutoChangeLog-pr-43920.yml deleted file mode 100644 index c2456c9f57f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-43920.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - rscadd: "New boxstation mining shuttle! It paves the way for little pod-like shuttles needing to return home where they can charge, though this needs to be expanded to other shuttles as well." diff --git a/html/changelogs/AutoChangeLog-pr-43939.yml b/html/changelogs/AutoChangeLog-pr-43939.yml deleted file mode 100644 index d1b38ccd93a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-43939.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - bugfix: "You no longer get shocked by shock touching someone you are pulling." diff --git a/html/changelogs/AutoChangeLog-pr-43966.yml b/html/changelogs/AutoChangeLog-pr-43966.yml new file mode 100644 index 00000000000..2cb728e04d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-43966.yml @@ -0,0 +1,8 @@ +author: "4dplanner" +delete-after: True +changes: + - rscadd: "stamina damage now pauses natural stamina regen for 10 seconds" + - rscadd: "stamina regenerates fully when it can." + - balance: "disabler damage reduced" + - tweak: "stamina damage no longer stacks with normal damage for the purposes of damage slowdown and crit" + - balance: "many sources of stamina damage have been adjusted, check PR for details" diff --git a/html/changelogs/AutoChangeLog-pr-44169.yml b/html/changelogs/AutoChangeLog-pr-44169.yml new file mode 100644 index 00000000000..fbaa289d1b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44169.yml @@ -0,0 +1,7 @@ +author: "nemvar" +delete-after: True +changes: + - balance: "The timer of all grenades can now be adjusted with a screwdriver. Possible values are instant, 3 seconds and 5 seconds." + - rscadd: "You can now adjust the timer of grenades with a multitool. You can put it anywhere between 3 and 5 seconds. Instant detonations are also possible." + - tweak: "Advanced release grenades now open a window if you want to change the amount of units released." + - tweak: "The default timer on smoke grenades is now 3 seconds." diff --git a/html/changelogs/AutoChangeLog-pr-44188.yml b/html/changelogs/AutoChangeLog-pr-44188.yml new file mode 100644 index 00000000000..f095cf73e79 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44188.yml @@ -0,0 +1,4 @@ +author: "Whoneedspacee" +delete-after: True +changes: + - rscadd: "New RPGLoot modifiers: Vampirism which heals you when you attack, Pyromantic which sets things you hit on fire. Shrapnel which causes projectiles fired from a gun to fire projectiles in a radius when they hit something. Finally, Summoning which summons mobs that sometimes aid you in combat." diff --git a/html/changelogs/AutoChangeLog-pr-44199.yml b/html/changelogs/AutoChangeLog-pr-44199.yml new file mode 100644 index 00000000000..705ce80d498 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44199.yml @@ -0,0 +1,4 @@ +author: "SuicidalPickles" +delete-after: True +changes: + - tweak: "Rolls of gauze now works on corpses." diff --git a/html/changelogs/AutoChangeLog-pr-44205.yml b/html/changelogs/AutoChangeLog-pr-44205.yml new file mode 100644 index 00000000000..4d1cd5be224 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44205.yml @@ -0,0 +1,4 @@ +author: "kriskog" +delete-after: True +changes: + - bugfix: "windoors can now be closed manually after bumping open without having them close again." diff --git a/html/changelogs/AutoChangeLog-pr-44208.yml b/html/changelogs/AutoChangeLog-pr-44208.yml new file mode 100644 index 00000000000..ddf98052fb1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44208.yml @@ -0,0 +1,5 @@ +author: "4dplanner" +delete-after: True +changes: + - bugfix: "thrown objects (but not mobs) no longer hit the thrower" + - bugfix: "mirror shield rebound no longer depends on the original thrower's momentum" diff --git a/html/changelogs/AutoChangeLog-pr-44261.yml b/html/changelogs/AutoChangeLog-pr-44261.yml new file mode 100644 index 00000000000..7f6e697a94a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-44261.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - admin: "\"Spawn reagent container\" verb has been added to the Debug tab. It can be used to spawn reagent containers and grenades with fully customized contents." diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 9dfd9ed91c1..7467561bafc 100644 Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ diff --git a/icons/mob/actions/actions_hive.dmi b/icons/mob/actions/actions_hive.dmi index 8404541cae1..233cf39d4d8 100644 Binary files a/icons/mob/actions/actions_hive.dmi and b/icons/mob/actions/actions_hive.dmi differ diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index ca380a5376e..39e2ea05841 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 6c42fdd68cc..0fab5cea28c 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 0d889374ff1..94fc6ded541 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index b2dd0cad786..cfdd0e549a0 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/mob/screen_pai.dmi b/icons/mob/screen_pai.dmi index b00bc979e24..4868d26cc08 100644 Binary files a/icons/mob/screen_pai.dmi and b/icons/mob/screen_pai.dmi differ diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index badd4cba673..2875e958c96 100644 Binary files a/icons/obj/atmospherics/components/unary_devices.dmi and b/icons/obj/atmospherics/components/unary_devices.dmi differ diff --git a/icons/obj/atmospherics/pipes/pipe_item.dmi b/icons/obj/atmospherics/pipes/pipe_item.dmi index e9ab3813eab..8489294ae58 100644 Binary files a/icons/obj/atmospherics/pipes/pipe_item.dmi and b/icons/obj/atmospherics/pipes/pipe_item.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a3b2dad750d..05f8986932f 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 2bc3997125c..984cac44712 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index b756c77e20f..f352b12d14c 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 4a6988f88e4..93bb9c477aa 100644 Binary files a/icons/obj/machines/telecomms.dmi and b/icons/obj/machines/telecomms.dmi differ diff --git a/icons/obj/machines/teleporter.dmi b/icons/obj/machines/teleporter.dmi index 20e144e0857..8e2c4f45320 100644 Binary files a/icons/obj/machines/teleporter.dmi and b/icons/obj/machines/teleporter.dmi differ diff --git a/icons/obj/poster_wanted.dmi b/icons/obj/poster_wanted.dmi index 38a20788b3e..473f7b762fa 100644 Binary files a/icons/obj/poster_wanted.dmi and b/icons/obj/poster_wanted.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 28b00d8707c..06af15db05b 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/icons/tg_32.png b/icons/tg_32.png new file mode 100644 index 00000000000..f59014198f6 Binary files /dev/null and b/icons/tg_32.png differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 56662d91ec0..b2f1f195c92 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -56,7 +56,7 @@ window "mainwindow" anchor2 = none is-default = true saved-params = "pos;size;is-minimized;is-maximized" - icon = 'icons\\ss13_64.png' + icon = 'icons\\tg_32.png' macro = "default" menu = "menu" elem "split" diff --git a/sound/effects/gravhit.ogg b/sound/effects/gravhit.ogg new file mode 100644 index 00000000000..524ddf733f5 Binary files /dev/null and b/sound/effects/gravhit.ogg differ diff --git a/sound/effects/hyperspace_begin_distance.ogg b/sound/effects/hyperspace_begin_distance.ogg new file mode 100644 index 00000000000..e79363743b4 Binary files /dev/null and b/sound/effects/hyperspace_begin_distance.ogg differ diff --git a/sound/effects/hyperspace_end_distance.ogg b/sound/effects/hyperspace_end_distance.ogg new file mode 100644 index 00000000000..591abb0ad25 Binary files /dev/null and b/sound/effects/hyperspace_end_distance.ogg differ diff --git a/sound/effects/hyperspace_progress_distance.ogg b/sound/effects/hyperspace_progress_distance.ogg new file mode 100644 index 00000000000..2ba8533a845 Binary files /dev/null and b/sound/effects/hyperspace_progress_distance.ogg differ diff --git a/strings/cas_black.txt b/strings/cas_black.txt index b63e33cdf21..734222d1fd1 100644 --- a/strings/cas_black.txt +++ b/strings/cas_black.txt @@ -1,13 +1,13 @@ Today, Security killed ____. Security, the clown's breaking into ____. -The Chaplain is worshiping the Church of _____. +Our last Chaplain believed in nothing but _____. What angered the gods this time? Why didn't engineering set up the singularity? What does the traitor steal this time? Cargo: There's a galaxy-wide shortage of _______. I don't care what they called me back on the station, I'm not a traitor. I'm a man of _________. The Syndicate is offering crew members _________ to defect. -Cargo ordered a crate full of _____. +What is Nanotrasen's highest-priority bounty? What is the gray tide protesting this time? If the Space Gods didn't want _________ they wouldn't have given us __________. Why was the death squad sent in? @@ -30,11 +30,10 @@ What made the nuclear operatives fluke? Why did the Chief Engineer disable comms? Every spaceman receives an internals box and ________. What brought the space orgy to a grinding halt? -Scientists are no longer allowed to make _____. +Scientists are no longer allowed to make ______. What was the clown's best joke? The HoP is now hiring assistants for __________. What happens when you emag an emag? -Our gang doesn't wear uniforms. Our gang wears ___________. No matter how many lizards you have, _____ is never acceptable. No, the AI's second law is NOT to serve _____. First CentCom came for the ________. Now they're coming for the __________. @@ -109,5 +108,12 @@ The auxiliary base was disabled after landing in the middle of _______. Xenobiologists have found slimes to be exceptionally responsive to _______. Why did the captain give me a medal? The curator's new exhibit is devoted solely to _________. -There's no ______ on the new escape shuttle, but there is plenty of _________! -What made me sell my soul to the devil? \ No newline at end of file +What made me sell my soul to the devil? +The engineers are testing an experimental supermatter setup involving _________. +I'm __________ in the streets, __________ in the sheets. +What's my family heirloom? +The Lawyer was fired for messaging the entire station a picture of ___________. +On Lavaland, it is rumored that ashwalkers roam, worshipping _________. +How did the traitor die a glorious death? +Nanotrasen's new state-of-the-art emergency shuttle was repurposed from _________ and _________. +What caused my brain trauma? \ No newline at end of file diff --git a/strings/cas_white.txt b/strings/cas_white.txt index 3a7f9456c95..b2e074ce40b 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -2,6 +2,7 @@ Those motherfucking carp. Having sex in the maintenance tunnels. Space 'Nam. Space lesbians. +Space NEETs. Space Hitler. Space Asshole. Ragin' mages. @@ -57,7 +58,6 @@ Defusing a syndicate bomb with another bomb. Going braindead mid-murder. A petsplosion. Meat spikes. -Collecting the crew's brains. Lopping off the Captain's johnson and shooting it out a pneumatic cannon. The secret monkey technique. Putting the pAI's doorjack where it don't belong. @@ -84,7 +84,6 @@ Paranoia. Putting the boots to him, medium style. ERP-seeking meteors. Paperwork HoPs. -A sexy clown. Rampant vending machines. The prisoner transfer center. Nations. @@ -186,7 +185,6 @@ A big, black shadowling dick. Emagging. Dead lizard storage. Dermal armor. -Energy balls. Fisting somebody until they gib. Alternate uses for defibrillator paddles. Breaking spacetime with thousands of bluespace tomatoes. @@ -197,7 +195,7 @@ Plasmaman strippers. A Quartermaster who WON'T STOP ordering guns. Space lag. Polishing the captain's laser rifle. -That one asshole double agent. +That one asshole nuke op. A surprise visit from Nanotrasen's CEO. The bleeding, dismembered, beautiful corpse of the clown. A glass of ...what? @@ -220,20 +218,18 @@ Welderbombing. Validhunting. Nar'Sie making love to Lord Singulo. Fun. -Crashing the stock market. HONK! -Enough morphine to put the entire station down. +Enough morphine to make the entire station comatose. A defective comdom. Cleanbot. A beaker of dried space carp penis. An Ian storm. -voxtest2. Nuking it from orbit. My senpAI. Harmbatonning. A Nanotrasen D-Notice. TALKING MIMES. -The lusty xenomorph maid, +The lusty xenomorph maid. Using assistants as human shields. Sentient securitrons. Piloting the station into the nearest sun. @@ -251,7 +247,7 @@ NAR'SIE HAS RISEN. Pierrot's Throat. A clown bomb. Space bees? -The entire engineering team having unprotected group sex. +Driving the clown car full speed into the engine. IC in OOC. The best cookie. The wizard with his staff inserted into his anus. @@ -276,9 +272,8 @@ Draconic. Riding borgs, cowgirl style. The Voice of God. Overpowered stuns. -Unironically reading library smut. +Unironically enjoying library smut. Spiritual journeys with BZ. -Freon. Deep-fried body parts. Suit sensor unit gas chambers. Moonlighting. @@ -293,4 +288,17 @@ A salt overdose. Mindswap. Potassium in the toilet bowls. Giving head to the heads. -A lizard wearing cat ears. \ No newline at end of file +A lizard wearing cat ears. +Precious clown gold. +Dabbing on a pile of corpses. +Tactical chairs. +The sweet, forbidden meat of the gondola. +Turning tricks for holocredits. +A captain that doesn't secure the disk. +A positive moodlet. +Hygiene. +The Oh Hi Mark shuttle. +The asteroid shuttle. +Razoring the wings off the moths. +Wiring the ethereals into the powernet. +Well-aged miasma. \ No newline at end of file diff --git a/strings/tips.txt b/strings/tips.txt index a9017173a13..d637fc7570c 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -79,6 +79,7 @@ As a Roboticist, you can augment people with cyborg limbs. Augmented limbs can e As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them, they aren't wearing agent IDs and aren't using digital camouflage as changelings. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can take pictures with your camera and upload them to newscasters. +As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys. As a Cyborg, choose your module carefully, as only cutting and mending your reset wire will let you repick it. If possible, refrain from choosing a module until a situation that requires one occurs. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. As a Cyborg, you are impervious to fires and heat. If you are rogue, you can release plasma fires everywhere and walk through them without a care in the world! @@ -248,3 +249,4 @@ When hacking doors, cutting and mending a "test light wire" will restore power t When crafting most items, you can either manually combine parts or use the crafting menu. Suit storage units not only remove blood and dirt from clothing, but also radiation! Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. +You can light a cigar on a supermatter crystal. diff --git a/tgstation.dme b/tgstation.dme index 8d0b055f6e4..fbe9a8f8ac2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -43,6 +43,7 @@ #include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" #include "code\__DEFINES\exports.dm" +#include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" @@ -130,6 +131,7 @@ #include "code\__HELPERS\qdel.dm" #include "code\__HELPERS\radiation.dm" #include "code\__HELPERS\radio.dm" +#include "code\__HELPERS\reagents.dm" #include "code\__HELPERS\records.dm" #include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" @@ -199,6 +201,7 @@ #include "code\_onclick\hud\picture_in_picture.dm" #include "code\_onclick\hud\plane_master.dm" #include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" #include "code\_onclick\hud\revenanthud.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" @@ -254,7 +257,6 @@ #include "code\controllers\subsystem\ping.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" -#include "code\controllers\subsystem\religion.dm" #include "code\controllers\subsystem\research.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" @@ -336,6 +338,7 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\anti_magic.dm" #include "code\datums\components\armor_plate.dm" +#include "code\datums\components\bane.dm" #include "code\datums\components\beetlejuice.dm" #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" @@ -351,9 +354,12 @@ #include "code\datums\components\forced_gravity.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\heirloom.dm" +#include "code\datums\components\igniter.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" +#include "code\datums\components\knockback.dm" #include "code\datums\components\knockoff.dm" +#include "code\datums\components\lifesteal.dm" #include "code\datums\components\lockon_aiming.dm" #include "code\datums\components\magnetic_catch.dm" #include "code\datums\components\material_container.dm" @@ -369,6 +375,7 @@ #include "code\datums\components\riding.dm" #include "code\datums\components\rot.dm" #include "code\datums\components\rotation.dm" +#include "code\datums\components\shrapnel.dm" #include "code\datums\components\signal_redirect.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\snail_crawl.dm" @@ -377,13 +384,20 @@ #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" +#include "code\datums\components\summoning.dm" #include "code\datums\components\swarming.dm" +#include "code\datums\components\tactical.dm" +#include "code\datums\components\tether.dm" #include "code\datums\components\thermite.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\waddling.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\decals\blood.dm" +#include "code\datums\components\fantasy\_fantasy.dm" +#include "code\datums\components\fantasy\affix.dm" +#include "code\datums\components\fantasy\prefixes.dm" +#include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" @@ -452,7 +466,6 @@ #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" #include "code\datums\looping_sounds\_looping_sound.dm" #include "code\datums\looping_sounds\item_sounds.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" @@ -657,7 +670,6 @@ #include "code\game\machinery\computer\robot.dm" #include "code\game\machinery\computer\security.dm" #include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\telecrystalconsoles.dm" #include "code\game\machinery\computer\teleporter.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -1121,6 +1133,7 @@ #include "code\modules\admin\holder2.dm" #include "code\modules\admin\ipintel.dm" #include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\outfits.dm" #include "code\modules\admin\permissionedit.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" @@ -1136,6 +1149,7 @@ #include "code\modules\admin\verbs\adminpm.dm" #include "code\modules\admin\verbs\adminsay.dm" #include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\beakerpanel.dm" #include "code\modules\admin\verbs\bluespacearty.dm" #include "code\modules\admin\verbs\borgpanel.dm" #include "code\modules\admin\verbs\BrokenInhands.dm" @@ -1191,6 +1205,7 @@ #include "code\modules\antagonists\blob\blobstrains\_reagent.dm" #include "code\modules\antagonists\blob\blobstrains\blazing_oil.dm" #include "code\modules\antagonists\blob\blobstrains\cryogenic_poison.dm" +#include "code\modules\antagonists\blob\blobstrains\debris_devourer.dm" #include "code\modules\antagonists\blob\blobstrains\electromagnetic_web.dm" #include "code\modules\antagonists\blob\blobstrains\energized_jelly.dm" #include "code\modules\antagonists\blob\blobstrains\explosive_lattice.dm" @@ -2148,6 +2163,7 @@ #include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" #include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" #include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\gravitokinetic.dm" #include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" #include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" #include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" @@ -2500,6 +2516,7 @@ #include "code\modules\reagents\chemistry\recipes\others.dm" #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" #include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" +#include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index 9eb9091d48b..6d35fe3eebb 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,21 +1,21 @@ -require=function(){function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n||t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:h(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=g),O}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(t,e,n){t(129),e.exports=t(24).RegExp.escape},{129:129,24:24}],4:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],5:[function(t,e,n){var a=t(19);e.exports=function(t,e){if("number"!=typeof t&&"Number"!=a(t))throw TypeError(e);return+t}},{19:19}],6:[function(t,e,n){var a=t(127)("unscopables"),r=Array.prototype;void 0==r[a]&&t(43)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{127:127,43:43}],7:[function(t,e,n){e.exports=function(t,e,n,a){if(!(t instanceof e)||void 0!==a&&a in t)throw TypeError(n+": incorrect invocation!");return t}},{}],8:[function(t,e,n){var a=t(52);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{52:52}],9:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments.length>2?arguments[2]:void 0,c=Math.min((void 0===u?o:r(u,o))-p,o-s),l=1;for(s>p&&p+c>s&&(l=-1,p+=c-1,s+=c-1);c-- >0;)p in n?n[s]=n[p]:delete n[s],s+=l,p+=l;return n}},{112:112,116:116,117:117}],10:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=function(t){for(var e=a(this),n=i(e.length),o=arguments.length,s=r(o>1?arguments[1]:void 0,n),p=o>2?arguments[2]:void 0,u=void 0===p?n:r(p,n);u>s;)e[s++]=t;return e}},{112:112,116:116,117:117}],11:[function(t,e,n){var a=t(40);e.exports=function(t,e){var n=[];return a(t,!1,n.push,n,e),n}},{40:40}],12:[function(t,e,n){var a=t(115),r=t(116),i=t(112);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c||0;return!t&&-1}}},{112:112,115:115,116:116}],13:[function(t,e,n){var a=t(26),r=t(48),i=t(117),o=t(116),s=t(16);e.exports=function(t,e){var n=1==t,p=2==t,u=3==t,c=4==t,l=6==t,d=5==t||l,f=e||s;return function(e,s,h){for(var m,g,v=i(e),b=r(v),y=a(s,h,3),_=o(b.length),x=0,w=n?f(e,_):p?f(e,0):void 0;_>x;x++)if((d||x in b)&&(m=b[x],g=y(m,x,v),t))if(n)w[x]=g;else if(g)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(c)return!1;return l?-1:u||c?c:w}}},{116:116,117:117,16:16,26:26,48:48}],14:[function(t,e,n){var a=t(4),r=t(117),i=t(48),o=t(116);e.exports=function(t,e,n,s,p){a(e);var u=r(t),c=i(u),l=o(u.length),d=p?l-1:0,f=p?-1:1;if(2>n)for(;;){if(d in c){s=c[d],d+=f;break}if(d+=f,p?0>d:d>=l)throw TypeError("Reduce of empty array with no initial value")}for(;p?d>=0:l>d;d+=f)d in c&&(s=e(s,c[d],d,u));return s}},{116:116,117:117,4:4,48:48}],15:[function(t,e,n){var a=t(52),r=t(50),i=t(127)("species");e.exports=function(t){var e;return r(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!r(e.prototype)||(e=void 0),a(e)&&(e=e[i],null===e&&(e=void 0))),void 0===e?Array:e}},{127:127,50:50,52:52}],16:[function(t,e,n){var a=t(15);e.exports=function(t,e){return new(a(t))(e)}},{15:15}],17:[function(t,e,n){"use strict";var a=t(4),r=t(52),i=t(47),o=[].slice,s={},p=function(t,e,n){if(!(e in s)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";s[e]=Function("F,a","return new F("+a.join(",")+")")}return s[e](t,n)};e.exports=Function.bind||function(t){var e=a(this),n=o.call(arguments,1),s=function(){var a=n.concat(o.call(arguments));return this instanceof s?p(e,a.length,a):i(e,a,t)};return r(e.prototype)&&(s.prototype=e.prototype),s}},{4:4,47:47,52:52}],18:[function(t,e,n){var a=t(19),r=t(127)("toStringTag"),i="Arguments"==a(function(){return arguments}()),o=function(t,e){try{return t[e]}catch(n){}};e.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=o(e=Object(t),r))?n:i?a(e):"Object"==(s=a(e))&&"function"==typeof e.callee?"Arguments":s}},{127:127,19:19}],19:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],20:[function(t,e,n){"use strict";var a=t(72).f,r=t(71),i=t(91),o=t(26),s=t(7),p=t(40),u=t(56),c=t(58),l=t(98),d=t(30),f=t(66).fastKey,h=t(124),m=d?"_s":"size",g=function(t,e){var n,a=f(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,u){var c=t(function(t,a){s(t,c,e,"_i"),t._t=e,t._i=r(null),t._f=void 0,t._l=void 0,t[m]=0,void 0!=a&&p(a,n,t[u],t)});return i(c.prototype,{clear:function(){for(var t=h(this,e),n=t._i,a=t._f;a;a=a.n)a.r=!0,a.p&&(a.p=a.p.n=void 0),delete n[a.i];t._f=t._l=void 0,t[m]=0},"delete":function(t){var n=h(this,e),a=g(n,t);if(a){var r=a.n,i=a.p;delete n._i[a.i],a.r=!0,i&&(i.n=r),r&&(r.p=i),n._f==a&&(n._f=r),n._l==a&&(n._l=i),n[m]--}return!!a},forEach:function(t){h(this,e);for(var n,a=o(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(a(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!g(h(this,e),t)}}),d&&a(c.prototype,"size",{get:function(){return h(this,e)[m]}}),c},def:function(t,e,n){var a,r,i=g(t,e);return i?i.v=n:(t._l=i={i:r=f(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[m]++,"F"!==r&&(t._i[r]=i)),t},getEntry:g,setStrong:function(t,e,n){u(t,e,function(t,n){this._t=h(t,e),this._k=n,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?c(0,n.k):"values"==e?c(0,n.v):c(0,[n.k,n.v]):(t._t=void 0,c(1))},n?"entries":"values",!n,!0),l(e)}}},{124:124,26:26,30:30,40:40,56:56,58:58,66:66,7:7,71:71,72:72,91:91,98:98}],21:[function(t,e,n){var a=t(18),r=t(11);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");return r(this)}}},{11:11,18:18}],22:[function(t,e,n){"use strict";var a=t(91),r=t(66).getWeak,i=t(8),o=t(52),s=t(7),p=t(40),u=t(13),c=t(42),l=t(124),d=u(5),f=u(6),h=0,m=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},v=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=v(this,t);return e?e[1]:void 0},has:function(t){return!!v(this,t)},set:function(t,e){var n=v(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=f(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,i){var u=t(function(t,a){s(t,u,e,"_i"),t._t=e,t._i=h++,t._l=void 0,void 0!=a&&p(a,n,t[i],t)});return a(u.prototype,{"delete":function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e))["delete"](t):n&&c(n,this._i)&&delete n[this._i]},has:function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e)).has(t):n&&c(n,this._i)}}),u},def:function(t,e,n){var a=r(i(e),!0);return a===!0?m(t).set(e,n):a[t._i]=n,t},ufstore:m}},{124:124,13:13,40:40,42:42,52:52,66:66,7:7,8:8,91:91}],23:[function(t,e,n){"use strict";var a=t(41),r=t(34),i=t(92),o=t(91),s=t(66),p=t(40),u=t(7),c=t(52),l=t(36),d=t(57),f=t(99),h=t(46);e.exports=function(t,e,n,m,g,v){var b=a[t],y=b,_=g?"set":"add",x=y&&y.prototype,w={},k=function(t){var e=x[t];i(x,t,"delete"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof y&&(v||x.forEach&&!l(function(){(new y).entries().next()}))){var S=new y,E=S[_](v?{}:-0,1)!=S,C=l(function(){S.has(1)}),P=d(function(t){new y(t)}),A=!v&&l(function(){for(var t=new y,e=5;e--;)t[_](e,e);return!t.has(-0)});P||(y=e(function(e,n){u(e,y,t);var a=h(new b,e,y);return void 0!=n&&p(n,g,a[_],a),a}),y.prototype=x,x.constructor=y),(C||A)&&(k("delete"),k("has"),g&&k("get")),(A||E)&&k(_),v&&x.clear&&delete x.clear}else y=m.getConstructor(e,t,g,_),o(y.prototype,n),s.NEED=!0;return f(y,t),w[t]=y,r(r.G+r.W+r.F*(y!=b),w),v||m.setStrong(y,t,g),y}},{34:34,36:36,40:40,41:41,46:46,52:52,57:57,66:66,7:7,91:91,92:92,99:99}],24:[function(t,e,n){var a=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=a)},{}],25:[function(t,e,n){"use strict";var a=t(72),r=t(90);e.exports=function(t,e,n){e in t?a.f(t,e,r(0,n)):t[e]=n}},{72:72,90:90}],26:[function(t,e,n){var a=t(4);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{4:4}],27:[function(t,e,n){"use strict";var a=t(36),r=Date.prototype.getTime,i=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};e.exports=a(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!a(function(){i.call(new Date(NaN))})?function(){if(!isFinite(r.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(n>99?n:"0"+o(n))+"Z"}:i},{36:36}],28:[function(t,e,n){"use strict";var a=t(8),r=t(118),i="number";e.exports=function(t){if("string"!==t&&t!==i&&"default"!==t)throw TypeError("Incorrect hint");return r(a(this),t!=i)}},{118:118,8:8}],29:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],30:[function(t,e,n){e.exports=!t(36)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{36:36}],31:[function(t,e,n){var a=t(52),r=t(41).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{41:41,52:52}],32:[function(t,e,n){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],33:[function(t,e,n){var a=t(81),r=t(78),i=t(82);e.exports=function(t){var e=a(t),n=r.f;if(n)for(var o,s=n(t),p=i.f,u=0;s.length>u;)p.call(t,o=s[u++])&&e.push(o);return e}},{78:78,81:81,82:82}],34:[function(t,e,n){var a=t(41),r=t(24),i=t(43),o=t(92),s=t(26),p="prototype",u=function(t,e,n){var c,l,d,f,h=t&u.F,m=t&u.G,g=t&u.S,v=t&u.P,b=t&u.B,y=m?a:g?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&void 0!==y[c],d=(l?y:n)[c],f=b&&l?s(d,a):v&&"function"==typeof d?s(Function.call,d):d,y&&o(y,c,d,t&u.U),_[c]!=d&&i(_,c,f),v&&x[c]!=d&&(x[c]=d)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},{24:24,26:26,41:41,43:43,92:92}],35:[function(t,e,n){var a=t(127)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{127:127}],36:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],37:[function(t,e,n){"use strict";var a=t(43),r=t(92),i=t(36),o=t(29),s=t(127);e.exports=function(t,e,n){var p=s(t),u=n(o,p,""[t]),c=u[0],l=u[1];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,c),a(RegExp.prototype,p,2==e?function(t,e){return l.call(t,this,e)}:function(t){return l.call(t,this)}))}},{127:127,29:29,36:36,43:43,92:92}],38:[function(t,e,n){"use strict";var a=t(8);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{8:8}],39:[function(t,e,n){"use strict";function a(t,e,n,u,c,l,d,f){for(var h,m,g=c,v=0,b=d?s(d,f,3):!1;u>v;){if(v in n){if(h=b?b(n[v],v,e):n[v],m=!1,i(h)&&(m=h[p],m=void 0!==m?!!m:r(h)),m&&l>0)g=a(t,e,h,o(h.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();t[g]=h}g++}v++}return g}var r=t(50),i=t(52),o=t(116),s=t(26),p=t(127)("isConcatSpreadable");e.exports=a},{116:116,127:127,26:26,50:50,52:52}],40:[function(t,e,n){var a=t(26),r=t(54),i=t(49),o=t(8),s=t(116),p=t(128),u={},c={},n=e.exports=function(t,e,n,l,d){var f,h,m,g,v=d?function(){return t}:p(t),b=a(n,l,e?2:1),y=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(i(v)){for(f=s(t.length);f>y;y++)if(g=e?b(o(h=t[y])[0],h[1]):b(t[y]),g===u||g===c)return g}else for(m=v.call(t);!(h=m.next()).done;)if(g=r(m,b,h.value,e),g===u||g===c)return g};n.BREAK=u,n.RETURN=c},{116:116,128:128,26:26,49:49,54:54,8:8}],41:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],42:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],43:[function(t,e,n){var a=t(72),r=t(90);e.exports=t(30)?function(t,e,n){return a.f(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{30:30,72:72,90:90}],44:[function(t,e,n){var a=t(41).document;e.exports=a&&a.documentElement},{41:41}],45:[function(t,e,n){e.exports=!t(30)&&!t(36)(function(){return 7!=Object.defineProperty(t(31)("div"),"a",{get:function(){return 7}}).a})},{30:30,31:31,36:36}],46:[function(t,e,n){var a=t(52),r=t(97).set;e.exports=function(t,e,n){var i,o=e.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&a(i)&&r&&r(t,i),t}},{52:52,97:97}],47:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],48:[function(t,e,n){var a=t(19);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{19:19}],49:[function(t,e,n){var a=t(59),r=t(127)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{127:127,59:59}],50:[function(t,e,n){var a=t(19);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{19:19}],51:[function(t,e,n){var a=t(52),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{52:52}],52:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],53:[function(t,e,n){var a=t(52),r=t(19),i=t(127)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{127:127,19:19,52:52}],54:[function(t,e,n){var a=t(8);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{8:8}],55:[function(t,e,n){"use strict";var a=t(71),r=t(90),i=t(99),o={};t(43)(o,t(127)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a(o,{next:r(1,n)}),i(t,e+" Iterator")}},{127:127,43:43,71:71,90:90,99:99}],56:[function(t,e,n){"use strict";var a=t(60),r=t(34),i=t(92),o=t(43),s=t(59),p=t(55),u=t(99),c=t(79),l=t(127)("iterator"),d=!([].keys&&"next"in[].keys()),f="@@iterator",h="keys",m="values",g=function(){return this};e.exports=function(t,e,n,v,b,y,_){p(n,e,v);var x,w,k,S=function(t){if(!d&&t in A)return A[t];switch(t){case h:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this,t)}},E=e+" Iterator",C=b==m,P=!1,A=t.prototype,O=A[l]||A[f]||b&&A[b],T=O||S(b),R=b?C?S("entries"):T:void 0,M="Array"==e?A.entries||O:O;if(M&&(k=c(M.call(new t)),k!==Object.prototype&&k.next&&(u(k,E,!0),a||"function"==typeof k[l]||o(k,l,g))),C&&O&&O.name!==m&&(P=!0,T=function(){return O.call(this)}),a&&!_||!d&&!P&&A[l]||o(A,l,T),s[e]=T,s[E]=g,b)if(x={values:C?T:S(m),keys:y?T:S(h),entries:R},_)for(w in x)w in A||i(A,w,x[w]);else r(r.P+r.F*(d||P),e,x);return x}},{127:127,34:34,43:43,55:55,59:59,60:60,79:79,92:92,99:99}],57:[function(t,e,n){var a=t(127)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{127:127}],58:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],59:[function(t,e,n){e.exports={}},{}],60:[function(t,e,n){e.exports=!1},{}],61:[function(t,e,n){var a=Math.expm1;e.exports=!a||a(10)>22025.465794806718||a(10)<22025.465794806718||-2e-17!=a(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}:a},{}],62:[function(t,e,n){var a=t(65),r=Math.pow,i=r(2,-52),o=r(2,-23),s=r(2,127)*(2-o),p=r(2,-126),u=function(t){return t+1/i-1/i};e.exports=Math.fround||function(t){var e,n,r=Math.abs(t),c=a(t);return p>r?c*u(r/p/o)*p*o:(e=(1+o/i)*r,n=e-(e-r),n>s||n!=n?c*(1/0):c*n)}},{65:65}],63:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],64:[function(t,e,n){e.exports=Math.scale||function(t,e,n,a,r){return 0===arguments.length||t!=t||e!=e||n!=n||a!=a||r!=r?NaN:t===1/0||t===-(1/0)?t:(t-e)*(r-a)/(n-e)+a}},{}],65:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],66:[function(t,e,n){var a=t(122)("meta"),r=t(52),i=t(42),o=t(72).f,s=0,p=Object.isExtensible||function(){return!0},u=!t(36)(function(){return p(Object.preventExtensions({}))}),c=function(t){o(t,a,{value:{i:"O"+ ++s,w:{}}})},l=function(t,e){if(!r(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,a)){if(!p(t))return"F";if(!e)return"E";c(t)}return t[a].i},d=function(t,e){if(!i(t,a)){if(!p(t))return!0;if(!e)return!1;c(t)}return t[a].w},f=function(t){return u&&h.NEED&&p(t)&&!i(t,a)&&c(t),t},h=e.exports={KEY:a,NEED:!1,fastKey:l,getWeak:d,onFreeze:f}},{122:122,36:36,42:42,52:52,72:72}],67:[function(t,e,n){var a=t(159),r=t(34),i=t(101)("metadata"),o=i.store||(i.store=new(t(265))),s=function(t,e,n){var r=o.get(t);if(!r){if(!n)return;o.set(t,r=new a)}var i=r.get(e);if(!i){if(!n)return;r.set(e,i=new a)}return i},p=function(t,e,n){var a=s(e,n,!1);return void 0===a?!1:a.has(t)},u=function(t,e,n){var a=s(e,n,!1);return void 0===a?void 0:a.get(t)},c=function(t,e,n,a){s(n,a,!0).set(t,e)},l=function(t,e){var n=s(t,e,!1),a=[];return n&&n.forEach(function(t,e){a.push(e)}),a},d=function(t){return void 0===t||"symbol"==typeof t?t:t+""},f=function(t){r(r.S,"Reflect",t)};e.exports={store:o,map:s,has:p,get:u,set:c,keys:l,key:d,exp:f}},{101:101,159:159,265:265,34:34}],68:[function(t,e,n){var a=t(41),r=t(111).set,i=a.MutationObserver||a.WebKitMutationObserver,o=a.process,s=a.Promise,p="process"==t(19)(o);e.exports=function(){var t,e,n,u=function(){var a,r;for(p&&(a=o.domain)&&a.exit();t;){r=t.fn,t=t.next;try{r()}catch(i){throw t?n():e=void 0,i}}e=void 0,a&&a.enter()};if(p)n=function(){o.nextTick(u)};else if(!i||a.navigator&&a.navigator.standalone)if(s&&s.resolve){var c=s.resolve(void 0);n=function(){c.then(u)}}else n=function(){r.call(a,u)};else{var l=!0,d=document.createTextNode("");new i(u).observe(d,{characterData:!0}),n=function(){d.data=l=!l}}return function(a){var r={fn:a,next:void 0};e&&(e.next=r),t||(t=r,n()),e=r}}},{111:111,19:19,41:41}],69:[function(t,e,n){"use strict";function a(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=r(e),this.reject=r(n)}var r=t(4);e.exports.f=function(t){return new a(t)}},{4:4}],70:[function(t,e,n){"use strict";var a=t(81),r=t(78),i=t(82),o=t(117),s=t(48),p=Object.assign;e.exports=!p||t(36)(function(){var t={},e={},n=Symbol(),a="abcdefghijklmnopqrst";return t[n]=7,a.split("").forEach(function(t){e[t]=t}),7!=p({},t)[n]||Object.keys(p({},e)).join("")!=a})?function(t,e){for(var n=o(t),p=arguments.length,u=1,c=r.f,l=i.f;p>u;)for(var d,f=s(arguments[u++]),h=c?a(f).concat(c(f)):a(f),m=h.length,g=0;m>g;)l.call(f,d=h[g++])&&(n[d]=f[d]);return n}:p},{117:117,36:36,48:48,78:78,81:81,82:82}],71:[function(t,e,n){var a=t(8),r=t(73),i=t(32),o=t(100)("IE_PROTO"),s=function(){},p="prototype",u=function(){var e,n=t(31)("iframe"),a=i.length,r="<",o=">";for(n.style.display="none",t(44).appendChild(n),n.src="javascript:",e=n.contentWindow.document,e.open(),e.write(r+"script"+o+"document.F=Object"+r+"/script"+o),e.close(),u=e.F;a--;)delete u[p][i[a]];return u()};e.exports=Object.create||function(t,e){var n;return null!==t?(s[p]=a(t),n=new s,s[p]=null,n[o]=t):n=u(),void 0===e?n:r(n,e)}},{100:100,31:31,32:32,44:44,73:73,8:8}],72:[function(t,e,n){var a=t(8),r=t(45),i=t(118),o=Object.defineProperty;n.f=t(30)?Object.defineProperty:function(t,e,n){if(a(t),e=i(e,!0),a(n),r)try{return o(t,e,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},{118:118,30:30,45:45,8:8}],73:[function(t,e,n){var a=t(72),r=t(8),i=t(81);e.exports=t(30)?Object.defineProperties:function(t,e){r(t);for(var n,o=i(e),s=o.length,p=0;s>p;)a.f(t,n=o[p++],e[n]);return t}},{30:30,72:72,8:8,81:81}],74:[function(t,e,n){"use strict";e.exports=t(60)||!t(36)(function(){var e=Math.random();__defineSetter__.call(null,e,function(){}),delete t(41)[e]})},{36:36,41:41,60:60}],75:[function(t,e,n){var a=t(82),r=t(90),i=t(115),o=t(118),s=t(42),p=t(45),u=Object.getOwnPropertyDescriptor;n.f=t(30)?u:function(t,e){if(t=i(t),e=o(e,!0),p)try{return u(t,e)}catch(n){}return s(t,e)?r(!a.f.call(t,e),t[e]):void 0}},{115:115,118:118,30:30,42:42,45:45,82:82,90:90}],76:[function(t,e,n){var a=t(115),r=t(77).f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{115:115,77:77}],77:[function(t,e,n){var a=t(80),r=t(32).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return a(t,r)}},{32:32,80:80}],78:[function(t,e,n){n.f=Object.getOwnPropertySymbols},{}],79:[function(t,e,n){var a=t(42),r=t(117),i=t(100)("IE_PROTO"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(t){return t=r(t),a(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},{100:100,117:117,42:42}],80:[function(t,e,n){var a=t(42),r=t(115),i=t(12)(!1),o=t(100)("IE_PROTO");e.exports=function(t,e){var n,s=r(t),p=0,u=[];for(n in s)n!=o&&a(s,n)&&u.push(n);for(;e.length>p;)a(s,n=e[p++])&&(~i(u,n)||u.push(n));return u}},{100:100,115:115,12:12,42:42}],81:[function(t,e,n){var a=t(80),r=t(32);e.exports=Object.keys||function(t){return a(t,r)}},{32:32,80:80}],82:[function(t,e,n){n.f={}.propertyIsEnumerable},{}],83:[function(t,e,n){var a=t(34),r=t(24),i=t(36);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{24:24,34:34,36:36}],84:[function(t,e,n){var a=t(81),r=t(115),i=t(82).f;e.exports=function(t){return function(e){for(var n,o=r(e),s=a(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{115:115,81:81,82:82}],85:[function(t,e,n){var a=t(77),r=t(78),i=t(8),o=t(41).Reflect;e.exports=o&&o.ownKeys||function(t){var e=a.f(i(t)),n=r.f;return n?e.concat(n(t)):e}},{41:41,77:77,78:78,8:8}],86:[function(t,e,n){var a=t(41).parseFloat,r=t(109).trim;e.exports=1/a(t(110)+"-0")!==-(1/0)?function(t){var e=r(t+"",3),n=a(e);return 0===n&&"-"==e.charAt(0)?-0:n}:a},{109:109,110:110,41:41}],87:[function(t,e,n){var a=t(41).parseInt,r=t(109).trim,i=t(110),o=/^[-+]?0[xX]/;e.exports=8!==a(i+"08")||22!==a(i+"0x16")?function(t,e){var n=r(t+"",3);return a(n,e>>>0||(o.test(n)?16:10))}:a},{109:109,110:110,41:41}],88:[function(t,e,n){e.exports=function(t){try{return{e:!1,v:t()}}catch(e){return{e:!0,v:e}}}},{}],89:[function(t,e,n){var a=t(8),r=t(52),i=t(69);e.exports=function(t,e){if(a(t),r(e)&&e.constructor===t)return e;var n=i.f(t),o=n.resolve;return o(e),n.promise}},{52:52,69:69,8:8}],90:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],91:[function(t,e,n){var a=t(92);e.exports=function(t,e,n){for(var r in e)a(t,r,e[r],n);return t}},{92:92}],92:[function(t,e,n){var a=t(41),r=t(43),i=t(42),o=t(122)("src"),s="toString",p=Function[s],u=(""+p).split(s);t(24).inspectSource=function(t){return p.call(t)},(e.exports=function(t,e,n,s){var p="function"==typeof n;p&&(i(n,"name")||r(n,"name",e)),t[e]!==n&&(p&&(i(n,o)||r(n,o,t[e]?""+t[e]:u.join(e+""))),t===a?t[e]=n:s?t[e]?t[e]=n:r(t,e,n):(delete t[e],r(t,e,n)))})(Function.prototype,s,function(){ -return"function"==typeof this&&this[o]||p.call(this)})},{122:122,24:24,41:41,42:42,43:43}],93:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],94:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],95:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(26),o=t(40);e.exports=function(t){a(a.S,t,{from:function(t){var e,n,a,s,p=arguments[1];return r(this),e=void 0!==p,e&&r(p),void 0==t?new this:(n=[],e?(a=0,s=i(p,arguments[2],2),o(t,!1,function(t){n.push(s(t,a++))})):o(t,!1,n.push,n),new this(n))}})}},{26:26,34:34,4:4,40:40}],96:[function(t,e,n){"use strict";var a=t(34);e.exports=function(t){a(a.S,t,{of:function(){for(var t=arguments.length,e=Array(t);t--;)e[t]=arguments[t];return new this(e)}})}},{34:34}],97:[function(t,e,n){var a=t(52),r=t(8),i=function(t,e){if(r(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(26)(Function.call,t(75).f(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(r){n=!0}return function(t,e){return i(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:i}},{26:26,52:52,75:75,8:8}],98:[function(t,e,n){"use strict";var a=t(41),r=t(72),i=t(30),o=t(127)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.f(e,o,{configurable:!0,get:function(){return this}})}},{127:127,30:30,41:41,72:72}],99:[function(t,e,n){var a=t(72).f,r=t(42),i=t(127)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{127:127,42:42,72:72}],100:[function(t,e,n){var a=t(101)("keys"),r=t(122);e.exports=function(t){return a[t]||(a[t]=r(t))}},{101:101,122:122}],101:[function(t,e,n){var a=t(24),r=t(41),i="__core-js_shared__",o=r[i]||(r[i]={});(e.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:a.version,mode:t(60)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},{24:24,41:41,60:60}],102:[function(t,e,n){var a=t(8),r=t(4),i=t(127)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{127:127,4:4,8:8}],103:[function(t,e,n){"use strict";var a=t(36);e.exports=function(t,e){return!!t&&a(function(){e?t.call(null,function(){},1):t.call(null)})}},{36:36}],104:[function(t,e,n){var a=t(114),r=t(29);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{114:114,29:29}],105:[function(t,e,n){var a=t(53),r=t(29);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{29:29,53:53}],106:[function(t,e,n){var a=t(34),r=t(36),i=t(29),o=/"/g,s=function(t,e,n,a){var r=i(t)+"",s="<"+e;return""!==n&&(s+=" "+n+'="'+(a+"").replace(o,""")+'"'),s+">"+r+""};e.exports=function(t,e){var n={};n[t]=e(s),a(a.P+a.F*r(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},{29:29,34:34,36:36}],107:[function(t,e,n){var a=t(116),r=t(108),i=t(29);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c||""==u)return s;var l=c-p,d=r.call(u,Math.ceil(l/u.length));return d.length>l&&(d=d.slice(0,l)),o?d+s:s+d}},{108:108,116:116,29:29}],108:[function(t,e,n){"use strict";var a=t(114),r=t(29);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{114:114,29:29}],109:[function(t,e,n){var a=t(34),r=t(29),i=t(36),o=t(110),s="["+o+"]",p="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e,n){var r={},s=i(function(){return!!o[t]()||p[t]()!=p}),u=r[t]=s?e(d):o[t];n&&(r[n]=u),a(a.P+a.F*s,"String",r)},d=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{110:110,29:29,34:34,36:36}],110:[function(t,e,n){e.exports=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff"},{}],111:[function(t,e,n){var a,r,i,o=t(26),s=t(47),p=t(44),u=t(31),c=t(41),l=c.process,d=c.setImmediate,f=c.clearImmediate,h=c.MessageChannel,m=c.Dispatch,g=0,v={},b="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},_=function(t){y.call(t.data)};d&&f||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++g]=function(){s("function"==typeof t?t:Function(t),e)},a(g),g},f=function(t){delete v[t]},"process"==t(19)(l)?a=function(t){l.nextTick(o(y,t,1))}:m&&m.now?a=function(t){m.now(o(y,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=_,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",_,!1)):a=b in u("script")?function(t){p.appendChild(u("script"))[b]=function(){p.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:d,clear:f}},{19:19,26:26,31:31,41:41,44:44,47:47}],112:[function(t,e,n){var a=t(114),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{114:114}],113:[function(t,e,n){var a=t(114),r=t(116);e.exports=function(t){if(void 0===t)return 0;var e=a(t),n=r(e);if(e!==n)throw RangeError("Wrong length!");return n}},{114:114,116:116}],114:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],115:[function(t,e,n){var a=t(48),r=t(29);e.exports=function(t){return a(r(t))}},{29:29,48:48}],116:[function(t,e,n){var a=t(114),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{114:114}],117:[function(t,e,n){var a=t(29);e.exports=function(t){return Object(a(t))}},{29:29}],118:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{52:52}],119:[function(t,e,n){"use strict";if(t(30)){var a=t(60),r=t(41),i=t(36),o=t(34),s=t(121),p=t(120),u=t(26),c=t(7),l=t(90),d=t(43),f=t(91),h=t(114),m=t(116),g=t(113),v=t(112),b=t(118),y=t(42),_=t(18),x=t(52),w=t(117),k=t(49),S=t(71),E=t(79),C=t(77).f,P=t(128),A=t(122),O=t(127),T=t(13),R=t(12),M=t(102),L=t(140),D=t(59),j=t(57),N=t(98),F=t(10),I=t(9),B=t(72),q=t(75),U=B.f,V=q.f,G=r.RangeError,z=r.TypeError,W=r.Uint8Array,H="ArrayBuffer",K="Shared"+H,Q="BYTES_PER_ELEMENT",Y="prototype",$=Array[Y],J=p.ArrayBuffer,X=p.DataView,Z=T(0),tt=T(2),et=T(3),nt=T(4),at=T(5),rt=T(6),it=R(!0),ot=R(!1),st=L.values,pt=L.keys,ut=L.entries,ct=$.lastIndexOf,lt=$.reduce,dt=$.reduceRight,ft=$.join,ht=$.sort,mt=$.slice,gt=$.toString,vt=$.toLocaleString,bt=O("iterator"),yt=O("toStringTag"),_t=A("typed_constructor"),xt=A("def_constructor"),wt=s.CONSTR,kt=s.TYPED,St=s.VIEW,Et="Wrong length!",Ct=T(1,function(t,e){return Rt(M(t,t[xt]),e)}),Pt=i(function(){return 1===new W(new Uint16Array([1]).buffer)[0]}),At=!!W&&!!W[Y].set&&i(function(){new W(1).set({})}),Ot=function(t,e){var n=h(t);if(0>n||n%e)throw G("Wrong offset!");return n},Tt=function(t){if(x(t)&&kt in t)return t;throw z(t+" is not a typed array!")},Rt=function(t,e){if(!(x(t)&&_t in t))throw z("It is not a typed array constructor!");return new t(e)},Mt=function(t,e){return Lt(M(t,t[xt]),e)},Lt=function(t,e){for(var n=0,a=e.length,r=Rt(t,a);a>n;)r[n]=e[n++];return r},Dt=function(t,e,n){U(t,e,{get:function(){return this._d[n]}})},jt=function(t){var e,n,a,r,i,o,s=w(t),p=arguments.length,c=p>1?arguments[1]:void 0,l=void 0!==c,d=P(s);if(void 0!=d&&!k(d)){for(o=d.call(s),a=[],e=0;!(i=o.next()).done;e++)a.push(i.value);s=a}for(l&&p>2&&(c=u(c,arguments[2],2)),e=0,n=m(s.length),r=Rt(this,n);n>e;e++)r[e]=l?c(s[e],e):s[e];return r},Nt=function(){for(var t=0,e=arguments.length,n=Rt(this,e);e>t;)n[t]=arguments[t++];return n},Ft=!!W&&i(function(){vt.call(new W(1))}),It=function(){return vt.apply(Ft?mt.call(Tt(this)):Tt(this),arguments)},Bt={copyWithin:function(t,e){return I.call(Tt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return nt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return F.apply(Tt(this),arguments)},filter:function(t){return Mt(this,tt(Tt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return at(Tt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return rt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(Tt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ot(Tt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return it(Tt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return ft.apply(Tt(this),arguments)},lastIndexOf:function(t){return ct.apply(Tt(this),arguments)},map:function(t){return Ct(Tt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return lt.apply(Tt(this),arguments)},reduceRight:function(t){return dt.apply(Tt(this),arguments)},reverse:function(){for(var t,e=this,n=Tt(e).length,a=Math.floor(n/2),r=0;a>r;)t=e[r],e[r++]=e[--n],e[n]=t;return e},some:function(t){return et(Tt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ht.call(Tt(this),t)},subarray:function(t,e){var n=Tt(this),a=n.length,r=v(t,a);return new(M(n,n[xt]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,m((void 0===e?a:v(e,a))-r))}},qt=function(t,e){return Mt(this,mt.call(Tt(this),t,e))},Ut=function(t){Tt(this);var e=Ot(arguments[1],1),n=this.length,a=w(t),r=m(a.length),i=0;if(r+e>n)throw G(Et);for(;r>i;)this[e+i]=a[i++]},Vt={entries:function(){return ut.call(Tt(this))},keys:function(){return pt.call(Tt(this))},values:function(){return st.call(Tt(this))}},Gt=function(t,e){return x(t)&&t[kt]&&"symbol"!=typeof e&&e in t&&+e+""==e+""},zt=function(t,e){return Gt(t,e=b(e,!0))?l(2,t[e]):V(t,e)},Wt=function(t,e,n){return!(Gt(t,e=b(e,!0))&&x(n)&&y(n,"value"))||y(n,"get")||y(n,"set")||n.configurable||y(n,"writable")&&!n.writable||y(n,"enumerable")&&!n.enumerable?U(t,e,n):(t[e]=n.value,t)};wt||(q.f=zt,B.f=Wt),o(o.S+o.F*!wt,"Object",{getOwnPropertyDescriptor:zt,defineProperty:Wt}),i(function(){gt.call({})})&&(gt=vt=function(){return ft.call(this)});var Ht=f({},Bt);f(Ht,Vt),d(Ht,bt,Vt.values),f(Ht,{slice:qt,set:Ut,constructor:function(){},toString:gt,toLocaleString:It}),Dt(Ht,"buffer","b"),Dt(Ht,"byteOffset","o"),Dt(Ht,"byteLength","l"),Dt(Ht,"length","e"),U(Ht,yt,{get:function(){return this[kt]}}),e.exports=function(t,e,n,p){p=!!p;var u=t+(p?"Clamped":"")+"Array",l="get"+t,f="set"+t,h=r[u],v=h||{},b=h&&E(h),y=!h||!s.ABV,w={},k=h&&h[Y],P=function(t,n){var a=t._d;return a.v[l](n*e+a.o,Pt)},A=function(t,n,a){var r=t._d;p&&(a=(a=Math.round(a))<0?0:a>255?255:255&a),r.v[f](n*e+r.o,a,Pt)},O=function(t,e){U(t,e,{get:function(){return P(this,e)},set:function(t){return A(this,e,t)},enumerable:!0})};y?(h=n(function(t,n,a,r){c(t,h,u,"_d");var i,o,s,p,l=0,f=0;if(x(n)){if(!(n instanceof J||(p=_(n))==H||p==K))return kt in n?Lt(h,n):jt.call(h,n);i=n,f=Ot(a,e);var v=n.byteLength;if(void 0===r){if(v%e)throw G(Et);if(o=v-f,0>o)throw G(Et)}else if(o=m(r)*e,o+f>v)throw G(Et);s=o/e}else s=g(n),o=s*e,i=new J(o);for(d(t,"_d",{b:i,o:f,l:o,e:s,v:new X(i)});s>l;)O(t,l++)}),k=h[Y]=S(Ht),d(k,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&j(function(t){new h,new h(null),new h(1.5),new h(t)},!0)||(h=n(function(t,n,a,r){c(t,h,u);var i;return x(n)?n instanceof J||(i=_(n))==H||i==K?void 0!==r?new v(n,Ot(a,e),r):void 0!==a?new v(n,Ot(a,e)):new v(n):kt in n?Lt(h,n):jt.call(h,n):new v(g(n))}),Z(b!==Function.prototype?C(v).concat(C(b)):C(v),function(t){t in h||d(h,t,v[t])}),h[Y]=k,a||(k.constructor=h));var T=k[bt],R=!!T&&("values"==T.name||void 0==T.name),M=Vt.values;d(h,_t,!0),d(k,kt,u),d(k,St,!0),d(k,xt,h),(p?new h(1)[yt]==u:yt in k)||U(k,yt,{get:function(){return u}}),w[u]=h,o(o.G+o.W+o.F*(h!=v),w),o(o.S,u,{BYTES_PER_ELEMENT:e}),o(o.S+o.F*i(function(){v.of.call(h,1)}),u,{from:jt,of:Nt}),Q in k||d(k,Q,e),o(o.P,u,Bt),N(u),o(o.P+o.F*At,u,{set:Ut}),o(o.P+o.F*!R,u,Vt),a||k.toString==gt||(k.toString=gt),o(o.P+o.F*i(function(){new h(1).slice()}),u,{slice:qt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){k.toLocaleString.call([1,2])})),u,{toLocaleString:It}),D[u]=R?T:M,a||R||d(k,bt,M)}}else e.exports=function(){}},{10:10,102:102,112:112,113:113,114:114,116:116,117:117,118:118,12:12,120:120,121:121,122:122,127:127,128:128,13:13,140:140,18:18,26:26,30:30,34:34,36:36,41:41,42:42,43:43,49:49,52:52,57:57,59:59,60:60,7:7,71:71,72:72,75:75,77:77,79:79,9:9,90:90,91:91,98:98}],120:[function(t,e,n){"use strict";function a(t,e,n){var a,r,i,o=Array(n),s=8*n-e-1,p=(1<>1,c=23===e?U(2,-24)-U(2,-77):0,l=0,d=0>t||0===t&&0>1/t?1:0;for(t=q(t),t!=t||t===I?(r=t!=t?1:0,a=p):(a=V(G(t)/z),t*(i=U(2,-a))<1&&(a--,i*=2),t+=a+u>=1?c/i:c*U(2,1-u),t*i>=2&&(a++,i/=2),a+u>=p?(r=0,a=p):a+u>=1?(r=(t*i-1)*U(2,e),a+=u):(r=t*U(2,u-1)*U(2,e),a=0));e>=8;o[l++]=255&r,r/=256,e-=8);for(a=a<0;o[l++]=255&a,a/=256,s-=8);return o[--l]|=128*d,o}function r(t,e,n){var a,r=8*n-e-1,i=(1<>1,s=r-7,p=n-1,u=t[p--],c=127&u;for(u>>=7;s>0;c=256*c+t[p],p--,s-=8);for(a=c&(1<<-s)-1,c>>=-s,s+=e;s>0;a=256*a+t[p],p--,s-=8);if(0===c)c=1-o;else{if(c===i)return a?NaN:u?-I:I;a+=U(2,e),c-=o}return(u?-1:1)*a*U(2,c-e)}function i(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function o(t){return[255&t]}function s(t){return[255&t,t>>8&255]}function p(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function u(t){return a(t,52,8)}function c(t){return a(t,23,4)}function l(t,e,n){C(t[R],e,{get:function(){return this[n]}})}function d(t,e,n,a){var r=+n,i=S(r);if(i+e>t[Y])throw F(L);var o=t[Q]._b,s=i+t[$],p=o.slice(s,s+e);return a?p:p.reverse()}function f(t,e,n,a,r,i){var o=+n,s=S(o);if(s+e>t[Y])throw F(L);for(var p=t[Q]._b,u=s+t[$],c=a(+r),l=0;e>l;l++)p[u+l]=c[i?l:e-l-1]}var h=t(41),m=t(30),g=t(60),v=t(121),b=t(43),y=t(91),_=t(36),x=t(7),w=t(114),k=t(116),S=t(113),E=t(77).f,C=t(72).f,P=t(10),A=t(99),O="ArrayBuffer",T="DataView",R="prototype",M="Wrong length!",L="Wrong index!",D=h[O],j=h[T],N=h.Math,F=h.RangeError,I=h.Infinity,B=D,q=N.abs,U=N.pow,V=N.floor,G=N.log,z=N.LN2,W="buffer",H="byteLength",K="byteOffset",Q=m?"_b":W,Y=m?"_l":H,$=m?"_o":K;if(v.ABV){if(!_(function(){D(1)})||!_(function(){new D(-1)})||_(function(){return new D,new D(1.5),new D(NaN),D.name!=O})){D=function(t){return x(this,D),new B(S(t))};for(var J,X=D[R]=B[R],Z=E(B),tt=0;Z.length>tt;)(J=Z[tt++])in D||b(D,J,B[J]);g||(X.constructor=D)}var et=new j(new D(2)),nt=j[R].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),(et.getInt8(0)||!et.getInt8(1))&&y(j[R],{setInt8:function(t,e){nt.call(this,t,e<<24>>24)},setUint8:function(t,e){nt.call(this,t,e<<24>>24)}},!0)}else D=function(t){x(this,D,O);var e=S(t);this._b=P.call(Array(e),0),this[Y]=e},j=function(t,e,n){x(this,j,T),x(t,D,T);var a=t[Y],r=w(e);if(0>r||r>a)throw F("Wrong offset!");if(n=void 0===n?a-r:k(n),r+n>a)throw F(M);this[Q]=t,this[$]=r,this[Y]=n},m&&(l(D,H,"_l"),l(j,W,"_b"),l(j,H,"_l"),l(j,K,"_o")),y(j[R],{getInt8:function(t){return d(this,1,t)[0]<<24>>24},getUint8:function(t){return d(this,1,t)[0]},getInt16:function(t){var e=d(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=d(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return i(d(this,4,t,arguments[1]))},getUint32:function(t){return i(d(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return r(d(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return r(d(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){f(this,1,t,o,e)},setUint8:function(t,e){f(this,1,t,o,e)},setInt16:function(t,e){f(this,2,t,s,e,arguments[2])},setUint16:function(t,e){f(this,2,t,s,e,arguments[2])},setInt32:function(t,e){f(this,4,t,p,e,arguments[2])},setUint32:function(t,e){f(this,4,t,p,e,arguments[2])},setFloat32:function(t,e){f(this,4,t,c,e,arguments[2])},setFloat64:function(t,e){f(this,8,t,u,e,arguments[2])}});A(D,O),A(j,T),b(j[R],v.VIEW,!0),n[O]=D,n[T]=j},{10:10,113:113,114:114,116:116,121:121,30:30,36:36,41:41,43:43,60:60,7:7,72:72,77:77,91:91,99:99}],121:[function(t,e,n){for(var a,r=t(41),i=t(43),o=t(122),s=o("typed_array"),p=o("view"),u=!(!r.ArrayBuffer||!r.DataView),c=u,l=0,d=9,f="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");d>l;)(a=r[f[l++]])?(i(a.prototype,s,!0),i(a.prototype,p,!0)):c=!1;e.exports={ABV:u,CONSTR:c,TYPED:s,VIEW:p}},{122:122,41:41,43:43}],122:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],123:[function(t,e,n){var a=t(41),r=a.navigator;e.exports=r&&r.userAgent||""},{41:41}],124:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},{52:52}],125:[function(t,e,n){var a=t(41),r=t(24),i=t(60),o=t(126),s=t(72).f;e.exports=function(t){var e=r.Symbol||(r.Symbol=i?{}:a.Symbol||{});"_"==t.charAt(0)||t in e||s(e,t,{value:o.f(t)})}},{126:126,24:24,41:41,60:60,72:72}],126:[function(t,e,n){n.f=t(127)},{127:127}],127:[function(t,e,n){var a=t(101)("wks"),r=t(122),i=t(41).Symbol,o="function"==typeof i,s=e.exports=function(t){return a[t]||(a[t]=o&&i[t]||(o?i:r)("Symbol."+t))};s.store=a},{101:101,122:122,41:41}],128:[function(t,e,n){var a=t(18),r=t(127)("iterator"),i=t(59);e.exports=t(24).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{127:127,18:18,24:24,59:59}],129:[function(t,e,n){var a=t(34),r=t(93)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{34:34,93:93}],130:[function(t,e,n){var a=t(34);a(a.P,"Array",{copyWithin:t(9)}),t(6)("copyWithin")},{34:34,6:6,9:9}],131:[function(t,e,n){"use strict";var a=t(34),r=t(13)(4);a(a.P+a.F*!t(103)([].every,!0),"Array",{every:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],132:[function(t,e,n){var a=t(34);a(a.P,"Array",{fill:t(10)}),t(6)("fill")},{10:10,34:34,6:6}],133:[function(t,e,n){"use strict";var a=t(34),r=t(13)(2);a(a.P+a.F*!t(103)([].filter,!0),"Array",{filter:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],134:[function(t,e,n){"use strict";var a=t(34),r=t(13)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],135:[function(t,e,n){"use strict";var a=t(34),r=t(13)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],136:[function(t,e,n){"use strict";var a=t(34),r=t(13)(0),i=t(103)([].forEach,!0);a(a.P+a.F*!i,"Array",{forEach:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],137:[function(t,e,n){"use strict";var a=t(26),r=t(34),i=t(117),o=t(54),s=t(49),p=t(116),u=t(25),c=t(128);r(r.S+r.F*!t(57)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,l,d=i(t),f="function"==typeof this?this:Array,h=arguments.length,m=h>1?arguments[1]:void 0,g=void 0!==m,v=0,b=c(d);if(g&&(m=a(m,h>2?arguments[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=p(d.length),n=new f(e);e>v;v++)u(n,v,g?m(d[v],v):d[v]);else for(l=b.call(d),n=new f;!(r=l.next()).done;v++)u(n,v,g?o(l,m,[r.value,v],!0):r.value);return n.length=v,n}})},{116:116,117:117,128:128,25:25,26:26,34:34,49:49,54:54,57:57}],138:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!1),i=[].indexOf,o=!!i&&1/[1].indexOf(1,-0)<0;a(a.P+a.F*(o||!t(103)(i)),"Array",{indexOf:function(t){return o?i.apply(this,arguments)||0:r(this,t,arguments[1])}})},{103:103,12:12,34:34}],139:[function(t,e,n){var a=t(34);a(a.S,"Array",{isArray:t(50)})},{34:34,50:50}],140:[function(t,e,n){"use strict";var a=t(6),r=t(58),i=t(59),o=t(115);e.exports=t(56)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{115:115,56:56,58:58,59:59,6:6}],141:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=[].join;a(a.P+a.F*(t(48)!=Object||!t(103)(i)),"Array",{join:function(t){return i.call(r(this),void 0===t?",":t)}})},{103:103,115:115,34:34,48:48}],142:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=t(114),o=t(116),s=[].lastIndexOf,p=!!s&&1/[1].lastIndexOf(1,-0)<0;a(a.P+a.F*(p||!t(103)(s)),"Array",{lastIndexOf:function(t){if(p)return s.apply(this,arguments)||0;var e=r(this),n=o(e.length),a=n-1;for(arguments.length>1&&(a=Math.min(a,i(arguments[1]))),0>a&&(a=n+a);a>=0;a--)if(a in e&&e[a]===t)return a||0;return-1}})},{103:103,114:114,115:115,116:116,34:34}],143:[function(t,e,n){"use strict";var a=t(34),r=t(13)(1);a(a.P+a.F*!t(103)([].map,!0),"Array",{map:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],144:[function(t,e,n){"use strict";var a=t(34),r=t(25);a(a.S+a.F*t(36)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)r(n,t,arguments[t++]);return n.length=e,n}})},{25:25,34:34,36:36}],145:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduceRight,!0),"Array",{reduceRight:function(t){return r(this,t,arguments.length,arguments[1],!0)}})},{103:103,14:14,34:34}],146:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduce,!0),"Array",{reduce:function(t){return r(this,t,arguments.length,arguments[1],!1)}})},{103:103,14:14,34:34}],147:[function(t,e,n){"use strict";var a=t(34),r=t(44),i=t(19),o=t(112),s=t(116),p=[].slice;a(a.P+a.F*t(36)(function(){r&&p.call(r)}),"Array",{slice:function(t,e){var n=s(this.length),a=i(this);if(e=void 0===e?n:e,"Array"==a)return p.call(this,t,e);for(var r=o(t,n),u=o(e,n),c=s(u-r),l=Array(c),d=0;c>d;d++)l[d]="String"==a?this.charAt(r+d):this[r+d];return l}})},{112:112,116:116,19:19,34:34,36:36,44:44}],148:[function(t,e,n){"use strict";var a=t(34),r=t(13)(3);a(a.P+a.F*!t(103)([].some,!0),"Array",{some:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],149:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(117),o=t(36),s=[].sort,p=[1,2,3];a(a.P+a.F*(o(function(){p.sort(void 0)})||!o(function(){p.sort(null)})||!t(103)(s)),"Array",{sort:function(t){return void 0===t?s.call(i(this)):s.call(i(this),r(t))}})},{103:103,117:117,34:34,36:36,4:4}],150:[function(t,e,n){t(98)("Array")},{98:98}],151:[function(t,e,n){var a=t(34);a(a.S,"Date",{now:function(){return(new Date).getTime()}})},{34:34}],152:[function(t,e,n){var a=t(34),r=t(27);a(a.P+a.F*(Date.prototype.toISOString!==r),"Date",{toISOString:r})},{27:27,34:34}],153:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118);a(a.P+a.F*t(36)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=r(this),n=i(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},{117:117,118:118,34:34,36:36}],154:[function(t,e,n){var a=t(127)("toPrimitive"),r=Date.prototype;a in r||t(43)(r,a,t(28))},{127:127,28:28,43:43}],155:[function(t,e,n){var a=Date.prototype,r="Invalid Date",i="toString",o=a[i],s=a.getTime;new Date(NaN)+""!=r&&t(92)(a,i,function(){var t=s.call(this);return t===t?o.call(this):r})},{92:92}],156:[function(t,e,n){var a=t(34);a(a.P,"Function",{bind:t(17)})},{17:17,34:34}],157:[function(t,e,n){"use strict";var a=t(52),r=t(79),i=t(127)("hasInstance"),o=Function.prototype;i in o||t(72).f(o,i,{value:function(t){if("function"!=typeof this||!a(t))return!1;if(!a(this.prototype))return t instanceof this;for(;t=r(t);)if(this.prototype===t)return!0;return!1}})},{127:127,52:52,72:72,79:79}],158:[function(t,e,n){var a=t(72).f,r=Function.prototype,i=/^\s*function ([^ (]*)/,o="name";o in r||t(30)&&a(r,o,{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},{30:30,72:72}],159:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Map";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(r(this,i),t);return e&&e.v},set:function(t,e){return a.def(r(this,i),0===t?0:t,e)}},a,!0)},{124:124,20:20,23:23}],160:[function(t,e,n){var a=t(34),r=t(63),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))&&o(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{34:34,63:63}],161:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(34),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),"Math",{asinh:a})},{34:34}],162:[function(t,e,n){var a=t(34),r=Math.atanh;a(a.S+a.F*!(r&&1/r(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{34:34}],163:[function(t,e,n){var a=t(34),r=t(65);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{34:34,65:65}],164:[function(t,e,n){var a=t(34);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{34:34}],165:[function(t,e,n){var a=t(34),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{34:34}],166:[function(t,e,n){var a=t(34),r=t(61);a(a.S+a.F*(r!=Math.expm1),"Math",{expm1:r})},{34:34,61:61}],167:[function(t,e,n){var a=t(34);a(a.S,"Math",{fround:t(62)})},{34:34,62:62}],168:[function(t,e,n){var a=t(34),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments.length,p=0;s>o;)n=r(arguments[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{34:34}],169:[function(t,e,n){var a=t(34),r=Math.imul;a(a.S+a.F*t(36)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{34:34,36:36}],170:[function(t,e,n){var a=t(34);a(a.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},{34:34}],171:[function(t,e,n){var a=t(34);a(a.S,"Math",{log1p:t(63)})},{34:34,63:63}],172:[function(t,e,n){var a=t(34);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{34:34}],173:[function(t,e,n){var a=t(34);a(a.S,"Math",{sign:t(65)})},{34:34,65:65}],174:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S+a.F*t(36)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{34:34,36:36,61:61}],175:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{34:34,61:61}],176:[function(t,e,n){var a=t(34);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{34:34}],177:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(19),o=t(46),s=t(118),p=t(36),u=t(77).f,c=t(75).f,l=t(72).f,d=t(109).trim,f="Number",h=a[f],m=h,g=h.prototype,v=i(t(71)(g))==f,b="trim"in String.prototype,y=function(t){var e=s(t,!1);if("string"==typeof e&&e.length>2){e=b?e.trim():d(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,p=e.slice(2),u=0,c=p.length;c>u;u++)if(o=p.charCodeAt(u),48>o||o>r)return NaN;return parseInt(p,a)}}return+e};if(!h(" 0o1")||!h("0b1")||h("+0x1")){h=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof h&&(v?p(function(){g.valueOf.call(n)}):i(n)!=f)?o(new m(y(e)),n,h):y(e)};for(var _,x=t(30)?u(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;x.length>w;w++)r(m,_=x[w])&&!r(h,_)&&l(h,_,c(m,_));h.prototype=g,g.constructor=h,t(92)(a,f,h)}},{109:109,118:118,19:19,30:30,36:36,41:41,42:42,46:46,71:71,72:72,75:75,77:77,92:92}],178:[function(t,e,n){var a=t(34);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{34:34}],179:[function(t,e,n){var a=t(34),r=t(41).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{34:34,41:41}],180:[function(t,e,n){var a=t(34);a(a.S,"Number",{isInteger:t(51)})},{34:34,51:51}],181:[function(t,e,n){var a=t(34);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{34:34}],182:[function(t,e,n){var a=t(34),r=t(51),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{34:34,51:51}],183:[function(t,e,n){var a=t(34);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{34:34}],184:[function(t,e,n){var a=t(34);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{34:34}],185:[function(t,e,n){var a=t(34),r=t(86);a(a.S+a.F*(Number.parseFloat!=r),"Number",{parseFloat:r})},{34:34,86:86}],186:[function(t,e,n){var a=t(34),r=t(87);a(a.S+a.F*(Number.parseInt!=r),"Number",{parseInt:r})},{34:34,87:87}],187:[function(t,e,n){"use strict";var a=t(34),r=t(114),i=t(5),o=t(108),s=1..toFixed,p=Math.floor,u=[0,0,0,0,0,0],c="Number.toFixed: incorrect invocation!",l="0",d=function(t,e){for(var n=-1,a=e;++n<6;)a+=t*u[n],u[n]=a%1e7,a=p(a/1e7)},f=function(t){for(var e=6,n=0;--e>=0;)n+=u[e],u[e]=p(n/t),n=n%t*1e7},h=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==u[t]){var n=u[t]+"";e=""===e?n:e+o.call(l,7-n.length)+n}return e},m=function(t,e,n){return 0===e?n:e%2===1?m(t,e-1,n*t):m(t*t,e/2,n)},g=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e};a(a.P+a.F*(!!s&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0))||!t(36)(function(){s.call({})})),"Number",{toFixed:function(t){var e,n,a,s,p=i(this,c),u=r(t),v="",b=l;if(0>u||u>20)throw RangeError(c);if(p!=p)return"NaN";if(-1e21>=p||p>=1e21)return p+"";if(0>p&&(v="-",p=-p),p>1e-21)if(e=g(p*m(2,69,1))-69,n=0>e?p*m(2,-e,1):p/m(2,e,1),n*=4503599627370496,e=52-e,e>0){for(d(0,n),a=u;a>=7;)d(1e7,0),a-=7;for(d(m(10,a,1),0),a=e-1;a>=23;)f(1<<23),a-=23;f(1<0?(s=b.length,b=v+(u>=s?"0."+o.call(l,u-s)+b:b.slice(0,s-u)+"."+b.slice(s-u))):b=v+b,b}})},{108:108,114:114,34:34,36:36,5:5}],188:[function(t,e,n){"use strict";var a=t(34),r=t(36),i=t(5),o=1..toPrecision;a(a.P+a.F*(r(function(){return"1"!==o.call(1,void 0)})||!r(function(){o.call({})})),"Number",{toPrecision:function(t){var e=i(this,"Number#toPrecision: incorrect invocation!");return void 0===t?o.call(e):o.call(e,t)}})},{34:34,36:36,5:5}],189:[function(t,e,n){var a=t(34);a(a.S+a.F,"Object",{assign:t(70)})},{34:34,70:70}],190:[function(t,e,n){var a=t(34);a(a.S,"Object",{create:t(71)})},{34:34,71:71}],191:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperties:t(73)})},{30:30,34:34,73:73}],192:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperty:t(72).f})},{30:30,34:34,72:72}],193:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("freeze",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],194:[function(t,e,n){var a=t(115),r=t(75).f;t(83)("getOwnPropertyDescriptor",function(){return function(t,e){return r(a(t),e)}})},{115:115,75:75,83:83}],195:[function(t,e,n){t(83)("getOwnPropertyNames",function(){return t(76).f})},{76:76,83:83}],196:[function(t,e,n){var a=t(117),r=t(79);t(83)("getPrototypeOf",function(){return function(t){return r(a(t))}})},{117:117,79:79,83:83}],197:[function(t,e,n){var a=t(52);t(83)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}}); -},{52:52,83:83}],198:[function(t,e,n){var a=t(52);t(83)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],199:[function(t,e,n){var a=t(52);t(83)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],200:[function(t,e,n){var a=t(34);a(a.S,"Object",{is:t(94)})},{34:34,94:94}],201:[function(t,e,n){var a=t(117),r=t(81);t(83)("keys",function(){return function(t){return r(a(t))}})},{117:117,81:81,83:83}],202:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("preventExtensions",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],203:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("seal",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],204:[function(t,e,n){var a=t(34);a(a.S,"Object",{setPrototypeOf:t(97).set})},{34:34,97:97}],205:[function(t,e,n){"use strict";var a=t(18),r={};r[t(127)("toStringTag")]="z",r+""!="[object z]"&&t(92)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{127:127,18:18,92:92}],206:[function(t,e,n){var a=t(34),r=t(86);a(a.G+a.F*(parseFloat!=r),{parseFloat:r})},{34:34,86:86}],207:[function(t,e,n){var a=t(34),r=t(87);a(a.G+a.F*(parseInt!=r),{parseInt:r})},{34:34,87:87}],208:[function(t,e,n){"use strict";var a,r,i,o,s=t(60),p=t(41),u=t(26),c=t(18),l=t(34),d=t(52),f=t(4),h=t(7),m=t(40),g=t(102),v=t(111).set,b=t(68)(),y=t(69),_=t(88),x=t(123),w=t(89),k="Promise",S=p.TypeError,E=p.process,C=E&&E.versions,P=C&&C.v8||"",A=p[k],O="process"==c(E),T=function(){},R=r=y.f,M=!!function(){try{var e=A.resolve(1),n=(e.constructor={})[t(127)("species")]=function(t){t(T,T)};return(O||"function"==typeof PromiseRejectionEvent)&&e.then(T)instanceof n&&0!==P.indexOf("6.6")&&-1===x.indexOf("Chrome/66")}catch(a){}}(),L=function(t){var e;return d(t)&&"function"==typeof(e=t.then)?e:!1},D=function(t,e){if(!t._n){t._n=!0;var n=t._c;b(function(){for(var a=t._v,r=1==t._s,i=0,o=function(e){var n,i,o,s=r?e.ok:e.fail,p=e.resolve,u=e.reject,c=e.domain;try{s?(r||(2==t._h&&F(t),t._h=1),s===!0?n=a:(c&&c.enter(),n=s(a),c&&(c.exit(),o=!0)),n===e.promise?u(S("Promise-chain cycle")):(i=L(n))?i.call(n,p,u):p(n)):u(a)}catch(l){c&&!o&&c.exit(),u(l)}};n.length>i;)o(n[i++]);t._c=[],t._n=!1,e&&!t._h&&j(t)})}},j=function(t){v.call(p,function(){var e,n,a,r=t._v,i=N(t);if(i&&(e=_(function(){O?E.emit("unhandledRejection",r,t):(n=p.onunhandledrejection)?n({promise:t,reason:r}):(a=p.console)&&a.error&&a.error("Unhandled promise rejection",r)}),t._h=O||N(t)?2:1),t._a=void 0,i&&e.e)throw e.v})},N=function(t){return 1!==t._h&&0===(t._a||t._c).length},F=function(t){v.call(p,function(){var e;O?E.emit("rejectionHandled",t):(e=p.onrejectionhandled)&&e({promise:t,reason:t._v})})},I=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),D(e,!0))},B=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw S("Promise can't be resolved itself");(e=L(t))?b(function(){var a={_w:n,_d:!1};try{e.call(t,u(B,a,1),u(I,a,1))}catch(r){I.call(a,r)}}):(n._v=t,n._s=1,D(n,!1))}catch(a){I.call({_w:n,_d:!1},a)}}};M||(A=function(t){h(this,A,k,"_h"),f(t),a.call(this);try{t(u(B,this,1),u(I,this,1))}catch(e){I.call(this,e)}},a=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},a.prototype=t(91)(A.prototype,{then:function(t,e){var n=R(g(this,A));return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,n.domain=O?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&D(this,!1),n.promise},"catch":function(t){return this.then(void 0,t)}}),i=function(){var t=new a;this.promise=t,this.resolve=u(B,t,1),this.reject=u(I,t,1)},y.f=R=function(t){return t===A||t===o?new i(t):r(t)}),l(l.G+l.W+l.F*!M,{Promise:A}),t(99)(A,k),t(98)(k),o=t(24)[k],l(l.S+l.F*!M,k,{reject:function(t){var e=R(this),n=e.reject;return n(t),e.promise}}),l(l.S+l.F*(s||!M),k,{resolve:function(t){return w(s&&this===o?A:this,t)}}),l(l.S+l.F*!(M&&t(57)(function(t){A.all(t)["catch"](T)})),k,{all:function(t){var e=this,n=R(e),a=n.resolve,r=n.reject,i=_(function(){var n=[],i=0,o=1;m(t,!1,function(t){var s=i++,p=!1;n.push(void 0),o++,e.resolve(t).then(function(t){p||(p=!0,n[s]=t,--o||a(n))},r)}),--o||a(n)});return i.e&&r(i.v),n.promise},race:function(t){var e=this,n=R(e),a=n.reject,r=_(function(){m(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r.e&&a(r.v),n.promise}})},{102:102,111:111,123:123,127:127,18:18,24:24,26:26,34:34,4:4,40:40,41:41,52:52,57:57,60:60,68:68,69:69,7:7,88:88,89:89,91:91,98:98,99:99}],209:[function(t,e,n){var a=t(34),r=t(4),i=t(8),o=(t(41).Reflect||{}).apply,s=Function.apply;a(a.S+a.F*!t(36)(function(){o(function(){})}),"Reflect",{apply:function(t,e,n){var a=r(t),p=i(n);return o?o(a,e,p):s.call(a,e,p)}})},{34:34,36:36,4:4,41:41,8:8}],210:[function(t,e,n){var a=t(34),r=t(71),i=t(4),o=t(8),s=t(52),p=t(36),u=t(17),c=(t(41).Reflect||{}).construct,l=p(function(){function t(){}return!(c(function(){},[],t)instanceof t)}),d=!p(function(){c(function(){})});a(a.S+a.F*(l||d),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(d&&!l)return c(t,e,n);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var a=[null];return a.push.apply(a,e),new(u.apply(t,a))}var p=n.prototype,f=r(s(p)?p:Object.prototype),h=Function.apply.call(t,f,e);return s(h)?h:f}})},{17:17,34:34,36:36,4:4,41:41,52:52,71:71,8:8}],211:[function(t,e,n){var a=t(72),r=t(34),i=t(8),o=t(118);r(r.S+r.F*t(36)(function(){Reflect.defineProperty(a.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=o(e,!0),i(n);try{return a.f(t,e,n),!0}catch(r){return!1}}})},{118:118,34:34,36:36,72:72,8:8}],212:[function(t,e,n){var a=t(34),r=t(75).f,i=t(8);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{34:34,75:75,8:8}],213:[function(t,e,n){"use strict";var a=t(34),r=t(8),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(55)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{34:34,55:55,8:8}],214:[function(t,e,n){var a=t(75),r=t(34),i=t(8);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.f(i(t),e)}})},{34:34,75:75,8:8}],215:[function(t,e,n){var a=t(34),r=t(79),i=t(8);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{34:34,79:79,8:8}],216:[function(t,e,n){function a(t,e){var n,s,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=r.f(t,e))?o(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:p(s=i(t))?a(s,e,c):void 0}var r=t(75),i=t(79),o=t(42),s=t(34),p=t(52),u=t(8);s(s.S,"Reflect",{get:a})},{34:34,42:42,52:52,75:75,79:79,8:8}],217:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{34:34}],218:[function(t,e,n){var a=t(34),r=t(8),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{34:34,8:8}],219:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{ownKeys:t(85)})},{34:34,85:85}],220:[function(t,e,n){var a=t(34),r=t(8),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{34:34,8:8}],221:[function(t,e,n){var a=t(34),r=t(97);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{34:34,97:97}],222:[function(t,e,n){function a(t,e,n){var p,d,f=arguments.length<4?t:arguments[3],h=i.f(c(t),e);if(!h){if(l(d=o(t)))return a(d,e,n,f);h=u(0)}if(s(h,"value")){if(h.writable===!1||!l(f))return!1;if(p=i.f(f,e)){if(p.get||p.set||p.writable===!1)return!1;p.value=n,r.f(f,e,p)}else r.f(f,e,u(0,n));return!0}return void 0===h.set?!1:(h.set.call(f,n),!0)}var r=t(72),i=t(75),o=t(79),s=t(42),p=t(34),u=t(90),c=t(8),l=t(52);p(p.S,"Reflect",{set:a})},{34:34,42:42,52:52,72:72,75:75,79:79,8:8,90:90}],223:[function(t,e,n){var a=t(41),r=t(46),i=t(72).f,o=t(77).f,s=t(53),p=t(38),u=a.RegExp,c=u,l=u.prototype,d=/a/g,f=/a/g,h=new u(d)!==d;if(t(30)&&(!h||t(36)(function(){return f[t(127)("match")]=!1,u(d)!=d||u(f)==f||"/a/i"!=u(d,"i")}))){u=function(t,e){var n=this instanceof u,a=s(t),i=void 0===e;return!n&&a&&t.constructor===u&&i?t:r(h?new c(a&&!i?t.source:t,e):c((a=t instanceof u)?t.source:t,a&&i?p.call(t):e),n?this:l,u)};for(var m=(function(t){t in u||i(u,t,{configurable:!0,get:function(){return c[t]},set:function(e){c[t]=e}})}),g=o(c),v=0;g.length>v;)m(g[v++]);l.constructor=u,u.prototype=l,t(92)(a,"RegExp",u)}t(98)("RegExp")},{127:127,30:30,36:36,38:38,41:41,46:46,53:53,72:72,77:77,92:92,98:98}],224:[function(t,e,n){t(30)&&"g"!=/./g.flags&&t(72).f(RegExp.prototype,"flags",{configurable:!0,get:t(38)})},{30:30,38:38,72:72}],225:[function(t,e,n){t(37)("match",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],226:[function(t,e,n){t(37)("replace",2,function(t,e,n){return[function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)},n]})},{37:37}],227:[function(t,e,n){t(37)("search",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],228:[function(t,e,n){t(37)("split",2,function(e,n,a){"use strict";var r=t(53),i=a,o=[].push,s="split",p="length",u="lastIndex";if("c"=="abbc"[s](/(b)*/)[1]||4!="test"[s](/(?:)/,-1)[p]||2!="ab"[s](/(?:ab)*/)[p]||4!="."[s](/(.?)(.?)/)[p]||"."[s](/()()/)[p]>1||""[s](/.?/)[p]){var c=void 0===/()??/.exec("")[1];a=function(t,e){var n=this+"";if(void 0===t&&0===e)return[];if(!r(t))return i.call(n,t,e);var a,s,l,d,f,h=[],m=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),g=0,v=void 0===e?4294967295:e>>>0,b=RegExp(t.source,m+"g");for(c||(a=RegExp("^"+b.source+"$(?!\\s)",m));(s=b.exec(n))&&(l=s.index+s[0][p],!(l>g&&(h.push(n.slice(g,s.index)),!c&&s[p]>1&&s[0].replace(a,function(){for(f=1;f1&&s.index=v)));)b[u]===s.index&&b[u]++;return g===n[p]?(d||!b.test(""))&&h.push(""):h.push(n.slice(g)),h[p]>v?h.slice(0,v):h}}else"0"[s](void 0,0)[p]&&(a=function(t,e){return void 0===t&&0===e?[]:i.call(this,t,e)});return[function(t,r){var i=e(this),o=void 0==t?void 0:t[n];return void 0!==o?o.call(t,i,r):a.call(i+"",t,r)},a]})},{37:37,53:53}],229:[function(t,e,n){"use strict";t(224);var a=t(8),r=t(38),i=t(30),o="toString",s=/./[o],p=function(e){t(92)(RegExp.prototype,o,e,!0)};t(36)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?p(function(){var t=a(this);return"/".concat(t.source,"/","flags"in t?t.flags:!i&&t instanceof RegExp?r.call(t):void 0)}):s.name!=o&&p(function(){return s.call(this)})},{224:224,30:30,36:36,38:38,8:8,92:92}],230:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Set";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t=0===t?0:t,t)}},a)},{124:124,20:20,23:23}],231:[function(t,e,n){"use strict";t(106)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},{106:106}],232:[function(t,e,n){"use strict";t(106)("big",function(t){return function(){return t(this,"big","","")}})},{106:106}],233:[function(t,e,n){"use strict";t(106)("blink",function(t){return function(){return t(this,"blink","","")}})},{106:106}],234:[function(t,e,n){"use strict";t(106)("bold",function(t){return function(){return t(this,"b","","")}})},{106:106}],235:[function(t,e,n){"use strict";var a=t(34),r=t(104)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{104:104,34:34}],236:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="endsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments.length>1?arguments[1]:void 0,a=r(e.length),p=void 0===n?a:Math.min(r(n),a),u=t+"";return s?s.call(e,u,p):e.slice(p-u.length,p)===u}})},{105:105,116:116,34:34,35:35}],237:[function(t,e,n){"use strict";t(106)("fixed",function(t){return function(){return t(this,"tt","","")}})},{106:106}],238:[function(t,e,n){"use strict";t(106)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},{106:106}],239:[function(t,e,n){"use strict";t(106)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},{106:106}],240:[function(t,e,n){var a=t(34),r=t(112),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments.length,o=0;a>o;){if(e=+arguments[o++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{112:112,34:34}],241:[function(t,e,n){"use strict";var a=t(34),r=t(105),i="includes";a(a.P+a.F*t(35)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{105:105,34:34,35:35}],242:[function(t,e,n){"use strict";t(106)("italics",function(t){return function(){return t(this,"i","","")}})},{106:106}],243:[function(t,e,n){"use strict";var a=t(104)(!0);t(56)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{104:104,56:56}],244:[function(t,e,n){"use strict";t(106)("link",function(t){return function(e){return t(this,"a","href",e)}})},{106:106}],245:[function(t,e,n){var a=t(34),r=t(115),i=t(116);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments.length,o=[],s=0;n>s;)o.push(e[s++]+""),a>s&&o.push(arguments[s]+"");return o.join("")}})},{115:115,116:116,34:34}],246:[function(t,e,n){var a=t(34);a(a.P,"String",{repeat:t(108)})},{108:108,34:34}],247:[function(t,e,n){"use strict";t(106)("small",function(t){return function(){return t(this,"small","","")}})},{106:106}],248:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="startsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=r(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),a=t+"";return s?s.call(e,a,n):e.slice(n,n+a.length)===a}})},{105:105,116:116,34:34,35:35}],249:[function(t,e,n){"use strict";t(106)("strike",function(t){return function(){return t(this,"strike","","")}})},{106:106}],250:[function(t,e,n){"use strict";t(106)("sub",function(t){return function(){return t(this,"sub","","")}})},{106:106}],251:[function(t,e,n){"use strict";t(106)("sup",function(t){return function(){return t(this,"sup","","")}})},{106:106}],252:[function(t,e,n){"use strict";t(109)("trim",function(t){return function(){return t(this,3)}})},{109:109}],253:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(30),o=t(34),s=t(92),p=t(66).KEY,u=t(36),c=t(101),l=t(99),d=t(122),f=t(127),h=t(126),m=t(125),g=t(33),v=t(50),b=t(8),y=t(52),_=t(115),x=t(118),w=t(90),k=t(71),S=t(76),E=t(75),C=t(72),P=t(81),A=E.f,O=C.f,T=S.f,R=a.Symbol,M=a.JSON,L=M&&M.stringify,D="prototype",j=f("_hidden"),N=f("toPrimitive"),F={}.propertyIsEnumerable,I=c("symbol-registry"),B=c("symbols"),q=c("op-symbols"),U=Object[D],V="function"==typeof R,G=a.QObject,z=!G||!G[D]||!G[D].findChild,W=i&&u(function(){return 7!=k(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=A(U,e);a&&delete U[e],O(t,e,n),a&&t!==U&&O(U,e,a)}:O,H=function(t){var e=B[t]=k(R[D]);return e._k=t,e},K=V&&"symbol"==typeof R.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof R},Q=function(t,e,n){return t===U&&Q(q,e,n),b(t),e=x(e,!0),b(n),r(B,e)?(n.enumerable?(r(t,j)&&t[j][e]&&(t[j][e]=!1),n=k(n,{enumerable:w(0,!1)})):(r(t,j)||O(t,j,w(1,{})),t[j][e]=!0),W(t,e,n)):O(t,e,n)},Y=function(t,e){b(t);for(var n,a=g(e=_(e)),r=0,i=a.length;i>r;)Q(t,n=a[r++],e[n]);return t},$=function(t,e){return void 0===e?k(t):Y(k(t),e)},J=function(t){var e=F.call(this,t=x(t,!0));return this===U&&r(B,t)&&!r(q,t)?!1:e||!r(this,t)||!r(B,t)||r(this,j)&&this[j][t]?e:!0},X=function(t,e){if(t=_(t),e=x(e,!0),t!==U||!r(B,e)||r(q,e)){var n=A(t,e);return!n||!r(B,e)||r(t,j)&&t[j][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=T(_(t)),a=[],i=0;n.length>i;)r(B,e=n[i++])||e==j||e==p||a.push(e);return a},tt=function(t){for(var e,n=t===U,a=T(n?q:_(t)),i=[],o=0;a.length>o;)r(B,e=a[o++])&&(n?r(U,e):!0)&&i.push(B[e]);return i};V||(R=function(){if(this instanceof R)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(n){this===U&&e.call(q,n),r(this,j)&&r(this[j],t)&&(this[j][t]=!1),W(this,t,w(1,n))};return i&&z&&W(U,t,{configurable:!0,set:e}),H(t)},s(R[D],"toString",function(){return this._k}),E.f=X,C.f=Q,t(77).f=S.f=Z,t(82).f=J,t(78).f=tt,i&&!t(60)&&s(U,"propertyIsEnumerable",J,!0),h.f=function(t){return H(f(t))}),o(o.G+o.W+o.F*!V,{Symbol:R});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)f(et[nt++]);for(var at=P(f.store),rt=0;at.length>rt;)m(at[rt++]);o(o.S+o.F*!V,"Symbol",{"for":function(t){return r(I,t+="")?I[t]:I[t]=R(t)},keyFor:function(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var e in I)if(I[e]===t)return e},useSetter:function(){z=!0},useSimple:function(){z=!1}}),o(o.S+o.F*!V,"Object",{create:$,defineProperty:Q,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),M&&o(o.S+o.F*(!V||u(function(){var t=R();return"[null]"!=L([t])||"{}"!=L({a:t})||"{}"!=L(Object(t))})),"JSON",{stringify:function(t){for(var e,n,a=[t],r=1;arguments.length>r;)a.push(arguments[r++]);return n=e=a[1],!y(e)&&void 0===t||K(t)?void 0:(v(e)||(e=function(t,e){return"function"==typeof n&&(e=n.call(this,t,e)),K(e)?void 0:e}),a[1]=e,L.apply(M,a))}}),R[D][N]||t(43)(R[D],N,R[D].valueOf),l(R,"Symbol"),l(Math,"Math",!0),l(a.JSON,"JSON",!0)},{101:101,115:115,118:118,122:122,125:125,126:126,127:127,30:30,33:33,34:34,36:36,41:41,42:42,43:43,50:50,52:52,60:60,66:66,71:71,72:72,75:75,76:76,77:77,78:78,8:8,81:81,82:82,90:90,92:92,99:99}],254:[function(t,e,n){"use strict";var a=t(34),r=t(121),i=t(120),o=t(8),s=t(112),p=t(116),u=t(52),c=t(41).ArrayBuffer,l=t(102),d=i.ArrayBuffer,f=i.DataView,h=r.ABV&&c.isView,m=d.prototype.slice,g=r.VIEW,v="ArrayBuffer";a(a.G+a.W+a.F*(c!==d),{ArrayBuffer:d}),a(a.S+a.F*!r.CONSTR,v,{isView:function(t){return h&&h(t)||u(t)&&g in t}}),a(a.P+a.U+a.F*t(36)(function(){return!new d(2).slice(1,void 0).byteLength}),v,{slice:function(t,e){if(void 0!==m&&void 0===e)return m.call(o(this),t);for(var n=o(this).byteLength,a=s(t,n),r=s(void 0===e?n:e,n),i=new(l(this,d))(p(r-a)),u=new f(this),c=new f(i),h=0;r>a;)c.setUint8(h++,u.getUint8(a++));return i}}),t(98)(v)},{102:102,112:112,116:116,120:120,121:121,34:34,36:36,41:41,52:52,8:8,98:98}],255:[function(t,e,n){var a=t(34);a(a.G+a.W+a.F*!t(121).ABV,{DataView:t(120).DataView})},{120:120,121:121,34:34}],256:[function(t,e,n){t(119)("Float32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],257:[function(t,e,n){t(119)("Float64",8,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],258:[function(t,e,n){t(119)("Int16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],259:[function(t,e,n){t(119)("Int32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],260:[function(t,e,n){t(119)("Int8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],261:[function(t,e,n){t(119)("Uint16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],262:[function(t,e,n){t(119)("Uint32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],263:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],264:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}},!0)},{119:119}],265:[function(t,e,n){"use strict";var a,r=t(13)(0),i=t(92),o=t(66),s=t(70),p=t(22),u=t(52),c=t(36),l=t(124),d="WeakMap",f=o.getWeak,h=Object.isExtensible,m=p.ufstore,g={},v=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},b={get:function(t){if(u(t)){var e=f(t);return e===!0?m(l(this,d)).get(t):e?e[this._i]:void 0}},set:function(t,e){return p.def(l(this,d),t,e)}},y=e.exports=t(23)(d,v,b,p,!0,!0);c(function(){return 7!=(new y).set((Object.freeze||Object)(g),7).get(g)})&&(a=p.getConstructor(v,d),s(a.prototype,b),o.NEED=!0,r(["delete","has","get","set"],function(t){var e=y.prototype,n=e[t];i(e,t,function(e,r){if(u(e)&&!h(e)){this._f||(this._f=new a);var i=this._f[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})}))},{124:124,13:13,22:22,23:23,36:36,52:52,66:66,70:70,92:92}],266:[function(t,e,n){"use strict";var a=t(22),r=t(124),i="WeakSet";t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t,!0)}},a,!1,!0)},{124:124,22:22,23:23}],267:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(4),p=t(16);a(a.P,"Array",{flatMap:function(t){var e,n,a=i(this);return s(t),e=o(a.length),n=p(a,0),r(n,a,a,e,0,1,t,arguments[1]),n}}),t(6)("flatMap")},{116:116,117:117,16:16,34:34,39:39,4:4,6:6}],268:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(114),p=t(16);a(a.P,"Array",{flatten:function(){var t=arguments[0],e=i(this),n=o(e.length),a=p(e,0);return r(a,e,e,n,0,void 0===t?1:s(t)),a}}),t(6)("flatten")},{114:114,116:116,117:117,16:16,34:34,39:39,6:6}],269:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)("includes")},{12:12,34:34,6:6}],270:[function(t,e,n){var a=t(34),r=t(68)(),i=t(41).process,o="process"==t(19)(i);a(a.G,{asap:function(t){var e=o&&i.domain;r(e?e.bind(t):t)}})},{19:19,34:34,41:41,68:68}],271:[function(t,e,n){var a=t(34),r=t(19);a(a.S,"Error",{isError:function(t){return"Error"===r(t)}})},{19:19,34:34}],272:[function(t,e,n){var a=t(34);a(a.G,{global:t(41)})},{34:34,41:41}],273:[function(t,e,n){t(95)("Map")},{95:95}],274:[function(t,e,n){t(96)("Map")},{96:96}],275:[function(t,e,n){var a=t(34);a(a.P+a.R,"Map",{toJSON:t(21)("Map")})},{21:21,34:34}],276:[function(t,e,n){var a=t(34);a(a.S,"Math",{clamp:function(t,e,n){return Math.min(n,Math.max(e,t))}})},{34:34}],277:[function(t,e,n){var a=t(34);a(a.S,"Math",{DEG_PER_RAD:Math.PI/180})},{34:34}],278:[function(t,e,n){var a=t(34),r=180/Math.PI;a(a.S,"Math",{degrees:function(t){return t*r}})},{34:34}],279:[function(t,e,n){var a=t(34),r=t(64),i=t(62);a(a.S,"Math",{fscale:function(t,e,n,a,o){return i(r(t,e,n,a,o))}})},{34:34,62:62,64:64}],280:[function(t,e,n){var a=t(34);a(a.S,"Math",{iaddh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i+(a>>>0)+((r&o|(r|o)&~(r+o>>>0))>>>31)|0}})},{34:34}],281:[function(t,e,n){var a=t(34);a(a.S,"Math",{imulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>16,p=r>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>16)+((i*p>>>0)+(u&n)>>16)}})},{34:34}],282:[function(t,e,n){var a=t(34);a(a.S,"Math",{isubh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i-(a>>>0)-((~r&o|~(r^o)&r-o>>>0)>>>31)|0}})},{34:34}],283:[function(t,e,n){var a=t(34);a(a.S,"Math",{RAD_PER_DEG:180/Math.PI})},{34:34}],284:[function(t,e,n){var a=t(34),r=Math.PI/180;a(a.S,"Math",{radians:function(t){return t*r}})},{34:34}],285:[function(t,e,n){var a=t(34);a(a.S,"Math",{scale:t(64)})},{34:34,64:64}],286:[function(t,e,n){var a=t(34);a(a.S,"Math",{signbit:function(t){return(t=+t)!=t?t:0==t?1/t==1/0:t>0}})},{34:34}],287:[function(t,e,n){var a=t(34);a(a.S,"Math",{umulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>>16,p=r>>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>>16)+((i*p>>>0)+(u&n)>>>16)}})},{34:34}],288:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineGetter__:function(t,e){o.f(r(this),t,{get:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],289:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineSetter__:function(t,e){o.f(r(this),t,{set:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],290:[function(t,e,n){var a=t(34),r=t(84)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{34:34,84:84}],291:[function(t,e,n){var a=t(34),r=t(85),i=t(115),o=t(75),s=t(25);a(a.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,a=i(t),p=o.f,u=r(a),c={},l=0;u.length>l;)n=p(a,e=u[l++]),void 0!==n&&s(c,e,n);return c}})},{115:115,25:25,34:34,75:75,85:85}],292:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupGetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.get;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],293:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupSetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.set;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],294:[function(t,e,n){var a=t(34),r=t(84)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{34:34,84:84}],295:[function(t,e,n){"use strict";var a=t(34),r=t(41),i=t(24),o=t(68)(),s=t(127)("observable"),p=t(4),u=t(8),c=t(7),l=t(91),d=t(43),f=t(40),h=f.RETURN,m=function(t){return null==t?void 0:p(t)},g=function(t){var e=t._c;e&&(t._c=void 0,e())},v=function(t){return void 0===t._o},b=function(t){v(t)||(t._o=void 0,g(t))},y=function(t,e){u(t),this._c=void 0,this._o=t,t=new _(this);try{var n=e(t),a=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){a.unsubscribe()}:p(n),this._c=n)}catch(r){return void t.error(r)}v(this)&&g(this)};y.prototype=l({},{unsubscribe:function(){b(this)}});var _=function(t){this._s=t};_.prototype=l({},{next:function(t){var e=this._s;if(!v(e)){var n=e._o;try{var a=m(n.next);if(a)return a.call(n,t)}catch(r){try{b(e)}finally{throw r}}}},error:function(t){var e=this._s;if(v(e))throw t;var n=e._o;e._o=void 0;try{var a=m(n.error);if(!a)throw t;t=a.call(n,t)}catch(r){try{g(e)}finally{throw r}}return g(e),t},complete:function(t){var e=this._s;if(!v(e)){var n=e._o;e._o=void 0;try{var a=m(n.complete);t=a?a.call(n,t):void 0}catch(r){try{g(e)}finally{throw r}}return g(e),t}}});var x=function(t){c(this,x,"Observable","_f")._f=p(t)};l(x.prototype,{subscribe:function(t){return new y(t,this._f)},forEach:function(t){var e=this;return new(i.Promise||r.Promise)(function(n,a){p(t);var r=e.subscribe({next:function(e){try{return t(e)}catch(n){a(n),r.unsubscribe()}},error:a,complete:n})})}}),l(x,{from:function(t){var e="function"==typeof this?this:x,n=m(u(t)[s]);if(n){var a=u(n.call(t));return a.constructor===e?a:new e(function(t){return a.subscribe(t)})}return new e(function(e){var n=!1;return o(function(){if(!n){try{if(f(t,!1,function(t){return e.next(t),n?h:void 0})===h)return}catch(a){if(n)throw a;return void e.error(a)}e.complete()}}),function(){n=!0}})},of:function(){for(var t=0,e=arguments.length,n=Array(e);e>t;)n[t]=arguments[t++];return new("function"==typeof this?this:x)(function(t){var e=!1;return o(function(){if(!e){for(var a=0;a1?arguments[1]:void 0,!1)}})},{107:107,123:123,34:34}],313:[function(t,e,n){"use strict";var a=t(34),r=t(107),i=t(123);a(a.P+a.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padStart:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{107:107,123:123,34:34}],314:[function(t,e,n){"use strict";t(109)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},{109:109}],315:[function(t,e,n){"use strict";t(109)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},{109:109}],316:[function(t,e,n){t(125)("asyncIterator")},{125:125}],317:[function(t,e,n){t(125)("observable")},{125:125}],318:[function(t,e,n){var a=t(34);a(a.S,"System",{global:t(41) -})},{34:34,41:41}],319:[function(t,e,n){t(95)("WeakMap")},{95:95}],320:[function(t,e,n){t(96)("WeakMap")},{96:96}],321:[function(t,e,n){t(95)("WeakSet")},{95:95}],322:[function(t,e,n){t(96)("WeakSet")},{96:96}],323:[function(t,e,n){for(var a=t(140),r=t(81),i=t(92),o=t(41),s=t(43),p=t(59),u=t(127),c=u("iterator"),l=u("toStringTag"),d=p.Array,f={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=r(f),m=0;m2,r=a?o.call(arguments,2):!1;return t(a?function(){("function"==typeof e?e:Function(e)).apply(this,r)}:e,n)}};r(r.G+r.B+r.F*s,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{123:123,34:34,41:41}],326:[function(t,e,n){t(253),t(190),t(192),t(191),t(194),t(196),t(201),t(195),t(193),t(203),t(202),t(198),t(199),t(197),t(189),t(200),t(204),t(205),t(156),t(158),t(157),t(207),t(206),t(177),t(187),t(188),t(178),t(179),t(180),t(181),t(182),t(183),t(184),t(185),t(186),t(160),t(161),t(162),t(163),t(164),t(165),t(166),t(167),t(168),t(169),t(170),t(171),t(172),t(173),t(174),t(175),t(176),t(240),t(245),t(252),t(243),t(235),t(236),t(241),t(246),t(248),t(231),t(232),t(233),t(234),t(237),t(238),t(239),t(242),t(244),t(247),t(249),t(250),t(251),t(151),t(153),t(152),t(155),t(154),t(139),t(137),t(144),t(141),t(147),t(149),t(136),t(143),t(133),t(148),t(131),t(146),t(145),t(138),t(142),t(130),t(132),t(135),t(134),t(150),t(140),t(223),t(229),t(224),t(225),t(226),t(227),t(228),t(208),t(159),t(230),t(265),t(266),t(254),t(255),t(260),t(263),t(264),t(258),t(261),t(259),t(262),t(256),t(257),t(209),t(210),t(211),t(212),t(213),t(216),t(214),t(215),t(217),t(218),t(219),t(220),t(222),t(221),t(269),t(267),t(268),t(310),t(313),t(312),t(314),t(315),t(311),t(316),t(317),t(291),t(294),t(290),t(288),t(289),t(292),t(293),t(275),t(309),t(274),t(308),t(320),t(322),t(273),t(307),t(319),t(321),t(272),t(318),t(271),t(276),t(277),t(278),t(279),t(280),t(282),t(281),t(283),t(284),t(285),t(287),t(286),t(296),t(297),t(298),t(299),t(301),t(300),t(303),t(302),t(304),t(305),t(306),t(270),t(295),t(325),t(324),t(323),e.exports=t(24)},{130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,188:188,189:189,190:190,191:191,192:192,193:193,194:194,195:195,196:196,197:197,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,216:216,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,24:24,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325}],327:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=p?e(i):document.fonts.load(u(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(d,25)},function(){e(i)})};d()}else n(function(){function n(){var e;(e=-1!=g&&-1!=v||-1!=g&&-1!=b||-1!=v&&-1!=b)&&((e=g!=v&&g!=b&&v!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(g==y&&v==y&&b==y||g==_&&v==_&&b==_||g==x&&v==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function d(){if((new Date).getTime()-c>=p)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(g=f.a.offsetWidth,v=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(d,50)}}var f=new a(s),h=new a(s),m=new a(s),g=-1,v=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(f,u(i,"sans-serif")),r(h,u(i,"serif")),r(m,u(i,"monospace")),w.appendChild(f.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=f.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,d(),o(f,function(t){g=t,n()}),r(f,u(i,'"'+i.family+'",sans-serif')),o(h,function(t){v=t,n()}),r(h,u(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,u(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],330:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[v]];return e||(e={},b++,t[v]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),d)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():g.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function p(t,e){if(t||(t=n),d)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),p=s.length;p>i;i++)a.createElement(s[i]);return a}function u(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),d||u(t,e),t}var l,d,f="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,g=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,d=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,d=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:f,shivCSS:h.shivCSS!==!1,supportsUnknownElements:d,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:p,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],331:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o,s=n.slice(),p=r(e,t),u=0,c=s.length;c>u&&(i=s[u],"object"==typeof i?"function"==typeof i.handleEvent&&i.handleEvent(p):i.call(t,p),!p.stoppedImmediatePropagation);u++);return o=!p.stoppedPropagation,a&&o&&t.parentNode?t.parentNode.dispatchEvent(p):!p.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=y(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function p(t){!f&&S.test(document.readyState)&&(f=!f,document.detachEvent(h,p),t=document.createEvent("Event"),t.initEvent(m,!0,!0),document.dispatchEvent(t))}function u(t){return function(){return P[t]||document.body&&document.body[t]||0}}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var d=!0,f=!1,h="onreadystatechange",m="DOMContentLoaded",g="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},b=Object.defineProperties||function(e,n){for(var a in n)if(_.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},y=Object.getOwnPropertyDescriptor,_=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,k=/^[a-z]+$/,S=/loaded|complete/,E={},C=document.createElement("div"),P=document.documentElement,A=P.removeAttribute,O=P.setAttribute,T=function(t){return{enumerable:!0,writable:!0,configurable:!0,value:t}};a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(w,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(y(t.CSSStyleSheet.prototype,"cssText")));var R=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;v(t.CSSStyleDeclaration.prototype,"opacity",{get:function(){var t=this.filter.match(R);return t?""+t[1]/100:""},set:function(t){this.zoom=1;var e=!1;t=1>t?" alpha(opacity="+Math.round(100*t)+")":"",this.filter=this.filter.replace(R,function(){return e=!0,t}),!e&&t&&(this.filter+=t)}}),b(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:T(function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,p=this,u="on"+t,c=p[g]||v(p,g,{value:{}})[g],d=c[u]||(c[u]={}),f=d.h||(d.h=[]);if(!_.call(d,"w")){if(d.w=function(t){return t[g]||e(p,l(p,t),f,!1)},!_.call(E,u))if(k.test(t)){try{r=document.createEventObject(),r[g]=!0,9!=p.nodeType&&(null==p.parentNode&&C.appendChild(p),(o=p.getAttribute(u))&&A.call(p,u)),p.fireEvent(u,r),E[u]=!0}catch(h){for(E[u]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&O.call(p,u,o)}else E[u]=!1;(d.n=E[u])&&p.attachEvent(u,d.w)}i(f,n)<0&&f[a?"unshift":"push"](n),"input"===t&&p.attachEvent("onkeyup",s)}}),dispatchEvent:T(function(t){var n,a=this,r="on"+t.type,i=a[g],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}),removeEventListener:T(function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[g],s=o&&o[r],p=s&&s.h,u=p?i(p,e):-1;u>-1&&p.splice(u,1)}})}),b(w,{addEventListener:T(x.addEventListener),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener)}),b(t.XMLHttpRequest.prototype,{addEventListener:T(function(t,e,n){var a=this,r="on"+t,o=a[g]||v(a,g,{value:{}})[g],s=o[r]||(o[r]={}),p=s.h||(s.h=[]);i(p,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),p[n?"unshift":"push"](e))}),dispatchEvent:T(function(t){var n=this,a="on"+t.type,r=n[g],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}),removeEventListener:T(x.removeEventListener)});var M=y(Event.prototype,"button").get;b(t.Event.prototype,{bubbles:T(!0),cancelable:T(!0),preventDefault:T(function(){this.cancelable&&(this.returnValue=!1)}),stopPropagation:T(function(){this.stoppedPropagation=!0,this.cancelBubble=!0}),stopImmediatePropagation:T(function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}),initEvent:T(function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+t.scrollX-(P.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+t.scrollY-(P.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?void 0:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return M.call(this)}},button:{get:function(){var t=this.buttons;return 1&t?0:2&t?2:4&t?1:void 0}},defaultPrevented:{get:function(){var t,e=this.returnValue;return!(e===t||e)}},relatedTarget:{get:function(){var t=this.type;return"mouseover"===t?this.fromElement:"mouseout"===t?this.toElement:null}}}),b(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:T(function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),d&&e===m&&!S.test(r.readyState)&&(d=!1,r.attachEvent(h,p),t==top&&!function i(t){try{r.documentElement.doScroll("left"),p()}catch(e){setTimeout(i,50)}}())}),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener),createEvent:T(function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e})}),b(t.Window.prototype,{getComputedStyle:T(function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,p=this._,u=p.style,c=p.currentStyle,l=p.runtimeStyle;return"opacity"==t?u.opacity||"1":(t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:u[t],n.test(e)&&!a.test(t)&&(o=u.left,s=l&&l.left,s&&(l.left=c.left),u.left="fontSize"===t?"1em":e,e=u.pixelLeft+"px",u.left=o,s&&(l.left=s)),null==e?e:e+""||"auto")},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()),addEventListener:T(function(n,a,r){var o,s=t,p="on"+n;s[p]||(s[p]=function(t){return e(s,l(s,t),o,!1)&&void 0}),o=s[p][g]||(s[p][g]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}),dispatchEvent:T(function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}),removeEventListener:T(function(e,n,a){var r="on"+e,o=(t[r]||Object)[g],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}),pageXOffset:{get:u("scrollLeft")},pageYOffset:{get:u("scrollTop")},scrollX:{get:u("scrollLeft")},scrollY:{get:u("scrollTop")},innerWidth:{get:u("clientWidth")},innerHeight:{get:u("clientHeight")}}),t.HTMLElement=t.Element,function(t,e,n){for(n=0;na;a++)e.appendChild(n[a].cloneNode(!0));return e},n.cloneRange=function(){var t=new e;return t._start=this._start,t._end=this._end,t},n.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.removeChild(n[a])},n.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.appendChild(n[a]);return e},n.setEndAfter=function(t){this._end=t},n.setEndBefore=function(t){this._end=t.previousSibling},n.setStartAfter=function(t){this._start=t.nextSibling},n.setStartBefore=function(t){this._start=t}}}()}}(this.window||t)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],332:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=s)return(0,p["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,u.times)(a,(0,u.minus)(n[l],n[l-1])));for(var d=[(0,u.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)d.push((0,u.minus)(n[l],(0,u.average)([i[l],i[l-1]])));d.push((0,u.minus)(n[s-1],c(i[s-2],i[s-3])));var f=d[0],h=d[1],m=n[0],g=n[1],v=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(f[0],f[1],h[0],h[1],g[0],g[1]);return{path:(0,u.range)(2,s).reduce(function(t,e){var a=d[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},v),centroid:(0,u.average)(n)}},e.exports=n["default"]},{335:335,336:336,337:337}],333:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(334),o=a(i),s=t(335),p=1e-5,u=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],u=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==u&&(u+=p),c==l&&(l+=p),{points:a,xmin:o,xmax:u,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,p=t.height,c=t.closed,l=t.min,d=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var f=function(t){return[n(t),a(t)]},h=e.map(function(t){return u(t,f)}),m=(0,s.minBy)(h,function(t){return t.xmin}),g=(0,s.maxBy)(h,function(t){return t.xmax}),v=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==d?(0,s.maxBy)(h,function(t){return t.ymax}):d;c&&(v=Math.min(v,0),b=Math.max(b,0));var y=c?0:v,_=(0,o["default"])([m,g],[0,i]),x=(0,o["default"])([v,b],[p,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{334:334,335:335}],334:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),p=s[0],u=s[1],c=function(t){return p+(u-p)*(t-r)/(o-r)};return c.inverse=function(){return i([p,u],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],335:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},p=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},u=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r+s,i+p]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r-s,i-p]},d=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},f=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return d(1/t.length,t.reduce(c))},g=function(t,e){return d(t,[Math.sin(e),-Math.cos(e)])},v=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,u=t[p];n.push(e(p,u))}}catch(c){r=!0,i=c}finally{ -try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=p,n.maxBy=u,n.plus=c,n.minus=l,n.times=d,n.id=x,n.length=f,n.sumVectors=h,n.average=m,n.onCircle=g,n.enhance=v,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:p,maxBy:u,plus:c,minus:l,times:d,id:x,length:f,sumVectors:h,average:m,onCircle:g,enhance:v,range:b,mapObject:y,pairs:_}},{}],336:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return r===s&&i===p},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},p=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},u=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(p).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,c=u(p,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],337:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Mo.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return Do.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function p(t){return!isNaN(parseFloat(t))&&isFinite(t)}function u(t){return t&&"[object Object]"===Lo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function d(){Mg.DEBUG&&Oo.apply(null,arguments)}function f(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),jo[t]||(jo[t]=!0,To(t,n))}function m(){Mg.DEBUG&&f.apply(null,arguments)}function g(){Mg.DEBUG&&h.apply(null,arguments)}function v(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,p,u="";if(!zo[t]){for(a=[];u.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)p.push(r(n[o]));a[i]=p}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&p(e)?+e:e}function S(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[$o];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===$o?o[0]=S(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!p(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,S(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!p(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!p(a))throw Error(Xo);return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function R(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function D(t){return"string"==typeof t?[t]:void 0===t?[]:t}function j(t){return t[t.length-1]}function N(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,p;s=function(e){o||(o=!0,q(t,e,n,a))},p=function(t){o||(o=!0,a(t))};try{r.call(e,s,p)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=S(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=V(cs(n),e),a&&z(t,a.firstKey,n)):a=G(t,S(e),n),a}function V(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return S(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),S(n.join("."))}return S(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function G(t,e,n,a){var r,i,o,s,p;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=S(i),p=G(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:p}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=S(e),(n=G(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function Y(t){t.cancel()}function $(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;fs.ractives.length;)e=fs.ractives.pop(),n=e.viewmodel.applyChanges(),n&&vs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=vt(t,r,n,a)&&s);if(Gs.dequeue(t),t.parent&&s){if(o&&t.component){var p=t.component.name+"."+e[e.length-1];e=S(p).wildcardMatches(),n&&(n.component=t)}gt(t.parent,e,n,a)}}function vt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=S(P(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){Ys.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=S(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function St(t,e,n,a){var r,i,o;e=S(P(e)),a=a||cp,e.isPattern?(r=new pp(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(u(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",up(this,t,e,n);if(i=t.split(" "),1===i.length)return up(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(up(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(fp).filter(hp),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(fp).filter(hp),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,p,u=[];if(a=Rt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],p=0;i>p;p+=1)u.push(p);for(;o>p;p+=1)u.push(-1);for(;r>p;p+=1)u.push(p+s);return 0!==s?u.touchedFrom=a[0]:u.touchedFrom=t.length,u}function Rt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Rp.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Op.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Mp.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(H)}function Dt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function jt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,p,u=[];for(e=[];n=Ip.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),p=e.length;p--;)s=i.slice(),r=e[p],s[p]=r.base+a+r.modifiers||"",o=i.slice(),o[p]=a+" "+o[p],u.push(s.join(" "),o.join(" "));return u.join(", ")},n=qp.test(t)?t.replace(qp,a):t.replace(Fp,"").replace(Np,function(t,e){var n,a;return Bp.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&g("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Ut(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Vt(t){var e=So(Qp);return e.parse=function(e,n){return Gt(e,n||t)},e}function Gt(t,e){if(!Hp)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hp(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a