diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index e6be68cae54f..1cc77a4beaef 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -37,7 +37,7 @@ /turf/open/floor/catwalk_floor/iron, /area/ruin/planetengi) "as" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/warning{ diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm index 64c6856d76c7..5d2b80bf29fe 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm @@ -62,7 +62,7 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/powered/mailroom) "gO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/carpet/green, @@ -128,7 +128,7 @@ /turf/open/floor/carpet/royalblack, /area/ruin/powered/mailroom) "lw" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/carpet/green, diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index 315eb9230633..61949bb291af 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -611,7 +611,7 @@ health = 25; maxHealth = 25; name = "hatchling"; - resize = 0.85 + current_size = 0.85 }, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) @@ -627,7 +627,7 @@ health = 25; maxHealth = 25; name = "hatchling"; - resize = 0.85 + current_size = 0.85 }, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) @@ -1467,7 +1467,7 @@ health = 25; maxHealth = 25; name = "hatchling"; - resize = 0.85 + current_size = 0.85 }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index ae83dbaa38df..783e37062c12 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -338,7 +338,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hellfactoryoffice) "bg" = ( -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /turf/open/floor/iron, /area/ruin/space/has_grav/hellfactory) "bh" = ( diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm index dfcdf0852910..287712dddb1f 100644 --- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm +++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm @@ -215,7 +215,7 @@ pixel_y = -4; pixel_x = -7 }, -/obj/item/camera_bug{ +/obj/item/computer_disk/syndicate/camera_app{ pixel_x = -5; pixel_y = 9 }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index cff5ce4e560e..d1b6e937645d 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -5278,7 +5278,7 @@ /area/ruin/space/ancientstation/charlie/hall) "we" = ( /obj/machinery/light/small/directional/north, -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) "wg" = ( diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index b39dc8bf0fed..b0b2d4dca38e 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -215,7 +215,7 @@ "aS" = ( /obj/structure/table/reinforced, /obj/machinery/light/directional/south, -/obj/item/camera_bug, +/obj/item/computer_disk/syndicate/camera_app, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) "aT" = ( diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 9f4c138fec8c..4e92c32d61eb 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -2142,7 +2142,7 @@ name = "Loading Doors"; pixel_y = 6 }, -/obj/machinery/modular_computer/console/preset{ +/obj/machinery/modular_computer/preset{ dir = 8 }, /turf/open/floor/iron, diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 0ca8b906560e..60ffa1b88918 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//area#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 66ae422e927f..c1e588189a1e 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -94,7 +94,7 @@ /turf/open/floor/plating, /area/station/maintenance/central) "abq" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -918,7 +918,7 @@ /turf/open/floor/plating, /area/station/maintenance/disposal) "alx" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -8601,7 +8601,7 @@ /obj/structure/railing{ dir = 4 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "bWT" = ( /obj/effect/decal/cleanable/dirt, @@ -10224,7 +10224,7 @@ /area/station/engineering/atmos/hfr_room) "crb" = ( /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "crd" = ( /obj/effect/decal/cleanable/dirt, @@ -12548,7 +12548,7 @@ /area/station/ai_monitored/security/armory) "cVt" = ( /obj/structure/railing, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "cVx" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15092,7 +15092,7 @@ /turf/open/floor/wood, /area/station/service/electronic_marketing_den) "dEk" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 1 }, /obj/structure/cable, @@ -17959,7 +17959,7 @@ /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) "epF" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ @@ -18839,7 +18839,7 @@ /obj/structure/sign/painting/library_private{ pixel_y = -32 }, -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 1 }, /obj/effect/turf_decal/bot_white, @@ -19246,7 +19246,7 @@ "eGr" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/light/directional/east, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "eGs" = ( /obj/structure/chair/office{ @@ -20752,7 +20752,7 @@ "eYr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -20908,7 +20908,7 @@ dir = 4 }, /obj/structure/window/reinforced/spawner/directional/east, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "fam" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23009,7 +23009,7 @@ "fzD" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/railing, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "fzF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27097,7 +27097,7 @@ /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) "gzz" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/structure/cable, @@ -28028,7 +28028,7 @@ /turf/open/floor/iron/large, /area/station/commons/locker) "gKu" = ( -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "gKA" = ( /obj/structure/cable, @@ -32678,7 +32678,7 @@ }, /obj/item/radio/intercom/directional/east, /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, /turf/open/floor/iron/dark, @@ -35339,7 +35339,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/nestbox, /mob/living/basic/chicken, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "iBf" = ( /obj/structure/cable, @@ -39523,7 +39523,7 @@ /area/station/cargo/miningoffice) "jBR" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, @@ -41169,7 +41169,7 @@ "jVg" = ( /obj/machinery/airalarm/directional/north, /obj/structure/window/reinforced/spawner/directional/east, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "jVx" = ( /obj/machinery/computer/crew{ @@ -41575,7 +41575,7 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "kaw" = ( /obj/structure/window/reinforced/spawner/directional/north, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "kax" = ( /obj/structure/chair/office/light{ @@ -42670,7 +42670,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "kmE" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, @@ -43787,7 +43787,7 @@ /area/station/maintenance/port) "kCq" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -44440,7 +44440,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/cargochat/science{ +/obj/machinery/modular_computer/preset/cargochat/science{ dir = 4 }, /obj/effect/turf_decal/bot/left, @@ -44891,7 +44891,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "kQV" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service, +/obj/machinery/modular_computer/preset/cargochat/service, /obj/effect/turf_decal/bot, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/checker, @@ -45001,13 +45001,13 @@ "kSi" = ( /obj/structure/nestbox, /obj/machinery/light/directional/west, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "kSk" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/cargochat/cargo, +/obj/machinery/modular_computer/preset/cargochat/cargo, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 }, @@ -45206,7 +45206,7 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "kVe" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hos) "kVo" = ( @@ -51841,7 +51841,7 @@ "mBG" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/nestbox, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "mBQ" = ( /obj/effect/decal/cleanable/dirt, @@ -55783,7 +55783,7 @@ /area/station/maintenance/fore) "nzA" = ( /mob/living/basic/chicken, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "nzD" = ( /obj/structure/disposalpipe/segment{ @@ -56689,7 +56689,7 @@ /area/station/maintenance/port/fore) "nKN" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -58999,7 +58999,7 @@ /turf/open/floor/iron/white, /area/station/security/execution/transfer) "ooa" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering{ +/obj/machinery/modular_computer/preset/cargochat/engineering{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -64803,7 +64803,7 @@ }, /area/station/medical/morgue) "pLV" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/structure/cable, @@ -65606,7 +65606,7 @@ /turf/open/floor/iron/checker, /area/station/hallway/secondary/service) "pUC" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ @@ -70305,7 +70305,7 @@ /turf/open/floor/iron/dark/side, /area/station/engineering/lobby) "rdU" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical, +/obj/machinery/modular_computer/preset/cargochat/medical, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 }, @@ -71334,7 +71334,7 @@ "rqc" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/item/radio/intercom/directional/north, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/tile/purple{ @@ -74374,7 +74374,7 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) "scR" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/requests_console/directional/west{ @@ -75161,7 +75161,7 @@ /obj/item/radio/intercom/directional/west{ pixel_y = -8 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/dark/textured_large, @@ -76560,7 +76560,7 @@ "sGm" = ( /obj/structure/window/reinforced/spawner/directional/north, /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "sGx" = ( /obj/structure/cable, @@ -77033,7 +77033,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "sLd" = ( /obj/structure/cable, @@ -80405,7 +80405,7 @@ "tCH" = ( /obj/machinery/light/directional/west, /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "tCI" = ( /obj/machinery/telecomms/server/presets/command, @@ -87847,7 +87847,7 @@ /turf/open/floor/iron, /area/station/maintenance/port) "vrJ" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/machinery/camera/directional/east{ @@ -88963,7 +88963,7 @@ /turf/open/floor/iron/dark, /area/station/science/explab) "vEl" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 @@ -90520,7 +90520,7 @@ /obj/structure/railing{ dir = 4 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "vZV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -90692,7 +90692,7 @@ c_tag = "Security - Office Aft" }, /obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -98752,7 +98752,7 @@ /turf/open/floor/iron, /area/station/science/robotics/mechbay) "xYS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/machinery/computer/security/telescreen/entertainment/directional/east, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 0e920ff1931e..04291d6953dc 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -2153,7 +2153,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/prison/toilet) "aLS" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -4280,7 +4280,7 @@ /turf/open/floor/iron/large, /area/station/engineering/main) "btQ" = ( -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 8 }, /obj/item/radio/intercom/directional/east, @@ -6412,7 +6412,7 @@ /turf/open/floor/iron/textured, /area/station/ai_monitored/command/storage/eva) "bZG" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /obj/effect/decal/cleanable/dirt/dust, @@ -12696,7 +12696,7 @@ /turf/open/floor/grass, /area/station/security/prison/garden) "dWX" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, @@ -18977,7 +18977,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/smooth_corner{ @@ -24804,7 +24804,7 @@ /turf/open/floor/plating, /area/station/engineering/storage/tech) "iaS" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/item/paper/fluff/ids_for_dummies, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -26529,7 +26529,7 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "iBO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/white/side{ @@ -30390,7 +30390,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 4 }, /turf/open/floor/plating, @@ -31910,7 +31910,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) "kna" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/lobby) @@ -32326,7 +32326,7 @@ "ksU" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/effect/turf_decal/bot_white, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -34853,7 +34853,7 @@ /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/iron, @@ -37563,7 +37563,7 @@ /turf/closed/wall, /area/station/hallway/secondary/service) "meg" = ( -/obj/machinery/modular_computer/console/preset/cargochat/science{ +/obj/machinery/modular_computer/preset/cargochat/science{ dir = 1 }, /obj/item/radio/intercom/directional/south, @@ -39652,7 +39652,7 @@ /turf/open/floor/iron/smooth, /area/mine/laborcamp/security) "mQr" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/item/radio/intercom/directional/east, /obj/machinery/camera{ c_tag = "Chief Medical Office North"; @@ -48074,7 +48074,7 @@ /turf/open/floor/plating, /area/station/engineering/engine_smes) "ptB" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/wood, @@ -55012,7 +55012,7 @@ /turf/open/floor/engine, /area/station/science/explab) "rEd" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ @@ -56200,7 +56200,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) "rYZ" = ( -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "rZa" = ( @@ -62319,7 +62319,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage) "tZO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/structure/sign/poster/official/build{ @@ -64209,7 +64209,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "uGz" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/camera/directional/west{ @@ -65144,7 +65144,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) "uXW" = ( -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/north, @@ -66303,7 +66303,7 @@ /area/station/medical/treatment_center) "vra" = ( /obj/machinery/firealarm/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 4 }, /obj/effect/decal/cleanable/dirt, @@ -66427,7 +66427,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/aft) "vuq" = ( -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/structure/fireaxecabinet/mechremoval/directional/north, /turf/open/floor/iron/white, /area/station/science/robotics/lab) @@ -66711,7 +66711,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "vyd" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/hos) "vyg" = ( @@ -69279,7 +69279,7 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/ce) "woF" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/end{ @@ -75129,7 +75129,7 @@ /turf/open/floor/iron, /area/station/security/prison/mess) "ydw" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/machinery/light/directional/north, /obj/item/radio/intercom/directional/north, /obj/structure/cable, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 438b1f6035e7..620765d9e8dc 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -3129,7 +3129,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/medical/chemistry) "bdk" = ( -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 8 }, /obj/structure/extinguisher_cabinet/directional/south, @@ -6976,7 +6976,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/medical/chemistry) "ctg" = ( -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 4 }, /obj/effect/turf_decal/bot, @@ -7159,7 +7159,7 @@ /turf/open/floor/plating, /area/station/maintenance/fore) "cwj" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/bot, /obj/machinery/computer/security/telescreen/ce{ pixel_y = 28 @@ -8082,7 +8082,7 @@ /obj/item/toy/figure/qm{ pixel_x = -17 }, -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/machinery/button/door/directional/east{ @@ -9388,7 +9388,7 @@ /turf/open/floor/engine/o2, /area/station/engineering/atmos) "dmD" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/machinery/keycard_auth/directional/west{ @@ -10231,7 +10231,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "dzL" = ( -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/effect/turf_decal/tile/yellow{ @@ -21803,7 +21803,7 @@ /area/station/ai_monitored/turret_protected/ai) "hlJ" = ( /obj/effect/turf_decal/bot, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -24696,7 +24696,7 @@ /area/station/hallway/primary/central/fore) "idM" = ( /obj/effect/turf_decal/bot, -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 8 }, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -25965,7 +25965,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "ixj" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/bot, /obj/machinery/light/directional/west, @@ -30305,7 +30305,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/cargochat/science{ +/obj/machinery/modular_computer/preset/cargochat/science{ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/end{ @@ -32428,7 +32428,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft) "kHs" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /turf/open/floor/iron/dark, /area/station/engineering/main) "kHw" = ( @@ -36412,7 +36412,7 @@ "lWg" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/machinery/requests_console/directional/east{ @@ -37691,7 +37691,7 @@ pixel_y = 8; req_access = list("command") }, -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/bot, /obj/machinery/light_switch/directional/east{ pixel_x = 24; @@ -39906,7 +39906,7 @@ /area/station/security/interrogation) "nep" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 }, @@ -40277,7 +40277,7 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "nmR" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -41864,7 +41864,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/science/xenobiology) "nPo" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /turf/open/floor/wood, @@ -48267,7 +48267,7 @@ /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) "pZI" = ( -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 4 }, /turf/open/floor/iron/dark, @@ -50520,7 +50520,7 @@ /turf/closed/wall/r_wall/rust, /area/station/maintenance/aft) "qNJ" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -51759,7 +51759,7 @@ /turf/open/floor/iron/stairs/old, /area/station/maintenance/port/fore) "rhs" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -58221,7 +58221,7 @@ /turf/closed/wall, /area/station/security/office) "tjR" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 8 }, /obj/effect/turf_decal/bot, @@ -61990,7 +61990,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 8 }, /obj/structure/disposalpipe/segment, @@ -68181,7 +68181,7 @@ /area/station/science/ordnance/bomb) "wqd" = ( /obj/item/radio/intercom/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 4 }, /obj/effect/turf_decal/bot, @@ -68388,7 +68388,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/medical/psychology) "wua" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/iron/dark, @@ -68683,7 +68683,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/greater) "wzk" = ( -/obj/machinery/modular_computer/console/preset/command{ +/obj/machinery/modular_computer/preset/command{ dir = 4 }, /obj/machinery/requests_console/directional/west{ @@ -69995,7 +69995,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/machinery/firealarm/directional/east, /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5e9cda6d529b..7ae1cc88981c 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3199,7 +3199,7 @@ dir = 1 }, /obj/structure/window/reinforced/spawner/directional/west, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "bep" = ( /obj/machinery/air_sensor/oxygen_tank, @@ -3481,7 +3481,7 @@ /turf/closed/wall, /area/station/security/courtroom) "bjH" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, @@ -4852,7 +4852,7 @@ "bJs" = ( /obj/machinery/light/directional/south, /obj/structure/window/reinforced/spawner/directional/west, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "bJQ" = ( /obj/machinery/vending/coffee, @@ -5235,7 +5235,7 @@ /turf/open/floor/iron, /area/station/security/prison/garden) "bSj" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/item/paper/fluff/ids_for_dummies, @@ -5320,7 +5320,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "bTP" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 8 }, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -6246,7 +6246,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "cqk" = ( /obj/structure/cable, @@ -6413,7 +6413,7 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "csS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/machinery/light/small/directional/east, @@ -8415,7 +8415,7 @@ /turf/closed/wall/r_wall, /area/station/command/bridge) "dhp" = ( -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, @@ -9541,7 +9541,7 @@ /area/station/engineering/break_room) "dFJ" = ( /obj/machinery/light_switch/directional/east, -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 8 }, /turf/open/floor/wood, @@ -12224,7 +12224,7 @@ /turf/open/floor/plating, /area/station/maintenance/space_hut) "eCV" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/machinery/light/directional/north, /obj/machinery/requests_console/directional/north{ department = "Security"; @@ -16591,7 +16591,7 @@ "gmR" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/main) @@ -17176,7 +17176,7 @@ /area/station/engineering/atmos) "gxn" = ( /obj/structure/nestbox, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "gxx" = ( /obj/machinery/door/airlock/atmos/glass{ @@ -19431,7 +19431,7 @@ /turf/open/floor/iron/white, /area/station/security/prison/mess) "hmM" = ( -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "hne" = ( /obj/machinery/door/window/brigdoor{ @@ -19809,7 +19809,7 @@ /turf/closed/wall/r_wall, /area/station/maintenance/starboard/greater) "huq" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ @@ -21879,7 +21879,7 @@ "igX" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/nestbox, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "igZ" = ( /obj/machinery/door/firedoor, @@ -24561,7 +24561,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "iVi" = ( /obj/machinery/door/airlock{ @@ -25619,7 +25619,7 @@ "jop" = ( /obj/machinery/light/directional/south, /obj/structure/nestbox, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "joq" = ( /obj/machinery/door/firedoor, @@ -32726,7 +32726,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, /turf/open/floor/iron/dark, @@ -35106,7 +35106,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "mFC" = ( /obj/effect/decal/cleanable/dirt, @@ -36287,7 +36287,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "mZL" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 }, @@ -36929,7 +36929,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/structure/sign/poster/official/random/directional/east, @@ -45326,7 +45326,7 @@ "qkV" = ( /obj/structure/window/reinforced/spawner/directional/west, /mob/living/basic/chicken, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "qkW" = ( /obj/machinery/light/directional/south, @@ -45384,7 +45384,7 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) "qmu" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/dark, @@ -45580,7 +45580,7 @@ /area/station/maintenance/starboard/lesser) "qpn" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 8 }, /obj/structure/sign/poster/random/directional/east, @@ -46717,7 +46717,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "qLb" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/requests_console/directional/west{ @@ -47871,7 +47871,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "rgS" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47969,7 +47969,7 @@ "rhV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/sign/poster/random/directional/south, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "riz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -53189,7 +53189,7 @@ /area/station/ai_monitored/command/storage/satellite) "sVz" = ( /obj/machinery/airalarm/directional/west, -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /obj/structure/cable, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -54328,7 +54328,7 @@ /area/station/service/library) "toD" = ( /obj/machinery/light/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/science{ +/obj/machinery/modular_computer/preset/cargochat/science{ dir = 4 }, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -55431,7 +55431,7 @@ /turf/open/floor/iron/white, /area/station/science/research) "tKS" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/requests_console/directional/north{ department = "Chief Engineer's Desk"; @@ -57753,7 +57753,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "uAM" = ( /obj/structure/cable, @@ -59959,7 +59959,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "vpg" = ( /obj/machinery/door/poddoor/preopen{ @@ -60723,7 +60723,7 @@ /turf/open/floor/engine/air, /area/station/engineering/atmos) "vEo" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/siding/purple{ @@ -62164,7 +62164,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "wew" = ( -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 8 }, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -63702,7 +63702,7 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 10 }, -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 8 }, /turf/open/floor/iron, @@ -65601,7 +65601,7 @@ /area/station/engineering/atmos) "xpk" = ( /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "xpo" = ( /turf/open/floor/carpet, @@ -66403,7 +66403,7 @@ c_tag = "Hydroponics - Aft" }, /mob/living/basic/chicken, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "xDD" = ( /obj/effect/turf_decal/stripes/red/line{ diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 48857e26ff76..bd13c17ff159 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -593,7 +593,7 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "ahG" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/machinery/airalarm/directional/west, @@ -917,7 +917,7 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) "alK" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -3414,7 +3414,7 @@ /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) "aRK" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3588,7 +3588,7 @@ /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) "aTn" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/stripes/white/line{ @@ -4712,7 +4712,7 @@ /turf/open/floor/iron/dark, /area/station/security/prison/visit) "bif" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, @@ -10504,7 +10504,7 @@ /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) "cGQ" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /turf/open/floor/iron/dark, @@ -11146,7 +11146,7 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 }, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/structure/cable, @@ -14051,7 +14051,7 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "dFO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/machinery/light/small/directional/east, @@ -18502,7 +18502,7 @@ }, /obj/machinery/vending/wallmed/directional/east, /obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/iron/dark, @@ -20195,7 +20195,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/item/radio/intercom/directional/south, @@ -20724,7 +20724,7 @@ /area/station/maintenance/floor1/port/fore) "fyT" = ( /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/machinery/light_switch/directional/north, @@ -25139,7 +25139,7 @@ /area/station/maintenance/floor2/port/aft) "gJz" = ( /obj/effect/turf_decal/tile/green/opposingcorners, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/iron/white, @@ -26647,7 +26647,7 @@ }, /area/station/commons/fitness) "heZ" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -27214,7 +27214,7 @@ /obj/effect/turf_decal/trimline/neutral/warning{ dir = 8 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/bot_white, @@ -27796,7 +27796,7 @@ }, /obj/machinery/newscaster/directional/east, /obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/iron/dark, @@ -28139,13 +28139,6 @@ /obj/structure/stairs/west, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"hAV" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/table/glass, -/obj/item/bonesetter, -/obj/item/stack/medical/bone_gel, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "hBe" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -28991,7 +28984,7 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) "hNg" = ( -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ +/obj/machinery/modular_computer/preset/cargochat/cargo{ dir = 1 }, /turf/open/floor/iron/textured_corner, @@ -30916,7 +30909,7 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) "iqy" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/machinery/button/door/directional/west{ @@ -32500,7 +32493,7 @@ pixel_x = 17 }, /obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/modular_computer/console/preset/cargochat/science, +/obj/machinery/modular_computer/preset/cargochat/science, /turf/open/floor/iron/white, /area/station/science/lab) "iOh" = ( @@ -32962,7 +32955,7 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) "iUS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ name = "Captain's Computer" }, /obj/item/radio/intercom/directional/north, @@ -34437,7 +34430,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 8 }, /turf/open/floor/iron, @@ -35577,7 +35570,7 @@ /obj/effect/turf_decal/siding/thinplating_new{ dir = 10 }, -/obj/machinery/modular_computer/console/preset/cargochat/engineering{ +/obj/machinery/modular_computer/preset/cargochat/engineering{ dir = 4 }, /turf/open/floor/iron/dark/textured, @@ -40158,7 +40151,7 @@ /turf/open/floor/iron/smooth, /area/station/construction) "kOs" = ( -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 1 }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -41323,7 +41316,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/iron/smooth_edge{ @@ -41540,7 +41533,7 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "lhi" = ( -/obj/machinery/modular_computer/console/preset/command, +/obj/machinery/modular_computer/preset/command, /turf/open/floor/carpet/blue, /area/station/command/bridge) "lhp" = ( @@ -42261,7 +42254,7 @@ }, /area/station/science/genetics) "lpB" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, @@ -44014,7 +44007,7 @@ /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/aft) "lNE" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/machinery/light/directional/north, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) @@ -49842,7 +49835,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /turf/open/floor/iron/dark, @@ -55572,7 +55565,7 @@ }, /area/station/hallway/floor3/aft) "oGm" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -55581,7 +55574,7 @@ /area/station/science/genetics) "oGo" = ( /obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/iron/dark, @@ -57400,7 +57393,7 @@ /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "piA" = ( -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 4 }, /turf/open/floor/engine/cult, @@ -65933,7 +65926,7 @@ /area/station/medical/medbay/lobby) "rwY" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 1 }, /turf/open/floor/pod/light, @@ -69053,7 +69046,7 @@ /turf/closed/wall, /area/station/commons/locker) "swe" = ( -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 4 }, /obj/effect/turf_decal/siding/thinplating_new/corner{ @@ -69128,7 +69121,7 @@ /turf/open/floor/engine/hull, /area/space/nearstation) "sxl" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -72019,7 +72012,7 @@ /turf/open/space/openspace, /area/space) "tlX" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/effect/turf_decal/siding/wood{ @@ -72059,7 +72052,7 @@ /turf/open/floor/wood, /area/station/commons/vacant_room/office) "tms" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/structure/cable, @@ -76472,7 +76465,7 @@ /turf/open/floor/iron, /area/station/hallway/floor3/fore) "uBL" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/machinery/newscaster/directional/east, @@ -78694,7 +78687,7 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "vgn" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/structure/cable, @@ -80099,7 +80092,7 @@ /turf/open/floor/mineral/plastitanium, /area/station/maintenance/floor2/starboard/aft) "vyy" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 8 }, /obj/machinery/light/directional/south, @@ -80768,7 +80761,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -88685,7 +88678,7 @@ /turf/open/floor/iron/dark, /area/station/security/evidence) "xKy" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/iron/dark, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index fc0d41965523..bc8c8c3ac4c6 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -881,7 +881,7 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "cs" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, +/obj/machinery/modular_computer/preset/id/centcom, /turf/open/floor/carpet/royalblue, /area/centcom/central_command_areas/admin) "ct" = ( @@ -1337,7 +1337,7 @@ /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) "dC" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 8 }, /turf/open/floor/carpet/purple, @@ -2112,7 +2112,7 @@ /turf/open/space/basic, /area/space/nearstation) "fU" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, +/obj/machinery/modular_computer/preset/id/centcom, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) "fV" = ( @@ -7283,7 +7283,7 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/borbop) "ur" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 4; desc = "A specialized console to connect to gaming computers to be able to broadcast live. Seriously, where does Ook find this stuff?" }, @@ -10545,7 +10545,7 @@ /turf/open/floor/carpet/green, /area/centcom/central_command_areas/admin) "Dt" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, +/obj/machinery/modular_computer/preset/id/centcom, /obj/effect/turf_decal/siding/dark{ dir = 5 }, @@ -11471,7 +11471,7 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) "Gb" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 4 }, /turf/open/floor/circuit, @@ -11944,7 +11944,7 @@ }, /area/centcom/central_command_areas/admin) "Hp" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 4 }, /turf/open/floor/iron/dark, @@ -12934,7 +12934,7 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/hall) "Ki" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 1 }, /turf/open/floor/iron/dark/herringbone, @@ -13744,7 +13744,7 @@ }, /area/centcom/central_command_areas/hall) "Mk" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 4 }, /turf/open/floor/plating/abductor, @@ -15663,7 +15663,7 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) "RK" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 1; desc = "A specialized console to connect to gaming computers to be able to broadcast live. Seriously, where does Ook find this stuff?" }, @@ -16290,7 +16290,7 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/hall) "Tx" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, +/obj/machinery/modular_computer/preset/id/centcom, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) "Ty" = ( @@ -17089,7 +17089,7 @@ /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "VL" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 1 }, /turf/open/floor/iron/grimy, @@ -17986,7 +17986,7 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) "Yj" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/machinery/modular_computer/preset/id/centcom{ dir = 4 }, /turf/open/floor/mineral/titanium/white, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 9c660a07a6fa..12016b0aa665 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2291,7 +2291,7 @@ /area/station/asteroid) "ahs" = ( /obj/machinery/newscaster/directional/north, -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /obj/structure/sign/calendar/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) @@ -2935,7 +2935,7 @@ /area/station/engineering/break_room) "amA" = ( /obj/machinery/newscaster/directional/north, -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -3049,7 +3049,7 @@ /turf/open/floor/iron, /area/station/engineering/main) "anJ" = ( -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -7355,7 +7355,7 @@ /area/station/maintenance/starboard/lesser) "bia" = ( /obj/machinery/light/directional/east, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8336,7 +8336,7 @@ }, /area/station/command/bridge) "byp" = ( -/obj/machinery/modular_computer/console/preset/research, +/obj/machinery/modular_computer/preset/research, /obj/effect/landmark/event_spawn, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) @@ -13259,7 +13259,7 @@ /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) "ddz" = ( -/obj/machinery/modular_computer/console/preset/cargochat/service{ +/obj/machinery/modular_computer/preset/cargochat/service{ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15132,7 +15132,7 @@ /area/station/science/ordnance/freezerchamber) "dIN" = ( /obj/structure/railing, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "dIO" = ( /obj/machinery/door/poddoor/preopen{ @@ -15569,7 +15569,7 @@ /turf/open/floor/iron, /area/station/maintenance/tram/left) "dPS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /obj/machinery/keycard_auth/directional/north, @@ -16286,7 +16286,7 @@ "eaX" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/railing, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "eaZ" = ( /obj/structure/rack, @@ -16345,7 +16345,7 @@ /area/station/medical/morgue) "ebH" = ( /obj/structure/cable, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "ebL" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4{ @@ -19257,7 +19257,7 @@ "eZy" = ( /obj/machinery/light/directional/north, /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "eZC" = ( /obj/effect/decal/cleanable/dirt, @@ -19893,7 +19893,7 @@ "fkq" = ( /obj/machinery/light/directional/south, /obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, /obj/structure/cable, @@ -21268,7 +21268,7 @@ /turf/open/floor/iron, /area/station/commons/dorms) "fGS" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 1 }, /obj/structure/sign/clock/directional/south, @@ -27745,7 +27745,7 @@ "hUC" = ( /obj/machinery/egg_incubator, /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "hUK" = ( /obj/effect/turf_decal/stripes/corner{ @@ -28069,7 +28069,7 @@ /area/station/command/heads_quarters/cmo) "ial" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/machinery/modular_computer/preset/cargochat/engineering, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plastic, @@ -28096,7 +28096,7 @@ /turf/open/floor/carpet, /area/station/commons/dorms) "iaZ" = ( -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 1 }, /obj/structure/window/reinforced/spawner, @@ -35968,7 +35968,7 @@ /area/station/engineering/gravity_generator) "kBz" = ( /obj/structure/window/reinforced/spawner/directional/east, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "kBO" = ( /obj/effect/turf_decal/siding/wood/corner{ @@ -37938,7 +37938,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "ldy" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -38903,7 +38903,7 @@ /area/station/medical/medbay/central) "lsR" = ( /mob/living/basic/chicken, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "lti" = ( /obj/structure/fans/tiny/invisible, @@ -40689,7 +40689,7 @@ "lYE" = ( /obj/structure/cable, /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "lYT" = ( /obj/structure/table/reinforced, @@ -41051,7 +41051,7 @@ "mey" = ( /obj/structure/railing, /obj/structure/window/reinforced/spawner/directional/east, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "meB" = ( /obj/effect/decal/cleanable/dirt, @@ -44444,7 +44444,7 @@ /turf/open/floor/plating, /area/station/cargo/sorting) "nkE" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /obj/structure/window/spawner/directional/north, @@ -47432,7 +47432,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "ojH" = ( /obj/effect/decal/cleanable/dirt, @@ -49741,7 +49741,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, -/obj/machinery/modular_computer/console/preset/cargochat/cargo, +/obj/machinery/modular_computer/preset/cargochat/cargo, /turf/open/floor/iron, /area/station/cargo/office) "oZA" = ( @@ -53355,7 +53355,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "qfv" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -56418,7 +56418,7 @@ name = "Captain's Requests Console"; can_send_announcements = 1 }, -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 8 }, /turf/open/floor/wood, @@ -57596,7 +57596,7 @@ /area/station/hallway/secondary/command) "rtn" = ( /obj/structure/window/reinforced/spawner/directional/north, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "rtp" = ( /turf/open/floor/iron/dark, @@ -58263,7 +58263,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/engineering{ +/obj/machinery/modular_computer/preset/engineering{ dir = 8 }, /obj/structure/cable, @@ -58461,7 +58461,7 @@ "rKb" = ( /obj/structure/nestbox, /mob/living/basic/chicken/brown, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "rKf" = ( /obj/effect/turf_decal/stripes/line{ @@ -61960,7 +61960,7 @@ /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/maint) "sQu" = ( -/obj/machinery/modular_computer/console/preset/curator{ +/obj/machinery/modular_computer/preset/curator{ dir = 4 }, /obj/machinery/light_switch/directional/west{ @@ -63219,7 +63219,7 @@ /turf/open/floor/iron, /area/station/cargo/storage) "tka" = ( -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "tkh" = ( /obj/effect/turf_decal/trimline/green/filled/line{ @@ -64853,7 +64853,7 @@ /turf/closed/wall/r_wall, /area/station/engineering/atmos) "tLA" = ( -/obj/machinery/modular_computer/console/preset/id{ +/obj/machinery/modular_computer/preset/id{ dir = 4 }, /obj/structure/cable, @@ -66404,7 +66404,7 @@ c_tag = "Science - Ordnance Lab"; network = list("ss13","rd") }, -/obj/machinery/modular_computer/console/preset/civilian, +/obj/machinery/modular_computer/preset/civilian, /turf/open/floor/iron/white, /area/station/science/ordnance/office) "ulJ" = ( @@ -66933,7 +66933,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) "utY" = ( @@ -71230,7 +71230,7 @@ /turf/open/floor/iron, /area/station/tcommsat/computer) "vGt" = ( -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -71945,7 +71945,7 @@ "vSB" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/nestbox, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "vSI" = ( /turf/open/openspace, @@ -72863,7 +72863,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8 }, /turf/open/floor/glass/reinforced, @@ -74415,7 +74415,7 @@ /turf/open/floor/iron, /area/station/commons/dorms) "wFS" = ( -/obj/machinery/modular_computer/console/preset/cargochat/security{ +/obj/machinery/modular_computer/preset/cargochat/security{ dir = 4 }, /obj/machinery/newscaster/directional/west, @@ -74821,7 +74821,7 @@ "wNL" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "wNV" = ( /obj/machinery/door/firedoor, @@ -77106,7 +77106,7 @@ "xEE" = ( /obj/structure/cable, /obj/structure/railing, -/turf/open/misc/sandy_dirt, +/turf/open/floor/sandy_dirt, /area/station/service/hydroponics) "xET" = ( /obj/effect/turf_decal/siding/thinplating/corner{ @@ -78321,7 +78321,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/modular_computer/console/preset/cargochat/medical{ +/obj/machinery/modular_computer/preset/cargochat/medical{ dir = 4 }, /turf/open/floor/iron/white, diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 310413554bb7..447700659028 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -18,7 +18,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "ai" = ( -/obj/machinery/modular_computer/console/preset/id, +/obj/machinery/modular_computer/preset/id, /turf/open/floor/iron/dark, /area/shuttle/escape) "aj" = ( diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 6d1ca3b9e5a4..5d34fc5a521b 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -1323,7 +1323,7 @@ /turf/open/floor/iron/showroomfloor, /area/shuttle/escape) "yH" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 1a2e99fea5c7..0b30ad502d8c 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -226,21 +226,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) -"ay" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4; - name = "tactical chair" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/bridge) "az" = ( /obj/effect/turf_decal/bot, /obj/machinery/computer/monitor{ @@ -385,33 +370,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) -"aS" = ( -/obj/effect/turf_decal/bot, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 8 - }, -/obj/item/lighter{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/lighter{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/machinery/power/apc/auto_name/directional/north{ - area = "/area/shuttle/syndicate/hallway" - }, -/obj/effect/mapping_helpers/apc/cut_AI_wire, -/obj/effect/mapping_helpers/apc/syndicate_access, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/hallway) "aU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1009,21 +967,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/eva) -"cg" = ( -/obj/machinery/suit_storage_unit/syndicate, -/obj/effect/turf_decal/box, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/eva) -"ch" = ( -/obj/item/surgical_drapes, -/obj/item/retractor, -/obj/item/cautery, -/obj/structure/table/reinforced, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "ci" = ( /obj/structure/table/reinforced, /obj/machinery/status_display/evac{ @@ -1146,31 +1089,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) -"cw" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/closet/crate/freezer{ - name = "universal blood storage" - }, -/obj/machinery/iv_drip, -/obj/item/reagent_containers/blood/universal{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/blood/universal, -/obj/item/reagent_containers/blood/universal{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "cx" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/power/shuttle_engine/heater, @@ -1437,19 +1355,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) -"di" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) "dj" = ( /obj/item/grenade/syndieminibomb{ pixel_x = 6; @@ -1467,30 +1372,6 @@ /obj/item/grenade/c4, /turf/open/floor/pod/dark, /area/shuttle/syndicate/armory) -"dk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) -"dl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) "dm" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1519,16 +1400,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"dp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/syndicate/airlock) "dq" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -1616,21 +1487,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) -"dz" = ( -/obj/item/circular_saw, -/obj/item/surgicaldrill{ - pixel_y = 5 - }, -/obj/item/healthanalyzer, -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "dA" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -1697,17 +1553,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) -"dG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/cc64k_ad{ - pixel_y = 32 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/armory) "dH" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -1831,18 +1676,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) -"dT" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "dU" = ( /obj/structure/table/optable, /obj/effect/turf_decal/bot, @@ -1850,21 +1683,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/pod/dark, /area/shuttle/syndicate/medical) -"dV" = ( -/obj/item/scalpel{ - pixel_y = 16 - }, -/obj/structure/table/reinforced, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -6 - }, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 6 - }, -/obj/item/hemostat, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/medical) "dW" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line, @@ -2065,27 +1883,6 @@ }, /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/medical) -"eo" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/weldingtool/largetank, -/obj/item/assembly/signaler{ - desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/assembly/signaler{ - desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; - pixel_x = 4; - pixel_y = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/pod/dark, -/area/shuttle/syndicate/armory) "ep" = ( /obj/structure/mirror/directional/north, /obj/structure/sink/directional/south, @@ -2139,6 +1936,199 @@ "ev" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/syndicate/hallway) +"fP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/cc64k_ad{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/armory) +"kH" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/bridge) +"oa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"pk" = ( +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/weldingtool/largetank, +/obj/item/assembly/signaler{ + desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/assembly/signaler{ + desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; + pixel_x = 4; + pixel_y = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/armory) +"ps" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"to" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/closet/crate/freezer{ + name = "universal blood storage" + }, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood/universal{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/blood/universal, +/obj/item/reagent_containers/blood/universal{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"uz" = ( +/obj/machinery/suit_storage_unit/syndicate, +/obj/effect/turf_decal/box, +/obj/machinery/airalarm/syndicate{ + pixel_y = -24 + }, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/eva) +"AH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"MZ" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/directional/west, +/obj/machinery/status_display/evac{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/healthanalyzer/advanced, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"RO" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/east, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 8 + }, +/obj/item/lighter{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/lighter{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/machinery/power/apc/auto_name/directional/north{ + area = "/area/shuttle/syndicate/hallway" + }, +/obj/effect/mapping_helpers/apc/cut_AI_wire, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = 25 + }, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/hallway) +"Sb" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = -24 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"SA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/syndicate/airlock) +"Vj" = ( +/obj/structure/table/reinforced, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -6 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) +"Yx" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/syndie/surgery, +/turf/open/floor/pod/dark, +/area/shuttle/syndicate/medical) (1,1,1) = {" ad @@ -2200,7 +2190,7 @@ aO bd bo dH -cw +to bf bD bD @@ -2218,16 +2208,16 @@ ad aO aN bm -di +AH aO bl bA by bH bL -dz +MZ dD -dT +Sb bn cy ad @@ -2272,8 +2262,8 @@ cc bJ bN bW -ch -dV +Yx +Vj cx cB cP @@ -2287,7 +2277,7 @@ aO aE aU df -dl +SA dv bq bs @@ -2399,7 +2389,7 @@ ak aq ax aF -aS +RO bc aQ aZ @@ -2420,7 +2410,7 @@ ad ab al ar -ay +kH aF aF be @@ -2429,7 +2419,7 @@ dR bS ej de -cg +uz dR bQ ek @@ -2471,7 +2461,7 @@ aO aE bv dh -dp +oa dv cv ds @@ -2520,7 +2510,7 @@ bZ aJ aO cF -dG +fP dj da eg @@ -2540,7 +2530,7 @@ ad aO aN cu -dk +ps aO ai bY @@ -2565,7 +2555,7 @@ ca dx dq aO -eo +pk ci dM db diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 8019774172de..e7a9797bf368 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -311,9 +311,6 @@ dir = 1 }, /obj/item/healthanalyzer, -/obj/item/healthanalyzer{ - pixel_y = 10 - }, /obj/item/healthanalyzer{ pixel_y = 10 }, @@ -487,6 +484,10 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/item/clothing/under/syndicate/scrubs, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/mask/breath/medical, +/obj/item/tank/internals/anesthetic, /turf/open/floor/iron, /area/shuttle/syndicate/medical) "ce" = ( @@ -530,7 +531,6 @@ /area/shuttle/syndicate/hallway) "cp" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/iron/white, /area/shuttle/syndicate/medical) "cr" = ( @@ -737,12 +737,12 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) "nZ" = ( -/obj/item/cautery, -/obj/item/scalpel, -/obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/computer/operating{ + dir = 1 + }, /turf/open/floor/iron/white, /area/shuttle/syndicate/medical) "pd" = ( @@ -752,10 +752,17 @@ /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) "pQ" = ( -/obj/item/retractor, -/obj/item/hemostat, -/obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue, +/obj/structure/table/reinforced, +/obj/item/bodypart/arm/left/robot{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/healthanalyzer, /turf/open/floor/iron/white, /area/shuttle/syndicate/medical) "st" = ( @@ -850,21 +857,12 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "zj" = ( -/obj/structure/table/reinforced, /obj/machinery/light/directional/west, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/bodypart/arm/right/robot{ - pixel_x = -10; - pixel_y = 9 - }, -/obj/item/surgicaldrill, -/obj/item/circular_saw, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/syndie/surgery, /turf/open/floor/iron/white/side, /area/shuttle/syndicate/medical) "zL" = ( diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 1d5fe4411084..ed8d78e7494a 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -881,7 +881,7 @@ /area/shuttle/abandoned) "Ky" = ( /obj/effect/turf_decal/bot_white, -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 1 }, /obj/effect/turf_decal/siding/purple/end, diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index 6a378324afe0..981fd15854fa 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -2033,7 +2033,7 @@ /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) "Wc" = ( -/obj/machinery/modular_computer/console/preset/research{ +/obj/machinery/modular_computer/preset/research{ dir = 4 }, /obj/machinery/light/directional/west, diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index 195aba6f581b..dbc04bc5c266 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -14,10 +14,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) -"ao" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "au" = ( /turf/open/floor/circuit/red, /area/centcom/syndicate_mothership/control) @@ -27,36 +23,9 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"aC" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 - }, -/obj/structure/sign/poster/contraband/rip_badger{ - pixel_x = 32 - }, -/obj/machinery/biogenerator, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "aG" = ( /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"aH" = ( -/obj/structure/table/reinforced, -/obj/item/knife/combat/survival{ - pixel_x = 7; - pixel_y = 17 - }, -/obj/item/reagent_containers/cup/glass/bottle/rum{ - pixel_x = -5; - pixel_y = 17 - }, -/obj/structure/sign/poster/contraband/red_rum{ - pixel_x = 32 - }, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "aJ" = ( /obj/structure/fence/cut/medium, /turf/open/misc/asteroid/snow/airless, @@ -67,18 +36,17 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"aR" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("nukiebase"="Burn Chamber"); - desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; - dir = 1; - name = "Ordnance Chamber Monitor" +"aT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/cold/directional/west{ - dir = 2 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 }, -/turf/open/floor/mineral/titanium/tiled/yellow, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) "bf" = ( /obj/effect/turf_decal/siding/purple{ @@ -89,6 +57,16 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"bg" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/rip_badger{ + pixel_x = 32 + }, +/obj/machinery/biogenerator, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "bo" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -103,6 +81,28 @@ /obj/machinery/atmospherics/components/binary/pump/on, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"bv" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"bz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/obj/machinery/airalarm/unlocked{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "bB" = ( /obj/structure/railing{ dir = 4 @@ -125,23 +125,26 @@ /obj/machinery/vending/hydronutrients, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"bE" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 5 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = -11 - }, -/obj/item/storage/belt/medical, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/centcom/syndicate_mothership/control) "bF" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 10 }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"bH" = ( +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) +"bJ" = ( +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "bT" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/snow/airless, @@ -160,16 +163,28 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"cc" = ( -/obj/structure/sign/poster/contraband/syndiemoth{ +"ck" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Frosted Window"; + opacity = 1 + }, +/obj/item/soap/syndie, +/obj/structure/sign/poster/contraband/got_wood{ pixel_x = 32 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +/turf/open/floor/iron/freezer, /area/centcom/syndicate_mothership/control) "cl" = ( /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) +"cr" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/sign/poster/contraband/cybersun_six_hundred{ + pixel_x = 32 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "cA" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/ignition/incinerator/ordmix{ @@ -187,24 +202,10 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"cC" = ( -/obj/machinery/griddle, -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "cF" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/control) -"cQ" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "cT" = ( /obj/structure/rack, /obj/item/katana/cursed{ @@ -223,6 +224,20 @@ /obj/machinery/shower/directional/south, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"dk" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/machinery/light/cold/directional/east, +/obj/item/gun/syringe/syndicate, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "dn" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -232,17 +247,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) -"do" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/mineral/titanium/tiled, -/area/centcom/syndicate_mothership/control) "dq" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_half, @@ -270,13 +274,6 @@ /obj/structure/fluff/tram_rail, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"dI" = ( -/obj/structure/dresser, -/obj/structure/noticeboard/directional/south, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/syndicate_mothership/control) "dN" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -318,11 +315,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) -"eh" = ( -/obj/structure/closet/cardboard/metal, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "ej" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -349,14 +341,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"eo" = ( -/obj/structure/sign/poster/contraband/free_drone{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "er" = ( /obj/structure/table/wood, /obj/item/food/syndicake{ @@ -401,24 +385,18 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"fd" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/power{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "fk" = ( /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"fo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/c20r{ - pixel_x = 32 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) -"fu" = ( -/obj/machinery/shower/directional/south, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/freezer, -/area/centcom/syndicate_mothership/control) "fw" = ( /obj/item/kirbyplants/random, /turf/open/floor/mineral/plastitanium, @@ -441,25 +419,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"fE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/airalarm/unlocked{ - dir = 8; - pixel_x = -24 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_bombthreat) -"fH" = ( -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_x = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "fK" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, @@ -475,15 +434,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"ga" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/knife/kitchen, -/obj/structure/sign/poster/contraband/self_ai_liberation{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "gf" = ( /obj/item/toy/plush/lizard_plushie/green{ name = "Spots-The-Operative" @@ -497,6 +447,25 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"gi" = ( +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) +"gn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/knife/kitchen, +/obj/structure/sign/poster/contraband/self_ai_liberation{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "go" = ( /obj/machinery/light/cold/directional/east, /obj/machinery/vending/snack/teal, @@ -510,6 +479,10 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"gv" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "gB" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -533,17 +506,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"gI" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/andromeda_bitters{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "gJ" = ( /obj/structure/rack, /obj/item/stack/sheet/iron/fifty, @@ -554,12 +516,6 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"gM" = ( -/obj/structure/sign/poster/contraband/revolver{ - pixel_y = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "gS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, @@ -591,34 +547,13 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"hb" = ( -/obj/effect/turf_decal/siding/wideplating{ +"hp" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/siding/wideplating, -/obj/machinery/door/airlock/glass_large{ - name = "Disembarkents" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/iron/smooth_half{ - dir = 4 - }, -/area/centcom/syndicate_mothership/control) -"hc" = ( -/obj/structure/sign/poster/contraband/lamarr{ - pixel_y = -32 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/syndicate_mothership/control) -"hp" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/railing{ - dir = 10 +/obj/structure/railing{ + dir = 10 }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) @@ -631,10 +566,34 @@ }, /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"hG" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/space_cube{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "hN" = ( /obj/machinery/chem_mass_spec, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"hS" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/spawner/random/aimodule/syndicate, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "hW" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -731,48 +690,12 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/catwalk_floor/titanium, /area/centcom/syndicate_mothership/control) -"jd" = ( -/obj/structure/rack, -/obj/machinery/light/cold/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = 12 - }, -/obj/item/wrench{ - desc = "A little smidgeon of Freon..."; - name = "Freon" - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = -4; - pixel_y = -8 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/stock_parts/micro_laser/high{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/melee/powerfist, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) "je" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 8 }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"jf" = ( -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "jh" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ chamber_id = "nukiebase"; @@ -782,13 +705,12 @@ }, /turf/open/floor/engine/vacuum, /area/centcom/syndicate_mothership/expansion_bombthreat) -"jq" = ( -/obj/structure/dresser, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/smooth_half{ - dir = 1 +"jn" = ( +/obj/machinery/igniter/incinerator_ordmix{ + id = "syn_ordmix_igniter" }, -/area/centcom/syndicate_mothership/control) +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) "js" = ( /obj/machinery/computer/camera_advanced{ dir = 8; @@ -797,6 +719,17 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"jw" = ( +/obj/structure/dresser, +/obj/structure/noticeboard/directional/north, +/obj/item/dyespray{ + pixel_x = -2; + pixel_y = 15 + }, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) "jC" = ( /obj/machinery/vending/boozeomat, /turf/closed/indestructible/syndicate, @@ -807,19 +740,6 @@ }, /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"jT" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/bottle/beer{ - pixel_x = 5; - pixel_y = -2 - }, -/obj/item/toy/cards/deck/syndicate{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/effect/spawner/random/aimodule/syndicate, -/turf/open/floor/wood/tile, -/area/centcom/syndicate_mothership/control) "jW" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -828,6 +748,13 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"jY" = ( +/obj/structure/sign/poster/contraband/masked_men{ + pixel_x = 32 + }, +/obj/machinery/chem_dispenser/fullupgrade, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "kg" = ( /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) @@ -855,6 +782,17 @@ "ks" = ( /turf/closed/wall/mineral/diamond, /area/centcom/syndicate_mothership/control) +"ku" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = -11 + }, +/obj/item/storage/belt/medical, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) "kz" = ( /obj/machinery/door/airlock/maintenance/external{ name = "Bunk Room 2" @@ -875,18 +813,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"kN" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/the_big_gas_giant_truth{ - pixel_y = 32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "kU" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -902,6 +828,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) +"kY" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "la" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -927,6 +859,38 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) +"le" = ( +/obj/structure/closet/crate/freezer{ + name = "pantry crate" + }, +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_y = -32 + }, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/peppermill, +/obj/item/food/grown/wheat, +/obj/item/food/grown/wheat, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/herbs, +/obj/item/food/grown/herbs, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/aloe, +/obj/item/food/grown/coffee, +/obj/item/food/grown/coffee, +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) "lg" = ( /turf/closed/indestructible/fakedoor{ name = "BUNKER 4337" @@ -941,18 +905,38 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"lm" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/structure/showcase/machinery/tv{ - desc = "Static fills the screen. If you can find the VCR, you might be able to watch those old Heist Movies again."; - name = "\improper Static Filled Tube(TM) Television" +"ll" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/structure/sign/poster/contraband/rip_badger{ - pixel_x = 32 +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/syringe{ + pixel_x = -5; + pixel_y = 12 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) +/obj/item/reagent_containers/syringe{ + pixel_x = -2; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 14 + }, +/obj/machinery/light/cold/directional/north, +/obj/item/reagent_containers/dropper{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/bottle/formaldehyde{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "lo" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/camera/autoname/directional/south{ @@ -982,52 +966,6 @@ dir = 1 }, /area/centcom/syndicate_mothership/control) -"lH" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/assembly/signaler{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/assembly/timer{ - pixel_x = 12; - pixel_y = -9 - }, -/obj/item/assembly/timer{ - pixel_x = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -6; - pixel_y = -4 - }, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/assembly/timer{ - pixel_x = 18; - pixel_y = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) "lQ" = ( /obj/structure/chair/sofa/left/brown{ dir = 4 @@ -1037,29 +975,21 @@ /area/centcom/syndicate_mothership/control) "mb" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 6 - }, -/obj/machinery/camera/autoname/directional/east{ - network = list("nukie") - }, -/obj/machinery/chem_dispenser/mutagensaltpeter, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) -"mt" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/structure/table/glass/plasmaglass, -/obj/item/folder/white, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 5 + dir = 6 }, -/obj/machinery/light/cold/directional/west, -/obj/item/stack/spacecash/c200{ - pixel_y = 17 +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") }, -/turf/open/floor/mineral/plastitanium, +/obj/machinery/chem_dispenser/mutagensaltpeter, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"mh" = ( +/obj/machinery/griddle, +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) "my" = ( /obj/effect/landmark/start/nukeop_leader, @@ -1088,38 +1018,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"mG" = ( -/obj/structure/closet/crate/freezer{ - name = "pantry crate" - }, -/obj/structure/sign/poster/contraband/moffuchis_pizza{ - pixel_y = -32 - }, -/obj/item/reagent_containers/condiment/rice{ - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/rice{ - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/saltshaker, -/obj/item/reagent_containers/condiment/peppermill, -/obj/item/food/grown/wheat, -/obj/item/food/grown/wheat, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/reagent_containers/condiment/sugar, -/obj/item/food/grown/soybeans, -/obj/item/food/grown/soybeans, -/obj/item/food/grown/vanillapod, -/obj/item/food/grown/vanillapod, -/obj/item/food/grown/herbs, -/obj/item/food/grown/herbs, -/obj/item/food/grown/cocoapod, -/obj/item/food/grown/cocoapod, -/obj/item/food/grown/aloe, -/obj/item/food/grown/coffee, -/obj/item/food/grown/coffee, -/turf/open/floor/plastic, -/area/centcom/syndicate_mothership/expansion_fridgerummage) "mJ" = ( /obj/structure/sign/poster/contraband/free_key, /turf/closed/indestructible/syndicate, @@ -1144,14 +1042,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"nb" = ( -/obj/machinery/oven/range, -/obj/structure/sign/poster/contraband/eat{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "ng" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -1164,21 +1054,6 @@ /obj/structure/fans/tiny, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"nh" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 15 - }, -/obj/item/grenade/chem_grenade, -/obj/item/stack/cable_coil, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 14 - }, -/obj/machinery/light/cold/directional/west, -/obj/item/stack/cable_coil, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "nk" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -1227,12 +1102,30 @@ /obj/structure/flora/tree/dead/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"oa" = ( +/obj/structure/sign/poster/contraband/lamarr{ + pixel_y = -32 + }, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) "oc" = ( /obj/structure/fence{ dir = 4 }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"of" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = -32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "oh" = ( /obj/structure/table/reinforced, /obj/item/syndicatedetonator{ @@ -1251,6 +1144,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) +"oq" = ( +/obj/structure/closet/cardboard, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "or" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -1277,12 +1177,34 @@ }, /turf/open/floor/engine/vacuum, /area/centcom/syndicate_mothership/expansion_bombthreat) +"oz" = ( +/obj/structure/dresser, +/obj/structure/noticeboard/directional/south, +/obj/item/dyespray{ + pixel_x = -3; + pixel_y = 13 + }, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) "oD" = ( /obj/effect/turf_decal/siding/red{ dir = 1 }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) +"oJ" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/andromeda_bitters{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "oK" = ( /obj/machinery/camera/autoname/directional/south{ network = list("nukie") @@ -1291,9 +1213,13 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) -"oN" = ( -/obj/machinery/light/cold/directional/east, -/obj/item/kirbyplants/random, +"oM" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/syndicate_pistol{ + pixel_y = 32 + }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "oR" = ( @@ -1327,24 +1253,6 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"pi" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/sign/poster/contraband/cybersun_six_hundred{ - pixel_x = 32 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"pj" = ( -/obj/structure/sign/poster/contraband/lusty_xenomorph{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/syndicate_mothership/control) "pl" = ( /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/airless, @@ -1374,13 +1282,6 @@ /obj/item/bedsheet/syndie, /turf/open/floor/iron/smooth_half, /area/centcom/syndicate_mothership/control) -"pF" = ( -/obj/structure/closet/cardboard, -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ - pixel_x = 32 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/centcom/syndicate_mothership/control) "pJ" = ( /obj/machinery/camera/autoname/directional/south{ network = list("nukie") @@ -1394,7 +1295,8 @@ /area/centcom/syndicate_mothership/control) "pM" = ( /obj/machinery/light/cold/directional/south, -/turf/open/floor/plating, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "pS" = ( /obj/structure/chair/greyscale{ @@ -1411,6 +1313,12 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"pV" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "pW" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -1422,12 +1330,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"qc" = ( -/obj/machinery/igniter/incinerator_ordmix{ - id = "syn_ordmix_igniter" - }, -/turf/open/floor/engine/vacuum, -/area/centcom/syndicate_mothership/expansion_bombthreat) "qh" = ( /obj/item/stack/spacecash/c20, /turf/open/misc/asteroid/snow/icemoon, @@ -1507,15 +1409,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"qL" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/syndicate_pistol{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "qN" = ( /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) @@ -1567,6 +1460,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) +"rp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "ru" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1577,6 +1478,14 @@ }, /turf/open/floor/iron/dark/textured_half, /area/centcom/syndicate_mothership/control) +"rD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/purple, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "rG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -1597,18 +1506,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"rX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/fun_police{ - pixel_x = -32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_bombthreat) "sb" = ( /obj/structure/fence/cut/medium{ dir = 4 @@ -1644,10 +1541,6 @@ }, /turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/expansion_bombthreat) -"sl" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "so" = ( /obj/structure/chair/office{ dir = 1 @@ -1664,49 +1557,10 @@ "sq" = ( /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership/control) -"ss" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/screwdriver{ - pixel_x = 1; - pixel_y = 23 - }, -/obj/item/clothing/glasses/science{ - pixel_x = -5; - pixel_y = 11 - }, -/obj/machinery/reagentgrinder{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/structure/noticeboard/directional/east, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -4 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "sv" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"sz" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 6 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_y = -32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "sE" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1748,15 +1602,6 @@ "sU" = ( /turf/open/space/basic, /area/space) -"sY" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/power{ - pixel_y = 32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "tc" = ( /obj/machinery/light/small/directional/south, /obj/structure/cable, @@ -1783,17 +1628,18 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"to" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) "ts" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 +/obj/structure/chair/sofa/bench/left{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/sign/poster/contraband/smoke{ + pixel_y = 31 }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "tu" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red/corner{ @@ -1812,16 +1658,19 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) -"tC" = ( -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/door/window/survival_pod{ - name = "Surgery"; - opacity = 1 +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"tB" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/turf/open/floor/mineral/titanium/tiled/blue, /area/centcom/syndicate_mothership/control) "tJ" = ( /obj/effect/light_emitter{ @@ -1855,6 +1704,19 @@ /obj/structure/statue/uranium/nuke, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"uJ" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("nukiebase"="Burn Chamber"); + desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; + dir = 1; + name = "Ordnance Chamber Monitor" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/cold/directional/west{ + dir = 2 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "uK" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1881,6 +1743,23 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"vm" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/control) +"vs" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "vv" = ( /obj/structure/table/reinforced, /obj/item/paper/fluff/stations/centcom/disk_memo{ @@ -1902,38 +1781,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"vG" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/structure/table/glass/plasmaglass, -/obj/item/reagent_containers/syringe{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = -2; - pixel_y = 13 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = 1; - pixel_y = 14 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/reagent_containers/dropper{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/bottle/formaldehyde{ - pixel_x = 8; - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "vI" = ( /obj/structure/railing, /turf/open/floor/catwalk_floor/iron_smooth{ @@ -2009,15 +1856,6 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"wy" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/rebels_unite{ - pixel_y = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "wG" = ( /turf/open/floor/iron/smooth_half{ dir = 1 @@ -2045,10 +1883,6 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"xc" = ( -/obj/machinery/smartfridge/chemistry/virology/preloaded, -/turf/closed/indestructible/syndicate, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "xe" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 6 @@ -2076,15 +1910,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"xs" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/punch_shit{ - pixel_y = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "xu" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) @@ -2099,12 +1924,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"xU" = ( -/obj/structure/sign/poster/contraband/moffuchis_pizza{ - pixel_x = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "ya" = ( /turf/open/floor/carpet, /area/centcom/syndicate_mothership/control) @@ -2142,24 +1961,6 @@ /obj/structure/chair/office/light, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"yy" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 6 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe{ - pixel_y = 15 - }, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/centcom/syndicate_mothership/control) "yB" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid/snow/icemoon, @@ -2174,15 +1975,6 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/catwalk_floor/titanium, /area/centcom/syndicate_mothership/control) -"yG" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 9 - }, -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_y = 32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "yK" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -2194,13 +1986,10 @@ /obj/item/storage/medkit/regular, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"yP" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/machinery/camera/autoname/directional/south{ - network = list("nukie") - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) +"yZ" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "zi" = ( /obj/structure/chair/office, /turf/open/floor/mineral/titanium/tiled/yellow, @@ -2240,41 +2029,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"zJ" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 - }, -/obj/structure/table/reinforced/plasmarglass, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve, -/obj/item/transfer_valve{ - pixel_x = -5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) "zL" = ( /obj/structure/rack, /obj/item/restraints/handcuffs/cable/pink, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"zN" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/space_cube{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "zQ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/tank/nitrogen, @@ -2290,13 +2050,21 @@ }, /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) -"zW" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/landmark/start/nukeop, -/obj/structure/sign/poster/contraband/donk_co{ - pixel_y = -32 +"zV" = ( +/obj/machinery/door/window/survival_pod{ + dir = 8; + name = "Toilet Door"; + opacity = 1 }, -/turf/open/floor/wood/tile, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ + name = "Frosted Window"; + opacity = 1 + }, +/obj/structure/toilet/greyscale{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "Ab" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -2325,6 +2093,11 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"AJ" = ( +/obj/structure/closet/cardboard/metal, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "AL" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/smooth_half{ @@ -2381,9 +2154,12 @@ /obj/machinery/chem_master, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Bk" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/mineral/titanium, +"Bi" = ( +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "Bm" = ( /obj/structure/flora/tree/pine/style_random, @@ -2442,6 +2218,14 @@ "BK" = ( /turf/open/floor/plastic, /area/centcom/syndicate_mothership/expansion_fridgerummage) +"BM" = ( +/obj/machinery/oven/range, +/obj/structure/sign/poster/contraband/eat{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "BR" = ( /obj/structure/table/glass/plasmaglass, /obj/item/storage/pill_bottle{ @@ -2458,6 +2242,16 @@ "Ca" = ( /turf/closed/wall/mineral/wood, /area/centcom/syndicate_mothership/control) +"Cd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/c20r{ + pixel_x = 32 + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Ce" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/east, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -2481,14 +2275,12 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"Cm" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = 31 +"Cr" = ( +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_x = 32 }, -/turf/open/floor/mineral/titanium, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) "Ct" = ( /obj/machinery/door/airlock/hatch{ @@ -2497,15 +2289,56 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/smooth_edge, /area/centcom/syndicate_mothership/control) +"CC" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/door/window/survival_pod{ + name = "Surgery"; + opacity = 1 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) +"CE" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "CX" = ( /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership) +"De" = ( +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Dl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"Dn" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_y = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Du" = ( /obj/docking_port/stationary{ area_type = /area/centcom/syndicate_mothership; @@ -2525,28 +2358,15 @@ /obj/structure/chair/sofa/bench, /obj/machinery/light/cold/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/stone, -/area/centcom/syndicate_mothership/control) -"DI" = ( -/obj/structure/sign/poster/contraband/masked_men{ - pixel_x = 32 - }, -/obj/machinery/chem_dispenser/fullupgrade, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/stone, +/area/centcom/syndicate_mothership/control) "DJ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) -"DN" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "DY" = ( /obj/structure/table/wood/poker, /obj/machinery/light/warm/directional/north, @@ -2600,10 +2420,11 @@ /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) "Et" = ( -/obj/machinery/light/cold/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark/textured_large, +/obj/structure/sign/poster/contraband/c20r{ + pixel_y = -32 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) "Ev" = ( /turf/open/floor/plating/elevatorshaft, @@ -2614,6 +2435,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"EG" = ( +/obj/structure/table/reinforced, +/obj/item/knife/combat/survival{ + pixel_x = 7; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + pixel_x = -5; + pixel_y = 17 + }, +/obj/structure/sign/poster/contraband/red_rum{ + pixel_x = 32 + }, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "EH" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -2622,14 +2460,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"EJ" = ( -/obj/machinery/light/small/red/directional/west, -/obj/structure/sign/poster/contraband/soviet_propaganda{ - pixel_x = -32 - }, -/obj/item/stack/sheet/cardboard/fifty, -/turf/open/floor/mineral/titanium/yellow, -/area/centcom/syndicate_mothership/control) "EM" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ dir = 4 @@ -2640,20 +2470,6 @@ /obj/structure/barricade/sandbags, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"ET" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/machinery/light/cold/directional/east, -/obj/item/gun/syringe/syndicate, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "EV" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -2661,6 +2477,14 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"EZ" = ( +/obj/structure/sign/poster/contraband/energy_swords{ + pixel_y = 32 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Fm" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red/corner{ @@ -2700,12 +2524,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"FR" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark/textured_half{ - dir = 4 - }, -/area/centcom/syndicate_mothership/control) "FU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2804,6 +2622,12 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"GC" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark/textured_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "GE" = ( /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/catwalk_floor/titanium, @@ -2849,22 +2673,52 @@ /obj/structure/railing, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"GV" = ( -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"GX" = ( -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "Hc" = ( /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"Hf" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/pen{ + pixel_x = 9; + pixel_y = 18 + }, +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_x = -32 + }, +/obj/item/storage/box/beakers{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 17 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -5 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Ho" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -2883,10 +2737,6 @@ /obj/machinery/shuttle_manipulator, /turf/open/floor/circuit/red, /area/centcom/syndicate_mothership/control) -"Hv" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/control) "HD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -2921,6 +2771,24 @@ /obj/item/stack/sheet/mineral/plasma, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"HE" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = 15 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) "HJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, @@ -3010,6 +2878,26 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"IG" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"IK" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_y = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "IL" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red, @@ -3052,20 +2940,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"Jz" = ( -/obj/structure/sign/poster/contraband/bountyhunters{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) -"JL" = ( -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "JR" = ( /obj/effect/turf_decal/stripes/end{ dir = 8 @@ -3122,10 +2996,29 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) +"KK" = ( +/obj/machinery/shower/directional/south, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "KL" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"KO" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical/old, +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) +"KP" = ( +/obj/machinery/light/cold/directional/south, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "KQ" = ( /obj/structure/railing/corner{ dir = 4 @@ -3214,15 +3107,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) -"LK" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 10 - }, -/obj/structure/sign/poster/contraband/energy_swords{ - pixel_x = -32 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "LM" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 8 @@ -3249,31 +3133,114 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 8 +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"Mb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) +"Me" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) +"Mk" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/assembly/signaler{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/assembly/timer{ + pixel_x = 12; + pixel_y = -9 + }, +/obj/item/assembly/timer{ + pixel_x = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = -4 + }, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/assembly/timer{ + pixel_x = 18; + pixel_y = 5 }, -/turf/open/floor/mineral/titanium/tiled/yellow, +/turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"Mb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/centcom/syndicate_mothership/control) -"Me" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "Mo" = ( /obj/structure/fence/cut/medium{ dir = 4 }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"Mq" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/screwdriver{ + pixel_x = 1; + pixel_y = 23 + }, +/obj/item/clothing/glasses/science{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/machinery/reagentgrinder{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/structure/noticeboard/directional/east, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Mr" = ( +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "Ms" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark/textured_half{ @@ -3323,6 +3290,17 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"MR" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "MU" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -3345,13 +3323,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) -"Nr" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "Ns" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -3359,13 +3330,9 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) -"NA" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical/old, -/obj/structure/sign/poster/contraband/pwr_game{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/yellow, +"Nz" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "NH" = ( /obj/effect/turf_decal/stripes/line{ @@ -3374,22 +3341,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) -"NM" = ( -/obj/machinery/door/window/survival_pod{ - dir = 8; - name = "Toilet Door"; - opacity = 1 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ - name = "Frosted Window"; - opacity = 1 - }, -/obj/structure/toilet/greyscale{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "NP" = ( /obj/structure/railing/corner, /turf/open/misc/asteroid/snow/icemoon, @@ -3428,13 +3379,11 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"Ov" = ( -/turf/open/floor/mineral/plastitanium, +"Or" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"Ow" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, +"Ov" = ( /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "Ox" = ( @@ -3469,18 +3418,18 @@ /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) "OR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 }, -/obj/structure/sign/poster/contraband/fun_police{ - pixel_x = -32 +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/glass_large{ + name = "Disembarkents" }, -/obj/machinery/light/cold/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/expansion_bombthreat) +/area/centcom/syndicate_mothership/control) "OS" = ( /obj/structure/chair/stool/directional/south, /obj/structure/sign/map/right{ @@ -3520,33 +3469,9 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"Pf" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/revolver{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "Ph" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"Pi" = ( -/obj/structure/sign/poster/contraband/c20r{ - pixel_y = -32 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) -"Pj" = ( -/obj/machinery/door/window/survival_pod{ - name = "Frosted Door"; - opacity = 1 - }, -/turf/open/floor/iron/freezer, -/area/centcom/syndicate_mothership/control) "Pu" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -3633,6 +3558,14 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) +"Qq" = ( +/obj/machinery/light/small/red/directional/west, +/obj/structure/sign/poster/contraband/soviet_propaganda{ + pixel_x = -32 + }, +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) "Qr" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -3641,6 +3574,10 @@ /obj/structure/railing, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"Qw" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Qy" = ( /obj/structure/table/wood, /obj/item/food/nachos{ @@ -3650,6 +3587,19 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"QK" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = -32 + }, +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) "QM" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -3664,22 +3614,17 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"QP" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/mech_bay_recharge_port, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Rd" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) -"Rf" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/closet/syndicate/personal, -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_y = 32 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "Rs" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -3689,6 +3634,25 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"Ru" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/revolver{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Rw" = ( +/obj/structure/sign/poster/contraband/bountyhunters{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "RA" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -3705,6 +3669,34 @@ "RD" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bombthreat) +"RG" = ( +/obj/structure/rack, +/obj/machinery/light/cold/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 12 + }, +/obj/item/wrench{ + desc = "A little smidgeon of Freon..."; + name = "Freon" + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -4; + pixel_y = -8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -8; + pixel_y = -4 + }, +/obj/item/melee/powerfist, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "RL" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -3717,11 +3709,20 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"RX" = ( -/obj/machinery/light/cold/directional/south, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, +"RV" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"RY" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/nukeop, +/obj/structure/sign/poster/contraband/donk_co{ + pixel_y = -32 + }, +/turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) "Sc" = ( /obj/structure/railing, @@ -3793,6 +3794,15 @@ /obj/item/mop, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"Sx" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/obj/structure/sign/poster/contraband/energy_swords{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "SD" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 @@ -3800,18 +3810,13 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bombthreat) -"SJ" = ( -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/structure/chair/sofa/bench/right, -/obj/structure/sign/poster/contraband/donut_corp{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/stone, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"SH" = ( +/obj/structure/sign/poster/contraband/revolver{ + pixel_y = -32 + }, +/turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "SK" = ( /obj/structure/fence/cut/large, @@ -3829,6 +3834,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/control) +"SN" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"SP" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "SR" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -3836,14 +3851,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) -"SY" = ( -/obj/structure/sign/poster/contraband/energy_swords{ - pixel_y = 32 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "Ta" = ( /turf/closed/indestructible/fakedoor{ name = "Sub-Laboratory Elevator" @@ -3966,19 +3973,28 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"TY" = ( -/turf/open/floor/mineral/plastitanium/red, +"Ui" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/showcase/machinery/tv{ + desc = "Static fills the screen. If you can find the VCR, you might be able to watch those old Heist Movies again."; + name = "\improper Static Filled Tube(TM) Television" + }, +/obj/structure/sign/poster/contraband/rip_badger{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"Ul" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/closet/syndicate/personal, -/obj/structure/sign/poster/contraband/lusty_xenomorph{ +"Uk" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/chair/sofa/bench/right, +/obj/structure/sign/poster/contraband/donut_corp{ pixel_y = 32 }, -/obj/effect/turf_decal/tile/red/full, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/stone, /area/centcom/syndicate_mothership/control) "Un" = ( /obj/effect/turf_decal/stripes/corner{ @@ -4010,35 +4026,51 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"Vb" = ( -/obj/effect/turf_decal/stripes/line{ +"UN" = ( +/obj/effect/turf_decal/siding/purple{ dir = 1 }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/the_big_gas_giant_truth{ + pixel_y = 32 + }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Vm" = ( -/obj/structure/flora/rock/pile/style_random, -/turf/open/misc/asteroid/snow/icemoon, -/area/centcom/syndicate_mothership/control) -"Vr" = ( +"US" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 + dir = 9 }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) -"VA" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Tinted Window"; - opacity = 1 +/obj/structure/table/glass/plasmaglass, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 12 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -7; + pixel_y = -8 }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = -7 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/kudzu{ + pixel_y = 32 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 10; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Vm" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "VC" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/textured_half{ @@ -4081,14 +4113,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"VW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/cold/directional/east, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/expansion_bombthreat) "Wc" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -4096,6 +4120,18 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"Wl" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "Wo" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -4221,16 +4257,11 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"XD" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ - name = "Frosted Window"; - opacity = 1 - }, -/obj/item/soap/syndie, -/obj/structure/sign/poster/contraband/got_wood{ - pixel_x = 32 +"XH" = ( +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 }, -/turf/open/floor/iron/freezer, +/turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) "XL" = ( /obj/machinery/light/cold/directional/east, @@ -4273,6 +4304,12 @@ "Ye" = ( /turf/closed/indestructible/rock/snow, /area/centcom/syndicate_mothership) +"Yi" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Yk" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -4302,35 +4339,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) -"YI" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 9 - }, -/obj/structure/table/glass/plasmaglass, -/obj/machinery/reagentgrinder{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -7; - pixel_y = -8 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 9; - pixel_y = -7 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/kudzu{ - pixel_y = 32 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 10; - pixel_y = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "YJ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -4349,6 +4357,13 @@ /obj/structure/weightmachine/weightlifter, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"YR" = ( +/obj/machinery/door/window/survival_pod{ + name = "Frosted Door"; + opacity = 1 + }, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "YS" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/railing{ @@ -4356,6 +4371,21 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"YT" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 14 + }, +/obj/machinery/light/cold/directional/west, +/obj/item/stack/cable_coil, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "YX" = ( /obj/structure/railing{ dir = 6 @@ -4397,6 +4427,22 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"Zu" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/table/glass/plasmaglass, +/obj/item/folder/white, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/light/cold/directional/west, +/obj/item/stack/spacecash/c200{ + pixel_y = 17 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Zv" = ( /obj/structure/flora/tree/pine/style_random, /obj/structure/flora/grass/both/style_random, @@ -4406,6 +4452,11 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"ZC" = ( +/obj/machinery/light/cold/directional/east, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "ZE" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -4435,49 +4486,6 @@ "ZO" = ( /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"ZV" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/pen{ - pixel_x = 9; - pixel_y = 18 - }, -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_x = -32 - }, -/obj/item/storage/box/beakers{ - pixel_x = -4; - pixel_y = 17 - }, -/obj/item/storage/box/syringes{ - pixel_x = 4; - pixel_y = 17 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = -1 - }, -/obj/item/assembly/timer{ - pixel_x = -6; - pixel_y = -5 - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "ZW" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -4766,8 +4774,8 @@ nQ AR BR Sm -nh -ZV +YT +Hf dx nQ Ox @@ -4776,7 +4784,7 @@ Ox xu xu xu -xc +yZ xu RT fk @@ -4876,7 +4884,7 @@ DZ DZ DZ xu -YI +US HD oi MH @@ -5069,7 +5077,7 @@ sU sU Ox nQ -sY +fd BE Tz bU @@ -5176,13 +5184,13 @@ FG KD qX qX -Vb +rD nQ DZ Ta DZ xu -vG +ll Ph Jq gV @@ -5280,9 +5288,9 @@ iO Mt EV nQ -yG -Ow -LK +bv +kY +Sx ZO XT xg @@ -5375,7 +5383,7 @@ sU sU Ox nQ -kN +UN yf yf yf @@ -5383,7 +5391,7 @@ yf na PD zE -TY +to lt ws Wz @@ -5485,10 +5493,10 @@ Ge Ge xf zE -TY +to lt ZO -aC +bg mb Mv nL @@ -5581,14 +5589,14 @@ Ye nQ nQ AW -DI -ET -ss +jY +dk +Mq hN PD zE -TY -yP +to +RV RD RD RD @@ -5688,16 +5696,16 @@ nQ nQ nQ nQ -GX -TY -JL +Bi +to +pM RD SD So -jd -lH -rX -OR +RG +Mk +aT +QK RD RD RD @@ -5785,22 +5793,22 @@ ub vX DZ oW -do +vm yK -mt +Zu In VK zE -TY +to lt FM wM ee yp -zJ +CE VF If -fE +bz lC yb Uq @@ -5887,13 +5895,13 @@ PN qO DZ iA -tC +CC Zg pU lt XQ zE -TY +to lt Lu ae @@ -5905,7 +5913,7 @@ LF cA RD PM -qc +jn RD Ox sU @@ -5988,14 +5996,14 @@ Bm uT PN DZ -bE -yy +ku +HE rS iH Bn VK zE -TY +to lt FM iL @@ -6096,9 +6104,9 @@ DZ ek ek ek -Vr -cQ -sz +vs +SP +of RD Gf gh @@ -6106,7 +6114,7 @@ yi Gf LY te -aR +uJ kW oy oy @@ -6192,9 +6200,9 @@ VK VK DZ aM -ga +gn Cf -nb +BM ek qs ek @@ -6205,7 +6213,7 @@ RD NH Tl nR -VA +IG AA ZG Oh @@ -6293,7 +6301,7 @@ VK VK iX DZ -cC +mh uX uX uX @@ -6305,9 +6313,9 @@ Yx JR RD Ns -fo -VW -ts +Cd +rp +MR Yk XV sj @@ -6398,9 +6406,9 @@ Lx uX uX uX -gI +oJ ek -mG +le ek zp Yx @@ -6500,7 +6508,7 @@ DZ gE my uX -zN +hG ek Id ek @@ -6508,13 +6516,13 @@ ZE Yx dN DZ -fu -Pj -fH -Bk -GV +KK +YR +De +Qw +XH gs -xU +bJ RD RD RD @@ -6610,13 +6618,13 @@ DZ GF DZ DZ -fu -XD +KK +ck IQ bo bo -NM -NM +zV +zV DZ Ox Ox @@ -6809,7 +6817,7 @@ ld ld KH Ez -Jz +Rw px px Qr @@ -6820,7 +6828,7 @@ tc mJ DY lQ -Pf +Ru VK KA ZL @@ -7019,11 +7027,11 @@ Wp kF YF DZ -SY +EZ HJ kX HJ -lm +Ui El VK YZ @@ -7216,17 +7224,17 @@ mK er TS DZ -SJ +Uk Wp Wp -Pi +Et DZ Sv DZ KW gS Ca -pj +gi KW DZ To @@ -7315,8 +7323,8 @@ bC DZ OS TG -jT -zW +hS +RY DZ Dy Wp @@ -7325,11 +7333,11 @@ Qr Ct pf DZ -jq +jw Ek Ca dq -dI +oz DZ YZ Eo @@ -7428,7 +7436,7 @@ DZ ad DZ pD -hc +oa Ca wG pD @@ -7931,7 +7939,7 @@ uT uT VK qp -DN +pV Ms Oi VK @@ -8033,7 +8041,7 @@ uT PN VK qp -eo +bH VC Oi VK @@ -8339,7 +8347,7 @@ uT uT VK qp -jf +Mr oK Oi VK @@ -8441,7 +8449,7 @@ uT uT VK qp -DN +pV Ms Oi VK @@ -8948,7 +8956,7 @@ VK VK VK DZ -Cm +ts GI IM wG @@ -9044,12 +9052,12 @@ qw qw qw ng -hb -FR +OR +GC TC TC -FR -hb +GC +OR ZZ Me wc @@ -9147,10 +9155,10 @@ qw qw ng qJ -FR +GC TC TC -FR +GC qJ ZZ Me @@ -9246,7 +9254,7 @@ uT bW qw qw -pM +gv DZ DZ VK @@ -9254,7 +9262,7 @@ Xv KE VK DZ -qL +oM ij zH wG @@ -9350,7 +9358,7 @@ qw qw qw VK -eh +AJ ay so uX @@ -9474,7 +9482,7 @@ Vm WC XC VK -sl +SN VK mV WC @@ -9555,14 +9563,14 @@ qw qw AN LS -cc +Cr uX ZH -RX +KP DZ Fp go -pi +cr wG AL DZ @@ -9654,13 +9662,13 @@ uT bW Zk qw -pM +gv DZ DZ DZ js sQ -aH +EG DZ DZ qp @@ -9765,19 +9773,19 @@ DZ DZ DZ pK -EJ +Qq VK ZZ ZZ dn qN qN -ao +Nz Wu ov or zE -sl +SN Ov Ov Ov @@ -9860,13 +9868,13 @@ qw qw qw VH -gM +SH DZ WU dO OO DZ -NA +KO FN VK ZZ @@ -9964,7 +9972,7 @@ qw Py sp DZ -Ul +tB ol cT DZ @@ -10064,7 +10072,7 @@ qw qw qw Rs -wy +IK DZ Ld ol @@ -10081,7 +10089,7 @@ au LB iV ov -Nr +QP DZ Ox sq @@ -10168,7 +10176,7 @@ qw VH ZZ DZ -Rf +Wl Ib Ib en @@ -10268,11 +10276,11 @@ qw UE Sg Py -xs +Dn DZ Ld XL -pF +oq VK ZZ ZZ @@ -10482,13 +10490,13 @@ Zt VK qw VK -oN +ZC pr ya PF ya oD -Et +Yi DZ DZ DZ @@ -10684,7 +10692,7 @@ HW HW tJ VK -Hv +Or VK Ho VK diff --git a/_maps/~monkestation/RandomBars/Icebox/BarSM.dmm b/_maps/~monkestation/RandomBars/Icebox/BarSM.dmm index f8788aacd9df..a283cdc68cd6 100644 --- a/_maps/~monkestation/RandomBars/Icebox/BarSM.dmm +++ b/_maps/~monkestation/RandomBars/Icebox/BarSM.dmm @@ -887,7 +887,7 @@ dir = 8 }, /obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering, +/obj/machinery/modular_computer/preset/engineering, /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 diff --git a/_maps/~monkestation/RandomBars/Icebox/Drunkopsbar.dmm b/_maps/~monkestation/RandomBars/Icebox/Drunkopsbar.dmm index cf6416cd6971..5b6c97d5451a 100644 --- a/_maps/~monkestation/RandomBars/Icebox/Drunkopsbar.dmm +++ b/_maps/~monkestation/RandomBars/Icebox/Drunkopsbar.dmm @@ -340,7 +340,7 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 4 }, -/obj/machinery/modular_computer/console/preset/civilian{ +/obj/machinery/modular_computer/preset/civilian{ dir = 8; name = "BarDropship Helm Console" }, diff --git a/_maps/~monkestation/RandomEngines/MetaStation/singularity.dmm b/_maps/~monkestation/RandomEngines/MetaStation/singularity.dmm index 13e5c45cf123..774617cb34a3 100644 --- a/_maps/~monkestation/RandomEngines/MetaStation/singularity.dmm +++ b/_maps/~monkestation/RandomEngines/MetaStation/singularity.dmm @@ -308,15 +308,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"yo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Space Engine Room" - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) "yR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -911,7 +902,7 @@ MT dx ID dc -yo +SS je je je diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 14641092d6dc..0eba623df047 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -330,3 +330,13 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( // This flag disables certain checks that presume antagonist datums mean 'baddie'. #define FLAG_FAKE_ANTAG (1 << 0) + +#define FREEDOM_IMPLANT_CHARGES 4 + +/// Changeling abilities with DNA cost = this are innately given to all changelings +#define CHANGELING_POWER_INNATE -1 +/// Changeling abilities with DNA cost = this are not obtainable by changelings - either used for secret unlockable or abstract abilities +#define CHANGELING_POWER_UNOBTAINABLE -2 + +/// For changelings, this is how many recent say lines are retained when absorbing a mob +#define LING_ABSORB_RECENT_SPEECH 8 diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm index 4144be832e29..26f13bc0522c 100644 --- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -84,6 +84,9 @@ /// The temperature the blue icon is displayed. #define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k +/// Beyond this temperature, being on fire will increase body temperature by less and less +#define BODYTEMP_FIRE_TEMP_SOFTCAP 1200 + /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define PRESSURE_DAMAGE_COEFFICIENT 2 #define MAX_HIGH_PRESSURE_DAMAGE 2 diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 6c8a3022e8fa..c7275f7c423e 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -26,3 +26,5 @@ #define MOOK_ATTACK_ACTIVE 2 #define MOOK_ATTACK_STRIKE 3 +///keeps track of how many gutlunches are born +GLOBAL_VAR_INIT(gutlunch_count, 0) diff --git a/code/__DEFINES/changeling.dm b/code/__DEFINES/changeling.dm deleted file mode 100644 index 1913e62c0e9a..000000000000 --- a/code/__DEFINES/changeling.dm +++ /dev/null @@ -1,4 +0,0 @@ -/// The duration of the fakedeath coma. -#define LING_FAKEDEATH_TIME (40 SECONDS) -/// The number of recent spoken lines to gain on absorbing a mob -#define LING_ABSORB_RECENT_SPEECH 8 diff --git a/code/__DEFINES/dcs/signals/signals_camera.dm b/code/__DEFINES/dcs/signals/signals_camera.dm new file mode 100644 index 000000000000..92e9b94f35bb --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_camera.dm @@ -0,0 +1,4 @@ +///Signal sent when a /datum/trackable found a target: (mob/living/target) +#define COMSIG_TRACKABLE_TRACKING_TARGET "comsig_trackable_tracking_target" +///Signal sent when the mob a /datum/trackable is actively following changes glide size: mob/living/target, new_glide_size) +#define COMSIG_TRACKABLE_GLIDE_CHANGED "comsig_trackable_glide_changed" diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index ff7d1e2cee6e..c65762eb6269 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -43,12 +43,8 @@ #define COMSIG_GASMIX_REACTED "comsig_gasmix_reacted" // Modular computer's file signals. Tells the program datum something is going on. -/// From /obj/item/modular_computer/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDING "comsig_modular_computer_file_adding" -/// From /obj/item/modular_computer/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDED "comsig_modular_computer_file_added" -/// From /obj/item/modular_computer/proc/remove_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_DELETING "comsig_modular_computer_file_deleting" +/// From /obj/item/modular_computer/proc/store_file: (datum/computer_file/file_source, obj/item/modular_computer/host) +#define COMSIG_MODULAR_COMPUTER_FILE_STORE "comsig_modular_computer_file_store" /// From /obj/item/modular_computer/proc/store_file: () #define COMSIG_MODULAR_COMPUTER_FILE_DELETED "comsig_modular_computer_file_deleted" diff --git a/code/__DEFINES/dcs/signals/signals_medical.dm b/code/__DEFINES/dcs/signals/signals_medical.dm index 801eb6b41bb1..2dca6487f702 100644 --- a/code/__DEFINES/dcs/signals/signals_medical.dm +++ b/code/__DEFINES/dcs/signals/signals_medical.dm @@ -4,9 +4,14 @@ /// From /datum/surgery_step/success(): (datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) #define COMSIG_MOB_SURGERY_STEP_SUCCESS "mob_surgery_step_success" +/// From /obj/item/shockpaddles/do_help, after the defib do_after is complete, but before any effects are applied: (mob/living/defibber, obj/item/shockpaddles/source) +#define COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP "carbon_being_defibbed" + /// Return to stop default defib handling + #define COMPONENT_DEFIB_STOP (1<<0) + /// From /obj/item/shockpaddles/proc/do_success(): (obj/item/shockpaddles/source) #define COMSIG_DEFIBRILLATOR_SUCCESS "defib_success" - #define COMPONENT_DEFIB_STOP (1<<0) + // #define COMPONENT_DEFIB_STOP (1<<0) // Same return, to stop default defib handling /// From /datum/surgery/can_start(): (mob/source, datum/surgery/surgery, mob/living/patient) #define COMSIG_SURGERY_STARTING "surgery_starting" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index a7a04b7dfdd3..f0622d183127 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -35,7 +35,7 @@ /// Should we stop the current living movement attempt #define COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE -/// From base of /client/Move(): (list/move_args) +/// From base of /client/Move(): (new_loc, direction) #define COMSIG_MOB_CLIENT_PRE_MOVE "mob_client_pre_move" /// Should always match COMPONENT_MOVABLE_BLOCK_PRE_MOVE as these are interchangeable and used to block movement. #define COMSIG_MOB_CLIENT_BLOCK_PRE_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE @@ -140,6 +140,9 @@ ///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target) #define COMSIG_TRY_WIRES_INTERACT "try_wires_interact" #define COMPONENT_CANT_INTERACT_WIRES (1<<0) +///Mob is trying to emote, from /datum/emote/proc/run_emote(): (key, params, type_override, intentional) +#define COMSIG_MOB_PRE_EMOTED "mob_pre_emoted" + #define COMPONENT_CANT_EMOTE (1<<0) #define COMSIG_MOB_EMOTED(emote_key) "mob_emoted_[emote_key]" ///sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index c8651b811e07..5c941e3689ab 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -174,6 +174,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define PASSDOORS (1<<10) #define PASSVEHICLE (1<<11) #define PASSITEM (1<<12) +/// Do not intercept click attempts during Adjacent() checks. See [turf/proc/ClickCross]. **ONLY MEANINGFUL ON pass_flags_self!** +#define LETPASSCLICKS (1<<13) //Movement Types #define GROUND (1<<0) @@ -199,6 +201,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define INDESTRUCTIBLE (1<<6) /// can't be frozen #define FREEZE_PROOF (1<<7) +/// can't be shuttle crushed. +#define SHUTTLE_CRUSH_PROOF (1<<8) //tesla_zap #define ZAP_MACHINE_EXPLOSIVE (1<<0) diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 64ab276591a5..0ddfaa5b9573 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -43,6 +43,8 @@ #define COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN "keybinding_human_quickequipbelt_down" #define COMSIG_KB_HUMAN_BAGEQUIP_DOWN "keybinding_human_bagequip_down" #define COMSIG_KB_HUMAN_SUITEQUIP_DOWN "keybinding_human_suitequip_down" +#define COMSIG_KB_HUMAN_LPOCKETEQUIP_DOWN "keybinding_human_lpocketequip_down" +#define COMSIG_KB_HUMAN_RPOCKETEQUIP_DOWN "keybinding_human_rpocketequip_down" //Living #define COMSIG_KB_LIVING_RESIST_DOWN "keybinding_living_resist_down" diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index cd3d68e2ea5b..a8a7f2e04da6 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -6,6 +6,10 @@ #define MOVABLE_LIGHT 2 ///Light made by masking the lighting darkness plane, and is directional. #define MOVABLE_LIGHT_DIRECTIONAL 3 +///Light made by masking the lighting darkness plane, and is a directionally focused beam. +#define MOVABLE_LIGHT_BEAM 4 +/// Nonesensical value for light color, used for null checks. +#define NONSENSICAL_VALUE -99999 ///Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) diff --git a/code/__DEFINES/modular_computer.dm b/code/__DEFINES/modular_computer.dm index db1460c2b0f0..001722eb2ddf 100644 --- a/code/__DEFINES/modular_computer.dm +++ b/code/__DEFINES/modular_computer.dm @@ -9,10 +9,6 @@ #define PROGRAM_CONSOLE (1<<0) #define PROGRAM_LAPTOP (1<<1) #define PROGRAM_TABLET (1<<2) -//Program states -#define PROGRAM_STATE_KILLED 0 -#define PROGRAM_STATE_BACKGROUND 1 -#define PROGRAM_STATE_ACTIVE 2 //Program categories #define PROGRAM_CATEGORY_CREW "Crew" #define PROGRAM_CATEGORY_ENGI "Engineering" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 0d33112b74da..bd44bdeaa09b 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -6,14 +6,13 @@ #define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? #define DANGEROUS_POSSESSION (1<<3) //Admin possession yes/no #define UNIQUE_RENAME (1<<4) // can you customize the description/name of the thing? -#define USES_TGUI (1<<5) //put on things that use tgui on ui_interact instead of custom/old UI. -#define BLOCK_Z_OUT_DOWN (1<<6) // Should this object block z falling from loc? -#define BLOCK_Z_OUT_UP (1<<7) // Should this object block z uprise from loc? -#define BLOCK_Z_IN_DOWN (1<<8) // Should this object block z falling from above? -#define BLOCK_Z_IN_UP (1<<9) // Should this object block z uprise from below? -#define BLOCKS_CONSTRUCTION (1<<10) //! Does this object prevent things from being built on it? -#define BLOCKS_CONSTRUCTION_DIR (1<<11) //! Does this object prevent same-direction things from being built on it? -#define IGNORE_DENSITY (1<<12) //! Can we ignore density when building on this object? (for example, directional windows and grilles) +#define BLOCK_Z_OUT_DOWN (1<<5) // Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<6) // Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<7) // Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<8) // Should this object block z uprise from below? +#define BLOCKS_CONSTRUCTION (1<<9) //! Does this object prevent things from being built on it? +#define BLOCKS_CONSTRUCTION_DIR (1<<10) //! Does this object prevent same-direction things from being built on it? +#define IGNORE_DENSITY (1<<11) //! Can we ignore density when building on this object? (for example, directional windows and grilles) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index 8a7731618bbf..ffac885bf4c8 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -100,3 +100,5 @@ #define NINJA_FILE "ninja.json" /// File loation for title splashes #define SPLASH_FILE "splashes.json" +///File location for mother hallucination lines +#define MOTHER_FILE "mother.json" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 93e000aa0dea..a15e21fd8110 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -988,6 +988,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_UNDERFLOOR "underfloor" /// From [/datum/element/elevation_core] for purpose of checking if the turf has the trait from an instance of the element #define TRAIT_ELEVATED_TURF "elevated_turf" +/// If the movable shouldn't be reflected by mirrors. +#define TRAIT_NO_MIRROR_REFLECTION "no_mirror_reflection" // unique trait sources, still defines #define CLONING_POD_TRAIT "cloning-pod" diff --git a/code/__DEFINES/~monkestation/asteroids.dm b/code/__DEFINES/~monkestation/asteroids.dm index 1e8792bbd61f..f9c081449d09 100644 --- a/code/__DEFINES/~monkestation/asteroids.dm +++ b/code/__DEFINES/~monkestation/asteroids.dm @@ -1,6 +1,8 @@ /// Used in asteroid composition lists to indicate a skip #define SKIP "skip" +#define islevelbaseturf(A) istype(A, SSmapping.level_trait(A.z, ZTRAIT_BASETURF) || /turf/open/space) + // Mining template rarities #define MINING_NO_RANDOM_SPAWN -1 #define MINING_COMMON 1 @@ -14,3 +16,10 @@ stoplag(); \ SSatoms.map_loader_begin(REF(template)); \ } + +// error codes for the asteroid magnet +#define MAGNET_ERROR_KEY_BUSY 1 +#define MAGNET_ERROR_KEY_USED_COORD 2 +#define MAGNET_ERROR_KEY_COOLDOWN 3 +#define MAGNET_ERROR_KEY_MOB 4 +#define MAGNET_ERROR_KEY_NO_COORD 5 diff --git a/code/__HELPERS/animations.dm b/code/__HELPERS/animations.dm index 6633d80eaae0..4f0a52a8fb9e 100644 --- a/code/__HELPERS/animations.dm +++ b/code/__HELPERS/animations.dm @@ -27,3 +27,6 @@ final_pixel_y += living_target.body_position_pixel_y_offset; \ }; \ animate(target, pixel_y = final_pixel_y, time = 1 SECONDS) + +/// The duration of the animate call in mob/living/update_transform +#define UPDATE_TRANSFORM_ANIMATION_TIME (0.2 SECONDS) diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm new file mode 100644 index 000000000000..9d74f3fe71b4 --- /dev/null +++ b/code/__HELPERS/cameras.dm @@ -0,0 +1,35 @@ +/** + * get_camera_list + * + * Builds a list of all available cameras that can be seen to networks_available + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + */ +/proc/get_camera_list(list/networks_available) + var/list/all_camera_list = list() + for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + all_camera_list.Add(camera) + + camera_sort(all_camera_list) + + var/list/usable_camera_list = list() + + for(var/obj/machinery/camera/camera as anything in all_camera_list) + var/list/tempnetwork = camera.network & networks_available + if(length(tempnetwork)) + usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return usable_camera_list + +///Sorts the list of cameras by their c_tag to display to players. +/proc/camera_sort(list/camera_list) + var/obj/machinery/camera/camera_comparing_a + var/obj/machinery/camera/camera_comparing_b + + for(var/i = length(camera_list), i > 0, i--) + for(var/j = 1 to i - 1) + camera_comparing_a = camera_list[j] + camera_comparing_b = camera_list[j + 1] + if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) + camera_list.Swap(j, j + 1) + return camera_list diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 0348524b4557..df8f4716bb91 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -5,6 +5,9 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE) if(!species_path) return FALSE + if(!ispath(species_path)) + stack_trace("Attempted to call get_dynamic_human_appearance() with an instantiated species_path. Pass the species datum typepath instead.") + return FALSE var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]" if(GLOB.dynamic_human_appearances[arg_string]) //if already exists in our cache, just return that return GLOB.dynamic_human_appearances[arg_string] @@ -54,4 +57,6 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/set_dynamic_human_appearance(list/arguments) var/atom/target = arguments[1] //1st argument is the target var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc - target.appearance = dynamic_appearance + target.icon = 'icons/blanks/32x32.dmi' + target.icon_state = "nothing" + target.copy_overlays(dynamic_appearance, cut_old = TRUE) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 6b197dbc5e43..0a743ee3a43d 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1484,6 +1484,12 @@ GLOBAL_LIST_EMPTY(icon_dimensions) /// Returns a list containing the width and height of an icon file /proc/get_icon_dimensions(icon_path) + // Icons can be a real file(), a rsc backed file(), a dynamic rsc (dyn.rsc) reference (known as a cache reference in byond docs), or an /icon which is pointing to one of those. + // Runtime generated dynamic icons are an unbounded concept cache identity wise, the same icon can exist millions of ways and holding them in a list as a key can lead to unbounded memory usage if called often by consumers. + // Check distinctly that this is something that has this unspecified concept, and thus that we should not cache. + if (!isfile(icon_path) || !length("[icon_path]")) + var/icon/my_icon = icon(icon_path) + return list("width" = my_icon.Width(), "height" = my_icon.Height()) if (isnull(GLOB.icon_dimensions[icon_path])) var/icon/my_icon = icon(icon_path) GLOB.icon_dimensions[icon_path] = list("width" = my_icon.Width(), "height" = my_icon.Height()) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e86f98be7cf5..07df001f3a51 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -194,18 +194,16 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO return FALSE if(human_mob.mind && (human_mob.mind.special_role || length(human_mob.mind.antag_datums) > 0)) - var/didthegamerwin = TRUE for(var/datum/antagonist/antag_datums as anything in human_mob.mind.antag_datums) + if(initial(antag_datums.can_assign_self_objectives) && !antag_datums.can_assign_self_objectives) + return FALSE // You don't get a prize if you picked your own objective, you can't fail those for(var/datum/objective/objective_datum as anything in antag_datums.objectives) if(!objective_datum.check_completion()) - didthegamerwin = FALSE - if(!didthegamerwin) - return FALSE + return FALSE player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score * 2)) else if(considered_escaped(human_mob)) player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score)) - /datum/controller/subsystem/ticker/proc/declare_completion(was_forced = END_ROUND_AS_NORMAL) set waitfor = FALSE @@ -783,10 +781,7 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO var/list/objective_parts = list() var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ return objective_parts.Join("
") diff --git a/code/__HELPERS/~monkestation-helpers/announcements.dm b/code/__HELPERS/~monkestation-helpers/announcements.dm new file mode 100644 index 000000000000..2298bfe448f1 --- /dev/null +++ b/code/__HELPERS/~monkestation-helpers/announcements.dm @@ -0,0 +1,15 @@ +/proc/send_formatted_admin_message( + text, + title = "Admin Alert", + sound_override = 'sound/effects/adminhelp.ogg', + color_override = "red" +) + if(isnull(text)) + return + var/list/announcement_strings = list() + announcement_strings += SUBHEADER_ANNOUNCEMENT_TITLE(title) + announcement_strings += span_major_announcement_text(text) + var/finalized_announcement = create_announcement_div(jointext(announcement_strings, ""), color_override) + SEND_ADMINCHAT_MESSAGE(finalized_announcement) + if(sound_override) + SEND_ADMINS_NOTFICATION_SOUND(sound_override) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 11db12766721..c59f199af410 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -285,19 +285,18 @@ DEFINE_BITFIELD(movement_type, list( )) DEFINE_BITFIELD(obj_flags, list( - "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, - "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, - "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, - "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "IN_USE" = IN_USE, + "EMAGGED" = EMAGGED, "CAN_BE_HIT" = CAN_BE_HIT, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, - "EMAGGED" = EMAGGED, - "IN_USE" = IN_USE, + "UNIQUE_RENAME" = UNIQUE_RENAME, + "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, + "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, + "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, "BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION, "BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR, "IGNORE_DENSITY" = IGNORE_DENSITY, - "UNIQUE_RENAME" = UNIQUE_RENAME, - "USES_TGUI" = USES_TGUI, )) DEFINE_BITFIELD(pass_flags, list( @@ -318,7 +317,8 @@ DEFINE_BITFIELD(resistance_flags, list( "UNACIDABLE" = UNACIDABLE, "ACID_PROOF" = ACID_PROOF, "INDESTRUCTIBLE" = INDESTRUCTIBLE, - "FREEZE_PROOF" = FREEZE_PROOF + "FREEZE_PROOF" = FREEZE_PROOF, + "SHUTTLE_CRUSH_PROOF" = SHUTTLE_CRUSH_PROOF )) DEFINE_BITFIELD(sight, list( diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 50a91c6152d9..6772ecab7dec 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -366,11 +366,13 @@ GLOBAL_LIST_INIT(oddity_loot, list(//oddity: strange or crazy items /obj/item/dice/d20/fate/stealth/one_use = 1, //Looks like a d20, keep the d20 in the uncommon pool. /obj/item/shadowcloak = 1, /obj/item/spear/grey_tide = 1, + /* MONKESTATION EDIT - removal of self antag items from maints loot list(//music /obj/item/instrument/saxophone/spectral = 1, /obj/item/instrument/trombone/spectral = 1, /obj/item/instrument/trumpet/spectral = 1, ) = 1, + */ // MONKESTATION EDIT END /obj/item/toy/cards/deck/tarot/haunted = 1, /obj/item/gun/magic/wand/polymorph = 1, //monkestation edit /obj/item/organ/internal/butt/atomic = 1, //monkestation edit diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index d0091684e2d4..cb7b7ebfc290 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -33,6 +33,7 @@ GLOBAL_LIST_INIT(syndicate_monkey_names, world.file2list("strings/names/syndicat GLOBAL_LIST_INIT(guardian_first_names, world.file2list("strings/names/guardian_descriptions.txt")) GLOBAL_LIST_INIT(guardian_tech_surnames, world.file2list("strings/names/guardian_gamepieces.txt")) GLOBAL_LIST_INIT(guardian_fantasy_surnames, world.file2list("strings/names/guardian_tarot.txt")) +GLOBAL_LIST_INIT(operative_aliases, world.file2list("strings/names/operative_alias.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt")) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index e33ba9cb5406..ab5b3f4aad97 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -87,19 +87,23 @@ /* This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW. +This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW or LETPASSCLICKS. The border_only flag allows you to not objects (for source and destination squares) */ /turf/proc/ClickCross(target_dir, border_only, atom/target, atom/movable/mover) for(var/obj/O in src) if((mover && O.CanPass(mover, target_dir)) || (!mover && !O.density)) continue - if(O == target || O == mover || (O.pass_flags_self & LETPASSTHROW)) //check if there's a dense object present on the turf - continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) + + //If there's a dense object on the turf, only allow the click to pass if you can throw items over it or it has a special flag. + if(O == target || O == mover || (O.pass_flags_self & (LETPASSTHROW|LETPASSCLICKS))) + continue if( O.flags_1&ON_BORDER_1) // windows are on border, check them first if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically return FALSE //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones + else if( !border_only ) // dense, not on border, cannot pass over return FALSE + return TRUE diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index bfe817919121..dde42df814b9 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ return if(ismob(A)) - ai_actual_track(A) + ai_tracking_tool.track_mob(src, A) else A.move_camera_by_click() diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index fabbdae41ab5..5d94d8be8c6e 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -30,13 +30,11 @@ icon_state = "track" /atom/movable/screen/ai/camera_track/Click() - if(..()) + . = ..() + if(.) return var/mob/living/silicon/ai/AI = usr - var/target_name = tgui_input_list(AI, "Select a target", "Tracking", AI.trackable_mobs()) - if(isnull(target_name)) - return - AI.ai_camera_track(target_name) + AI.ai_camera_track() /atom/movable/screen/ai/camera_light name = "Toggle Camera Light" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index b4ea3b9dc6da..08a3c9d70a23 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -73,6 +73,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /// had with a proc call, especially on one of the hottest procs in the /// game (MouseEntered). var/screentips_enabled = SCREENTIP_PREFERENCE_ENABLED + /// Whether to use text or images for click hints. + /// Same behavior as `screentips_enabled`--very hot, updated when the preference is updated. + var/screentip_images = TRUE /// If this client is being shown atmos debug overlays or not var/atmos_debug_overlays = FALSE @@ -121,6 +124,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/datum/preferences/preferences = owner?.client?.prefs screentip_color = preferences?.read_preference(/datum/preference/color/screentip_color) screentips_enabled = preferences?.read_preference(/datum/preference/choiced/enable_screentips) + screentip_images = preferences?.read_preference(/datum/preference/toggle/screentip_images) screentip_text = new(null, src) static_inventory += screentip_text diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index c62e55ebd84d..50d7ea4e1fdf 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -1,3 +1,5 @@ +#define VERY_LATE_ARRIVAL_TOAST_PROB 20 + SUBSYSTEM_DEF(job) name = "Jobs" init_order = INIT_ORDER_JOBS @@ -601,6 +603,8 @@ SUBSYSTEM_DEF(job) wageslave.add_mob_memory(/datum/memory/key/account, remembered_id = wageslave.account_id) setup_alt_job_items(wageslave, job, player_client) + if(EMERGENCY_PAST_POINT_OF_NO_RETURN && prob(VERY_LATE_ARRIVAL_TOAST_PROB)) + equipping.equip_to_slot_or_del(new /obj/item/food/griddle_toast(equipping), ITEM_SLOT_MASK) job.after_spawn(equipping, player_client) @@ -1187,3 +1191,5 @@ SUBSYSTEM_DEF(job) if(!job) return FALSE job.current_positions = max(0, job.current_positions - 1) + +#undef VERY_LATE_ARRIVAL_TOAST_PROB diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 0e1341f56aea..2bed96ac7d40 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -124,7 +124,7 @@ SUBSYSTEM_DEF(polling) // Image to display var/image/poll_image if(pic_source) - if(!ispath(pic_source)) + if(isatom(pic_source)) var/atom/the_pic_source = pic_source var/old_layer = the_pic_source.layer var/old_plane = the_pic_source.plane diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index d40b187b3bb4..7d2507b5917b 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -80,6 +80,17 @@ return FALSE return ..() +/datum/action/item_action/toggle_hud + name = "Toggle Implant HUD" + desc = "Disables your HUD implant's visuals. You can still access examine information." + +/datum/action/item_action/toggle_hud/Trigger(trigger_flags) + . = ..() + if(!.) + return + var/obj/item/organ/internal/cyberimp/eyes/hud/hud_implant = target + hud_implant.toggle_hud(owner) + /datum/action/item_action/wheelys name = "Toggle Wheels" desc = "Pops out or in your shoes' wheels." diff --git a/code/datums/ai/babies/babies_behaviors.dm b/code/datums/ai/babies/babies_behaviors.dm index 4b56d0706956..e58d99a3ed63 100644 --- a/code/datums/ai/babies/babies_behaviors.dm +++ b/code/datums/ai/babies/babies_behaviors.dm @@ -65,7 +65,8 @@ finish_action(controller, FALSE, target_key) return var/mob/living/basic/living_pawn = controller.pawn - living_pawn.set_combat_mode(FALSE) + //living_pawn.set_combat_mode(FALSE) + living_pawn.istate &= ~ISTATE_HARM living_pawn.melee_attack(target) finish_action(controller, TRUE, target_key) diff --git a/code/datums/ai/babies/babies_subtrees.dm b/code/datums/ai/babies/babies_subtrees.dm index 8310cd955733..1b7fe5b88cb5 100644 --- a/code/datums/ai/babies/babies_subtrees.dm +++ b/code/datums/ai/babies/babies_subtrees.dm @@ -2,8 +2,11 @@ * Reproduce with a similar mob. */ /datum/ai_planning_subtree/make_babies - var/chance = 5 operational_datums = list(/datum/component/breed) + ///chance to make babies + var/chance = 5 + ///make babies behavior we will use + var/datum/ai_behavior/reproduce_behavior = /datum/ai_behavior/make_babies /datum/ai_planning_subtree/make_babies/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() @@ -12,7 +15,7 @@ return if(controller.blackboard_key_exists(BB_BABIES_TARGET)) - controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) + controller.queue_behavior(reproduce_behavior, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) return SUBTREE_RETURN_FINISH_PLANNING if(controller.pawn.gender == FEMALE || !controller.blackboard[BB_BREED_READY]) diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm index d4160f826dd6..d0e7161fd2de 100644 --- a/code/datums/ai/hunting_behavior/hunting_mouse.dm +++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm @@ -11,7 +11,7 @@ finding_behavior = /datum/ai_behavior/find_hunt_target/mouse_cable hunt_targets = list(/obj/structure/cable) hunt_range = 0 // Only look below us - hunt_chance = 5 + hunt_chance = 1 // When looking for a cable, we can only bite things we can reach. /datum/ai_behavior/find_hunt_target/mouse_cable diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index dd5544297fb1..8a117961fd23 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -14,6 +14,8 @@ var/datum/callback/on_clear_callback /// A typecache of all effects we can clear with our item. var/list/obj/effect/effects_we_clear + /// If above 0, how long it takes while standing still to remove the effect. + var/time_to_remove = 0 SECONDS /datum/component/effect_remover/Initialize( success_forcesay, @@ -21,6 +23,7 @@ tip_text, on_clear_callback, effects_we_clear, + time_to_remove, ) . = ..() @@ -36,6 +39,7 @@ src.tip_text = tip_text src.on_clear_callback = on_clear_callback src.effects_we_clear = typecacheof(effects_we_clear) + src.time_to_remove = time_to_remove /datum/component/effect_remover/Destroy(force, silent) QDEL_NULL(on_clear_callback) @@ -69,6 +73,9 @@ * Actually removes the effect, invoking our on_clear_callback before it's deleted. */ /datum/component/effect_remover/proc/do_remove_effect(obj/effect/target, mob/living/user) + if(time_to_remove && !do_after(user, time_to_remove, target)) + return + var/obj/item/item_parent = parent if(success_forcesay) user.say(success_forcesay, forced = item_parent.name) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index d079f55d170a..800356d64020 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -60,6 +60,8 @@ var/atom/movable/parent_attached_to ///Whether we're a directional light var/directional = FALSE + ///Whether we're a beam light + var/beam = FALSE ///A cone overlay for directional light, it's alpha and color are dependant on the light var/image/cone ///Current tracked direction for the directional cast behaviour @@ -71,13 +73,13 @@ ///Cast range for the directional cast (how far away the atom is moved) var/cast_range = 2 -/datum/component/overlay_lighting/Initialize(_range, _power, _color, starts_on, is_directional) +/datum/component/overlay_lighting/Initialize(_range, _power, _color, starts_on, is_directional, is_beam) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE var/atom/movable/movable_parent = parent - if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL) - stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT] or [MOVABLE_LIGHT_DIRECTIONAL] instead.") + if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL && movable_parent.light_system != MOVABLE_LIGHT_BEAM) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT], [MOVABLE_LIGHT_DIRECTIONAL] or [MOVABLE_LIGHT_BEAM] instead.") return COMPONENT_INCOMPATIBLE . = ..() @@ -94,6 +96,8 @@ cone.alpha = 110 cone.transform = cone.transform.Translate(-32, -32) set_direction(movable_parent.dir) + if(is_beam) + beam = TRUE if(!isnull(_range)) movable_parent.set_light_range(_range, _range) set_range(parent, movable_parent.light_inner_range, movable_parent.light_outer_range) @@ -193,7 +197,7 @@ get_new_turfs() -///Adds the luminosity and source for the afected movable atoms to keep track of their visibility. +///Adds the luminosity and source for the affected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/add_dynamic_lumi() LAZYSET(current_holder.affected_dynamic_lights, src, lumcount_range + 1) current_holder.underlays += visible_mask @@ -201,7 +205,7 @@ if(directional) current_holder.underlays += cone -///Removes the luminosity and source for the afected movable atoms to keep track of their visibility. +///Removes the luminosity and source for the affected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/remove_dynamic_lumi() LAZYREMOVE(current_holder.affected_dynamic_lights, src) current_holder.underlays -= visible_mask @@ -345,7 +349,7 @@ var/new_range = source.light_outer_range if(range == new_range) return - if(range == 0) + if(new_range == 0) turn_off() range = clamp(CEILING(new_range, 0.5), 1, 6) var/pixel_bounds = ((range - 1) * 64) + 32 @@ -354,16 +358,21 @@ current_holder.underlays -= visible_mask visible_mask.icon = light_overlays["[pixel_bounds]"] if(pixel_bounds == 32) - visible_mask.transform = null - return - var/offset = (pixel_bounds - 32) * 0.5 - var/matrix/transform = new - transform.Translate(-offset, -offset) - visible_mask.transform = transform + if(!directional) // it's important that we make it to the end of this function if we are a directional light + visible_mask.transform = null + return + else + var/offset = (pixel_bounds - 32) * 0.5 + var/matrix/transform = new + transform.Translate(-offset, -offset) + visible_mask.transform = transform if(current_holder && overlay_lighting_flags & LIGHTING_ON) current_holder.underlays += visible_mask if(directional) - cast_range = clamp(round(new_range * 0.5), 1, 3) + if(beam) + cast_range = max(round(new_range * 0.5), 1) + else + cast_range = clamp(round(new_range * 0.5), 1, 3) if(overlay_lighting_flags & LIGHTING_ON) make_luminosity_update() @@ -487,19 +496,32 @@ var/translate_x = -((range - 1) * 32) var/translate_y = translate_x + var/scale_x = 1 + var/scale_y = 1 switch(current_direction) if(NORTH) translate_y += 32 * final_distance + if(beam && range > 1) + scale_x = 1 / (range - (range/5)) if(SOUTH) translate_y += -32 * final_distance + if(beam && range > 1) + scale_x = 1 / (range - (range/5)) if(EAST) translate_x += 32 * final_distance + if(beam && range > 1) + scale_y = 1 / (range - (range/5)) if(WEST) translate_x += -32 * final_distance + if(beam && range > 1) + scale_y = 1 / (range - (range/5)) + if((directional_offset_x != translate_x) || (directional_offset_y != translate_y)) directional_offset_x = translate_x directional_offset_y = translate_y var/matrix/transform = matrix() + if(beam && range > 1) + transform.Scale(scale_x, scale_y) transform.Translate(translate_x, translate_y) visible_mask.transform = transform if(overlay_lighting_flags & LIGHTING_ON) diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index 211b995b22e2..93265b80481c 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -148,6 +148,7 @@ radial_icon = 'icons/mob/simple/animal.dmi' radial_icon_state = "heart" speech_commands = list("breed", "consummate") + var/datum/ai_behavior/reproduce_behavior = /datum/ai_behavior/make_babies /datum/pet_command/point_targeting/breed/set_command_target(mob/living/parent, atom/target) if(isnull(target) || !isliving(target)) @@ -165,7 +166,7 @@ /datum/pet_command/point_targeting/breed/execute_action(datum/ai_controller/controller) if(is_type_in_list(controller.blackboard[BB_CURRENT_PET_TARGET], controller.blackboard[BB_BABIES_PARTNER_TYPES])) - controller.queue_behavior(/datum/ai_behavior/make_babies, BB_CURRENT_PET_TARGET) + controller.queue_behavior(reproduce_behavior, BB_CURRENT_PET_TARGET) controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm new file mode 100644 index 000000000000..cb411720f7fc --- /dev/null +++ b/code/datums/components/reflection.dm @@ -0,0 +1,131 @@ +/** + * A simple-ish component that reflects the icons of movables on the parent like a mirror. + * Sadly, there's no easy way to make the SOUTH dir reflection flip the visual so that you can see + * the back NORTH dir of a target while it's facing SOUTH beside adding the VIS_INHERIT_DIR flag + * to the target movable, which I'm not doing to spare eventual issues with other vis overlays in the future. + */ +/datum/component/reflection + /** + * The direction from which the component gets its visual overlays. + * The visuals are also flipped horizontally or vertically based on it. + */ + var/reflected_dir + /// the movable which the reflected movables are attached to, in turn added to the vis contents of the parent. + var/obj/effect/abstract/reflection_holder + /// A lazy assoc list that keeps track of which movables are being reflected and the associated reflections. + var/list/reflected_movables + /// A callback used check to know which movables should be reflected and which not. + var/datum/callback/can_reflect + ///the base matrix used by reflections + var/matrix/reflection_matrix + ///the filter data added to reflection holder. + var/list/reflection_filter + ///the transparency channel value of the reflection holder. + var/alpha + ///A list of signals that when sent to the parent, will force the comp to recalculate the reflected movables. + var/list/update_signals + +/datum/component/reflection/Initialize(reflected_dir = NORTH, list/reflection_filter, matrix/reflection_matrix, datum/callback/can_reflect, alpha = 150, list/update_signals) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + var/static/list/connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_movable_entered_or_initialized), + COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(on_movable_entered_or_initialized), + COMSIG_ATOM_EXITED = PROC_REF(on_movable_exited) + ) + AddComponent(/datum/component/connect_range, parent, connections, 1, works_in_containers = FALSE) + src.reflected_dir = reflected_dir + src.reflection_matrix = reflection_matrix + src.reflection_filter = reflection_filter + src.can_reflect = can_reflect + reflection_holder = new(parent) + reflection_holder.alpha = alpha + reflection_holder.appearance_flags = KEEP_TOGETHER + reflection_holder.vis_flags = VIS_INHERIT_ID + reflection_holder.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + if(reflection_filter) + reflection_holder.add_filter("reflection", 1, reflection_filter) + + var/atom/movable/mov_parent = parent + mov_parent.vis_contents += reflection_holder + set_reflection(new_dir = mov_parent.dir) + + RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_dir_change)) + var/list/reflect_update_signals = list(COMSIG_MOVABLE_MOVED) + update_signals + RegisterSignals(parent, reflect_update_signals, PROC_REF(get_reflection_targets)) + +/datum/component/reflection/Destroy() + QDEL_LIST_ASSOC_VAL(reflected_movables) + QDEL_NULL(reflection_holder) + return ..() + +///Called when the parent changes its direction. +/datum/component/reflection/proc/on_dir_change(atom/movable/source, old_dir, new_dir) + SIGNAL_HANDLER + set_reflection(old_dir, new_dir) + +///Turns the allowed reflected direction alongside the parent's dir. then calls get_reflection_targets. +/datum/component/reflection/proc/set_reflection(old_dir = SOUTH, new_dir = SOUTH) + if(old_dir == new_dir) + return + + reflected_dir = turn(reflected_dir, dir2angle(new_dir) - dir2angle(old_dir)) + get_reflection_targets() + +///Unsets the old reflected movables and sets it with new ones. +/datum/component/reflection/proc/get_reflection_targets(atom/movable/source) + SIGNAL_HANDLER + QDEL_LIST_ASSOC_VAL(reflected_movables) + for(var/atom/movable/target in view(1, source)) + if(check_can_reflect(target, FALSE)) + set_reflected(target) + +///Checks if the target movable can be reflected or not. +/datum/component/reflection/proc/check_can_reflect(atom/movable/target, check_view = TRUE) + if(target == parent || (check_view && !(target in view(1, parent)))) + return FALSE + var/atom/movable/mov_parent = parent + if(target.loc != mov_parent.loc && get_dir(mov_parent, target) != reflected_dir) + return FALSE + if(can_reflect && !can_reflect.Invoke(target)) + return FALSE + return TRUE + +///Called when a movable enters a turf within the connected range +/datum/component/reflection/proc/on_movable_entered_or_initialized(atom/movable/source, atom/movable/arrived) + SIGNAL_HANDLER + if(LAZYACCESS(reflected_movables, arrived) || !check_can_reflect(arrived)) + return + set_reflected(arrived) + +///Called when a movable exits a turf within the connected range +/datum/component/reflection/proc/on_movable_exited(atom/movable/source, atom/movable/gone) + SIGNAL_HANDLER + var/atom/movable/reflection = LAZYACCESS(reflected_movables, gone) + if(!reflection || check_can_reflect(gone)) + return + qdel(reflection) + LAZYREMOVE(reflected_movables, gone) + +///Sets up a visual overlay of the target movables, which is added to the parent's vis contents. +/datum/component/reflection/proc/set_reflected(atom/movable/target) + SIGNAL_HANDLER + /** + * If the loc is null, only a black (or grey depending on alpha) silhouette of the target will be rendered + * Just putting this information here in case you want something like that in the future. + */ + var/obj/effect/abstract/reflection = new(parent) + reflection.vis_flags = VIS_INHERIT_ID + if(!target.render_target) + target.render_target = REF(target) + reflection.render_source = target.render_target + ///The filter is added to the reflection holder; the matrix is not, otherwise that'd go affecting the filter. + if(reflection_matrix) + reflection.transform = reflection_matrix + if(reflected_dir == NORTH) + reflection.transform = reflection.transform.Scale(1, -1) + else if(reflected_dir != SOUTH) + reflection.transform = reflection.transform.Scale(-1, 1) + LAZYSET(reflected_movables, target, reflection) + reflection_holder.vis_contents += reflection diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 28ef612c6cba..d3b7119ab7f6 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -253,6 +253,7 @@ data["current_stock"] = remaining_stock data["shop_locked"] = uplink_handler.shop_locked data["purchased_items"] = length(uplink_handler.purchase_log?.purchase_log) + data["can_renegotiate"] = user.mind == uplink_handler.owner && uplink_handler.can_replace_objectives?.Invoke() == TRUE //monkestation edit start data["locked_entries"] = uplink_handler.locked_entries data["is_contractor"] = (uplink_handler.uplink_flag == UPLINK_CONTRACTORS) @@ -310,6 +311,9 @@ if(!lockable) return TRUE lock_uplink() + if("renegotiate_objectives") + uplink_handler.replace_objectives?.Invoke() + SStgui.update_uis(src) if(!uplink_handler.has_objectives) return TRUE diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 619568f67e08..c308cfd99fb3 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -384,10 +384,11 @@ /datum/symptom/heal/coma/proc/coma(mob/living/M) + if(QDELETED(M) || M.stat == DEAD) + return M.fakedeath("regenerative_coma", !deathgasp) addtimer(CALLBACK(src, PROC_REF(uncoma), M), 300) - /datum/symptom/heal/coma/proc/uncoma(mob/living/M) if(QDELETED(M) || !active_coma) return diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index c8c1af309f7c..feca02e6e6d4 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -91,6 +91,8 @@ . = TRUE if(!can_run_emote(user, TRUE, intentional)) return FALSE + if(SEND_SIGNAL(user, COMSIG_MOB_PRE_EMOTED, key, params, type_override, intentional) & COMPONENT_CANT_EMOTE) + return // We don't return FALSE because the error output would be incorrect, provide your own if necessary. var/msg = select_message_type(user, message, intentional) if(params && message_param) msg = select_param(user, params) diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm index 448a15d4539a..cc401adfcc94 100644 --- a/code/datums/keybinding/human.dm +++ b/code/datums/keybinding/human.dm @@ -56,3 +56,21 @@ slot_type = ITEM_SLOT_SUITSTORE slot_item_name = "suit storage slot item" keybind_signal = COMSIG_KB_HUMAN_SUITEQUIP_DOWN + +/datum/keybinding/human/quick_equip_belt/quick_equip_lpocket + hotkey_keys = list("Ctrl1") + name = "quick_equip_lpocket" + full_name = "Quick equip left pocket" + description = "Put in or take out an item in left pocket" + slot_type = ITEM_SLOT_LPOCKET + slot_item_name = "left pocket" + keybind_signal = COMSIG_KB_HUMAN_LPOCKETEQUIP_DOWN + +/datum/keybinding/human/quick_equip_belt/quick_equip_rpocket + hotkey_keys = list("Ctrl2") + name = "quick_equip_rpocket" + full_name = "Quick equip right pocket" + description = "Put in or take out an item in right pocket" + slot_type = ITEM_SLOT_RPOCKET + slot_item_name = "right pocket" + keybind_signal = COMSIG_KB_HUMAN_RPOCKETEQUIP_DOWN diff --git a/code/datums/memory/key_memories.dm b/code/datums/memory/key_memories.dm index 768b659a61a4..4a1b79af8956 100644 --- a/code/datums/memory/key_memories.dm +++ b/code/datums/memory/key_memories.dm @@ -163,3 +163,48 @@ "[protagonist_name] being implanted by a scientist.", "[protagonist_name] having surgery done on them by a scientist.", ) + +/datum/memory/key/permabrig_crimes + var/crimes + +/datum/memory/key/permabrig_crimes/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + crimes, +) + src.crimes = crimes + return ..() + +/datum/memory/key/permabrig_crimes/get_names() + return list("[protagonist_name]'s crime of \"[crimes]\".") + +/datum/memory/key/permabrig_crimes/get_starts() + return list( + "[protagonist_name] being arrested by security for [crimes].", + "[protagonist_name] committing the crimes of [crimes].", + ) + +/datum/memory/key/message_server_key + var/decrypt_key + +/datum/memory/key/message_server_key/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + decrypt_key, +) + src.decrypt_key = decrypt_key + return ..() + +/datum/memory/key/message_server_key/get_names() + return list("The daily message server key is [decrypt_key]. Keep it a secret from the clown.") + +/datum/memory/key/message_server_key/get_starts() + return list( + "A sticky note attached to a monitor with [decrypt_key] written on it.", + "Poly the parrot screaming \"[decrypt_key]!\" over and over again.", + "[protagonist_name] spilling coffee over the message monitor while typing [decrypt_key].", + ) diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 2d7970906838..1da35af5a824 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -352,6 +352,41 @@ objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") + else if(href_list["obj_prompt_custom"]) + var/datum/antagonist/target_antag + if(href_list["target_antag"]) + var/datum/antagonist/found_datum = locate(href_list["target_antag"]) in antag_datums + if(found_datum) + target_antag = found_datum + if(isnull(target_antag)) + switch(length(antag_datums)) + if(0) + target_antag = add_antag_datum(/datum/antagonist/custom) + if(1) + target_antag = antag_datums[1] + else + var/datum/antagonist/target = input("Which antagonist gets the objective:", "Antagonist", "(new custom antag)") as null|anything in sort_list(antag_datums) + "(new custom antag)" + if (QDELETED(target)) + return + else if(target == "(new custom antag)") + target_antag = add_antag_datum(/datum/antagonist/custom) + else + target_antag = target + var/replace_existing = input("Replace existing objectives?","Replace objectives?") in list("Yes", "No") + if (isnull(replace_existing)) + return + replace_existing = replace_existing == "Yes" + var/replace_escape + if (!replace_existing) + replace_escape = FALSE + else + replace_escape = input("Replace survive/escape/martyr objectives?","Replace objectives?") in list("Yes", "No") + if (isnull(replace_escape)) + return + replace_escape = replace_escape == "Yes" + target_antag.submit_player_objective(retain_existing = !replace_existing, retain_escape = !replace_escape, force = TRUE) + log_admin("[key_name(usr)] prompted [current] to enter their own objectives for [target_antag].") + else if (href_list["silicon"]) switch(href_list["silicon"]) if("unemag") diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index a1ce90175ec6..c0ae74e58a81 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -382,7 +382,8 @@ if(..()) return ADD_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) - //handled in init_signals.dm + owner.update_transform(1.25) + owner.visible_message(span_danger("[owner] suddenly grows!"), span_notice("Everything around you seems to shrink..")) /datum/mutation/human/gigantism/on_losing(mob/living/carbon/human/owner) if(..()) @@ -390,6 +391,9 @@ //We're leaving the size traits permanent until someone wants to separate the mutation from customization aspects //REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) //handled in init_signals.dm + //REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) + owner.update_transform(0.8) + owner.visible_message(span_danger("[owner] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) /datum/mutation/human/spastic name = "Spastic" diff --git a/code/datums/screentips/screentips.dm b/code/datums/screentips/screentips.dm new file mode 100644 index 000000000000..d72e41960e50 --- /dev/null +++ b/code/datums/screentips/screentips.dm @@ -0,0 +1,34 @@ +#define HINT_ICON_FILE 'icons/ui_icons/screentips/cursor_hints.dmi' + +/// Stores the cursor hint icons for screentip context. +GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons()) + +/proc/prepare_screentip_context_icons() + var/list/output = list() + for(var/state in icon_states(HINT_ICON_FILE)) + output[state] = image(HINT_ICON_FILE, icon_state = state) + return output + +/* + * # Compiles a string for this key + * Args: + * - context = list (REQUIRED) + * - Must contain key + * - key = string (REQUIRED) + * - allow_image = boolean (not required) +*/ +/proc/build_context(list/context, key, allow_image) + if(!length(context) || !context[key] || !key) + return "" + // Splits key combinations from mouse buttons. e.g. `Ctrl-Shift-LMB` goes in, `Ctrl-Shift-` goes out. Will be empty for single button actions. + var/key_combo = length(key) > 3 ? "[copytext(key, 1, -3)]" : "" + // Grab the mouse button, LMB/RMB + var/button = copytext(key, -3) + if(allow_image) + // Compile into image, if allowed + button = "\icon[GLOB.screentip_context_icons[button]]" + + // Voilá, final result + return "[key_combo][button][allow_image ? "" : ":"] [context[key]]" + +#undef HINT_ICON_FILE diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 3f2c9d107c39..cf0f22e98a80 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -218,14 +218,19 @@ var/mob/living/carbon/human/victim = owner var/thermal_protection = victim.get_thermal_protection() - if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT && !no_protection) - return + if(!no_protection) + if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) + return + if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) + victim.adjust_bodytemperature(5.5 * seconds_per_tick) + return - if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT && !no_protection) - victim.adjust_bodytemperature(5.5 * seconds_per_tick) - return + var/amount_to_heat = (BODYTEMP_HEATING_MAX + (stacks * 12)) * 0.5 * seconds_per_tick + if(owner.bodytemperature > BODYTEMP_FIRE_TEMP_SOFTCAP) + // Apply dimishing returns upon temp beyond the soft cap + amount_to_heat = amount_to_heat ** (BODYTEMP_FIRE_TEMP_SOFTCAP / owner.bodytemperature) - victim.adjust_bodytemperature((BODYTEMP_HEATING_MAX + (stacks * 12)) * 0.5 * seconds_per_tick) + victim.adjust_bodytemperature(amount_to_heat) victim.add_mood_event("on_fire", /datum/mood_event/on_fire) victim.add_mob_memory(/datum/memory/was_burning) diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index b4ad895e1a28..46f10e9f0e81 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -121,7 +121,7 @@ if(SSshuttle.arrivals?.mode == SHUTTLE_CALL) var/atom/movable/screen/splash/Spl = new(null, boarder.client, TRUE) Spl.Fade(TRUE) - boarder.playsound_local(get_turf(boarder), 'monkestation/sound/ai/duke/welcome/welcome2.ogg', 25) //MONKESTATION EDIT + boarder.playsound_local(get_turf(boarder), 'monkestation/sound/ai/duke/welcome/welcome2.ogg', 50) //MONKESTATION EDIT boarder.update_parallax_teleport() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a256e14f5503..bc36879bba28 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -2067,15 +2067,16 @@ | (held_item && SEND_SIGNAL(held_item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, context, src, user)) if (contextual_screentip_returns & CONTEXTUAL_SCREENTIP_SET) + var/screentip_images = active_hud.screentip_images // LMB and RMB on one line... - var/lmb_text = (SCREENTIP_CONTEXT_LMB in context) ? "[SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB]]" : "" - var/rmb_text = (SCREENTIP_CONTEXT_RMB in context) ? "[SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB]]" : "" + var/lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB, screentip_images) + var/rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB, screentip_images) - if (lmb_text) + if (lmb_text != "") lmb_rmb_line = lmb_text - if (rmb_text) + if (rmb_text != "") lmb_rmb_line += " | [rmb_text]" - else if (rmb_text) + else if (rmb_text != "") lmb_rmb_line = rmb_text // Ctrl-LMB, Ctrl-RMB on one line... @@ -2083,33 +2084,34 @@ lmb_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_CTRL_LMB in context) - ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB]]" + ctrl_lmb_ctrl_rmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_LMB, screentip_images) + if (SCREENTIP_CONTEXT_CTRL_RMB in context) if (ctrl_lmb_ctrl_rmb_line != "") ctrl_lmb_ctrl_rmb_line += " | " - ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB]]" + ctrl_lmb_ctrl_rmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_RMB, screentip_images) // Alt-LMB, Alt-RMB on one line... if (ctrl_lmb_ctrl_rmb_line != "") ctrl_lmb_ctrl_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_ALT_LMB in context) - alt_lmb_alt_rmb_line += "[SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB]]" + alt_lmb_alt_rmb_line += build_context(context, SCREENTIP_CONTEXT_ALT_LMB, screentip_images) if (SCREENTIP_CONTEXT_ALT_RMB in context) if (alt_lmb_alt_rmb_line != "") alt_lmb_alt_rmb_line += " | " - alt_lmb_alt_rmb_line += "[SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB]]" + alt_lmb_alt_rmb_line += build_context(context, SCREENTIP_CONTEXT_ALT_RMB, screentip_images) // Shift-LMB, Ctrl-Shift-LMB on one line... if (alt_lmb_alt_rmb_line != "") alt_lmb_alt_rmb_line += "
" extra_lines++ if (SCREENTIP_CONTEXT_SHIFT_LMB in context) - shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB]]" + shift_lmb_ctrl_shift_lmb_line += build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB, screentip_images) if (SCREENTIP_CONTEXT_CTRL_SHIFT_LMB in context) if (shift_lmb_ctrl_shift_lmb_line != "") shift_lmb_ctrl_shift_lmb_line += " | " - shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]]" + shift_lmb_ctrl_shift_lmb_line += build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB, screentip_images) if (shift_lmb_ctrl_shift_lmb_line != "") extra_lines++ diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a937d56234a3..29ea9178374b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -175,6 +175,8 @@ AddComponent(/datum/component/overlay_lighting) if(MOVABLE_LIGHT_DIRECTIONAL) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) + if(MOVABLE_LIGHT_BEAM) + AddComponent(/datum/component/overlay_lighting, is_directional = TRUE, is_beam = TRUE) /atom/movable/Destroy(force) QDEL_NULL(language_holder) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index fd9ea7e480d7..62e7d3fd8265 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -202,10 +202,10 @@ /datum/game_mode/proc/generate_station_goals(greenshift) var/goal_budget = greenshift ? INFINITY : CONFIG_GET(number/station_goal_budget) var/list/possible = subtypesof(/datum/station_goal) + // Remove all goals that require space if space is not present if(SSmapping.is_planetary()) - for(var/datum/station_goal/goal in possible) - if(goal.requires_space) - ///Removes all goals that require space if space is not present + for(var/datum/station_goal/goal as anything in possible) + if(initial(goal.requires_space)) possible -= goal var/goal_weights = 0 while(possible.len && goal_weights < goal_budget) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 469e17ce22f9..410ee0f6ada2 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -96,6 +96,10 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list /datum/objective/proc/check_completion() return completed +/// Provides a string describing what a good job you did or did not do +/datum/objective/proc/get_roundend_success_suffix() + return check_completion() ? span_greentext("Success!") : span_redtext("Fail.") + /datum/objective/proc/is_unique_objective(possible_target, dupe_search_range) if(!islist(dupe_search_range)) stack_trace("Non-list passed as duplicate objective search range") @@ -946,6 +950,9 @@ GLOBAL_LIST_EMPTY(possible_items) if(expl) explanation_text = expl +/datum/objective/custom/get_roundend_success_suffix() + return "" // Just print the objective with no success/fail evaluation, as it has no mechanical backing + //Ideally this would be all of them but laziness and unusual subtypes /proc/generate_admin_objective_list() GLOB.admin_objective_list = list() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 956c1936226a..24548d01a40a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -91,7 +91,7 @@ verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 - pass_flags_self = PASSMACHINE + pass_flags_self = PASSMACHINE | LETPASSCLICKS max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_ricochet = RICOCHET_HARD diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 397f85a2f95d..0a983d97d08f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -18,7 +18,6 @@ var/status = TRUE var/start_active = FALSE //If it ignores the random chance to start broken on round start var/invuln = null - var/obj/item/camera_bug/bug = null var/datum/weakref/assembly_ref = null var/area/myarea = null @@ -129,12 +128,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) LAZYREMOVE(myarea.cameras, src) QDEL_NULL(alarm_manager) QDEL_NULL(assembly_ref) - if(bug) - bug.bugged_cameras -= c_tag - if(bug.current == src) - bug.current = null - bug = null - QDEL_NULL(last_shown_paper) return ..() @@ -202,6 +195,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) return FALSE return ..() +/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) + if (!istype(user)) + return + if (!can_use()) + return + user.switchCamera(src) + /obj/machinery/camera/proc/setViewRange(num = 7) src.view_range = num GLOB.cameranet.updateVisibility(src, 0) @@ -415,21 +415,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) to_chat(potential_viewer, "[span_name(user)] holds \a [item_name] up to your camera...") return - - if(istype(attacking_item, /obj/item/camera_bug)) - if(!can_use()) - to_chat(user, span_notice("Camera non-functional.")) - return - if(bug) - to_chat(user, span_notice("Camera bug removed.")) - bug.bugged_cameras -= src.c_tag - bug = null - else - to_chat(user, span_notice("Camera bugged.")) - bug = attacking_item - bug.bugged_cameras[src.c_tag] = WEAKREF(src) - return - return ..() diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm new file mode 100644 index 000000000000..967b68e774b7 --- /dev/null +++ b/code/game/machinery/camera/trackable.dm @@ -0,0 +1,200 @@ +///How many ticks to try to find a target before giving up. +#define CAMERA_TICK_LIMIT 10 + +/datum/trackable + ///Reference to the atom that owns us, used for tracking. + var/atom/tracking_holder + + ///What mob are we currently tracking, if any + var/mob/living/tracked_mob + ///If we're currently rechecking our target's trackability in hopes of something changing + var/rechecking = FALSE + ///How many times we've failed to locate our target. + var/cameraticks = 0 + + ///List of all names that can be tracked. + VAR_PRIVATE/list/names = list() + ///List of all namecounts for mobs with the exact same name, just in-case. + VAR_PRIVATE/list/namecounts = list() + ///List of all humans trackable by cameras. + VAR_PRIVATE/static/list/humans = list() + ///List of all non-humans trackable by cameras, split so humans take priority. + VAR_PRIVATE/static/list/others = list() + +/datum/trackable/New(atom/source) + . = ..() + tracking_holder = source + RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(perspective_reset)) + +/datum/trackable/Destroy(force, ...) + tracking_holder = null + tracked_mob = null + STOP_PROCESSING(SSprocessing, src) + return ..() + +///Generates a list of trackable people by name, returning a list of Humans + Non-Humans that can be tracked. +/datum/trackable/proc/find_trackable_mobs() + RETURN_TYPE(/list) + + names.Cut() + namecounts.Cut() + + humans.Cut() + others.Cut() + + for(var/mob/living/living_mob as anything in GLOB.mob_living_list) + if(!living_mob.can_track(usr)) + continue + + var/name = living_mob.name + while(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + names.Add(name) + namecounts[name] = 1 + + if(ishuman(living_mob)) + humans[name] = WEAKREF(living_mob) + else + others[name] = WEAKREF(living_mob) + + var/list/targets = sort_list(humans) + sort_list(others) + return targets + +/// Takes a mob to track, resets our state and begins trying to follow it +/// Best we can at least +/datum/trackable/proc/set_tracked_mob(mob/living/track) + set_rechecking(FALSE) + if(tracked_mob) + UnregisterSignal(tracked_mob, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE)) + if(track && !isliving(track)) + tracked_mob = null + return + tracked_mob = track + if(tracked_mob) + RegisterSignal(tracked_mob, COMSIG_QDELETING, PROC_REF(target_deleted)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(glide_size_changed)) + attempt_track() + +/datum/trackable/proc/target_deleted(datum/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/perspective_reset(atom/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/target_moved(datum/source) + SIGNAL_HANDLER + if(attempt_track()) + return + set_rechecking(TRUE) + +/// Controls if we're processing to recheck the conditions that prevent tracking or not +/datum/trackable/proc/set_rechecking(should_check) + if(should_check) + START_PROCESSING(SSprocessing, src) + cameraticks = initial(cameraticks) + rechecking = TRUE + else + STOP_PROCESSING(SSprocessing, src) + rechecking = FALSE + +/datum/trackable/process() + if(!rechecking) + return PROCESS_KILL + + if(attempt_track()) + set_rechecking(FALSE) + return + + if(cameraticks < CAMERA_TICK_LIMIT) + if(!cameraticks) + to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + return + + to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) + reset_tracking() + +/// Tries to track onto our target mob. Returns true if it succeeds, false otherwise +/datum/trackable/proc/attempt_track() + if(!tracked_mob) + reset_tracking() + return FALSE + + if(!tracked_mob.can_track(tracking_holder)) + return FALSE + // In case we've been checking + set_rechecking(FALSE) + SEND_SIGNAL(src, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_mob) + return TRUE + +/datum/trackable/proc/glide_size_changed(datum/source, new_glide_size) + SIGNAL_HANDLER + SEND_SIGNAL(src, COMSIG_TRACKABLE_GLIDE_CHANGED, tracked_mob, new_glide_size) + +/** + * reset_tracking + * + * Resets our tracking + */ +/datum/trackable/proc/reset_tracking() + set_tracked_mob(null) + +/** + * track_input + * + * Sets a mob as being tracked, will give a tgui input list to find targets to track. + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + */ +/datum/trackable/proc/track_input(mob/living/tracker) + if(!tracker || tracker.stat == DEAD) + return + + var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) + if(!target_name || isnull(target_name)) + return + var/datum/weakref/mob_ref = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + set_tracked_mob(mob_ref.resolve()) + +/** + * track_name + * + * Sets a mob as being tracked, will track the passed in target name's target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked_mob_name - The person being tracked. + */ +/datum/trackable/proc/track_name(mob/living/tracker, tracked_mob_name) + if(!tracker || tracker.stat == DEAD) + return + + find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. + var/datum/weakref/mob_ref = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) + set_tracked_mob(mob_ref.resolve()) + +/** + * track_mob + * + * Sets a mob as being tracked, will track the passed in target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked - The person being tracked. + */ +/datum/trackable/proc/track_mob(mob/living/tracker, mob/living/tracked) + if(!tracker || tracker.stat == DEAD) + return + // Need to make sure the tracked mob is in our list + track_name(tracked.name) + +#undef CAMERA_TICK_LIMIT diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm deleted file mode 100644 index 1228930a7a2e..000000000000 --- a/code/game/machinery/camera/tracking.dm +++ /dev/null @@ -1,158 +0,0 @@ -/mob/living/silicon/ai/proc/get_camera_list() - var/list/L = list() - for (var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) - L.Add(C) - - camera_sort(L) - - var/list/T = list() - - for (var/obj/machinery/camera/C in L) - var/list/tempnetwork = C.network&src.network - if (length(tempnetwork)) - T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C - - return T - -/mob/living/silicon/ai/proc/show_camera_list() - var/list/cameras = get_camera_list() - var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) - if(isnull(camera)) - return - if(isnull(cameras[camera])) - return - switchCamera(cameras[camera]) - -/datum/trackable - var/initialized = FALSE - var/list/names = list() - var/list/namecounts = list() - var/list/humans = list() - var/list/others = list() - -/mob/living/silicon/ai/proc/trackable_mobs() - track.initialized = TRUE - track.names.Cut() - track.namecounts.Cut() - track.humans.Cut() - track.others.Cut() - - if(usr.stat == DEAD) - return list() - - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(!L.can_track(usr)) - continue - - var/name = L.name - while(name in track.names) - track.namecounts[name]++ - name = text("[] ([])", name, track.namecounts[name]) - track.names.Add(name) - track.namecounts[name] = 1 - - if(ishuman(L)) - track.humans[name] = WEAKREF(L) - else - track.others[name] = WEAKREF(L) - - var/list/targets = sort_list(track.humans) + sort_list(track.others) - - return targets - -/mob/living/silicon/ai/verb/ai_camera_track(target_name in trackable_mobs()) - set name = "track" - set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass - - if(!target_name) - return - - if(!track.initialized) - trackable_mobs() - - var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - - ai_actual_track(target?.resolve()) - -/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) - if(!istype(target)) - return - var/mob/living/silicon/ai/U = usr - - U.cameraFollow = target - U.tracking = 1 - - if(!target || !target.can_track(usr)) - to_chat(U, span_warning("Target is not near any active cameras.")) - U.cameraFollow = null - return - - to_chat(U, span_notice("Now tracking [target.get_visible_name()] on camera.")) - - INVOKE_ASYNC(src, PROC_REF(do_track), target, U) - -/mob/living/silicon/ai/proc/do_track(mob/living/target, mob/living/silicon/ai/U) - var/cameraticks = 0 - - while(U.cameraFollow == target) - if(U.cameraFollow == null) - return - - if(!target.can_track(usr)) - U.tracking = TRUE - if(!cameraticks) - to_chat(U, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - if(cameraticks > 9) - U.cameraFollow = null - to_chat(U, span_warning("Unable to reacquire, cancelling track...")) - tracking = FALSE - return - else - sleep(1 SECONDS) - continue - - else - cameraticks = 0 - U.tracking = FALSE - - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target)) - - else - view_core() - U.cameraFollow = null - return - - sleep(1 SECONDS) - -/proc/near_camera(mob/living/M) - if (!isturf(M.loc)) - return FALSE - if(issilicon(M)) - var/mob/living/silicon/S = M - if((QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) - return FALSE - else if(!GLOB.cameranet.checkCameraVis(M)) - return FALSE - return TRUE - -/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) - if (!istype(user)) - return - if (!can_use()) - return - user.switchCamera(src) - -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = length(L), i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index e8fc202feede..54e622fb12d3 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -82,24 +82,26 @@ /obj/machinery/computer/security/ui_data() var/list/data = list() - data["network"] = network data["activeCamera"] = null if(active_camera) data["activeCamera"] = list( name = active_camera.c_tag, + ref = REF(active_camera), status = active_camera.status, ) return data /obj/machinery/computer/security/ui_static_data() var/list/data = list() + data["network"] = network data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] data["cameras"] += list(list( name = C.c_tag, + ref = REF(C), )) return data @@ -110,13 +112,11 @@ return if(action == "switch_camera") - var/c_tag = params["name"] - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/selected_camera = cameras[c_tag] + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras active_camera = selected_camera playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) - if(!selected_camera) + if(isnull(active_camera)) return TRUE update_active_camera_screen() @@ -178,28 +178,6 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/obj/machinery/computer/security/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if((is_away_level(z) || is_away_level(camera_turf.z)) && (camera_turf.z != z))//if on away mission, can only receive feed from same z_level cameras - continue - L.Add(cam) - var/list/D = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - D["[cam.c_tag]"] = cam - return D - // SECURITY MONITORS /obj/machinery/computer/security/wooden_tv diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 562a0f0cba77..d46efbe39a47 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -881,8 +881,8 @@ continue shake_camera(crew_member, 15, 1) - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.unfavorable_situation() + SSgamemode.point_gain_multipliers[EVENT_TRACK_ROLESET]++ + if(HACK_SLEEPER) // Trigger one or multiple sleeper agents with the crew (or for latejoining crew) var/datum/dynamic_ruleset/midround/sleeper_agent_type = /datum/dynamic_ruleset/midround/from_living/autotraitor diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 1560d1f17228..e4419226aea2 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -277,7 +277,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return results -/datum/crewmonitor/ui_act(action,params) +/datum/crewmonitor/ui_act(action, params) . = ..() if(.) return @@ -286,7 +286,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/mob/living/silicon/ai/AI = usr if(!istype(AI)) return - AI.ai_camera_track(params["name"]) + AI.ai_tracking_tool.track_name(AI, params["name"]) #undef SENSORS_UPDATE_PERIOD #undef UNKNOWN_JOB_ID diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e691c5d9fc1b..a7ac997db2f5 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -10,6 +10,8 @@ #define MAX_IV_TRANSFER_RATE 5 ///Default IV drip transfer rate in units per second #define DEFAULT_IV_TRANSFER_RATE 5 +//Alert shown to mob the IV is still connected +#define ALERT_IV_CONNECTED "iv_connected" ///Universal IV that can drain blood or feed reagents over a period of time from or to a replaceable container /obj/machinery/iv_drip @@ -26,7 +28,7 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER use_power = NO_POWER_USE ///What are we sticking our needle in? - var/atom/attached + var/mob/attached ///Are we donating or injecting? var/mode = IV_INJECTING ///The chemicals flow speed @@ -303,7 +305,7 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN ///called when an IV is attached -/obj/machinery/iv_drip/proc/attach_iv(atom/target, mob/user) +/obj/machinery/iv_drip/proc/attach_iv(mob/target, mob/user) if(isliving(target)) user.visible_message(span_warning("[usr] begins attaching [src] to [target]..."), span_warning("You begin attaching [src] to [target].")) if(!do_after(usr, 1 SECONDS, target)) @@ -314,6 +316,7 @@ var/datum/reagents/container = get_reagents() log_combat(usr, target, "attached", src, "containing: ([container.get_reagent_log_string()])") add_fingerprint(usr) + target.throw_alert(ALERT_IV_CONNECTED, /atom/movable/screen/alert/iv_connected) attached = target START_PROCESSING(SSmachines, src) update_appearance(UPDATE_ICON) @@ -324,6 +327,7 @@ /obj/machinery/iv_drip/proc/detach_iv() if(attached) visible_message(span_notice("[attached] is detached from [src].")) + attached.clear_alert(ALERT_IV_CONNECTED, /atom/movable/screen/alert/iv_connected) SEND_SIGNAL(src, COMSIG_IV_DETACH, attached) attached = null update_appearance(UPDATE_ICON) @@ -439,6 +443,11 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS +/atom/movable/screen/alert/iv_connected + name = "IV Connected" + desc = "You have an IV connected to your arm. Remember to remove it or drag the IV stand with you before moving, or else it will rip out!" + icon_state = ALERT_IV_CONNECTED + #undef IV_TAKING #undef IV_INJECTING @@ -446,3 +455,5 @@ #undef MAX_IV_TRANSFER_RATE #undef IV_TRANSFER_RATE_STEP + +#undef ALERT_IV_CONNECTED diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index 3d12932d99da..b862a6372b7a 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -98,6 +98,7 @@ screen = MAIN_VIEW return TRUE return TRUE + /obj/machinery/computer/telecomms/monitor/attackby() . = ..() updateUsrDialog() diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 9e799b3595a0..420f43793f14 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -91,9 +91,6 @@ /obj/machinery/telecomms/message_server/Initialize(mapload) . = ..() - if (!decryptkey) - decryptkey = GenerateKey() - if (calibrating) calibrating += world.time say("Calibrating... Estimated wait time: [rand(3, 9)] minutes.") @@ -112,13 +109,6 @@ if(calibrating) . += span_warning("It's still calibrating.") -/obj/machinery/telecomms/message_server/proc/GenerateKey() - var/newKey - newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le") - newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai") - newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") - return newKey - /obj/machinery/telecomms/message_server/process() . = ..() if(calibrating && calibrating <= world.time) @@ -153,6 +143,29 @@ if(calibrating) . += "message_server_calibrate" +// Preset messaging server +/obj/machinery/telecomms/message_server/preset + id = "Messaging Server" + network = "tcommsat" + autolinkers = list("messaging") + calibrating = 0 + +GLOBAL_VAR(preset_station_message_server_key) + +/obj/machinery/telecomms/message_server/preset/Initialize(mapload) + . = ..() + // Just in case there are multiple preset messageservers somehow once the CE arrives, + // we want those on the station to share the same preset default decrypt key shown in his memories. + var/is_on_station = is_station_level(z) + if(is_on_station && GLOB.preset_station_message_server_key) + decryptkey = GLOB.preset_station_message_server_key + return + //Generate a random password for the message server + decryptkey = pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le") + decryptkey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai") + decryptkey += "[rand(0, 9)]" + if(is_on_station) + GLOB.preset_station_message_server_key = decryptkey // Root messaging signal datum /datum/signal/subspace/messaging diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 377c8470480b..0c050579de45 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -48,6 +48,7 @@ ///The abstract effect ignores even more effects and is often typechecked for atoms that should truly not be fucked with. /obj/effect/abstract + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /obj/effect/abstract/singularity_pull() return diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index a29be972dc61..167d359551bd 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -18,16 +18,31 @@ anchored = TRUE density = TRUE // dense for receiving bumbs layer = HIGH_OBJ_LAYER + light_system = STATIC_LIGHT + light_outer_range = 3 + light_power = 1 + light_on = TRUE + light_color = COLOR_BLUE_LIGHT + /// Are mechs able to enter this portal? var/mech_sized = FALSE + /// A reference to another "linked" destination portal var/obj/effect/portal/linked - var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. + /// Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. + var/hardlinked = TRUE + /// What teleport channel does this portal use? var/teleport_channel = TELEPORT_CHANNEL_BLUESPACE - var/turf/hard_target //For when a portal needs a hard target and isn't to be linked. + /// For when a portal needs a hard target and isn't to be linked. + var/turf/hard_target + /// Do we teleport anchored objects? var/allow_anchored = FALSE + /// What precision value do we pass to do_teleport (how far from the target destination we will pop out at). var/innate_accuracy_penalty = 0 + /// Used to track how often sparks should be output. Might want to turn this into a cooldown. var/last_effect = 0 /// Does this portal bypass teleport restrictions? like TRAIT_NO_TELEPORT and NOTELEPORT flags. var/force_teleport = FALSE + /// Does this portal create spark effect when teleporting? + var/sparkless = FALSE /obj/effect/portal/anom name = "wormhole" @@ -37,6 +52,7 @@ plane = ABOVE_GAME_PLANE mech_sized = TRUE teleport_channel = TELEPORT_CHANNEL_WORMHOLE + light_on = FALSE /obj/effect/portal/Move(newloc) for(var/T in newloc) diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index ce48a31e5fdd..616225bce2e2 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -9,7 +9,7 @@ loot = list( // Space loot spawner. Couple of random bits of technology-adjacent stuff including anomaly cores and BEPIS techs. /obj/item/raw_anomaly_core/random, /obj/item/disk/design_disk/bepis, - /obj/item/camera_bug, + /obj/item/computer_disk/syndicate/camera_app, ) /obj/effect/spawner/random/exotic/languagebook diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 681c8ed996a8..7f1afd127867 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -467,7 +467,7 @@ add_fingerprint(user) ui_interact(user) -/obj/item/ui_act(action, list/params) +/obj/item/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) add_fingerprint(usr) return ..() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 55fb6cedd8ff..f9c7a42f4054 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -649,7 +649,12 @@ if(loc != user) to_chat(user, span_warning("You must be holding the ID to continue!")) return FALSE - var/new_bank_id = tgui_input_number(user, "Enter your account ID number", "Account Reclamation", 111111, 999999, 111111) + var/list/user_memories = user.mind.memories + var/datum/memory/key/account/user_key = user_memories[/datum/memory/key/account] + var/user_account = 11111 + if(!isnull(user_key)) + user_account = user_key.remembered_id + var/new_bank_id = tgui_input_number(user, "Enter the account ID to associate with this card.", "Link Bank Account", user_account, 999999, 111111) if(!new_bank_id || QDELETED(user) || QDELETED(src) || issilicon(user) || !alt_click_can_use_id(user) || loc != user) return FALSE if(registered_account?.account_id == new_bank_id) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index c2cadb21e6b1..b3dd4b330beb 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -219,17 +219,27 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!lighting_text) return ..() - if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen - var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn - to_chat(user, span_notice("Your [name] needs a source of oxygen to burn.")) - return ..() + if(!check_oxygen(user)) //cigarettes need oxygen + balloon_alert(user, "no air!") + return ..() if(smoketime > 0) light(lighting_text) else to_chat(user, span_warning("There is nothing to smoke!")) +/// Checks that we have enough air to smoke +/obj/item/clothing/mask/cigarette/proc/check_oxygen(mob/user) + if (reagents.has_reagent(/datum/reagent/oxygen)) + return TRUE + var/datum/gas_mixture/air = return_air() + if (!isnull(air) && air.has_gas(/datum/gas/oxygen, 1)) + return TRUE + if (!iscarbon(user)) + return FALSE + var/mob/living/carbon/the_smoker = user + return the_smoker.can_breathe_helmet() + /obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/cup/glass, mob/user, proximity) . = ..() if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead) @@ -364,11 +374,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/mob/living/user = isliving(loc) ? loc : null var/turf/location = get_turf(src) user?.ignite_mob() - if(!reagents.has_reagent(/datum/reagent/oxygen)) //cigarettes need oxygen - var/datum/gas_mixture/air = return_air() - if(!air || !air.has_gas(/datum/gas/oxygen, 1)) //or oxygen on a tile to burn - extinguish() - return + + if(!check_oxygen(user)) + extinguish() + return location.pollute_turf(pollution_type, 5, POLLUTION_PASSIVE_EMITTER_CAP) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index fd73dadc7f79..2bc057adafe1 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -197,7 +197,7 @@ if(!(B?.being_dumped)) accounts_to_rob -= B continue - var/amount = B.account_balance * percentage_lost + var/amount = round(B.account_balance * percentage_lost) // We don't want fractions of a credit stolen. That's just agony for everyone. var/datum/bank_account/account = bogdanoff?.get_bank_account() if (account) // get_bank_account() may return FALSE account.transfer_money(B, amount, "?VIVA¿: !LA CRABBE¡") diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 28d08ad15f8e..437a85e6febe 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -592,6 +592,9 @@ playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE) do_cancel() return + if(SEND_SIGNAL(H, COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP, user, src) & COMPONENT_DEFIB_STOP) + do_cancel() + return if(H.stat == DEAD) H.visible_message(span_warning("[H]'s body convulses a bit.")) playsound(src, SFX_BODYFALL, 50, TRUE) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 61ba48c081b4..71b6080f6cea 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -3,6 +3,7 @@ desc = "A storage device for AIs. Patent pending." icon = 'icons/obj/aicards.dmi' icon_state = "aicard" // aicard-full + base_icon_state = "aicard" inhand_icon_state = "electronic" worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' @@ -13,51 +14,91 @@ var/flush = FALSE var/mob/living/silicon/ai/AI +/obj/item/aicard/Destroy(force) + if(AI) + AI.ghostize(can_reenter_corpse = FALSE) + QDEL_NULL(AI) + + return ..() + /obj/item/aicard/aitater name = "intelliTater" desc = "A stylish upgrade (?) to the intelliCard." icon_state = "aitater" + base_icon_state = "aitater" /obj/item/aicard/aispook name = "intelliLantern" desc = "A spoOoOoky upgrade to the intelliCard." icon_state = "aispook" + base_icon_state = "aispook" /obj/item/aicard/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!")) return BRUTELOSS /obj/item/aicard/pre_attack(atom/target, mob/living/user, params) - if(AI) //AI is on the card, implies user wants to upload it. - var/our_ai = AI - target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) - if(!AI) - log_combat(user, our_ai, "uploaded", src, "to [target].") - update_appearance() + . = ..() + if(.) + return + + if(AI) + if(upload_ai(target, user)) return TRUE - else //No AI on the card, therefore the user wants to download one. - target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) - if(AI) - log_silicon("[key_name(user)] carded [key_name(AI)]", src) - update_appearance() + else + if(capture_ai(target, user)) return TRUE - return ..() -/obj/item/aicard/update_icon_state() - if(!AI) - name = initial(name) - icon_state = initial(icon_state) - return ..() - name = "[initial(name)] - [AI.name]" - icon_state = "[initial(icon_state)][AI.stat == DEAD ? "-404" : "-full"]" +/// Tries to get an AI from the atom clicked +/obj/item/aicard/proc/capture_ai(atom/from_what, mob/living/user) + from_what.transfer_ai(AI_TRANS_TO_CARD, user, null, src) + if(isnull(AI)) + return FALSE + + log_silicon("[key_name(user)] carded [key_name(AI)]", src) + update_appearance() AI.cancel_camera() + RegisterSignal(AI, COMSIG_MOB_STATCHANGE, PROC_REF(on_ai_stat_change)) + return TRUE + +/// Tries to upload the AI we have captured to the atom clicked +/obj/item/aicard/proc/upload_ai(atom/to_what, mob/living/user) + var/mob/living/silicon/ai/old_ai = AI + to_what.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) + if(!isnull(AI)) + return FALSE + + log_combat(user, old_ai, "uploaded", src, "to [to_what].") + update_appearance() + old_ai.cancel_camera() + UnregisterSignal(old_ai, COMSIG_MOB_STATCHANGE) + return TRUE + +/obj/item/aicard/proc/on_ai_stat_change(datum/source, new_stat, old_stat) + SIGNAL_HANDLER + + if(new_stat == DEAD || old_stat == DEAD) + update_appearance() + +/obj/item/aicard/update_name(updates) + . = ..() + if(AI) + name = "[initial(name)] - [AI.name]" + else + name = initial(name) + +/obj/item/aicard/update_icon_state() + if(AI) + icon_state = "[base_icon_state][AI.stat == DEAD ? "-404" : "-full"]" + else + icon_state = base_icon_state return ..() /obj/item/aicard/update_overlays() . = ..() if(!AI?.control_disabled) return - . += "[initial(icon_state)]-on" + . += "[base_icon_state]-on" /obj/item/aicard/ui_state(mob/user) return GLOB.hands_state @@ -93,13 +134,7 @@ var/confirm = tgui_alert(usr, "Are you sure you want to wipe this card's memory?", name, list("Yes", "No")) if(confirm == "Yes" && !..()) flush = TRUE - if(AI && AI.loc == src) - to_chat(AI, span_userdanger("Your core files are being wiped!")) - while(AI.stat != DEAD && flush) - AI.adjustOxyLoss(5) - AI.updatehealth() - sleep(0.5 SECONDS) - flush = FALSE + wipe_ai() . = TRUE if("wireless") AI.control_disabled = !AI.control_disabled @@ -114,3 +149,14 @@ to_chat(AI, span_warning("Your Subspace Transceiver has been [AI.radio_enabled ? "enabled" : "disabled"]!")) . = TRUE update_appearance() + +/obj/item/aicard/proc/wipe_ai() + set waitfor = FALSE + + if(AI && AI.loc == src) + to_chat(AI, span_userdanger("Your core files are being wiped!")) + while(AI.stat != DEAD && flush) + AI.adjustOxyLoss(5) + AI.updatehealth() + sleep(0.5 SECONDS) + flush = FALSE diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm deleted file mode 100644 index 918b7313691a..000000000000 --- a/code/game/objects/items/devices/camera_bug.dm +++ /dev/null @@ -1,319 +0,0 @@ - -#define BUGMODE_LIST 0 -#define BUGMODE_MONITOR 1 -#define BUGMODE_TRACK 2 - - - -/obj/item/camera_bug - name = "camera bug" - desc = "For illicit snooping through the camera network." - icon = 'icons/obj/device.dmi' - icon_state = "camera_bug" - w_class = WEIGHT_CLASS_TINY - inhand_icon_state = "camera_bug" - throw_speed = 4 - throw_range = 20 - item_flags = NOBLUDGEON - - var/obj/machinery/camera/current = null - - var/last_net_update = 0 - var/list/bugged_cameras = list() - - var/track_mode = BUGMODE_LIST - var/last_tracked = 0 - var/refresh_interval = 50 - - var/tracked_name = null - var/atom/tracking = null - - var/last_found = null - var/last_seen = null - -/obj/item/camera_bug/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/camera_bug/Destroy() - STOP_PROCESSING(SSobj, src) - get_cameras() - for(var/cam_tag in bugged_cameras) - var/datum/weakref/camera_ref = bugged_cameras[cam_tag] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && camera.bug == src) - camera.bug = null - bugged_cameras = list() - if(tracking) - tracking = null - return ..() - -/obj/item/camera_bug/interact(mob/user) - ui_interact(user) - -/obj/item/camera_bug/ui_interact(mob/user = usr) - . = ..() - var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src) - popup.set_content(menu(get_cameras())) - popup.open() - -/obj/item/camera_bug/attack_self(mob/user) - user.set_machine(src) - interact(user) - -/obj/item/camera_bug/check_eye(mob/user) - if ( loc != user || user.incapacitated() || user.is_blind() || !current ) - user.unset_machine() - return FALSE - if(!is_valid_z_level(get_turf(current), get_turf(user.loc)) || !current.can_use()) - to_chat(user, span_danger("[src] has lost the signal.")) - current = null - user.unset_machine() - return FALSE - return TRUE -/obj/item/camera_bug/on_unset_machine(mob/user) - user.reset_perspective(null) - -/obj/item/camera_bug/proc/get_cameras() - if( world.time > (last_net_update + 100)) - bugged_cameras = list() - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - if(camera.machine_stat || !camera.can_use()) - continue - if(length(list("ss13","mine", "rd", "labor", "ordnance", "minisat") & camera.network)) - var/datum/weakref/camera_ref = WEAKREF(camera) - if(!camera_ref || !camera.c_tag) - continue - bugged_cameras[camera.c_tag] = camera_ref - return sort_list(bugged_cameras) - - -/obj/item/camera_bug/proc/menu(list/cameras) - if(!cameras || !cameras.len) - return "No bugged cameras found." - - var/html - switch(track_mode) - if(BUGMODE_LIST) - html = "

Select a camera:

\[Cancel camera view\]
" - for(var/entry in cameras) - var/datum/weakref/camera_ref = cameras[entry] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(!camera) - cameras -= camera_ref - continue - var/functions = "" - if(camera.bug == src) - functions = " - \[Monitor\]\[Disable\]" - else - functions = " - \[Monitor\]" - html += "" - - if(BUGMODE_MONITOR) - if(current) - html = "Analyzing Camera '[current.c_tag]' \[Select Camera\]
" - html += camera_report() - else - track_mode = BUGMODE_LIST - return .(cameras) - if(BUGMODE_TRACK) - if(tracking) - html = "Tracking '[tracked_name]' \[Cancel Tracking\]\[Cancel camera view\]
" - if(last_found) - var/time_diff = round((world.time - last_seen) / 150) - var/datum/weakref/camera_ref = bugged_cameras[last_found] - var/obj/machinery/camera/camera = camera_ref.resolve() - var/outstring - if(camera) - outstring = "[last_found]" - else - outstring = last_found - if(!time_diff) - html += "Last seen near [outstring] (now)
" - else - // 15 second intervals ~ 1/4 minute - var/m = round(time_diff/4) - var/s = (time_diff - 4*m) * 15 - if(!s) - s = "00" - html += "Last seen near [outstring] ([m]:[s] minute\s ago)
" - if(camera && (camera.bug == src)) //Checks to see if the camera has a bug - html += "\[Disable\]" - - else - html += "Not yet seen." - else - track_mode = BUGMODE_LIST - return .(cameras) - return html - -/obj/item/camera_bug/proc/get_seens() - return current?.can_see() - -/obj/item/camera_bug/proc/camera_report() - // this should only be called if current exists - var/dat = "" - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/list/names = list() - for(var/obj/singularity/S in seen) // god help you if you see more than one - if(S.name in names) - names[S.name]++ - dat += "[S.name] ([names[S.name]])" - else - names[S.name] = 1 - dat += "[S.name]" - var/stage = round(S.current_size / 2)+1 - dat += " (Stage [stage])" - dat += " \[Track\]
" - - for(var/obj/vehicle/sealed/mecha/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - dat += " \[Track\]
" - - - for(var/mob/living/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - if(M.body_position == LYING_DOWN) - if(M.buckled) - dat += " (Sitting)" - else - dat += " (Laying down)" - dat += " \[Track\]
" - if(length(dat) == 0) - dat += "No motion detected." - return dat - else - return "Camera Offline
" - -/obj/item/camera_bug/Topic(href,list/href_list) - if(usr != loc) - usr.unset_machine() - usr << browse(null, "window=camerabug") - return - usr.set_machine(src) - if("mode" in href_list) - track_mode = text2num(href_list["mode"]) - if("monitor" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["monitor"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - track_mode = BUGMODE_MONITOR - current = camera - usr.reset_perspective(null) - interact() - if("track" in href_list) - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/atom/A = locate(href_list["track"]) in seen - if(A && istype(A)) - tracking = A - tracked_name = A.name - last_found = current.c_tag - last_seen = world.time - track_mode = BUGMODE_TRACK - if("emp" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["emp"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera) && camera.bug == src) - if(!same_z_level(camera)) - return - camera.emp_act(EMP_HEAVY) - camera.bug = null - bugged_cameras -= camera.c_tag - interact() - return - if("close" in href_list) - usr.unset_machine() - current = null - return - if("view" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["view"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - if(!camera.can_use()) - to_chat(usr, span_warning("Something's wrong with that camera! You can't get a feed.")) - return - current = camera - addtimer(CALLBACK(src, PROC_REF(view_camera), usr, camera), 0.6 SECONDS) - return - else - usr.unset_machine() - - interact() - -/obj/item/camera_bug/proc/view_camera(mob/show, obj/machinery/camera/camera) - if(check_eye(show)) - show.reset_perspective(camera) - interact() - else - show.unset_machine() - show << browse(null, "window=camerabug") - -/obj/item/camera_bug/process() - if(track_mode == BUGMODE_LIST || (world.time < (last_tracked + refresh_interval))) - return - last_tracked = world.time - if(track_mode == BUGMODE_TRACK ) // search for user - // Note that it will be tricked if your name appears to change. - // This is not optimal but it is better than tracking you relentlessly despite everything. - if(!tracking) - src.updateSelfDialog() - return - - if(tracking.name != tracked_name) // Hiding their identity, tricksy - var/mob/M = tracking - if(istype(M)) - if(!(tracked_name == "Unknown" && findtext(tracking.name,"Unknown"))) // we saw then disguised before - if(!(tracked_name == M.real_name && findtext(tracking.name,M.real_name))) // or they're still ID'd - src.updateSelfDialog()//But if it's neither of those cases - return // you won't find em on the cameras - else - src.updateSelfDialog() - return - - var/list/tracking_cams = list() - var/list/b_cams = get_cameras() - for(var/entry in b_cams) - tracking_cams += b_cams[entry] - var/list/target_region = view(tracking) - - for(var/obj/machinery/camera/C in (target_region & tracking_cams)) - if(!can_see(C,tracking)) // target may have xray, that doesn't make them visible to cameras - continue - if(C.can_use()) - last_found = C.c_tag - last_seen = world.time - break - src.updateSelfDialog() - -/obj/item/camera_bug/proc/same_z_level(obj/machinery/camera/C) - var/turf/T_bug = get_turf(loc) - if(!T_bug || !is_valid_z_level(T_bug, get_turf(C))) - to_chat(usr, span_warning("You can't get a signal!")) - return FALSE - return TRUE - -#undef BUGMODE_LIST -#undef BUGMODE_MONITOR -#undef BUGMODE_TRACK diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index a3a2bc5b4ac4..a15afe737cdb 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -202,6 +202,7 @@ /obj/item/flashlight/equipped(mob/user, slot, initial) . = ..() setDir(initial(dir)) + SEND_SIGNAL(user, COMSIG_ATOM_DIR_CHANGE, user.dir, user.dir) // This is dumb, but if we don't do this then the lighting overlay may be facing the wrong direction depending on how it is picked up /// for directional sprites - so when we drop the flashlight, it drops facing the same way the user is facing /obj/item/flashlight/dropped(mob/user, silent = FALSE) @@ -841,6 +842,11 @@ light_outer_range = 1 light_power = 0.07 +/obj/item/flashlight/eyelight/glow + light_system = MOVABLE_LIGHT_BEAM + light_outer_range = 4 + light_power = 2 + #undef FAILURE #undef SUCCESS #undef NO_FUEL diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index b514cb0b1abd..35780928819e 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -86,10 +86,6 @@ /obj/item/multitool/ai_detect/proc/multitool_detect() var/turf/our_turf = get_turf(src) detect_state = PROXIMITY_NONE - for(var/mob/living/silicon/ai/AI as anything in GLOB.ai_list) - if(AI.cameraFollow == src) - detect_state = PROXIMITY_ON_SCREEN - return for(var/mob/camera/ai_eye/AI_eye as anything in GLOB.aiEyes) if(!AI_eye.ai_detector_visible) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 646a3fc01582..9210a6af5c3f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -17,7 +17,6 @@ throw_range = 7 w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT * 0.75, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 0.25) - obj_flags = USES_TGUI ///if FALSE, broadcasting and listening dont matter and this radio shouldnt do anything VAR_PRIVATE/on = TRUE diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 6640b7cb0cfd..1421a4963dd6 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -111,7 +111,17 @@ return CONTEXTUAL_SCREENTIP_SET -// Used by the PDA medical scanner too +/** + * healthscan + * returns a list of everything a health scan should give to a player. + * Examples of where this is used is Health Analyzer and the Physical Scanner tablet app. + * Args: + * user - The person with the scanner + * target - The person being scanned + * mode - Uses SCANNER_CONDENSED or SCANNER_VERBOSE to decide whether to give a list of all individual limb damage + * advanced - Whether it will give more advanced details, such as husk source. + * tochat - Whether to immediately post the result into the chat of the user, otherwise it will return the results. + */ /proc/healthscan(mob/user, mob/living/target, mode = SCANNER_VERBOSE, advanced = FALSE, tochat = TRUE) if(user.incapacitated()) return @@ -132,8 +142,6 @@ render_list += "[span_info("Analyzing results for [target]:")]\nOverall status: [mob_status]\n" - SEND_SIGNAL(target, COMSIG_LIVING_HEALTHSCAN, render_list, advanced, user, mode) - if(ishuman(target)) var/mob/living/carbon/human/humantarget = target if(humantarget.undergoing_cardiac_arrest() && humantarget.stat != DEAD) @@ -141,6 +149,8 @@ if(humantarget.has_reagent(/datum/reagent/inverse/technetium)) advanced = TRUE + SEND_SIGNAL(target, COMSIG_LIVING_HEALTHSCAN, render_list, advanced, user, mode) + // Husk detection if(HAS_TRAIT(target, TRAIT_HUSK)) if(advanced) @@ -248,6 +258,9 @@ dmgreport += "" dmgreport += "
[entry][functions]
[(limb.burn_dam > 0) ? "[CEILING(limb.burn_dam,1)]" : "0"]
" render_list += dmgreport // tables do not need extra linebreak + for(var/obj/item/bodypart/limb as anything in carbontarget.bodyparts) + for(var/obj/item/embed as anything in limb.embedded_objects) + render_list += "Embedded object: [embed] located in \the [limb.plaintext_zone]\n" if(ishuman(target)) var/mob/living/carbon/human/humantarget = target @@ -317,8 +330,21 @@ || istype(humantarget.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS), /obj/item/organ/external/wings/functional) render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]\n" - render_list += "Core temperature: [round(humantarget.coretemperature-T0C,0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)\n" - render_list += "Body temperature: [round(target.bodytemperature-T0C,0.1)] °C ([round(target.bodytemperature*1.8-459.67,0.1)] °F)\n" + var/core_temperature_message = "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)" + if(humantarget.coretemperature >= humantarget.get_body_temp_heat_damage_limit()) + render_list += "☼ [core_temperature_message] ☼\n" + else if(humantarget.coretemperature <= humantarget.get_body_temp_cold_damage_limit()) + render_list += "❄ [core_temperature_message] ❄\n" + else + render_list += "[core_temperature_message]\n" + + var/body_temperature_message = "Body temperature: [round(target.bodytemperature-T0C, 0.1)] °C ([round(target.bodytemperature*1.8-459.67,0.1)] °F)" + if(target.bodytemperature >= target.get_body_temp_heat_damage_limit()) + render_list += "☼ [body_temperature_message] ☼\n" + else if(target.bodytemperature <= target.get_body_temp_cold_damage_limit()) + render_list += "❄ [body_temperature_message] ❄\n" + else + render_list += "[body_temperature_message]\n" // Time of death if(target.tod && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) @@ -352,11 +378,9 @@ var/mob/living/carbon/carbontarget = target var/blood_id = carbontarget.get_blood_id() if(blood_id) - if(ishuman(carbontarget)) - var/mob/living/carbon/human/humantarget = carbontarget - if(humantarget.is_bleeding()) - render_list += "Subject is bleeding!\n" - var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL)*100) + if(carbontarget.is_bleeding()) + render_list += "Subject is bleeding!\n" + var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL) * 100) var/blood_type = carbontarget.dna.blood_type if(blood_id != /datum/reagent/blood) // special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index 4a40fcc7f91e..671bbecf06b9 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -3,37 +3,45 @@ desc = "Use this to escape from those evil Red Shirts." icon_state = "freedom" implant_color = "r" - uses = 4 + uses = FREEDOM_IMPLANT_CHARGES +/obj/item/implant/freedom/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(!.) + return FALSE + if(!iscarbon(target)) //This is pretty much useless for anyone else since they can't be cuffed + balloon_alert(user, "that would be a waste!") + return FALSE + return TRUE /obj/item/implant/freedom/activate() . = ..() + var/mob/living/carbon/carbon_imp_in = imp_in + if(!carbon_imp_in.handcuffed && !carbon_imp_in.legcuffed) + balloon_alert(carbon_imp_in, "no restraints!") + return + uses-- - to_chat(imp_in, span_hear("You feel a faint click.")) - if(iscarbon(imp_in)) - var/mob/living/carbon/C_imp_in = imp_in - C_imp_in.uncuff() + + carbon_imp_in.uncuff() if(!uses) + addtimer(CALLBACK(carbon_imp_in, TYPE_PROC_REF(/atom, balloon_alert), carbon_imp_in, "implant degraded!"), 1 SECONDS) qdel(src) - /obj/item/implant/freedom/get_data() var/dat = {" -Implant Specifications:
-Name: Freedom Beacon
-Life: optimum 5 uses
-Important Notes: Illegal
-
-Implant Details:
-Function: Transmits a specialized cluster of signals to override handcuff locking -mechanisms
-Special Features:
-Neuro-Scan- Analyzes certain shadow signals in the nervous system
-
-No Implant Specifics"} + Implant Specifications:
+ Name: Freedom Beacon
+ Life: Optimum [initial(uses)] uses
+ Important Notes: Illegal
+
+ Implant Details:
+ Function: Transmits a specialized cluster of signals to override handcuff locking + mechanisms. These signals will release any bindings on both the arms and legs.
+ Disclaimer: Heavy-duty restraints such as straightjackets are deemed "too complex" to release from. + "} return dat - /obj/item/implanter/freedom name = "implanter (freedom)" imp_type = /obj/item/implant/freedom diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 06f33f98750f..1150041264e0 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -21,8 +21,13 @@ var/obj/item/bodypart/head/robot/head = null /// Forced name of the cyborg var/created_name = "" + /// Forced master AI of the cyborg var/mob/living/silicon/ai/forced_ai + /// The name of the AI being forced, tracked separately to above + /// so we can reference handle without worrying about making "AI got gibbed" detectors + var/forced_ai_name + /// If the cyborg starts movement free and not under lockdown var/locomotion = TRUE /// If the cyborg synchronizes it's laws with it's master AI @@ -36,6 +41,30 @@ . = ..() update_appearance() +/obj/item/robot_suit/Destroy() + QDEL_NULL(l_arm) + QDEL_NULL(r_arm) + QDEL_NULL(l_leg) + QDEL_NULL(r_leg) + QDEL_NULL(chest) + QDEL_NULL(head) + return ..() + +/obj/item/robot_suit/Exited(atom/movable/gone, direction) + . = ..() + if(gone == l_arm) + l_arm = null + if(gone == r_arm) + r_arm = null + if(gone == l_leg) + l_leg = null + if(gone == r_leg) + r_leg = null + if(gone == chest) + chest = null + if(gone == head) + head = null + /obj/item/robot_suit/prebuilt/Initialize(mapload) . = ..() l_arm = new(src) @@ -76,38 +105,31 @@ var/turf/T = get_turf(src) if(l_leg || r_leg || chest || l_arm || r_arm || head) if(I.use_tool(src, user, 5, volume=50)) - if(l_leg) - l_leg.forceMove(T) - l_leg = null - if(r_leg) - r_leg.forceMove(T) - r_leg = null - if(chest) - if (chest.cell) //Sanity check. - chest.cell.forceMove(T) - chest.cell = null - chest.forceMove(T) - new /obj/item/stack/cable_coil(T, 1) - chest.wired = FALSE - chest = null - if(l_arm) - l_arm.forceMove(T) - l_arm = null - if(r_arm) - r_arm.forceMove(T) - r_arm = null - if(head) - head.forceMove(T) - head.flash1.forceMove(T) - head.flash1 = null - head.flash2.forceMove(T) - head.flash2 = null - head = null + drop_all_parts(T) to_chat(user, span_notice("You disassemble the cyborg shell.")) else to_chat(user, span_warning("There is nothing to remove from the endoskeleton!")) update_appearance() +/// Drops all included parts to the passed location +/// This will also dissassemble the parts being dropped into components as well +/obj/item/robot_suit/proc/drop_all_parts(atom/drop_to = drop_location()) + l_leg?.forceMove(drop_to) + r_leg?.forceMove(drop_to) + l_arm?.forceMove(drop_to) + r_arm?.forceMove(drop_to) + + if(chest) + chest.forceMove(drop_to) + new /obj/item/stack/cable_coil(drop_to, 1) + chest.wired = FALSE + chest.cell?.forceMove(drop_to) + + if(head) + head.flash1?.forceMove(drop_to) + head.flash2?.forceMove(drop_to) + head.forceMove(drop_to) + /obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc if(!user.put_in_hands(I)) I.forceMove(drop_location()) @@ -124,7 +146,7 @@ return var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell) - var/swap_failed + var/swap_failed = FALSE if(!temp_cell) //if we're not holding a cell swap_failed = TRUE else if(!user.transferItemToLoc(temp_cell, chest)) @@ -295,10 +317,9 @@ O.cell = chest.cell chest.cell.forceMove(O) - chest.cell = null + W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - if(O.mmi) //we delete the mmi created by robot/New() - qdel(O.mmi) + QDEL_NULL(O.mmi) //we delete the mmi created by robot/New() O.mmi = W //and give the real mmi to the borg. O.updatename(brainmob.client) // This canonizes that MMI'd cyborgs have memories of their previous life @@ -359,7 +380,7 @@ O.cell = chest.cell chest.cell.forceMove(O) - chest.cell = null + O.locked = panel_locked O.job = JOB_CYBORG forceMove(O) @@ -403,7 +424,7 @@ data["locomotion"] = locomotion data["panel"] = panel_locked data["aisync"] = aisync - data["master"] = forced_ai ? forced_ai.name : null + data["master"] = forced_ai_name data["lawsync"] = lawsync return data @@ -436,16 +457,47 @@ log_silicon("[key_name(user)] has [aisync ? "enabled" : "disabled"] the AI sync for a cyborg shell at [loc_name(user)]") return TRUE if("set_ai") - var/selected_ai = select_active_ai(user, z) - if(!in_range(src, user) && loc != user) - return - if(!selected_ai) + if(length(active_ais(check_mind = FALSE, z = z)) <= 0) to_chat(user, span_alert("No active AIs detected.")) return - forced_ai = selected_ai + + var/selected_ai = select_active_ai(user, z) // this one runs input() + if(!in_range(src, user) && loc != user) + return + if(!selected_ai) // null = clear + clear_forced_ai() + return TRUE + if(forced_ai == selected_ai) // same AI = clear + clear_forced_ai() + to_chat(user, span_notice("You reset [src]'s AI setting.")) + return TRUE + + set_forced_ai(selected_ai, user) + to_chat(user, span_notice("You set [src]'s AI setting to [forced_ai_name].")) log_silicon("[key_name(user)] set the default AI for a cyborg shell to [key_name(selected_ai)] at [loc_name(user)]") return TRUE + if("lawsync") lawsync = !lawsync log_silicon("[key_name(user)] has [lawsync ? "enabled" : "disabled"] the law sync for a cyborg shell at [loc_name(user)]") return TRUE + +/// Sets [forced_ai] and [forced_ai_name] to the passed AI +/obj/item/robot_suit/proc/set_forced_ai(mob/living/silicon/ai/ai) + forced_ai = ai + forced_ai_name = ai.name + RegisterSignal(ai, COMSIG_QDELETING, PROC_REF(ai_die)) + +/// Clears [forced_ai] and [forced_ai_name] +/obj/item/robot_suit/proc/clear_forced_ai() + if(forced_ai) + UnregisterSignal(forced_ai, COMSIG_QDELETING) + forced_ai = null + forced_ai_name = null + +/// Clears the forced_ai ref +/obj/item/robot_suit/proc/ai_die(datum/source) + SIGNAL_HANDLER + // Does not use [proc/clear_forced_ai] because we'd like to keep the AI name tracked for metagaming purposes + UnregisterSignal(forced_ai, COMSIG_QDELETING) + forced_ai = null diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 2f96aae1e8c9..3133ab79f039 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -567,17 +567,15 @@ robot.SetLockdown(FALSE) robot.set_anchored(FALSE) REMOVE_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) - robot.resize = 2 robot.hasExpanded = TRUE - robot.update_transform() + robot.update_transform(2) /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) if (R.hasExpanded) R.hasExpanded = FALSE - R.resize = 0.5 - R.update_transform() + R.update_transform(0.5) /obj/item/borg/upgrade/rped name = "engineering cyborg RPED" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 28c1a9283537..2ba0ab73eab0 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,14 +1,17 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ - new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 5, one_per_turf = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("railing", /obj/structure/railing, 6, time = 3.6 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 2.5 SECONDS, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 0.5 SECONDS, one_per_turf = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing corner", /obj/structure/railing/corner, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end", /obj/structure/railing/corner/end, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end (flipped)", /obj/structure/railing/corner/end/flip, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 0.5 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 10, one_per_turf = FALSE, category = CAT_TOOLS), \ + new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, one_per_turf = FALSE, category = CAT_TOOLS), \ )) /obj/item/stack/rods diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 4b9b9671f860..ce5efefaa0c9 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -256,6 +256,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ max_amount = 6 novariants = FALSE item_flags = NOBLUDGEON + resistance_flags = FIRE_PROOF w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER merge_type = /obj/item/stack/sheet/animalhide/goliath_hide diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 9d9e16e4edf8..a7fa03f96bcb 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("tram wall girders (anchored)", /obj/structure/girder/tram, 2, time = 4 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, on_tram = TRUE, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ null, \ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console, 10, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ null, \ new /datum/stack_recipe_list("airlock assemblies", list( \ diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 84534458943f..569af765e5bf 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -612,19 +612,20 @@ inhand_icon_state = "duffel-syndiemed" /obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents() - new /obj/item/scalpel(src) - new /obj/item/hemostat(src) - new /obj/item/retractor(src) - new /obj/item/circular_saw(src) - new /obj/item/bonesetter(src) - new /obj/item/surgicaldrill(src) - new /obj/item/cautery(src) + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/cautery/advanced(src) new /obj/item/surgical_drapes(src) + new /obj/item/reagent_containers/medigel/sterilizine(src) + new /obj/item/surgicaldrill(src) + new /obj/item/bonesetter(src) + new /obj/item/blood_filter(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/roller(src) new /obj/item/clothing/suit/jacket/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) new /obj/item/mmi/syndie(src) - new /obj/item/blood_filter(src) - new /obj/item/stack/medical/bone_gel(src) /obj/item/storage/backpack/duffelbag/syndie/ammo name = "ammunition duffel bag" diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index 616524e28c6a..75f1e8b500b0 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -186,6 +186,24 @@ atom_storage.silent = TRUE +// MONKESTATION ADDITION START +/obj/item/storage/belt/holster/chameleon/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour != TOOL_MULTITOOL) + return ..() + + if(chameleon_action.hidden) + chameleon_action.hidden = FALSE + actions += chameleon_action + chameleon_action.Grant(user) + log_game("[key_name(user)] has removed the disguise lock on the chameleon holster ([name]) with [W]") + else + chameleon_action.hidden = TRUE + actions -= chameleon_action + chameleon_action.Remove(user) + log_game("[key_name(user)] has locked the disguise of the chameleon holster ([name]) with [W]") +// MONKESTATION ADDITION END + + /obj/item/storage/belt/holster/nukie name = "operative holster" desc = "A deep shoulder holster capable of holding almost any form of firearm and its ammo." diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 40cfe25f9017..6514377887d6 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -52,7 +52,7 @@ new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/encryptionkey/syndicate(src) // 2 tc new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc @@ -115,7 +115,7 @@ new /obj/item/ai_module/toy_ai(src) // ~6 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc new /obj/item/card/id/advanced/chameleon(src) // 2 tc @@ -136,7 +136,7 @@ if(KIT_SABOTAGE) new /obj/item/storage/backpack/duffelbag/syndie/sabotage(src) // 5 tc for 3 c4 and 2 x4 - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/sbeacondrop/powersink(src) // 11 tc new /obj/item/computer_disk/virus/detomatix(src) // 6 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index d73443b2433d..09669efc0acd 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -129,32 +129,34 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) return null /obj/proc/updateUsrDialog() - if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) - var/is_in_use = FALSE - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) + if(!(obj_flags & IN_USE)) + return + + var/is_in_use = FALSE + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + is_in_use = TRUE + ui_interact(M) + if(issilicon(usr) || isAdminGhostAI(usr)) + if (!(usr in nearby)) + if (usr.client && usr.machine == src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. is_in_use = TRUE - ui_interact(M) - if(issilicon(usr) || isAdminGhostAI(usr)) - if (!(usr in nearby)) - if (usr.client && usr.machine == src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. + ui_interact(usr) + + // check for TK users + + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + if(!(usr in nearby)) + if(usr.client && usr.machine == src) + if(H.dna.check_mutation(/datum/mutation/human/telekinesis)) is_in_use = TRUE ui_interact(usr) - - // check for TK users - - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - if(!(usr in nearby)) - if(usr.client && usr.machine == src) - if(H.dna.check_mutation(/datum/mutation/human/telekinesis)) - is_in_use = TRUE - ui_interact(usr) - if (is_in_use) - obj_flags |= IN_USE - else - obj_flags &= ~IN_USE + if (is_in_use) + obj_flags |= IN_USE + else + obj_flags &= ~IN_USE /obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) // Check that people are actually using the machine. If not, don't update anymore. diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 9c7b3cf7132f..35d2bffde992 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -409,6 +409,7 @@ That prevents a few funky behaviors. /atom/proc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + SHOULD_CALL_PARENT(TRUE) if(istype(card)) if(card.flush) to_chat(user, span_alert("ERROR: AI flush is in progress, cannot execute transfer protocol.")) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 203fbc7cfdbe..9fbd47e391a7 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -11,6 +11,7 @@ integrity_failure = 0.25 armor_type = /datum/armor/structure_closet blocks_emissive = EMISSIVE_BLOCK_GENERIC + pass_flags_self = LETPASSCLICKS /// The overlay for the closet's door var/obj/effect/overlay/closet_door/door_obj diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 086c13fdbb2c..60c23136008d 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -20,8 +20,8 @@ new /obj/item/clothing/head/bio_hood/virology(src) new /obj/item/clothing/mask/breath(src) new /obj/item/tank/internals/oxygen(src) - new /obj/item/extrapolator(src) - new /obj/item/extrapolator(src) +// new /obj/item/extrapolator(src) // monkestation edit - extrapolators are worthless for pathology +// new /obj/item/extrapolator(src) /obj/structure/closet/l3closet/security diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 49fadd6ec983..b04bb4df6d0b 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -174,6 +174,7 @@ new /obj/item/pinpointer/crew(src) new /obj/item/binoculars(src) new /obj/item/storage/box/rxglasses/spyglasskit(src) + new /obj/item/clothing/head/fedora/inspector_hat(src) /obj/structure/closet/secure_closet/injection name = "lethal injections locker" diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 40c5256915bd..ce0668568c6e 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -20,6 +20,9 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/basic/mining/wolf) move_resist = INFINITY anchored = TRUE + scanner_taggable = TRUE + mob_gps_id = "WF" // wolf + spawner_gps_id = "Animal Den" /obj/structure/spawner/ice_moon/Initialize(mapload) . = ..() @@ -65,6 +68,7 @@ GLOBAL_LIST_INIT(ore_probability, list( max_mobs = 1 spawn_time = 60 SECONDS mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear) + mob_gps_id = "BR" // bear /obj/structure/spawner/ice_moon/polarbear/clear_rock() for(var/turf/potential in RANGE_TURFS(1, src)) @@ -79,6 +83,8 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/basic/mining/ice_demon) light_outer_range = 1 light_color = COLOR_SOFT_RED + mob_gps_id = "WT|B" // watcher | bluespace + spawner_gps_id = "Netheric Distortion" /obj/structure/spawner/ice_moon/demonic_portal/Initialize(mapload) . = ..() @@ -100,9 +106,11 @@ GLOBAL_LIST_INIT(ore_probability, list( /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp mob_types = list(/mob/living/basic/mining/ice_whelp) + mob_gps_id = "ID|W" // ice drake | whelp /obj/structure/spawner/ice_moon/demonic_portal/snowlegion mob_types = list(/mob/living/basic/mining/legion/snow/spawner_made) + mob_gps_id = "LG|S" // legion | snow /obj/effect/collapsing_demonic_portal name = "collapsing demonic portal" diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 3a7aab6d977c..53776bd418bd 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -14,20 +14,23 @@ move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it anchored = TRUE resistance_flags = FIRE_PROOF | LAVA_PROOF - - var/gps = null var/obj/effect/light_emitter/tendril/emitted_light - + scanner_taggable = TRUE + mob_gps_id = "WT" + spawner_gps_id = "Necropolis Tendril" var/deconstruct_override = FALSE // Monkestation addition: override for ocean tendrils /obj/structure/spawner/lavaland/goliath mob_types = list(/mob/living/basic/mining/goliath) + mob_gps_id = "GL" /obj/structure/spawner/lavaland/legion mob_types = list(/mob/living/basic/mining/legion/spawner_made) + mob_gps_id = "LG" /obj/structure/spawner/lavaland/icewatcher mob_types = list(/mob/living/basic/mining/watcher/icewing) + mob_gps_id = "WT|I" // icewing GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/Initialize(mapload) @@ -68,7 +71,6 @@ GLOBAL_LIST_INIT(tendrils, list()) L.client.give_award(/datum/award/score/tendril_score, L) //Progresses score by one GLOB.tendrils -= src QDEL_NULL(emitted_light) - QDEL_NULL(gps) return ..() /obj/effect/light_emitter/tendril diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 0692e7f3c1ba..fbf2ad8e2815 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -8,6 +8,22 @@ max_integrity = 200 integrity_failure = 0.5 +/obj/structure/mirror/Initialize(mapload) + . = ..() + var/static/list/reflection_filter = alpha_mask_filter(icon = icon('icons/obj/watercloset.dmi', "mirror_mask")) + var/static/matrix/reflection_matrix = matrix(0.75, 0, 0, 0, 0.75, 0) + var/datum/callback/can_reflect = CALLBACK(src, PROC_REF(can_reflect)) + var/list/update_signals = list(COMSIG_ATOM_BREAK) + AddComponent(/datum/component/reflection, reflection_filter = reflection_filter, reflection_matrix = reflection_matrix, can_reflect = can_reflect, update_signals = update_signals) + +/obj/structure/mirror/proc/can_reflect(atom/movable/target) + ///I'm doing it this way too, because the signal is sent before the broken variable is set to TRUE. + if(atom_integrity <= integrity_failure * max_integrity) + return FALSE + if(broken || !isliving(target) || HAS_TRAIT(target, TRAIT_NO_MIRROR_REFLECTION)) + return FALSE + return TRUE + MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) /obj/structure/mirror/Initialize(mapload) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index ca5c1c9e999d..45cef86f422a 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -8,9 +8,9 @@ density = TRUE anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE - /// armor more or less consistent with grille. max_integrity about one time and a half that of a grille. + /// armor is a little bit less than a grille. max_integrity about half that of a grille. armor_type = /datum/armor/structure_railing - max_integrity = 75 + max_integrity = 25 var/climbable = TRUE ///Initial direction of the railing. @@ -19,9 +19,9 @@ var/item_deconstruct = /obj/item/stack/rods /datum/armor/structure_railing - melee = 50 - bullet = 70 - laser = 70 + melee = 35 + bullet = 50 + laser = 50 energy = 100 bomb = 10 @@ -41,6 +41,19 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + var/static/list/tool_behaviors = list( + TOOL_WELDER = list( + SCREENTIP_CONTEXT_LMB = "Repair", + ), + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_LMB = "Anchor/Unanchor", + ), + TOOL_WIRECUTTER = list( + SCREENTIP_CONTEXT_LMB = "Deconstruct", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) /obj/structure/railing/attackby(obj/item/I, mob/living/user, params) @@ -65,11 +78,10 @@ /obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) . = ..() - if(!anchored) - to_chat(user, span_warning("You cut apart the railing.")) - I.play_tool_sound(src, 100) - deconstruct() - return TRUE + to_chat(user, span_warning("You cut apart the railing.")) + I.play_tool_sound(src, 100) + deconstruct() + return TRUE /obj/structure/railing/deconstruct(disassembled) if((flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index cc020f275ae0..29a63b1bff80 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -15,6 +15,52 @@ var/mob_types = list(/mob/living/basic/carp) var/spawn_text = "emerges from" var/spawner_type = /datum/component/spawner + /// Is this spawner taggable with something? + var/scanner_taggable = FALSE + /// If this spawner's taggable, what can we tag it with? + var/static/list/scanner_types = list(/obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner) + /// If this spawner's taggable, what's the text we use to describe what we can tag it with? + var/scanner_descriptor = "mining analyzer" + /// Has this spawner been tagged/analyzed by a mining scanner? + var/gps_tagged = FALSE + /// A short identifier for the mob it spawns. Keep around 3 characters or less? + var/mob_gps_id = "???" + /// A short identifier for what kind of spawner it is, for use in putting together its GPS tag. + var/spawner_gps_id = "Creature Nest" + /// A complete identifier. Generated on tag (if tagged), used for its examine. + var/assigned_tag + +/obj/structure/spawner/examine(mob/user) + . = ..() + if(!scanner_taggable) + return + if(gps_tagged) + . += span_notice("A holotag's been attached, projecting \"[assigned_tag]\".") + else + . += span_notice("It looks like you could probably scan and tag it with a [scanner_descriptor].") + +/obj/structure/spawner/attackby(obj/item/item, mob/user, params) + . = ..() + if(.) + return TRUE + if(scanner_taggable && is_type_in_list(item, scanner_types)) + gps_tag(user) + return TRUE + +/// Tag the spawner, prefixing its GPS entry with an identifier - or giving it one, if nonexistent. +/obj/structure/spawner/proc/gps_tag(mob/user) + if(gps_tagged) + to_chat(user, span_warning("[src] already has a holotag attached!")) + return + to_chat(user, span_notice("You affix a holotag to [src].")) + playsound(src, 'sound/machines/twobeep.ogg', 100) + gps_tagged = TRUE + assigned_tag = "\[[mob_gps_id]-[rand(100,999)]\] " + spawner_gps_id + var/datum/component/gps/our_gps = GetComponent(/datum/component/gps) + if(our_gps) + our_gps.gpstag = assigned_tag + return + AddComponent(/datum/component/gps, assigned_tag) /obj/structure/spawner/Initialize(mapload) . = ..() @@ -33,6 +79,8 @@ spawn_text = "warps in from" mob_types = list(/mob/living/basic/trooper/syndicate/ranged) faction = list(ROLE_SYNDICATE) + mob_gps_id = "SYN" // syndicate + spawner_gps_id = "Hostile Warp Beacon" /obj/structure/spawner/skeleton name = "bone pit" @@ -45,6 +93,8 @@ mob_types = list(/mob/living/basic/skeleton) spawn_text = "climbs out of" faction = list(FACTION_SKELETON) + mob_gps_id = "SKL" // skeletons + spawner_gps_id = "Bone Pit" /obj/structure/spawner/clown name = "Laughing Larry" @@ -68,6 +118,8 @@ ) spawn_text = "climbs out of" faction = list(FACTION_CLOWN) + mob_gps_id = "???" // clowns + spawner_gps_id = "Clown Planet Distortion" /obj/structure/spawner/mining name = "monster den" @@ -81,7 +133,7 @@ /mob/living/basic/mining/basilisk, /mob/living/basic/mining/goldgrub, /mob/living/basic/mining/goliath/ancient, - /mob/living/basic/mining/legion, + /mob/living/basic/mining/hivelord, /mob/living/basic/wumborian_fugu, ) faction = list(FACTION_MINING) @@ -90,26 +142,31 @@ name = "goldgrub den" desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." mob_types = list(/mob/living/basic/mining/goldgrub) + mob_gps_id = "GG" /obj/structure/spawner/mining/goliath name = "goliath den" desc = "A den housing a nest of goliaths, oh god why?" mob_types = list(/mob/living/basic/mining/goliath/ancient) + mob_gps_id = "GL|A" /obj/structure/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." mob_types = list(/mob/living/basic/mining/hivelord) + mob_gps_id = "HL" /obj/structure/spawner/mining/basilisk name = "basilisk den" desc = "A den housing a nest of basilisks, bring a coat." mob_types = list(/mob/living/basic/mining/basilisk) + mob_gps_id = "BK" /obj/structure/spawner/mining/wumborian name = "wumborian fugu den" desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?" mob_types = list(/mob/living/basic/wumborian_fugu) + mob_gps_id = "WF" /obj/structure/spawner/nether name = "netherworld link" @@ -126,6 +183,9 @@ /mob/living/basic/migo, ) faction = list(FACTION_NETHER) + scanner_taggable = TRUE + mob_gps_id = "?!?" + spawner_gps_id = "Netheric Distortion" /obj/structure/spawner/nether/Initialize(mapload) . = ..() diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index 04fb8ef88566..5f8669d16478 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -53,6 +53,7 @@ GLOBAL_VAR(antag_prototypes)
" obj_count++ result += "Add objective
" + result += "Prompt custom objective entry
" result += "Announce objectives
" return result diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 856460cf855e..24bd2763622c 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -1,3 +1,6 @@ +/// Max length of custom objective text +#define CUSTOM_OBJECTIVE_MAX_LENGTH 300 + GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist @@ -51,7 +54,11 @@ GLOBAL_LIST_EMPTY(antagonists) /// The typepath for the outfit to show in the preview for the preferences menu. var/preview_outfit /// Flags for antags to turn on or off and check! - var/antag_flags = NONE + var/antag_flags = NONE /// If true, this antagonist can assign themself a new objective + var/can_assign_self_objectives = FALSE + /// Default to fill in when entering a custom objective. + var/default_custom_objective = "Cause chaos on the space station." + //ANTAG UI ///name of the UI that will try to open, right now using a generic ui @@ -116,6 +123,15 @@ GLOBAL_LIST_EMPTY(antagonists) ui = new(user, src, ui_name, name) ui.open() +/datum/antagonist/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("change_objectives") + submit_player_objective() + return TRUE + /datum/antagonist/ui_state(mob/user) return GLOB.always_state @@ -123,6 +139,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/list/data = list() data["antag_name"] = name data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives return data //button for antags to review their descriptions/info @@ -486,7 +503,7 @@ GLOBAL_LIST_EMPTY(antagonists) /// Adds a HUD that will show you other members with the same antagonist. /// If an antag typepath is passed to `antag_to_check`, will check that, otherwise will use the source type. -/datum/antagonist/proc/add_team_hud(mob/target, antag_to_check) +/datum/antagonist/proc/add_team_hud(mob/target, antag_to_check, passed_hud_keys) //monkestation edit: adds passed_hud_keys QDEL_NULL(team_hud_ref) team_hud_ref = WEAKREF(target.add_alt_appearance( @@ -494,6 +511,7 @@ GLOBAL_LIST_EMPTY(antagonists) "antag_team_hud_[REF(src)]", hud_image_on(target), antag_to_check || type, + passed_hud_keys || hud_keys, //monkestation edit )) // Add HUDs that they couldn't see before @@ -525,3 +543,56 @@ GLOBAL_LIST_EMPTY(antagonists) /// Used to create objectives for the antagonist. /datum/antagonist/proc/forge_objectives() return + +/** + * Allows player to replace their objectives with a new one they wrote themselves. + * * retain_existing - If true, will just be added as a new objective instead of replacing existing ones. + * * retain_escape - If true, will retain specifically 'escape alive' objectives (or similar) + * * force - Skips the check about whether this antagonist is supposed to set its own objectives, for badminning + */ +/datum/antagonist/proc/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) + if (isnull(owner) || isnull(owner.current)) + return + var/mob/living/owner_mob = owner.current + if (!force && !can_assign_self_objectives) + owner_mob.balloon_alert(owner_mob, "can't do that!") + return + var/custom_objective_text = tgui_input_text( + owner_mob, + message = "Specify your new objective.", + title = "Custom Objective", + default = default_custom_objective, + max_length = CUSTOM_OBJECTIVE_MAX_LENGTH, + ) + if (QDELETED(src) || QDELETED(owner_mob) || isnull(custom_objective_text)) + return // Some people take a long-ass time to type maybe they got dusted + + log_game("[key_name(owner_mob)] [retain_existing ? "" : "opted out of their original objectives and "]chose a custom objective: [custom_objective_text]") + message_admins("[ADMIN_LOOKUPFLW(owner_mob)] has chosen a custom antagonist objective: [span_syndradio("[custom_objective_text]")] | [ADMIN_SMITE(owner_mob)] | [ADMIN_SYNDICATE_REPLY(owner_mob)]") + + var/datum/objective/custom/custom_objective = new() + custom_objective.owner = owner + custom_objective.explanation_text = custom_objective_text + custom_objective.completed = TRUE + + if (retain_existing) + objectives.Insert(1, custom_objective) + else if (!retain_escape) + objectives = list(custom_objective) + else + var/static/list/escape_objectives = list( + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/martyr, + /datum/objective/exile, + ) + for (var/datum/objective/check_objective in objectives) + if (is_type_in_list(check_objective, escape_objectives)) + continue + objectives -= check_objective + objectives.Insert(1, custom_objective) + + can_assign_self_objectives = FALSE + owner.announce_objectives() + +#undef CUSTOM_OBJECTIVE_MAX_LENGTH diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm index 228bfc354dff..300b4bb4296b 100644 --- a/code/modules/antagonists/_common/antag_hud.dm +++ b/code/modules/antagonists/_common/antag_hud.dm @@ -5,8 +5,9 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc /datum/atom_hud/alternate_appearance/basic/has_antagonist var/antag_datum_type -/datum/atom_hud/alternate_appearance/basic/has_antagonist/New(key, image/I, antag_datum_type) +/datum/atom_hud/alternate_appearance/basic/has_antagonist/New(key, image/I, antag_datum_type, valid_keys) //monkestation edit: adds valid_keys src.antag_datum_type = antag_datum_type + src.valid_keys = valid_keys GLOB.has_antagonist_huds += src return ..(key, I, NONE) @@ -14,8 +15,8 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc GLOB.has_antagonist_huds -= src return ..() -/datum/atom_hud/alternate_appearance/basic/has_antagonist/mobShouldSee(mob/M) - return !!M.mind?.has_antag_datum(antag_datum_type) +///datum/atom_hud/alternate_appearance/basic/has_antagonist/mobShouldSee(mob/M) //monkestation removal, moved to the modular version of this file +// return !!M.mind?.has_antag_datum(antag_datum_type) //monkestation removal /// An alternate appearance that will show all the antagonists this mob has /datum/atom_hud/alternate_appearance/basic/antagonist_hud diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm index c568c58e3104..902456d909bc 100644 --- a/code/modules/antagonists/_common/antag_team.dm +++ b/code/modules/antagonists/_common/antag_team.dm @@ -58,11 +58,9 @@ GLOBAL_LIST_EMPTY(antagonist_teams) var/win = TRUE var/objective_count = 1 for(var/datum/objective/objective as anything in objectives) - if(objective.check_completion()) - report += "Objective #[objective_count]: [objective.explanation_text] [span_greentext("Success!")]" - else - report += "Objective #[objective_count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) win = FALSE + report += "Objective #[objective_count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" objective_count++ if(win) report += span_greentext("The [name] was successful!") diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index b4f3ebd20493..68e83ea25e66 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -28,43 +28,44 @@ ui = new(user, src, "CellularEmporium", name) ui.open() -/datum/cellular_emporium/ui_data(mob/user) +/datum/cellular_emporium/ui_static_data(mob/user) var/list/data = list() - data["can_readapt"] = changeling.can_respec - - var/genetic_points_remaining = changeling.genetic_points - data["genetic_points_remaining"] = genetic_points_remaining + var/static/list/abilities + if(isnull(abilities)) + abilities = list() + for(var/datum/action/changeling/ability_path as anything in changeling.all_powers) - var/list/abilities = list() - for(var/datum/action/changeling/ability_path as anything in changeling.all_powers) + var/dna_cost = initial(ability_path.dna_cost) - var/dna_cost = initial(ability_path.dna_cost) + if(dna_cost < 0) // 0 = free, but negatives are invalid + continue - if(dna_cost <= 0) - continue + var/list/ability_data = list() + ability_data["name"] = initial(ability_path.name) + ability_data["desc"] = initial(ability_path.desc) + ability_data["path"] = ability_path + ability_data["helptext"] = initial(ability_path.helptext) + ability_data["genetic_point_required"] = dna_cost + ability_data["absorbs_required"] = initial(ability_path.req_absorbs) // compares against changeling true_absorbs + ability_data["dna_required"] = initial(ability_path.req_dna) // compares against changeling absorbed_count - var/list/ability_data = list() - ability_data["name"] = initial(ability_path.name) - ability_data["desc"] = initial(ability_path.desc) - ability_data["path"] = ability_path - ability_data["helptext"] = initial(ability_path.helptext) - ability_data["owned"] = !!changeling.purchased_powers[ability_path] - ability_data["dna_cost"] = dna_cost + abilities += list(ability_data) - var/can_purchase = TRUE - if(initial(ability_path.req_absorbs) > changeling.true_absorbs) - can_purchase = FALSE - if(initial(ability_path.req_dna) > changeling.absorbed_count) - can_purchase = FALSE - if(dna_cost > genetic_points_remaining) - can_purchase = FALSE + // Sorts abilities alphabetically by default + sortTim(abilities, /proc/cmp_assoc_list_name) - ability_data["can_purchase"] = can_purchase + data["abilities"] = abilities + return data - abilities += list(ability_data) +/datum/cellular_emporium/ui_data(mob/user) + var/list/data = list() - data["abilities"] = abilities + data["can_readapt"] = changeling.can_respec + data["owned_abilities"] = assoc_to_keys(changeling.purchased_powers) + data["genetic_points_count"] = changeling.genetic_points + data["absorb_count"] = changeling.true_absorbs + data["dna_count"] = changeling.absorbed_count return data @@ -77,33 +78,29 @@ if("readapt") if(changeling.can_respec) changeling.readapt() + if("evolve") - var/sting_path = text2path(params["path"]) - if(!ispath(sting_path, /datum/action/changeling)) - return - changeling.purchase_power(sting_path) + // purchase_power sanity checks stuff like typepath, DNA, and absorbs for us. + changeling.purchase_power(text2path(params["path"])) return TRUE -/datum/action/innate/cellular_emporium +/datum/action/cellular_emporium name = "Cellular Emporium" button_icon = 'icons/obj/drinks/soda.dmi' button_icon_state = "changelingsting" background_icon_state = "bg_changeling" overlay_icon_state = "bg_changeling_border" - /// The cell emporium we open. - var/datum/cellular_emporium/cellular_emporium + check_flags = NONE -/datum/action/innate/cellular_emporium/New(our_target) +/datum/action/cellular_emporium/New(Target) . = ..() - if(istype(our_target, /datum/cellular_emporium)) - cellular_emporium = our_target - else - CRASH("cellular_emporium action created with non emporium") + if(!istype(Target, /datum/cellular_emporium)) + stack_trace("cellular_emporium action created with non-emporium.") + qdel(src) -/datum/action/innate/cellular_emporium/Destroy() - cellular_emporium = null - return ..() - -/datum/action/innate/cellular_emporium/Activate() - cellular_emporium.ui_interact(owner) +/datum/action/cellular_emporium/Trigger(trigger_flags) + . = ..() + if(!.) + return + target.ui_interact(owner) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 608038bb4530..04e1b9ed1e37 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -11,6 +11,8 @@ hijack_speed = 0.5 ui_name = "AntagInfoChangeling" suicide_cry = "FOR THE HIVE!!" + can_assign_self_objectives = TRUE + default_custom_objective = "Consume the station's most valuable genomes." /// Whether to give this changeling objectives or not var/give_objectives = TRUE /// Weather we assign objectives which compete with other lings @@ -62,7 +64,7 @@ /// A reference to our cellular emporium datum. var/datum/cellular_emporium/cellular_emporium /// A reference to our cellular emporium action (which opens the UI for the datum). - var/datum/action/innate/cellular_emporium/emporium_action + var/datum/action/cellular_emporium/emporium_action /// UI displaying how many chems we have var/atom/movable/screen/ling/chems/lingchemdisplay @@ -229,11 +231,11 @@ /* * Instantiate all the default actions of a ling (transform, dna sting, absorb, etc) - * Any Changeling action with `dna_cost == 0` will be added here automatically + * Any Changeling action with dna_cost = CHANGELING_POWER_INNATE will be added here automatically */ /datum/antagonist/changeling/proc/create_innate_actions() for(var/datum/action/changeling/path as anything in all_powers) - if(initial(path.dna_cost) != 0) + if(initial(path.dna_cost) != CHANGELING_POWER_INNATE) continue var/datum/action/changeling/innate_ability = new path() @@ -345,12 +347,11 @@ /datum/antagonist/changeling/proc/regain_powers() emporium_action.Grant(owner.current) for(var/datum/action/changeling/power as anything in innate_powers) - if(power.needs_button) - power.Grant(owner.current) + power.Grant(owner.current) for(var/power_path in purchased_powers) var/datum/action/changeling/power = purchased_powers[power_path] - if(istype(power) && power.needs_button) + if(istype(power)) power.Grant(owner.current) /* @@ -359,8 +360,8 @@ * [sting_path] - the power that's being purchased / evolved. */ /datum/antagonist/changeling/proc/purchase_power(datum/action/changeling/sting_path) - if(!ispath(sting_path)) - CRASH("Changeling purchase_power attempted to purchase an invalid typepath!") + if(!ispath(sting_path, /datum/action/changeling)) + CRASH("Changeling purchase_power attempted to purchase an invalid typepath! (got: [sting_path])") if(purchased_powers[sting_path]) to_chat(owner.current, span_warning("We have already evolved this ability!")) @@ -411,7 +412,8 @@ purchased_powers[power_path] = new_action new_action.on_purchase(owner.current) // Grant() is ran in this proc, see changeling_powers.dm. - log_changeling_power("[key_name(owner)] adapted the [new_action] power") + log_changeling_power("[key_name(owner)] adapted the [new_action.name] power") + SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, new_action.name) return TRUE @@ -646,10 +648,6 @@ add_new_profile(owner.current) /datum/antagonist/changeling/forge_objectives() - //OBJECTIVES - random traitor objectives. Unique objectives "steal brain" and "identity theft". - //No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting - //If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone - var/escape_objective_possible = TRUE switch(competitive_objectives ? rand(1,3) : 1) @@ -965,11 +963,9 @@ if(objectives.len) var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) changeling_win = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(changeling_win) @@ -1043,9 +1039,6 @@ /datum/outfit/changeling_space name = "Changeling (Space)" - - head = /obj/item/clothing/head/helmet/space/changeling - suit = /obj/item/clothing/suit/space/changeling l_hand = /obj/item/melee/arm_blade #undef FORMAT_CHEM_CHARGES_TEXT diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 96cad5107355..1786ea648dcd 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -7,17 +7,31 @@ background_icon_state = "bg_changeling" overlay_icon_state = "bg_changeling_border" button_icon = 'icons/mob/actions/actions_changeling.dmi' - var/needs_button = TRUE//for passive abilities like hivemind that dont need a button - var/helptext = "" // Details - var/chemical_cost = 0 // negative chemical cost is for passive abilities (chemical glands) - var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase (see changeling.dm), -1 = cannot be purchased - var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 - var/req_human = FALSE //if you need to be human to use this ability - var/req_absorbs = 0 //similar to req_dna, but only gained from absorbing, not DNA sting - ///Maximum stat before the ability is blocked. For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, while `DEAD` allows the ability to be used on any stat values. + /// Details displayed in fine print within the changling emporium + var/helptext = "" + /// How many changeling chems it costs to use + var/chemical_cost = 0 + /** + * Cost of the ability in dna points, negative values are not valid + * + * Special numbers include [CHANGELING_POWER_INNATE], which are given to changeling for free without bring prompted + * and [CHANGELING_POWER_UNOBTAINABLE], which are not available for purchase in the changeling emporium + */ + var/dna_cost = CHANGELING_POWER_UNOBTAINABLE + /// Amount of dna needed to use this ability. Note, changelings always have atleast 1 + var/req_dna = 0 + /// If you need to be humanoid to use this ability (disincludes monkeys) + var/req_human = FALSE + /// Similar to req_dna, but only gained from absorbing, not DNA sting + var/req_absorbs = 0 + /// Maximum stat before the ability is blocked. + /// For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, + /// while `DEAD` allows the ability to be used on any stat values. var/req_stat = CONSCIOUS - var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag - var/active = FALSE//used by a few powers that toggle + /// usable when the changeling is in death coma + var/ignores_fakedeath = FALSE + /// used by a few powers that toggle + var/active = FALSE /* changeling code now relies on on_purchase to grant powers. @@ -26,10 +40,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p */ /datum/action/changeling/proc/on_purchase(mob/user, is_respec) - if(!is_respec) - SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, name) - if(needs_button) - Grant(user)//how powers are added rather than the checks in mob.dm + Grant(user)//how powers are added rather than the checks in mob.dm /datum/action/changeling/Trigger(trigger_flags) var/mob/user = owner diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 6cc9290b7f7f..cee0f0da5b99 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -3,7 +3,7 @@ desc = "Absorb the DNA of our victim. Requires us to strangle them." button_icon_state = "absorb_dna" chemical_cost = 0 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_human = TRUE ///if we're currently absorbing, used for sanity var/is_absorbing = FALSE diff --git a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm index de10b27413a8..b4de878c69ee 100644 --- a/code/modules/antagonists/changeling/powers/augmented_eyesight.dm +++ b/code/modules/antagonists/changeling/powers/augmented_eyesight.dm @@ -3,50 +3,81 @@ /datum/action/changeling/augmented_eyesight name = "Augmented Eyesight" - desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. Protects our vision from flashes while inactive." - helptext = "Grants us x-ray vision or flash protection. We will become a lot more vulnerable to flash-based devices while x-ray vision is active." + desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. \ + Protects our vision from flashes while inactive." + helptext = "Grants us x-ray vision or flash protection. \ + We will become a lot more vulnerable to flash-based devices while x-ray vision is active." button_icon_state = "augmented_eyesight" chemical_cost = 0 - dna_cost = 2 //Would be 1 without thermal vision + dna_cost = 2 + // Active = Flash weakness and x-ray + // Inactive = Flash protection and no x-ray active = FALSE /datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. - ..() - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if (E) - E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to protect them from bright lights.") - else - to_chat(user, "We can't adjust our eyes if we don't have any!") + . = ..() + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + RegisterSignal(user, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(eye_implanted)) + RegisterSignal(user, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(eye_removed)) + if(!isnull(ling_eyes)) + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection + to_chat(user, span_changeling("We adjust our eyes to protect them from bright lights.")) /datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/user) if(!istype(user)) - return + return FALSE + + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + if(isnull(ling_eyes)) + user.balloon_alert(user, "no eyes!") + return FALSE + ..() - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if(E) - if(!active) - E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes - E.flash_protect = FLASH_PROTECTION_SENSITIVE //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to sense prey through walls.") - active = TRUE //Defined in code/modules/spells/spell.dm - else - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS //Remove sight flags from the user's eyes - E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection - to_chat(user, "We adjust our eyes to protect them from bright lights.") - active = FALSE - user.update_sight() + + if(active) + active = FALSE + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER + to_chat(user, span_changeling("We adjust our eyes to protect them from bright lights.")) + else - user.balloon_alert(user, "no eyes!") + active = TRUE + ADD_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + ling_eyes.flash_protect = FLASH_PROTECTION_SENSITIVE + to_chat(user, span_changeling("We adjust our eyes to sense prey through walls.")) + + user.update_sight() return TRUE +/datum/action/changeling/augmented_eyesight/Remove(mob/user) + var/obj/item/organ/internal/eyes/ling_eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + if(!isnull(ling_eyes)) + ling_eyes.flash_protect = initial(ling_eyes.flash_protect) -/datum/action/changeling/augmented_eyesight/Remove(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability - var/obj/item/organ/internal/eyes/E = user.get_organ_slot(ORGAN_SLOT_EYES) - if(E) - if (active) - E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS - else - E.flash_protect = FLASH_PROTECTION_NONE - user.update_sight() - ..() + REMOVE_TRAIT(user, TRAIT_XRAY_VISION, REF(src)) + user.update_sight() + + UnregisterSignal(user, list(COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN)) + return ..() + +/// Signal proc to grant the correct level of flash sensitivity +/datum/action/changeling/augmented_eyesight/proc/eye_implanted(mob/living/source, obj/item/organ/gained, special) + SIGNAL_HANDLER + + var/obj/item/organ/internal/eyes/ling_eyes = gained + if(!istype(ling_eyes)) + return + if(active) + ling_eyes.flash_protect = FLASH_PROTECTION_SENSITIVE + else + ling_eyes.flash_protect = FLASH_PROTECTION_WELDER + +/// Signal proc to remove flash sensitivity when the eyes are removed +/datum/action/changeling/augmented_eyesight/proc/eye_removed(mob/living/source, obj/item/organ/removed, special) + SIGNAL_HANDLER + + var/obj/item/organ/internal/eyes/ling_eyes = removed + if(!istype(ling_eyes)) + return + ling_eyes.flash_protect = initial(ling_eyes.flash_protect) + // We don't need to bother about removing or adding x-ray vision, fortunately, because they can't see anyways diff --git a/code/modules/antagonists/changeling/powers/defib_grasp.dm b/code/modules/antagonists/changeling/powers/defib_grasp.dm new file mode 100644 index 000000000000..135b9b243f72 --- /dev/null +++ b/code/modules/antagonists/changeling/powers/defib_grasp.dm @@ -0,0 +1,91 @@ +/datum/action/changeling/defib_grasp + name = "Defibrillator Grasp" + desc = "We prepare ourselves while in stasis. If one of our enemies attempts to defibrillate us, \ + we will snatch their arms off and instantly finalize our stasis." + helptext = "This ability is passive, and will trigger when a defibrillator paddle is applied to our chest \ + while we are dead or in stasis. Will also stun cyborgs momentarily." + owner_has_control = FALSE + dna_cost = 0 + + /// Flags to pass to fully heal when we get zapped + var/heal_flags = HEAL_DAMAGE|HEAL_BODY|HEAL_STATUS|HEAL_CC_STATUS + +/datum/action/changeling/defib_grasp/on_purchase(mob/user, is_respec) + . = ..() + RegisterSignal(user, COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP, PROC_REF(on_defibbed)) + +/// Signal proc for [COMSIG_DEFIBRILLATOR_PRE_HELP_ZAP]. +/datum/action/changeling/defib_grasp/proc/on_defibbed(mob/living/carbon/source, mob/living/defibber, obj/item/shockpaddles/defib) + SIGNAL_HANDLER + + if(source.stat != DEAD && !HAS_TRAIT_FROM(source, TRAIT_FAKEDEATH, CHANGELING_TRAIT)) + return + + INVOKE_ASYNC(src, PROC_REF(execute_defib), source, defibber, defib) + return COMPONENT_DEFIB_STOP + +/// Executes the defib action, causing the changeling to fully heal and get up. +/datum/action/changeling/defib_grasp/proc/execute_defib(mob/living/carbon/changeling, mob/living/defibber, obj/item/shockpaddles/defib) + remove_arms(changeling, defibber, defib) + + if(changeling.stat == DEAD) + changeling.revive(heal_flags) + else + changeling.fully_heal(heal_flags) + + changeling.buckled?.unbuckle_mob(changeling) // get us off of stasis beds please + changeling.set_resting(FALSE) + changeling.adjust_jitter(20 SECONDS) + changeling.emote("scream") + playsound(changeling, 'sound/magic/demon_consume.ogg', 50, TRUE) + + // Mimics some real defib stuff (wish this was more generalized) + playsound(defib, SFX_BODYFALL, 50, TRUE) + playsound(defib, 'sound/machines/defib_zap.ogg', 75, TRUE, -1) + playsound(defib, 'sound/machines/defib_success.ogg', 50, FALSE) // I guess + defib.shock_pulling(30, changeling) + +/// Removes the arms of the defibber if they're a carbon, and stuns them for a bit. +/// If they're a cyborg, they'll just get stunned instead. +/datum/action/changeling/defib_grasp/proc/remove_arms(mob/living/carbon/changeling, mob/living/defibber, obj/item/shockpaddles/defib) + + if(iscyborg(defibber)) + if(defibber.flash_act(affect_silicon = TRUE)) + to_chat(defibber, span_userdanger("[changeling] awakens suddenly, overloading your sensors!")) + // run default visible message regardless, no overt indication of the cyborg being overloaded to watchers + + else + defibber.Stun(4 SECONDS) // stuck defibbing + + if(iscarbon(defibber)) + var/removed_arms = 0 + var/mob/living/carbon/carbon_defibber = defibber + for(var/obj/item/bodypart/arm/limb in carbon_defibber.bodyparts) + if(limb.dismember(silent = FALSE)) + removed_arms++ + qdel(limb) + + if(removed_arms) + // OH GOOD HEAVENS + defibber.adjust_jitter(3 MINUTES) + defibber.adjust_dizzy(1 MINUTES) + defibber.adjust_stutter(1 MINUTES) + defibber.adjust_eye_blur(10 SECONDS) + defibber.emote("scream") + + changeling.visible_message( + span_bolddanger("[changeling] awakens suddenly, snatching [defib] out of [defibber]'s hands while ripping off [removed_arms >= 2 ? "" : "one of "][defibber.p_their()] arms!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = list(changeling, defibber), + ) + to_chat(changeling, span_changeling("The power of [defib] course through us, reviving us from our stasis! \ + With this newfound energy, we snap [removed_arms >= 2 ? "" : "one of "][defibber]'s arms off!")) + to_chat(defibber, span_userdanger("[changeling] awakens suddenly, snapping [removed_arms >= 2 ? "" : "one of "]your arms off!")) + return // no default message if we got an arm + + changeling.visible_message( + span_bolddanger("[changeling] awakens suddenly!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = changeling, + ) + to_chat(changeling, span_changeling("The power of [defib] course through us, reviving us from our stasis!")) diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 40a71f6ce848..a4b6b54de3d2 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -3,10 +3,15 @@ desc = "We fall into a stasis, allowing us to regenerate and trick our enemies. Costs 15 chemicals." button_icon_state = "fake_death" chemical_cost = 15 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_dna = 1 req_stat = DEAD ignores_fakedeath = TRUE + + /// How long it takes for revival to ready upon entering stasis. + /// The changeling can opt to stay in fakedeath for longer, though. + var/fakedeath_duration = 40 SECONDS + /// If TRUE, we're ready to revive and can click the button to heal. var/revive_ready = FALSE //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. @@ -14,25 +19,79 @@ ..() if(revive_ready) INVOKE_ASYNC(src, PROC_REF(revive), user) - revive_ready = FALSE - chemical_cost = 15 - to_chat(user, span_notice("We have revived ourselves.")) - build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + disable_revive(user) // this should be already called via signal, but just incase something wacky happens + + else if(enable_fakedeath(user)) + to_chat(user, span_changeling("We begin our stasis, preparing energy to arise once more.")) + else - to_chat(user, span_notice("We begin our stasis, preparing energy to arise once more.")) - user.fakedeath(CHANGELING_TRAIT) //play dead - addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), user), LING_FAKEDEATH_TIME, TIMER_UNIQUE) + stack_trace("Changeling revive failed to enter fakedeath when it should have been in a valid state to.") + return TRUE +/// Used to enable fakedeath and register relevant signals / start timers +/datum/action/changeling/fakedeath/proc/enable_fakedeath(mob/living/changeling) + if(revive_ready || HAS_TRAIT_FROM(changeling, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return + + changeling.fakedeath(CHANGELING_TRAIT) + addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), changeling), fakedeath_duration, TIMER_UNIQUE) + // Basically, these let the ling exit stasis without giving away their ling-y-ness if revived through other means + RegisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(fakedeath_reset)) + RegisterSignal(changeling, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + return TRUE + +/// Sets [revive_ready] to FALSE and updates the button icons. +/// Can be called mid-revival if the process is being cancelled +/datum/action/changeling/fakedeath/proc/disable_revive(mob/living/changeling) + if(revive_ready) + chemical_cost = 15 + revive_ready = FALSE + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + + UnregisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA)) + UnregisterSignal(changeling, COMSIG_MOB_STATCHANGE) + +/// Sets [revive_ready] to TRUE and updates the button icons. +/datum/action/changeling/fakedeath/proc/enable_revive(mob/living/changeling) + if(revive_ready) + return + + chemical_cost = 0 + revive_ready = TRUE + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + +/// Signal proc to stop the revival process if the changeling exits their stasis early. +/datum/action/changeling/fakedeath/proc/fakedeath_reset(mob/living/source) + SIGNAL_HANDLER + + if(HAS_TRAIT_FROM(source, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return + + disable_revive(source) + +/// Signal proc to exit fakedeath early if we're revived from being previously dead +/datum/action/changeling/fakedeath/proc/on_stat_change(mob/living/source, new_stat, old_stat) + SIGNAL_HANDLER + + if(old_stat != DEAD) + return + + source.cure_fakedeath(CHANGELING_TRAIT) + to_chat(source, span_changeling("We exit our stasis early.")) + /datum/action/changeling/fakedeath/proc/revive(mob/living/carbon/user) if(!istype(user)) return + if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) + return user.cure_fakedeath(CHANGELING_TRAIT) // Heal all damage and some minor afflictions, var/flags_to_heal = (HEAL_DAMAGE|HEAL_BODY|HEAL_STATUS|HEAL_CC_STATUS) // but leave out limbs so we can do it specially user.revive(flags_to_heal & ~HEAL_LIMBS) + to_chat(user, span_changeling("We have revived ourselves.")) var/static/list/dont_regenerate = list(BODY_ZONE_HEAD) // headless changelings are funny if(!length(user.get_missing_limbs() - dont_regenerate)) @@ -49,17 +108,17 @@ user.regenerate_limbs(dont_regenerate) /datum/action/changeling/fakedeath/proc/ready_to_regenerate(mob/user) - if(!user?.mind) + if(QDELETED(src) || QDELETED(user)) return - var/datum/antagonist/changeling/ling = user.mind.has_antag_datum(/datum/antagonist/changeling) - if(!ling || !(src in ling.innate_powers)) + var/datum/antagonist/changeling/ling = user.mind?.has_antag_datum(/datum/antagonist/changeling) + if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage + return + if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) return - to_chat(user, span_notice("We are ready to revive.")) - chemical_cost = 0 - revive_ready = TRUE - build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + to_chat(user, span_changeling("We are ready to revive.")) + enable_revive(user) /datum/action/changeling/fakedeath/can_sting(mob/living/user) if(revive_ready) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 91b31733dc77..d6ae824ef6c3 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -15,7 +15,7 @@ desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 - dna_cost = -1 + dna_cost = CHANGELING_POWER_UNOBTAINABLE var/silent = FALSE var/weapon_type @@ -88,7 +88,7 @@ desc = "Go tell a coder if you see this" helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 - dna_cost = -1 + dna_cost = CHANGELING_POWER_UNOBTAINABLE var/helmet_type = /obj/item var/suit_type = /obj/item @@ -277,6 +277,7 @@ flags_1 = NONE w_class = WEIGHT_CLASS_HUGE slot_flags = NONE + antimagic_flags = NONE pinless = TRUE ammo_type = /obj/item/ammo_casing/magic/tentacle fire_sound = 'sound/effects/splat.ogg' @@ -512,78 +513,6 @@ remaining_uses-- return ..() - -/***************************************\ -|*********SPACE SUIT + HELMET***********| -\***************************************/ -/datum/action/changeling/suit/organic_space_suit - name = "Organic Space Suit" - desc = "We grow an organic suit to protect ourselves from space exposure, including regulation of temperature and oxygen needs. Costs 20 chemicals." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form." - button_icon_state = "organic_suit" - chemical_cost = 20 - dna_cost = 2 - req_human = TRUE - - suit_type = /obj/item/clothing/suit/space/changeling - helmet_type = /obj/item/clothing/head/helmet/space/changeling - suit_name_simple = "flesh shell" - helmet_name_simple = "space helmet" - recharge_slowdown = 0.25 - blood_on_castoff = 1 - -/obj/item/clothing/suit/space/changeling - name = "flesh mass" - icon_state = "lingspacesuit_t" - icon = 'icons/obj/clothing/suits/costume.dmi' - worn_icon = 'icons/mob/clothing/suits/costume.dmi' - desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." - item_flags = DROPDEL - clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) - armor_type = /datum/armor/space_changeling - actions_types = list() - cell = null - show_hud = FALSE - -/datum/armor/space_changeling - bio = 100 - fire = 90 - acid = 90 - -/obj/item/clothing/suit/space/changeling/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - if(ismob(loc)) - loc.visible_message(span_warning("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!"), span_warning("We inflate our flesh, creating a spaceproof suit!"), span_hear("You hear organic matter ripping and tearing!")) - START_PROCESSING(SSobj, src) - -// seal the cell door -/obj/item/clothing/suit/space/changeling/toggle_spacesuit_cell(mob/user) - return - -/obj/item/clothing/suit/space/changeling/process(seconds_per_tick) - if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM * (seconds_per_tick / SSMOBS_DT)) - H.adjust_bodytemperature(temperature_setting - H.bodytemperature) // force changelings to normal temp step mode played badly - -/obj/item/clothing/head/helmet/space/changeling - name = "flesh mass" - icon = 'icons/obj/clothing/head/costume.dmi' - worn_icon = 'icons/mob/clothing/head/costume.dmi' - icon_state = "lingspacehelmet" - inhand_icon_state = null - desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." - item_flags = DROPDEL - clothing_flags = STOPSPRESSUREDAMAGE | HEADINTERNALS - armor_type = /datum/armor/space_changeling - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH - -/obj/item/clothing/head/helmet/space/changeling/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - /***************************************\ |*****************ARMOR*****************| \***************************************/ diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index 3716a0b40cb0..6595e3311953 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -4,7 +4,7 @@ helptext = "Will alert nearby crew if any external limbs are regenerated. Can be used while unconscious." button_icon_state = "regenerate" chemical_cost = 10 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_stat = HARD_CRIT /datum/action/changeling/regenerate/sting_action(mob/living/user) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 0eab76764623..ffffb9f2d136 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -243,8 +243,9 @@ /datum/action/changeling/sting/lsd name = "Hallucination Sting" - desc = "We cause mass terror to our victim." - helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." + desc = "We cause mass terror to our victim. Costs 10 chemicals." + helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. \ + The target does not notice they have been stung, and the effect occurs after 30 to 60 seconds." button_icon_state = "sting_lsd" chemical_cost = 10 dna_cost = 1 diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 256dfe62ecc6..804dd2bffaca 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -3,7 +3,7 @@ desc = "We take on the appearance and voice of one we have absorbed. Costs 5 chemicals." button_icon_state = "transform" chemical_cost = 5 - dna_cost = 0 + dna_cost = CHANGELING_POWER_INNATE req_dna = 1 req_human = TRUE diff --git a/code/modules/antagonists/changeling/powers/void_adaption.dm b/code/modules/antagonists/changeling/powers/void_adaption.dm new file mode 100644 index 000000000000..76c0eeffc972 --- /dev/null +++ b/code/modules/antagonists/changeling/powers/void_adaption.dm @@ -0,0 +1,68 @@ +/datum/action/changeling/void_adaption + name = "Void Adaption" + desc = "We prepare our cells to resist the hostile environment outside of the station. We may freely travel wherever we wish." + helptext = "This ability is passive, and will automatically protect you in situations of extreme cold or vacuum, \ + as well as removing your need to breathe. While it is actively protecting you from temperature or pressure \ + it reduces your chemical regeneration rate." + owner_has_control = FALSE + dna_cost = 2 + + /// Traits we apply to become immune to the environment + var/static/list/gain_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE, TRAIT_SNOWSTORM_IMMUNE) + /// How much we slow chemical regeneration while active, in chems per second + var/recharge_slowdown = 0.25 + /// Are we currently protecting our user? + var/currently_active = FALSE + +/datum/action/changeling/void_adaption/on_purchase(mob/user, is_respec) + . = ..() + user.add_traits(gain_traits, REF(src)) + RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(check_environment)) + +/datum/action/changeling/void_adaption/Remove(mob/remove_from) + remove_from.remove_traits(gain_traits, REF(src)) + UnregisterSignal(remove_from, COMSIG_LIVING_LIFE) + if (currently_active) + on_removed_adaption(remove_from, "Our cells relax, despite the danger!") + return ..() + +/// Checks if we would be providing any useful benefit at present +/datum/action/changeling/void_adaption/proc/check_environment(mob/living/void_adapted) + SIGNAL_HANDLER + + var/list/active_reasons = list() + + var/datum/gas_mixture/environment = void_adapted.loc.return_air() + if (!isnull(environment)) + var/vulnerable_temperature = void_adapted.get_body_temp_cold_damage_limit() + var/affected_temperature = environment.return_temperature() + if (ishuman(void_adapted)) + var/mob/living/carbon/human/special_boy = void_adapted + var/cold_protection = special_boy.get_cold_protection(affected_temperature) + vulnerable_temperature *= (1 - cold_protection) + + var/affected_pressure = special_boy.calculate_affecting_pressure(environment.return_pressure()) + if (affected_pressure < HAZARD_LOW_PRESSURE) + active_reasons += "vacuum" + + if (affected_temperature < vulnerable_temperature) + active_reasons += "cold" + + var/should_be_active = !!length(active_reasons) + if (currently_active == should_be_active) + return + + if (!should_be_active) + on_removed_adaption(void_adapted, "Our cells relax in safer air.") + return + var/datum/antagonist/changeling/changeling_data = void_adapted.mind?.has_antag_datum(/datum/antagonist/changeling) + to_chat(void_adapted, span_changeling("Our cells harden themselves against the [pick(active_reasons)].")) + changeling_data?.chem_recharge_slowdown -= recharge_slowdown + currently_active = TRUE + +/// Called when we stop being adapted +/datum/action/changeling/void_adaption/proc/on_removed_adaption(mob/living/former, message) + var/datum/antagonist/changeling/changeling_data = former.mind?.has_antag_datum(/datum/antagonist/changeling) + to_chat(former, span_changeling(message)) + changeling_data?.chem_recharge_slowdown += recharge_slowdown + currently_active = FALSE diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 9c714b03717c..426cec70e941 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -603,7 +603,6 @@ user.visible_message(span_danger("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")) make_new_construct_from_class(construct_class, THEME_CULT, candidate, user, FALSE, T) uses-- - candidate.mmi = null qdel(candidate) channeling = FALSE else diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 67675e352cac..8d35b3892890 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -23,6 +23,8 @@ hijack_speed = 0.5 suicide_cry = "THE MANSUS SMILES UPON ME!!" preview_outfit = /datum/outfit/heretic + can_assign_self_objectives = TRUE + default_custom_objective = "Turn a department into a testament for your dark knowledge." /// Whether we give this antagonist objectives on gain. var/give_objectives = TRUE /// Whether we've ascended! (Completed one of the final rituals) @@ -118,6 +120,7 @@ var/list/data = list() data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives for(var/path in researched_knowledge) var/list/knowledge_data = list() @@ -162,6 +165,19 @@ knowledge_points -= initial(researched_path.cost) return TRUE +/datum/antagonist/heretic/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) + if (isnull(owner) || isnull(owner.current)) + return + var/confirmed = tgui_alert( + owner.current, + message = "Are you sure? You will no longer be able to Ascend.", + title = "Reject the call?", + buttons = list("Yes", "No"), + ) == "Yes" + if (!confirmed) + return + return ..() + /datum/antagonist/heretic/ui_status(mob/user, datum/ui_state/state) if(user.stat == DEAD) return UI_CLOSE @@ -463,11 +479,9 @@ if(length(objectives)) var/count = 1 for(var/datum/objective/objective as anything in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) succeeded = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(ascended) @@ -676,6 +690,8 @@ * Returns FALSE if not all of our objectives are complete, or TRUE otherwise. */ /datum/antagonist/heretic/proc/can_ascend() + if(!can_assign_self_objectives) + return FALSE // We spurned the offer of the Mansus :( for(var/datum/objective/must_be_done as anything in objectives) if(!must_be_done.check_completion()) return FALSE diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index b07d052a0917..d3eb4bf58399 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -16,6 +16,7 @@ throwforce = 10 wound_bonus = 5 bare_wound_bonus = 15 + toolspeed = 0.375 demolition_mod = 0.8 hitsound = 'sound/weapons/bladeslice.ogg' armour_penetration = 35 diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 7f8eaaf1fb0f..e9cc46f68bc7 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -69,7 +69,8 @@ success_feedback = "You remove %THEEFFECT.", \ tip_text = "Clear rune", \ on_clear_callback = CALLBACK(src, PROC_REF(after_clear_rune)), \ - effects_we_clear = list(/obj/effect/heretic_rune)) + effects_we_clear = list(/obj/effect/heretic_rune), \ + time_to_remove = 0.4 SECONDS) /* * Callback for effect_remover component. diff --git a/code/modules/antagonists/malf_ai/malf_ai.dm b/code/modules/antagonists/malf_ai/malf_ai.dm index 50ddaf6c9ef2..863b32e28d8f 100644 --- a/code/modules/antagonists/malf_ai/malf_ai.dm +++ b/code/modules/antagonists/malf_ai/malf_ai.dm @@ -8,6 +8,8 @@ job_rank = ROLE_MALF antag_hud_name = "traitor" ui_name = "AntagInfoMalf" + can_assign_self_objectives = TRUE + default_custom_objective = "Make sure your precious crew are incapable of ever, ever leaving you." ///the name of the antag flavor this traitor has. var/employer ///assoc list of strings set up after employer is given @@ -178,6 +180,7 @@ data["allies"] = malfunction_flavor["allies"] data["goal"] = malfunction_flavor["goal"] data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives //module picker data @@ -235,11 +238,9 @@ if(objectives.len) //If the traitor had no objectives, don't need to process this. var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) malf_ai_won = FALSE + objectives_text += "
Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ result += objectives_text diff --git a/code/modules/antagonists/ninja/ninja_explosive.dm b/code/modules/antagonists/ninja/ninja_explosive.dm index 68241ce77696..b371f12c2e76 100644 --- a/code/modules/antagonists/ninja/ninja_explosive.dm +++ b/code/modules/antagonists/ninja/ninja_explosive.dm @@ -1,14 +1,14 @@ /** * # Spider Charge * - * A unique version of c4 possessed only by the space ninja. Has a stronger blast radius. - * Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can. + * A unique version of c4 possessed only by the space ninja. Has a stronger blast radius. + * Can only be detonated by space ninjas with the bombing objective. Can only be set up where the objective says it can. * When it primes, the space ninja responsible will have their objective set to complete. * */ /obj/item/grenade/c4/ninja name = "spider charge" - desc = "A modified C-4 charge supplied to you by the Spider Clan. Its explosive power has been juiced up, but only works in one specific area." + desc = "A modified C-4 charge supplied by the Spider Clan. It has great explosive power, but is keyed to only work in one specific area." icon_state = "ninja-explosive0" inhand_icon_state = "ninja-explosive" boom_sizes = list(4, 8, 12) @@ -22,6 +22,15 @@ detonation_area = null return ..() +/obj/item/grenade/c4/ninja/examine(mob/user) + . = ..() + if (!IS_SPACE_NINJA(user)) + return + if (isnull(detonation_area)) + . += span_notice("This one was provided with no destination set, and cannot be used.") + else + . += span_notice("This device will only function in [detonation_area].") + /** * set_detonation_area * @@ -38,9 +47,9 @@ return detonation_area = objective.detonation_location -/obj/item/grenade/c4/ninja/afterattack(atom/movable/AM, mob/ninja, flag) +/obj/item/grenade/c4/ninja/afterattack(atom/movable/target, mob/ninja, flag) if(!IS_SPACE_NINJA(ninja)) - to_chat(ninja, span_notice("While it appears normal, you can't seem to detonate the charge.")) + say("Access denied.") return . |= AFTERATTACK_PROCESSED_ITEM if (!check_loc(ninja)) @@ -59,15 +68,15 @@ //Since we already did the checks in afterattack, the denonator must be a ninja with the bomb objective. if(!detonator) return - var/mob/ninja = detonator.resolve() . = ..() if(!.) return + var/mob/ninja = detonator.resolve() if (isnull(ninja)) return var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) var/datum/objective/plant_explosive/objective = locate() in ninja_antag.objectives - objective.completed = TRUE + objective?.completed = TRUE /** * check_loc @@ -78,11 +87,11 @@ * * mob/user - The planter of the c4 */ /obj/item/grenade/c4/ninja/proc/check_loc(mob/user) - if(!detonation_area) - to_chat(user, span_notice("You can't seem to activate the charge. It's location-locked, but you don't know where to detonate it.")) + if(isnull(detonation_area)) + balloon_alert(user, "no location set!") return FALSE if((get_area(target) != detonation_area) && (get_area(src) != detonation_area)) if (!active) - to_chat(user, span_notice("This isn't the location you're supposed to use this!")) + balloon_alert(user, "wrong location!") return FALSE return TRUE diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index c2809d680cc6..015307bbd17b 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -103,10 +103,11 @@ /datum/antagonist/nukeop/proc/give_alias() if(nuke_team?.syndicate_name) - 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) + var/mob/living/carbon/human/human_to_rename = owner.current + if(istype(human_to_rename)) // Reinforcements get a real name + var/first_name = owner.current.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) + var/chosen_name = "[first_name] [nuke_team.syndicate_name]" + human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) else var/number = 1 number = nuke_team.members.Find(owner) @@ -256,13 +257,6 @@ H.put_in_hands(nuke_code_paper, TRUE) H.update_icons() -/datum/antagonist/nukeop/leader/give_alias() - title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - if(nuke_team?.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" - else - owner.current.real_name = "Syndicate [title]" - /datum/antagonist/nukeop/leader/greet() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for guiding the team and your ID is the only one who can open the launch bay doors.") @@ -290,11 +284,12 @@ name = "[syndicate_name] Team" for(var/I in members) var/datum/mind/synd_mind = I - var/mob/living/carbon/human/H = synd_mind.current - if(!istype(H)) + var/mob/living/carbon/human/human_to_rename = synd_mind.current + if(!istype(human_to_rename)) continue - var/chosen_name = H.dna.species.random_name(H.gender,0,syndicate_name) - H.fully_replace_character_name(H.real_name,chosen_name) + var/first_name = human_to_rename.client?.prefs?.read_preference(/datum/preference/name/operative_alias) || pick(GLOB.operative_aliases) + var/chosen_name = "[first_name] [syndicate_name]" + human_to_rename.fully_replace_character_name(human_to_rename.real_name, chosen_name) /datum/antagonist/nukeop/leader/proc/ask_name() var/randomname = pick(GLOB.last_names) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 3324fe447db2..3ec2d3c89d15 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -78,6 +78,7 @@ /datum/antagonist/rev/greet() . = ..() to_chat(owner, span_userdanger("Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!")) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/revolutionary_tide.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) owner.announce_objectives() /datum/antagonist/rev/create_team(datum/team/revolution/new_team) @@ -562,7 +563,6 @@ if(player_mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) ADD_TRAIT(player, TRAIT_DEFIB_BLACKLISTED, REF(src)) - player.med_hud_set_status() for(var/datum/job/job as anything in SSjob.joinable_occupations) if(!(job.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_COMMAND)) @@ -570,8 +570,7 @@ job.allow_bureaucratic_error = FALSE job.total_positions = 0 - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.unfavorable_situation() + SSgamemode.point_gain_multipliers[EVENT_TRACK_ROLESET]++ var/message_header = "A recent assessment of your station has marked your station as a severe risk area for high ranking Nanotrasen officials." var/extra_detail = try_auto_call_shuttle() \ @@ -629,7 +628,6 @@ for (var/datum/mind/rev_head as anything in ex_headrevs) if(!isnull(rev_head.current)) ADD_TRAIT(rev_head.current, TRAIT_DEFIB_BLACKLISTED, REF(src)) - rev_head.current.med_hud_set_status() for(var/datum/objective/mutiny/head_tracker in objectives) var/mob/living/head_of_staff = head_tracker.target?.current diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index 7ce6f9f6cf5f..7948b1fe6cbd 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -9,6 +9,9 @@ antag_moodlet = /datum/mood_event/focused suicide_cry = "FOR THE SPIDER CLAN!!" preview_outfit = /datum/outfit/ninja_preview + can_assign_self_objectives = TRUE + ui_name = "AntagInfoNinja" + default_custom_objective = "Destroy vital station infrastructure, without being seen." ///Whether or not this ninja will obtain objectives var/give_objectives = TRUE ///Whether or not this ninja receives the standard equipment @@ -35,7 +38,7 @@ antag_memory += "Surprise is my weapon. Shadows are my armor. Without them, I am nothing.
" /datum/objective/cyborg_hijack - explanation_text = "Use your gloves to convert at least one cyborg to aide you in sabotaging the station." + explanation_text = "Use your gloves to convert at least one cyborg to aid you in sabotaging the station." /datum/objective/door_jack ///How many doors that need to be opened using the gloves to pass the objective diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 07a1c5b607b7..2aade03ae3fb 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -14,6 +14,8 @@ ui_name = "AntagInfoTraitor" suicide_cry = "FOR THE SYNDICATE!!" preview_outfit = /datum/outfit/traitor + can_assign_self_objectives = TRUE + default_custom_objective = "Perform an overcomplicated heist on valuable Nanotrasen assets." var/give_objectives = TRUE /// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost. var/give_secondary_objectives = TRUE @@ -84,6 +86,9 @@ uplink_handler.has_objectives = FALSE //monkestation edit end + uplink_handler.can_replace_objectives = CALLBACK(src, PROC_REF(can_change_objectives)) + uplink_handler.replace_objectives = CALLBACK(src, PROC_REF(submit_player_objective)) + if(uplink_handler.progression_points < SStraitor.current_global_progression) uplink_handler.progression_points = SStraitor.current_global_progression * SStraitor.newjoin_progression_coeff @@ -111,8 +116,10 @@ return ..() /datum/antagonist/traitor/on_removal() - if(uplink_handler) + if(!isnull(uplink_handler)) uplink_handler.has_objectives = FALSE + uplink_handler.can_replace_objectives = null + uplink_handler.replace_objectives = null return ..() /datum/antagonist/traitor/proc/traitor_objective_to_html(datum/traitor_objective/to_display) @@ -163,6 +170,10 @@ result += "Force add objective
" return result +/// Returns true if we're allowed to assign ourselves a new objective +/datum/antagonist/traitor/proc/can_change_objectives() + return can_assign_self_objectives + /// proc that generates the traitors replacement uplink code and radio frequency /datum/antagonist/traitor/proc/generate_replacement_codes() replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" @@ -323,11 +334,9 @@ if(objectives.len) //If the traitor had no objectives, don't need to process this. var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objectives_text += "
Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + if(!objective.check_completion()) traitor_won = FALSE + objectives_text += "
Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(uplink_handler.final_objective) objectives_text += "
[span_greentext("[traitor_won ? "Additionally" : "However"], the final objective \"[uplink_handler.final_objective]\" was completed!")]" diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index dc958f3b1171..4722ffcb9aef 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -48,11 +48,20 @@ var/debug_mode = FALSE /// Whether the shop is locked or not. If set to true, nothing can be purchased. var/shop_locked = FALSE + /// Callback which returns true if you can choose to replace your objectives with different ones + var/datum/callback/can_replace_objectives + /// Callback which performs that operation + var/datum/callback/replace_objectives /datum/uplink_handler/New() . = ..() maximum_potential_objectives = CONFIG_GET(number/maximum_potential_objectives) +/datum/uplink_handler/Destroy(force, ...) + can_replace_objectives = null + replace_objectives = null + return ..() + /// Called whenever an update occurs on this uplink handler. Used for UIs /datum/uplink_handler/proc/on_update() SEND_SIGNAL(src, COMSIG_UPLINK_HANDLER_ON_UPDATE) diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm index 36ed05594ee4..1a2cbe31aa3c 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm @@ -154,6 +154,7 @@ light_inner_range = 1 //monkestation edit light_outer_range = 2 //monkestation edit light_color = COLOR_PALE_GREEN + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /// Who are we reviving? var/mob/living/corpse /// Who if anyone is playing as them? diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 3aae394a7487..87fe2f3e4325 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -12,6 +12,8 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) ui_name = "AntagInfoWizard" suicide_cry = "FOR THE FEDERATION!!" preview_outfit = /datum/outfit/wizard + can_assign_self_objectives = TRUE + default_custom_objective = "Demonstrate your incredible and destructive magical powers." var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE @@ -191,9 +193,9 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) H.equipOutfit(outfit_type) /datum/antagonist/wizard/ui_static_data(mob/user) - . = ..() var/list/data = list() data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives return data /datum/antagonist/wizard/ui_data(mob/user) @@ -252,6 +254,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) /datum/antagonist/wizard/apprentice name = "Wizard Apprentice" antag_hud_name = "apprentice" + can_assign_self_objectives = FALSE var/datum/mind/master var/school = APPRENTICE_DESTRUCTION outfit_type = /datum/outfit/wizard/apprentice @@ -369,6 +372,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) show_in_antagpanel = FALSE outfit_type = /datum/outfit/wizard/academy move_to_lair = FALSE + can_assign_self_objectives = FALSE /datum/antagonist/wizard/academy/assign_ritual() return // Has other duties to be getting on with @@ -403,13 +407,11 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) parts += "
Grand Rituals completed: [ritual.times_completed]
" var/count = 1 - var/wizardwin = 1 + var/wizardwin = TRUE for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - parts += "Objective #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - parts += "Objective #[count]: [objective.explanation_text] [span_redtext("Fail.")]" - wizardwin = 0 + if(!objective.check_completion()) + wizardwin = FALSE + parts += "Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]" count++ if(wizardwin) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 09dd406fefab..579c3fa62cec 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -109,6 +109,8 @@ var/message_cooldown ///Cryo will continue to treat people with 0 damage but existing wounds, but will sound off when damage healing is done in case doctors want to directly treat the wounds instead var/treating_wounds = FALSE + /// Cryo should notify doctors if the patient is dead, and eject them if autoeject is enabled + var/patient_dead = FALSE fair_market_price = 10 payment_department = ACCOUNT_MED @@ -268,19 +270,36 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/process(seconds_per_tick) ..() - - if(!on) - return if(!occupant) return + if(!on) + // Should turn on if set to auto + if(autoeject) + set_on(TRUE) + else + return + var/mob/living/mob_occupant = occupant if(mob_occupant.on_fire) mob_occupant.extinguish_mob() if(!check_nap_violations()) return - if(mob_occupant.stat == DEAD) // We don't bother with dead people. + if(mob_occupant.stat == DEAD) // Notify doctors and potentially eject if the patient is dead + set_on(FALSE) + var/msg = "Patient is deceased." + if(autoeject) // Eject if configured. + msg += " Auto ejecting patient now." + open_machine() + // Only need to tell them once + if(!patient_dead) + playsound(src, 'sound/machines/cryo_warning.ogg', volume) + patient_dead = TRUE + radio.talk_into(src, msg, radio_channel) return + + patient_dead = FALSE + if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. if(iscarbon(mob_occupant)) var/mob/living/carbon/C = mob_occupant @@ -383,6 +402,9 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user, density_to_set = TRUE) treating_wounds = FALSE if((isnull(user) || istype(user)) && state_open && !panel_open) + if(loc == user?.loc) + to_chat(user, span_warning("You can't close [src] on yourself!")) + return flick("pod-close-anim", src) ..(user) return occupant diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 294b2a49bd6a..237d84abbac4 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -67,7 +67,7 @@ description = "Our big data division needs more powerful hardware to play 'Outbomb Cuban Pe-', err, to closely monitor threats in your sector. Send us a working modular computer console." reward = CARGO_CRATE_VALUE * 6 required_count = 1 - wanted_types = list(/obj/machinery/modular_computer/console = TRUE) + wanted_types = list(/obj/machinery/modular_computer = TRUE) require_powered = FALSE /datum/bounty/item/science/ntnet/console/applies_to(obj/O) diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index fe6c151e658a..57c0cbf0a814 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -21,9 +21,26 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( var/list/department_delivery_areas = list() ///which groups this computer can order from var/list/dep_groups = list() + /// If this departmental order console currently is on cooldown. + var/on_cooldown = FALSE + + /// Our radio object we use to talk to our department. + var/obj/item/radio/radio + /// The radio key typepath that will be instantiated and inserted into our radio. + var/obj/item/encryptionkey/radio_key_typepath + /// The radio channel we will speak into by default. + var/radio_channel /obj/machinery/computer/department_orders/Initialize(mapload, obj/item/circuitboard/board) . = ..() + + if (radio_channel && radio_key_typepath) + radio = new(src) + radio.keyslot = new radio_key_typepath + radio.subspace_transmission = TRUE + radio.canhear_range = 0 + radio.recalculateChannels() + if(mapload) //check for mapping errors for(var/delivery_area_type in department_delivery_areas) if(GLOB.areas_by_type[delivery_area_type]) @@ -32,6 +49,11 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( log_mapping("[src] has no valid areas to deliver to on this map, add some more fallback areas to its \"department_delivery_areas\" var.") department_delivery_areas = list(/area/station/hallway/primary/central) //if this doesn't exist like honestly fuck your map man +/obj/machinery/computer/department_orders/Destroy() + QDEL_NULL(radio) + + return ..() + /obj/machinery/computer/department_orders/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -163,6 +185,20 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( time_y = 5 MINUTES * time_y GLOB.department_order_cooldowns[type] = world.time + time_y +/obj/machinery/computer/department_orders/process() + . = ..() + if (!.) + return FALSE + + if (GLOB.department_order_cooldowns[type] > world.time) + on_cooldown = TRUE + else if (on_cooldown) + radio?.talk_into(src, "Order cooldown has expired! A new order may now be placed!", radio_channel) + playsound(src, 'sound/machines/ping.ogg', 30, TRUE) + on_cooldown = FALSE + + return TRUE + /obj/machinery/computer/department_orders/service name = "service order console" circuit = /obj/item/circuitboard/computer/service_orders @@ -170,6 +206,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_HOP req_one_access = list(ACCESS_SERVICE) dep_groups = list("Service", "Food & Hydroponics", "Livestock", "Costumes & Toys") + radio_key_typepath = /obj/item/encryptionkey/headset_service + radio_channel = RADIO_CHANNEL_SERVICE /obj/machinery/computer/department_orders/engineering name = "engineering order console" @@ -178,6 +216,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_CE req_one_access = REGION_ACCESS_ENGINEERING dep_groups = list("Engineering", "Engine Construction", "Canisters & Materials") + radio_key_typepath = /obj/item/encryptionkey/headset_eng + radio_channel = RADIO_CHANNEL_ENGINEERING /obj/machinery/computer/department_orders/science name = "science order console" @@ -186,6 +226,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_RD req_one_access = REGION_ACCESS_RESEARCH dep_groups = list("Science", "Livestock", "Canisters & Materials") + radio_key_typepath = /obj/item/encryptionkey/headset_sci + radio_channel = RADIO_CHANNEL_SCIENCE /obj/machinery/computer/department_orders/security name = "security order console" @@ -198,6 +240,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_HOS req_one_access = REGION_ACCESS_SECURITY dep_groups = list("Security", "Armory") + radio_key_typepath = /obj/item/encryptionkey/headset_sec + radio_channel = RADIO_CHANNEL_SECURITY /obj/machinery/computer/department_orders/medical name = "medical order console" @@ -211,3 +255,5 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( override_access = ACCESS_CMO req_one_access = REGION_ACCESS_MEDBAY dep_groups = list("Medical") + radio_key_typepath = /obj/item/encryptionkey/headset_med + radio_channel = RADIO_CHANNEL_MEDICAL diff --git a/code/modules/client/preferences/names.dm b/code/modules/client/preferences/names.dm index 3438ec14e39d..0f3105c73367 100644 --- a/code/modules/client/preferences/names.dm +++ b/code/modules/client/preferences/names.dm @@ -155,3 +155,25 @@ /datum/preference/name/bible/create_default_value() return DEFAULT_BIBLE + +/// The first name given to nuclear operative antagonists. The last name will be chosen by the team leader. +/datum/preference/name/operative_alias + savefile_key = "operative_alias" + allow_numbers = TRUE //You can get a little wacky with your alias nobody will judge you + explanation = "Operative Alias" + group = "antagonists" + +/datum/preference/name/operative_alias/create_default_value() + return pick(GLOB.operative_aliases) + +/datum/preference/name/operative_alias/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + // If one of the roles is ticked in the antag prefs menu, this option will show. + var/static/list/ops_roles = list(ROLE_OPERATIVE, ROLE_LONE_OPERATIVE, ROLE_OPERATIVE_MIDROUND, ROLE_CLOWN_OPERATIVE) + if(length(ops_roles & preferences.be_special)) + return TRUE + + return FALSE diff --git a/code/modules/client/preferences/screentips.dm b/code/modules/client/preferences/screentips.dm index fe2578233751..87ce18d7f24e 100644 --- a/code/modules/client/preferences/screentips.dm +++ b/code/modules/client/preferences/screentips.dm @@ -36,3 +36,11 @@ /datum/preference/color/screentip_color/create_default_value() return LIGHT_COLOR_FAINT_BLUE + +/datum/preference/toggle/screentip_images + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "screentip_images" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/screentip_images/apply_to_client(client/client, value) + client.mob?.hud_used?.screentip_images = value diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index af3d94f0996c..f37a8e343f14 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -528,6 +528,23 @@ var/datum/action/item_action/chameleon/change/chameleon_action +// MONKESTATION ADDITION START +/obj/item/clothing/glasses/thermal/syndi/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour != TOOL_MULTITOOL) + return ..() + + if(chameleon_action.hidden) + chameleon_action.hidden = FALSE + actions += chameleon_action + chameleon_action.Grant(user) + log_game("[key_name(user)] has removed the disguise lock on the chameleon thermals ([name]) with [W]") + else + chameleon_action.hidden = TRUE + actions -= chameleon_action + chameleon_action.Remove(user) + log_game("[key_name(user)] has locked the disguise of the chameleon thermals ([name]) with [W]") +// MONKESTATION ADDITION END + /obj/item/clothing/glasses/thermal/syndi/Initialize(mapload) . = ..() chameleon_action = new(src) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 989e1bbc2acf..db21c6cce3a5 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -151,6 +151,22 @@ return chameleon_action.emp_randomise() +// MONKESTATION ADDITION START +/obj/item/clothing/glasses/hud/security/chameleon/attackby(obj/item/W, mob/user, params) + if(W.tool_behaviour != TOOL_MULTITOOL) + return ..() + + if(chameleon_action.hidden) + chameleon_action.hidden = FALSE + actions += chameleon_action + chameleon_action.Grant(user) + log_game("[key_name(user)] has removed the disguise lock on the chameleon security HUD ([name]) with [W]") + else + chameleon_action.hidden = TRUE + actions -= chameleon_action + chameleon_action.Remove(user) + log_game("[key_name(user)] has locked the disguise of the chameleon security HUD ([name]) with [W]") +// MONKESTATION ADDITION END /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch name = "eyepatch HUD" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index fc018e15a0dc..7264b435fb20 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -12,19 +12,77 @@ desc = "The commander in chef's head wear." strip_delay = 10 equip_delay_other = 10 - dog_fashion = /datum/dog_fashion/head/chef - ///the chance that the movements of a mouse inside of this hat get relayed to the human wearing the hat + /// The chance that the movements of a mouse inside of this hat get relayed to the human wearing the hat var/mouse_control_probability = 20 + /// Allowed time between movements + COOLDOWN_DECLARE(move_cooldown) + +/// Admin variant of the chef hat where every mouse pilot input will always be transferred to the wearer +/obj/item/clothing/head/utility/chefhat/i_am_assuming_direct_control + desc = "The commander in chef's head wear. Upon closer inspection, there seem to be dozens of tiny levers, buttons, dials, and screens inside of this hat. What the hell...?" + mouse_control_probability = 100 /obj/item/clothing/head/utility/chefhat/Initialize(mapload) . = ..() - create_storage(storage_type = /datum/storage/pockets/chefhat) -/obj/item/clothing/head/utility/chefhat/i_am_assuming_direct_control - desc = "The commander in chef's head wear. Upon closer inspection, there seem to be dozens of tiny levers, buttons, dials, and screens inside of this hat. What the hell...?" - mouse_control_probability = 100 +/obj/item/clothing/head/utility/chefhat/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + var/mob/living/basic/new_boss = get_mouse(arrived) + if(!new_boss) + return + RegisterSignal(new_boss, COMSIG_MOB_PRE_EMOTED, PROC_REF(on_mouse_emote)) + RegisterSignal(new_boss, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_mouse_moving)) + RegisterSignal(new_boss, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(on_mouse_moving)) + +/obj/item/clothing/head/utility/chefhat/Exited(atom/movable/gone, direction) + . = ..() + var/mob/living/basic/old_boss = get_mouse(gone) + if(!old_boss) + return + UnregisterSignal(old_boss, list(COMSIG_MOB_PRE_EMOTED, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE)) + +/// Returns a mob stored inside a mob container, if there is one +/obj/item/clothing/head/utility/chefhat/proc/get_mouse(atom/possible_mouse) + if (!ispickedupmob(possible_mouse)) + return + var/obj/item/clothing/head/mob_holder/mousey_holder = possible_mouse + return locate(/mob/living/basic) in mousey_holder.contents + +/// Relays emotes emoted by your boss to the hat wearer for full immersion +/obj/item/clothing/head/utility/chefhat/proc/on_mouse_emote(mob/living/source, key, emote_message, type_override) + SIGNAL_HANDLER + var/mob/living/carbon/wearer = loc + if(!wearer || wearer.incapacitated(IGNORE_RESTRAINTS)) + return + if (!prob(mouse_control_probability)) + return COMPONENT_CANT_EMOTE + INVOKE_ASYNC(wearer, TYPE_PROC_REF(/mob, emote), key, type_override, emote_message, FALSE) + return COMPONENT_CANT_EMOTE + +/// Relays movement made by the mouse in your hat to the wearer of the hat +/obj/item/clothing/head/utility/chefhat/proc/on_mouse_moving(mob/living/source, atom/moved_to) + SIGNAL_HANDLER + if (!prob(mouse_control_probability) || !COOLDOWN_FINISHED(src, move_cooldown)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Didn't roll well enough or on cooldown + + var/mob/living/carbon/wearer = loc + if(!wearer || wearer.incapacitated(IGNORE_RESTRAINTS)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Not worn or can't move + + var/move_direction = get_dir(wearer, moved_to) + if(!wearer.Process_Spacemove(move_direction)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Currently drifting in space + if(!has_gravity() || !isturf(wearer.loc)) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE // Not in a location where we can move + + step_towards(wearer, moved_to) + var/move_delay = wearer.cached_multiplicative_slowdown + if (ISDIAGONALDIR(move_direction)) + move_delay *= sqrt(2) + COOLDOWN_START(src, move_cooldown, move_delay) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE /obj/item/clothing/head/utility/chefhat/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.")) @@ -35,14 +93,6 @@ playsound(user, 'sound/machines/ding.ogg', 50, TRUE) return FIRELOSS -/obj/item/clothing/head/utility/chefhat/relaymove(mob/living/user, direction) - if(!ismouse(user) || !isliving(loc) || !prob(mouse_control_probability)) - return - var/mob/living/L = loc - if(L.incapacitated(IGNORE_RESTRAINTS)) //just in case - return - step_towards(L, get_step(L, direction)) - //Captain /obj/item/clothing/head/hats/caphat name = "captain's hat" @@ -156,6 +206,116 @@ /obj/item/clothing/head/fedora/det_hat/minor flask_path = /obj/item/reagent_containers/cup/glass/flask/det/minor +///Detectives Fedora, but like Inspector Gadget. Not a subtype to not inherit candy corn stuff +/obj/item/clothing/head/fedora/inspector_hat + name = "inspector's fedora" + desc = "There's only one man can try to stop an evil villian." + armor_type = /datum/armor/fedora_det_hat + icon_state = "detective" + inhand_icon_state = "det_hat" + dog_fashion = /datum/dog_fashion/head/detective + ///prefix our phrases must begin with + var/prefix = "go go gadget" + ///an assoc list of phrase = item (like gun = revolver) + var/list/items_by_phrase = list() + ///how many gadgets can we hold + var/max_items = 4 + ///items above this weight cannot be put in the hat + var/max_weight = WEIGHT_CLASS_NORMAL + +/obj/item/clothing/head/fedora/inspector_hat/Initialize(mapload) + . = ..() + become_hearing_sensitive(ROUNDSTART_TRAIT) + QDEL_NULL(atom_storage) + +/obj/item/clothing/head/fedora/inspector_hat/examine(mob/user) + . = ..() + . += span_notice("You can put items inside, and get them out by saying a phrase, or using it in-hand!") + . += span_notice("The prefix is [prefix], and you can change it with alt-click!\n") + for(var/phrase in items_by_phrase) + var/obj/item/item = items_by_phrase[phrase] + . += span_notice("[icon2html(item, user)] You can remove [item] by saying \"[prefix] [phrase]\"!") + +/obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) + . = ..() + var/mob/living/carbon/wearer = loc + if(!istype(wearer) || speaker != wearer) //if we are worn + return FALSE + + raw_message = htmlrendertext(raw_message) + var/prefix_index = findtext(raw_message, prefix) + if(prefix_index != 1) + return FALSE + + var/the_phrase = trim_left(replacetext(raw_message, prefix, "")) + var/obj/item/result = items_by_phrase[the_phrase] + if(!result) + return FALSE + + if(wearer.put_in_active_hand(result)) + wearer.visible_message(span_warning("[src] drops [result] into the hands of [wearer]!")) + else + balloon_alert(wearer, "cant put in hands!") + + return TRUE + +/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, params) + . = ..() + + if(LAZYLEN(contents) >= max_items) + balloon_alert(user, "full!") + return + if(item.w_class > max_weight) + balloon_alert(user, "too big!") + return + + var/input = tgui_input_text(user, "What is the activation phrase?", "Activation phrase", "gadget", max_length = 26) + if(!input) + return + if(input in items_by_phrase) + balloon_alert(user, "already used!") + return + + if(item.loc != user || !user.transferItemToLoc(item, src)) + return + + to_chat(user, span_notice("You install [item] into the [thtotext(contents.len)] slot in [src].")) + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + items_by_phrase[input] = item + +/obj/item/clothing/head/fedora/inspector_hat/attack_self(mob/user) + . = ..() + var/phrase = tgui_input_list(user, "What item do you want to remove by phrase?", "Item Removal", items_by_phrase) + if(!phrase) + return + user.put_in_inactive_hand(items_by_phrase[phrase]) + +/obj/item/clothing/head/fedora/inspector_hat/AltClick(mob/user) + . = ..() + var/new_prefix = tgui_input_text(user, "What should be the new prefix?", "Activation prefix", prefix, max_length = 24) + if(!new_prefix) + return + prefix = new_prefix + +/obj/item/clothing/head/fedora/inspector_hat/Exited(atom/movable/gone, direction) + . = ..() + for(var/phrase in items_by_phrase) + var/obj/item/result = items_by_phrase[phrase] + if(gone == result) + items_by_phrase -= phrase + return + +/obj/item/clothing/head/fedora/inspector_hat/atom_destruction(damage_flag) + for(var/phrase in items_by_phrase) + var/obj/item/result = items_by_phrase[phrase] + result.forceMove(drop_location()) + items_by_phrase = null + return ..() + +/obj/item/clothing/head/fedora/inspector_hat/Destroy() + QDEL_LIST_ASSOC(items_by_phrase) + return ..() + //Mime /obj/item/clothing/head/beret name = "beret" diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index d1ebedd1e13a..47d48a0b1790 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -32,6 +32,17 @@ return ..() +/obj/item/clothing/head/wig/build_worn_icon( + default_layer = 0, + default_icon_file = null, + isinhands = FALSE, + female_uniform = NO_FEMALE_UNIFORM, + override_state = null, + override_file = null, + use_height_offset = TRUE, +) + return ..(default_layer, default_icon_file, isinhands, female_uniform, override_state, override_file, use_height_offset = FALSE) + /obj/item/clothing/head/wig/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use) . = ..() if(isinhands) diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 36fdddbb7abc..f06e773e1d87 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list( return COOLDOWN_START(src, whistle_cooldown, 10 SECONDS) user.audible_message("HALT!") - playsound(src, 'sound/misc/whistle.ogg', 75, FALSE, 4) + playsound(src, 'sound/misc/whistle.ogg', 50, FALSE, 4) /datum/action/item_action/halt name = "HALT!" diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 37ad8afec98c..cc9c923ae2a9 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to icon = 'icons/obj/objects.dmi' icon_state = "anom" mech_sized = TRUE - + light_on = FALSE /obj/effect/portal/wormhole/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override) . = ..() diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 56613dc6b1c3..183b45f1ac16 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -287,9 +287,16 @@ balloon_alert(user, "it's too dirty!") return TRUE - if(istype(O, /obj/item/storage/bag/tray)) + if(istype(O, /obj/item/storage)) var/obj/item/storage/T = O var/loaded = 0 + + if(!istype(O, /obj/item/storage/bag/tray)) + // Non-tray dumping requires a do_after + to_chat(user, span_notice("You start dumping out the contents of [O] into [src]...")) + if(!do_after(user, 2 SECONDS, target = T)) + return + for(var/obj/S in T.contents) if(!IS_EDIBLE(S)) continue diff --git a/code/modules/hallucination/mother.dm b/code/modules/hallucination/mother.dm new file mode 100644 index 000000000000..631a5c6641e3 --- /dev/null +++ b/code/modules/hallucination/mother.dm @@ -0,0 +1,94 @@ +/// Your mother appears to scold you. +/datum/hallucination/your_mother + random_hallucination_weight = 2 + var/obj/effect/client_image_holder/hallucination/your_mother/mother + +/datum/hallucination/your_mother/start() + var/list/spawn_locs = list() + for(var/turf/open/floor in view(hallucinator, 4)) + if(floor.is_blocked_turf(exclude_mobs = TRUE)) + continue + spawn_locs += floor + + if(!length(spawn_locs)) + return FALSE + var/turf/spawn_loc = pick(spawn_locs) + mother = new(spawn_loc, hallucinator, src) + mother.AddComponent(/datum/component/leash, owner = hallucinator, distance = get_dist(hallucinator, mother)) //basically makes mother follow them + point_at(hallucinator) + talk("[capitalize(hallucinator.real_name)]!!!!") // Your mother won't be fooled by paltry disguises + var/list/scold_lines = list( + pick_list_replacements(MOTHER_FILE, "do_something"), + pick_list_replacements(MOTHER_FILE, "be_upset"), + pick_list_replacements(MOTHER_FILE, "get_reprimanded"), + ) + var/delay = 2 SECONDS + for(var/line in scold_lines) + addtimer(CALLBACK(src, PROC_REF(talk), line), delay) + delay += 2 SECONDS + addtimer(CALLBACK(src, PROC_REF(exit)), delay + 4 SECONDS) + return TRUE + +/datum/hallucination/your_mother/proc/point_at(atom/target) + var/turf/tile = get_turf(target) + if(!tile) + return + + var/obj/visual = image('icons/hud/screen_gen.dmi', mother.loc, "arrow", FLY_LAYER) + + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), visual, list(hallucinator.client), 2.5 SECONDS) + animate(visual, pixel_x = (tile.x - mother.x) * world.icon_size, pixel_y = (tile.y - mother.y) * world.icon_size, time = 1.7, easing = EASE_OUT) + +/datum/hallucination/your_mother/proc/talk(text) + var/plus_runechat = hallucinator.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) + var/datum/language/understood_language = hallucinator.get_random_understood_language() + var/spans = list(mother.speech_span) + + if(!plus_runechat) + var/image/speech_overlay = image('icons/mob/effects/talk.dmi', mother, "default0", layer = ABOVE_MOB_LAYER) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), speech_overlay, list(hallucinator.client), 30) + else + hallucinator.create_chat_message(mother, understood_language, text, spans) + + var/message = hallucinator.compose_message(mother, understood_language, text, null, spans, visible_name = TRUE) + to_chat(hallucinator, message) + +/datum/hallucination/your_mother/proc/exit() + qdel(src) + +/datum/outfit/yourmother + name = "Your Mother" + + uniform = /obj/item/clothing/under/color/jumpskirt/red + neck = /obj/item/clothing/neck/beads + shoes = /obj/item/clothing/shoes/sandal + +/datum/outfit/yourmother/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + user.hairstyle = "Braided" //get_dynamic_human_appearance uses bald dummies + user.update_body_parts() + +/obj/effect/client_image_holder/hallucination/your_mother + gender = FEMALE + image_icon = 'icons/mob/simple/simple_human.dmi' + name = "Your mother" + desc = "She is not happy." + image_state = "" + +/obj/effect/client_image_holder/hallucination/your_mother/Initialize(mapload, list/mobs_which_see_us, datum/hallucination/parent) + var/mob/living/hallucinator = parent.hallucinator + if (ishuman(hallucinator)) + var/mob/living/carbon/dna_haver = hallucinator + image_icon = getFlatIcon(get_dynamic_human_appearance(/datum/outfit/yourmother, dna_haver.dna.species.type)) + return ..() + + if (istype(hallucinator, /mob/living/basic/pet/dog/corgi/ian)) + image_icon = getFlatIcon(get_dynamic_human_appearance(/datum/outfit/job/hop)) + name = "Head of Personnel" + return ..() + + image_icon = hallucinator.icon + image_state = hallucinator.icon_state + image_pixel_x = hallucinator.pixel_x + image_pixel_y = hallucinator.pixel_y + return ..() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index ab0280e7fecd..47fa445a4bcc 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -294,6 +294,9 @@ if(prob(10) && has_viable_mutations()) t_prod = create_valid_mutation(output_loc) else + if(!product) + t_amount++ + continue t_prod = new product(output_loc, src) if(parent.myseed.plantname != initial(parent.myseed.plantname)) t_prod.name = parent.myseed.plantname diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 787db0725a75..d5a7b6bca106 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -48,6 +48,10 @@ voice_of_god_power = 1.4 //Command staff has authority +/datum/job/chief_engineer/after_spawn(mob/living/spawned, client/player_client) + . = ..() + spawned.add_mob_memory(/datum/memory/key/message_server_key, decrypt_key = GLOB.preset_station_message_server_key) + /datum/job/chief_engineer/get_captaincy_announcement(mob/living/captain) return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 0254830501af..4ed70576a12f 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -45,6 +45,7 @@ var/datum/crime/past_crime = new(crime.name, crime.desc, "Central Command", "Indefinite.") target_record.crimes += past_crime to_chat(crewmember, span_warning("You are imprisoned for \"[crime_name]\".")) + crewmember.add_mob_memory(/datum/memory/key/permabrig_crimes, crimes = crime_name) /datum/outfit/job/prisoner name = "Prisoner" @@ -69,7 +70,6 @@ if(!crime_name) return var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name] - var/list/limbs_to_tat = new_prisoner.bodyparts.Copy() for(var/i in 1 to crime.tattoos) if(!length(SSpersistence.prison_tattoos_to_use) || visualsOnly) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 2cbc2f288d00..5d4cc75b9b8b 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -30,7 +30,6 @@ mail_goodies = list( /obj/item/raw_anomaly_core/random = 10, /obj/item/disk/design_disk/bepis = 2, - /obj/item/camera_bug = 1 ) rpg_title = "Thaumaturgist" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 3b516fd995ca..75518b8c291c 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -46,7 +46,7 @@ id_trim = /datum/id_trim/job/virologist uniform = /obj/item/clothing/under/rank/medical/virologist backpack_contents = list( - /obj/item/extrapolator = 1, +// /obj/item/extrapolator = 1, //monkestation edit - extrapolator is useless with pathology. /obj/item/storage/box/vials = 1, ) suit = /obj/item/clothing/suit/toggle/labcoat/virologist diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 3000c4b97148..571adde8b212 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -1,7 +1,6 @@ // The proc you should always use to set the light of this atom. // Nonesensical value for l_color default, so we can detect if it gets set to null. -#define NONSENSICAL_VALUE -99999 /atom/proc/set_light(l_outer_range, l_inner_range, l_power, l_falloff_curve = LIGHTING_DEFAULT_FALLOFF_CURVE, l_color = NONSENSICAL_VALUE, l_on) if(!isnum(l_power) && !isnull(l_power)) return @@ -31,8 +30,6 @@ update_light() -#undef NONSENSICAL_VALUE - /// Will update the light (duh). /// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 14751f3986c2..b7697b3cb75c 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -651,8 +651,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) name = "Dead Body placer" late = TRUE icon_state = "deadbodyplacer" + ///if TRUE, was spawned out of mapload. var/admin_spawned - var/bodycount = 2 //number of bodies to spawn + ///number of bodies to spawn + var/bodycount = 3 + /// These species IDs will be barred from spawning if morgue_cadaver_disable_nonhumans is disabled (In the future, we can also dehardcode this) + var/list/blacklisted_from_rng_placement = list( + SPECIES_ETHEREAL, // they revive on death which is bad juju + SPECIES_HUMAN, // already have a 50% chance of being selected + ) /obj/effect/mapping_helpers/dead_body_placer/Initialize(mapload) . = ..() @@ -661,23 +668,23 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) admin_spawned = TRUE /obj/effect/mapping_helpers/dead_body_placer/LateInitialize() - var/area/a = get_area(src) - var/list/trays = list() - for (var/i in a.contents) - if (istype(i, /obj/structure/bodycontainer/morgue)) - if(admin_spawned) - var/obj/structure/bodycontainer/morgue/early_morgue_tray = i - if(early_morgue_tray.connected.loc != early_morgue_tray) - continue - trays += i - if(!trays.len) + var/area/morgue_area = get_area(src) + var/list/obj/structure/bodycontainer/morgue/trays = list() + for(var/turf/area_turf as anything in morgue_area.get_contained_turfs()) + var/obj/structure/bodycontainer/morgue/morgue_tray = locate() in area_turf + if(isnull(morgue_tray) || !morgue_tray.beeper || morgue_tray.connected.loc != morgue_tray) + continue + trays += morgue_tray + + var/numtrays = length(trays) + if(numtrays == 0) if(admin_spawned) message_admins("[src] spawned at [ADMIN_VERBOSEJMP(src)] failed to find a closed morgue to spawn a body!") else log_mapping("[src] at [x],[y] could not find any morgues.") return - var/reuse_trays = (trays.len < bodycount) //are we going to spawn more trays than bodies? + var/reuse_trays = (numtrays < bodycount) //are we going to spawn more trays than bodies? var/use_species = !(CONFIG_GET(flag/morgue_cadaver_disable_nonhumans)) var/species_probability = CONFIG_GET(number/morgue_cadaver_other_species_probability) @@ -686,35 +693,39 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(use_species) var/list/temp_list = get_selectable_species() usable_races = temp_list.Copy() - usable_races -= SPECIES_ETHEREAL //they revive on death which is bad juju - LAZYREMOVE(usable_races, SPECIES_HUMAN) - if(!usable_races) + LAZYREMOVE(usable_races, blacklisted_from_rng_placement) + if(!LAZYLEN(usable_races)) notice("morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!") if(override_species) warning("morgue_cadaver_override_species BEING OVERRIDEN since morgue_cadaver_disable_nonhumans is disabled.") else if(override_species) - usable_races += override_species + LAZYADD(usable_races, override_species) - for (var/i = 1 to bodycount) + var/guaranteed_human_spawned = FALSE + for (var/i in 1 to bodycount) var/obj/structure/bodycontainer/morgue/morgue_tray = reuse_trays ? pick(trays) : pick_n_take(trays) var/obj/structure/closet/body_bag/body_bag = new(morgue_tray.loc) - var/mob/living/carbon/human/new_human = new /mob/living/carbon/human(morgue_tray.loc, 1) + var/mob/living/carbon/human/new_human = new(morgue_tray.loc) var/species_to_pick - if(LAZYLEN(usable_races)) - if(!species_probability) - species_probability = 50 - stack_trace("WARNING: morgue_cadaver_other_species_probability CONFIG SET TO 0% WHEN SPAWNING. DEFAULTING TO [species_probability]%.") - if(prob(species_probability)) - species_to_pick = pick(usable_races) - var/datum/species/new_human_species = GLOB.species_list[species_to_pick] - if(new_human_species) - new_human.set_species(new_human_species) - new_human_species = new_human.dna.species - new_human_species.randomize_features(new_human) - new_human.fully_replace_character_name(new_human.real_name, new_human_species.random_name(new_human.gender, TRUE, TRUE)) - else - stack_trace("failed to spawn cadaver with species ID [species_to_pick]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol. + + if(guaranteed_human_spawned && use_species) + if(LAZYLEN(usable_races)) + if(!isnum(species_probability)) + species_probability = 50 + stack_trace("WARNING: morgue_cadaver_other_species_probability CONFIG SET TO 0% WHEN SPAWNING. DEFAULTING TO [species_probability]%.") + if(prob(species_probability)) + species_to_pick = pick(usable_races) + var/datum/species/new_human_species = GLOB.species_list[species_to_pick] + if(new_human_species) + new_human.set_species(new_human_species) + new_human_species = new_human.dna.species + new_human_species.randomize_features(new_human) + new_human.fully_replace_character_name(new_human.real_name, new_human_species.random_name(new_human.gender, TRUE, TRUE)) + else + stack_trace("failed to spawn cadaver with species ID [species_to_pick]") //if it's invalid they'll just be a human, so no need to worry too much aside from yelling at the server owner lol. + else + guaranteed_human_spawned = TRUE body_bag.insert(new_human, TRUE) body_bag.close() @@ -722,18 +733,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) body_bag.forceMove(morgue_tray) new_human.death() //here lies the mans, rip in pepperoni. - for (var/part in new_human.organs) //randomly remove organs from each body, set those we keep to be in stasis + for (var/obj/item/organ/internal/part in new_human.organs) //randomly remove organs from each body, set those we keep to be in stasis if (prob(40)) qdel(part) else - var/obj/item/organ/O = part - O.organ_flags |= ORGAN_FROZEN + part.organ_flags |= ORGAN_FROZEN morgue_tray.update_appearance() qdel(src) - //On Ian's birthday, the hop's office is decorated. /obj/effect/mapping_helpers/ianbirthday name = "Ian's Bday Helper" diff --git a/code/modules/meteors/meteor_spawning.dm b/code/modules/meteors/meteor_spawning.dm index eac365bc2a83..97c359d03bfb 100644 --- a/code/modules/meteors/meteor_spawning.dm +++ b/code/modules/meteors/meteor_spawning.dm @@ -109,7 +109,7 @@ new_changeling.log_message("was spawned as a midround space changeling by an event.", LOG_GAME) var/datum/antagonist/changeling/changeling_datum = locate() in player_mind.antag_datums - changeling_datum.give_power(/datum/action/changeling/suit/organic_space_suit) + changeling_datum.give_power(/datum/action/changeling/void_adaption) changeling_datum.give_power(/datum/action/changeling/weapon/arm_blade) new_changeling.equipOutfit(/datum/outfit/changeling_space) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index d0abc0a045b3..65b80f0196d0 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -127,6 +127,7 @@ /obj/item/spear, /obj/item/tank/internals, ) + resistance_flags = FIRE_PROOF armor_type = /datum/armor/cloak_goliath hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath body_parts_covered = CHEST|GROIN|ARMS @@ -169,6 +170,7 @@ clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR transparent_protection = HIDEMASK + resistance_flags = FIRE_PROOF /datum/armor/cloakhood_goliath melee = 35 diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index beaa8b5c8808..f42d572cb6cd 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -101,6 +101,7 @@ desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." mech_sized = TRUE //save your ripley innate_accuracy_penalty = 6 + light_on = FALSE /obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) . = ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5448a3a98134..5706baa595bd 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -257,6 +257,9 @@ if((job.job_flags & JOB_ASSIGN_QUIRKS) && humanc && CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(humanc, humanc.client) + var/area/station/arrivals = GLOB.areas_by_type[/area/station/hallway/secondary/entry] + if(humanc && arrivals && !arrivals.power_environ) //arrivals depowered + humanc.put_in_hands(new /obj/item/crowbar/large/emergency(get_turf(humanc))) //if hands full then just drops on the floor log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) if(humanc) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 73f919b75e84..6b4c3c577e5e 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -119,13 +119,23 @@ if(speak_emote) speak_emote = string_list(speak_emote) - if(unsuitable_atmos_damage != 0) - //String assoc list returns a cached list, so this is like a static list to pass into the element below. - habitable_atmos = string_assoc_list(habitable_atmos) - AddElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage) + apply_atmos_requirements() + apply_temperature_requirements() + +/// Ensures this mob can take atmospheric damage if it's supposed to +/mob/living/basic/proc/apply_atmos_requirements() + if(unsuitable_atmos_damage == 0) + return + //String assoc list returns a cached list, so this is like a static list to pass into the element below. + habitable_atmos = string_assoc_list(habitable_atmos) + AddElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage) + +/// Ensures this mob can take temperature damage if it's supposed to +/mob/living/basic/proc/apply_temperature_requirements() + if(unsuitable_cold_damage == 0 && unsuitable_heat_damage == 0) + return + AddElement(/datum/element/basic_body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) - if(unsuitable_cold_damage != 0 && unsuitable_heat_damage != 0) - AddElement(/datum/element/basic_body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) /mob/living/basic/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() @@ -214,10 +224,24 @@ //monkestation edit /mob/living/basic/vv_edit_var(vname, vval) + switch(vname) + if(NAMEOF(src, habitable_atmos), NAMEOF(src, unsuitable_atmos_damage)) + RemoveElement(/datum/element/atmos_requirements, habitable_atmos, unsuitable_atmos_damage) + . = TRUE + if(NAMEOF(src, minimum_survivable_temperature), NAMEOF(src, maximum_survivable_temperature), NAMEOF(src, unsuitable_cold_damage), NAMEOF(src, unsuitable_heat_damage)) + RemoveElement(/datum/element/basic_body_temp_sensitive, minimum_survivable_temperature, maximum_survivable_temperature, unsuitable_cold_damage, unsuitable_heat_damage) + . = TRUE + . = ..() - if(vname == NAMEOF(src, speed)) - datum_flags |= DF_VAR_EDITED - set_varspeed(vval) + + switch(vname) + if(NAMEOF(src, habitable_atmos), NAMEOF(src, unsuitable_atmos_damage)) + apply_atmos_requirements() + if(NAMEOF(src, minimum_survivable_temperature), NAMEOF(src, maximum_survivable_temperature), NAMEOF(src, unsuitable_cold_damage), NAMEOF(src, unsuitable_heat_damage)) + apply_temperature_requirements() + if(NAMEOF(src, speed)) + datum_flags |= DF_VAR_EDITED + set_varspeed(vval) /mob/living/basic/proc/set_varspeed(var_value) speed = var_value diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm index d075bedd0af8..16805a3a02a0 100644 --- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm @@ -13,7 +13,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST basic_mob_flags = DEL_ON_DEATH speak_emote = list("warbles", "quavers") - faction = list(FACTION_MINING, FACTION_ASHWALKER) + faction = list(FACTION_ASHWALKER) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -32,6 +32,7 @@ /mob/living/basic/mining/gutlunch/Initialize(mapload) . = ..() + GLOB.gutlunch_count++ RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) if(greyscale_config) set_greyscale(colors = list(pick(possible_colors))) @@ -46,6 +47,10 @@ breed_timer = 3 MINUTES,\ ) +/mob/living/basic/mining/gutlunch/Destroy() + GLOB.gutlunch_count-- + return ..() + /mob/living/basic/mining/gutlunch/proc/pre_attack(mob/living/puncher, atom/target) SIGNAL_HANDLER @@ -109,7 +114,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/point_targeting/attack, - /datum/pet_command/point_targeting/breed, + /datum/pet_command/point_targeting/breed/gutlunch, /datum/pet_command/follow, /datum/pet_command/point_targeting/fetch, /datum/pet_command/mine_walls, diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm index 57893b294ce3..faf7a58b65fa 100644 --- a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm @@ -1,3 +1,4 @@ +#define MAXIMUM_GUTLUNCH_POP 20 /datum/ai_controller/basic_controller/gutlunch ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk @@ -13,11 +14,16 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate/check_faction, /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/make_babies, /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/befriend_ashwalkers, + /datum/ai_planning_subtree/make_babies/gutlunch, ) +/datum/ai_planning_subtree/make_babies/gutlunch/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(GLOB.gutlunch_count >= MAXIMUM_GUTLUNCH_POP) + return + return ..() + ///find ashwalkers and add them to the list of masters /datum/ai_planning_subtree/befriend_ashwalkers @@ -117,3 +123,14 @@ controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING controller.queue_behavior(/datum/ai_behavior/find_mineral_wall, BB_CURRENT_PET_TARGET) + +//pet commands +/datum/pet_command/point_targeting/breed/gutlunch + +/datum/pet_command/point_targeting/breed/gutlunch/set_command_target(mob/living/parent, atom/target) + if(GLOB.gutlunch_count >= MAXIMUM_GUTLUNCH_POP) + parent.balloon_alert_to_viewers("can't reproduce anymore!") + return + return ..() + +#undef MAXIMUM_GUTLUNCH_POP diff --git a/code/modules/mob/living/basic/pets/parrot/poly.dm b/code/modules/mob/living/basic/pets/parrot/poly.dm index 9deaff7a10b6..d5490389c434 100644 --- a/code/modules/mob/living/basic/pets/parrot/poly.dm +++ b/code/modules/mob/living/basic/pets/parrot/poly.dm @@ -187,6 +187,7 @@ butcher_results = list(/obj/item/ectoplasm = 1) ai_controller = /datum/ai_controller/basic_controller/parrot/ghost speech_probability_rate = 1 + resistance_flags = parent_type::resistance_flags | SHUTTLE_CRUSH_PROOF /mob/living/basic/parrot/poly/ghost/Initialize(mapload) // block anything and everything that could possibly happen with writing memory for ghosts diff --git a/code/modules/mob/living/basic/vermin/space_bat.dm b/code/modules/mob/living/basic/vermin/space_bat.dm index dc3c1b85aede..24718c8481ac 100644 --- a/code/modules/mob/living/basic/vermin/space_bat.dm +++ b/code/modules/mob/living/basic/vermin/space_bat.dm @@ -37,7 +37,7 @@ . = ..() AddElement(/datum/element/simple_flying) AddElement(/datum/element/ai_retaliate) - add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + add_traits(list(TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_NO_MIRROR_REFLECTION), INNATE_TRAIT) ///Controller for space bats, has nothing unique, just retaliation. /datum/ai_controller/basic_controller/space_bat diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 2afd66ff58fb..373398934a8b 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -98,7 +98,7 @@ //Blood loss still happens in locker, floor stays clean if(isturf(loc) && prob(sqrt(amt)*BLOOD_DRIP_RATE_MOD)) - add_splatter_floor(loc, (amt >= 10)) + add_splatter_floor(loc, (amt <= 10)) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 0de10eda4c9d..3dc3d08d3994 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -22,9 +22,6 @@ laws.set_laws_config() /obj/item/mmi/Destroy() - if(iscyborg(loc)) - var/mob/living/silicon/robot/borg = loc - borg.mmi = null set_mecha(null) QDEL_NULL(brainmob) QDEL_NULL(brain) diff --git a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm index 5a4fd7c20ff2..bbfd68f8186b 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm @@ -52,7 +52,7 @@ // update_icons() //Handled in update_transform(), leaving this here as a reminder update_transform() -/mob/living/carbon/alien/adult/perform_update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. +/mob/living/carbon/alien/adult/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. . = ..() update_icons() diff --git a/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm b/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm index 8e2c75647c53..185e7df2f0b0 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_update_icons.dm @@ -21,7 +21,7 @@ else icon_state = "larva[state]" -/mob/living/carbon/alien/larva/perform_update_transform() //All this is handled in update_icons() +/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() . = ..() update_icons() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 523c269e4346..360b479d0150 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -179,7 +179,7 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) . = TRUE - + if(length(diseases) && isliving(user)) var/mob/living/living = user var/block = living.check_contact_sterility(BODY_ZONE_EVERYTHING) @@ -196,7 +196,7 @@ if(length(contact) && !block) for(var/datum/disease/advanced/V as anything in contact) infect_disease(V, notes="(Skin Contact - (Bump), coming from [living])") - + for(var/datum/surgery/operations as anything in surgeries) if((user.istate & ISTATE_HARM)) @@ -226,7 +226,7 @@ var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - */ + */ if(!(user.istate & ISTATE_HARM)) help_shake_act(user) return FALSE @@ -459,6 +459,30 @@ null, span_hear("You hear the rustling of clothes."), DEFAULT_MESSAGE_RANGE, list(helper, src)) to_chat(helper, span_notice("You shake [src] trying to pick [p_them()] up!")) to_chat(src, span_notice("[helper] shakes you to get you up!")) + //Monkestation addition start: this is a port of #77651 which was closed, so I'm putting this as an addition + else if(helper.zone_selected == BODY_ZONE_PRECISE_MOUTH) //Boops + if(HAS_TRAIT(src, TRAIT_BADTOUCH) && prob(75)) + helper.visible_message(span_notice("[src] matrix dodges [helper]'s boop, holy shit!"), \ + null, span_hear("You hear a strange noise, like someone fighting for their life!"), DEFAULT_MESSAGE_RANGE, list(helper, src)) + to_chat(helper, span_notice("[src] matrix dodges your boop, holy shit!")) + to_chat(src, span_notice("[helper] tried to boop you but you avoid it with a matrix dodge, holy shit!")) + else if(istype(get_item_by_slot(ITEM_SLOT_MASK), /obj/item/clothing/mask/gas/clown_hat)) + playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) + helper.visible_message(span_notice("[helper] honks [src]'s nose"), \ + null, span_hear("You hear a honk!"), DEFAULT_MESSAGE_RANGE, list(helper, src)) + to_chat(helper, span_notice("You honk [src]'s nose.")) + to_chat(src, span_notice("[helper] honks your clown nose, honk! ")) + else if(src.dna.species.bodytype & BODYTYPE_SNOUTED) + helper.visible_message(span_notice("[helper] boops [src]'s snout."), \ + null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src)) + to_chat(helper, span_notice("You boop [src] on the snout.")) + to_chat(src, span_notice("[helper] boops you on the snout.")) + else + helper.visible_message(span_notice("[helper] boops [src]'s nose."), \ + null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src)) + to_chat(helper, span_notice("You boop [src] on the nose.")) + to_chat(src, span_notice("[helper] boops you on the nose.")) + //Monkestation addition end else if(check_zone(helper.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) //Headpats! helper.visible_message(span_notice("[helper] gives [src] a pat on the head to make [p_them()] feel better!"), \ null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src)) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 84dc1029808b..1274e321d8d0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -11,8 +11,8 @@ usable_hands = 0 //Populated on init through list/bodyparts mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT blocks_emissive = EMISSIVE_BLOCK_NONE - ///List of [/obj/item/organ/internal] in the mob. They don't go in the contents for some reason I don't want to know. - var/list/obj/item/organ/internal/organs = list() + ///List of [/obj/item/organ]s in the mob. They don't go in the contents for some reason I don't want to know. + var/list/obj/item/organ/organs = list() ///Same as [above][/mob/living/carbon/var/organs], but stores "slot ID" - "organ" pairs for easy access. var/list/organs_slot = list() ///How many dream images we have left to send @@ -61,7 +61,7 @@ var/gib_type = /obj/effect/decal/cleanable/blood/gibs - var/rotate_on_lying = 1 + rotate_on_lying = TRUE /// Gets filled up in [/datum/species/proc/replace_body]. /// Will either contain a list of typepaths if nothing has been created yet, diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index dc5c474d3968..84c5c42f289d 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -32,32 +32,6 @@ if(slot_flags & (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)) update_pockets() -//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/carbon/perform_update_transform() - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - if(lying_angle != lying_prev && rotate_on_lying) - changed++ - ntransform.TurnTo(lying_prev , lying_angle) - if(!lying_angle) //Lying to standing - final_pixel_y = base_pixel_y - else //if(lying != 0) - if(lying_prev == 0) //Standing to lying - pixel_y = base_pixel_y - final_pixel_y = base_pixel_y + PIXEL_Y_OFFSET_LYING - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - if(resize != RESIZE_DEFAULT_SIZE) - changed++ - ntransform.Scale(resize) - resize = RESIZE_DEFAULT_SIZE - - if(changed) - SEND_SIGNAL(src, COMSIG_PAUSE_FLOATING_ANIM, 0.3 SECONDS) - animate(src, transform = ntransform, time = (lying_prev == 0 || lying_angle == 0) ? 2 : 0, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT)) - /mob/living/carbon var/list/overlays_standing[TOTAL_LAYERS] diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index e3b95c01b388..9d3c3d308b14 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -324,9 +324,9 @@ GLOBAL_LIST_EMPTY(features_by_species) * Arguments: * * gender - The gender that the name should adhere to. Use MALE for male names, use anything else for female names. * * unique - If true, ensures that this new name is not a duplicate of anyone else's name currently on the station. - * * lastname - Does this species' naming system adhere to the last name system? Set to false if it doesn't. + * * last_name - Do we use a given last name or pick a random new one? */ -/datum/species/proc/random_name(gender,unique,lastname) +/datum/species/proc/random_name(gender, unique, last_name) if(unique) return random_unique_name(gender) @@ -336,8 +336,8 @@ GLOBAL_LIST_EMPTY(features_by_species) else randname = pick(GLOB.first_names_female) - if(lastname) - randname += " [lastname]" + if(last_name) + randname += " [last_name]" else randname += " [pick(GLOB.last_names)]" diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 2e8f56db51eb..ad321d93f1b5 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -761,6 +761,7 @@ generate/load female uniform sprites matching all previously decided variables female_uniform = NO_FEMALE_UNIFORM, override_state = null, override_file = null, + use_height_offset = TRUE, ) //Find a valid icon_state from variables+arguments @@ -789,7 +790,7 @@ generate/load female uniform sprites matching all previously decided variables //eg: ammo counters, primed grenade flashes, etc. var/list/worn_overlays = worn_overlays(standing, isinhands, file2use) if(worn_overlays?.len) - if(!isinhands && default_layer && ishuman(loc)) + if(!isinhands && default_layer && ishuman(loc) && use_height_offset) var/mob/living/carbon/human/human_loc = loc if(human_loc.get_mob_height() != HUMAN_HEIGHT_MEDIUM) var/string_form_layer = num2text(default_layer) diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 308ade654cfe..618154cd2e05 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -24,13 +24,11 @@ /mob/living/carbon/human/proc/on_gain_giant_trait(datum/source) SIGNAL_HANDLER - src.resize = 1.25 - src.update_transform() + src.update_transform(1.25) src.visible_message(span_danger("[src] suddenly grows!"), span_notice("Everything around you seems to shrink..")) /mob/living/carbon/human/proc/on_lose_giant_trait(datum/source) SIGNAL_HANDLER //We're leaving the size traits permanent until someone wants to separate the mutation from customization aspects - //src.resize = 0.8 - //src.update_transform() + //src.update_transform(0.8) //src.visible_message(span_danger("[src] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index c753e6b8eb5c..46e772a71fcd 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -14,6 +14,7 @@ TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, TRAIT_NOBLOOD, + TRAIT_NO_DNA_COPY, ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL 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 49c8a32db086..3cebd9f52233 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -18,6 +18,8 @@ inherent_traits = list( TRAIT_NOBREATH, TRAIT_NOHUNGER, + TRAIT_NO_MIRROR_REFLECTION, + /*TRAIT_USES_SKINTONES,*/ //monkestation temp removal, we dont have this refactor yet ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index fae78c27fc86..be431ccf31f8 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -6,6 +6,14 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(on_deathcoma_trait_loss)) + RegisterSignals(src, list( + SIGNAL_ADDTRAIT(TRAIT_FAKEDEATH), + SIGNAL_REMOVETRAIT(TRAIT_FAKEDEATH), + + SIGNAL_ADDTRAIT(TRAIT_DEFIB_BLACKLISTED), + SIGNAL_REMOVETRAIT(TRAIT_DEFIB_BLACKLISTED), + ), PROC_REF(update_medhud_on_signal)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_IMMOBILIZED), PROC_REF(on_immobilized_trait_loss)) @@ -67,7 +75,6 @@ if(stat <= UNCONSCIOUS) update_stat() - /// Called when [TRAIT_DEATHCOMA] is added to the mob. /mob/living/proc/on_deathcoma_trait_gain(datum/source) SIGNAL_HANDLER @@ -78,6 +85,11 @@ SIGNAL_HANDLER REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, TRAIT_DEATHCOMA) +/// Updates medhud when recieving relevant signals. +/mob/living/proc/update_medhud_on_signal(datum/source) + SIGNAL_HANDLER + med_hud_set_health() + med_hud_set_status() /// Called when [TRAIT_IMMOBILIZED] is added to the mob. /mob/living/proc/on_immobilized_trait_gain(datum/source) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b80ddec48250..da3bd02d854c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,7 +1,8 @@ /mob/living/Initialize(mapload) . = ..() stamina = new(src) - + if(current_size != RESIZE_DEFAULT_SIZE) + update_transform(current_size) AddElement(/datum/element/movetype_handler) register_init_signals() if(unique_name) @@ -431,19 +432,21 @@ if(GRAB_KILL) offset = GRAB_PIXEL_SHIFT_NECK M.setDir(get_dir(M, src)) + var/target_pixel_x = M.base_pixel_x + M.body_position_pixel_x_offset + var/target_pixel_y = M.base_pixel_y + M.body_position_pixel_y_offset switch(M.dir) if(NORTH) - animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y + offset, 3) + animate(M, pixel_x = target_pixel_x, pixel_y = target_pixel_y + offset, 3) if(SOUTH) - animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y - offset, 3) + animate(M, pixel_x = target_pixel_x, pixel_y = target_pixel_y - offset, 3) if(EAST) if(M.lying_angle == 270) //update the dragged dude's direction if we've turned M.set_lying_angle(90) - animate(M, pixel_x = M.base_pixel_x + offset, pixel_y = M.base_pixel_y, 3) + animate(M, pixel_x = target_pixel_x + offset, pixel_y = target_pixel_y, 3) if(WEST) if(M.lying_angle == 90) M.set_lying_angle(270) - animate(M, pixel_x = M.base_pixel_x - offset, pixel_y = M.base_pixel_y, 3) + animate(M, pixel_x = target_pixel_x - offset, pixel_y = target_pixel_y, 3) /mob/living/proc/reset_pull_offsets(mob/living/M, override) if(!override && M.buckled) @@ -671,8 +674,8 @@ return if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED)) return - set_lying_angle(0) set_body_position(STANDING_UP) + set_lying_angle(0) /mob/living/proc/rest_checks_callback() @@ -692,7 +695,8 @@ add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) if(HAS_TRAIT(src, TRAIT_FLOORED) && !(dir & (NORTH|SOUTH))) setDir(pick(NORTH, SOUTH)) // We are and look helpless. - body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING + if(rotate_on_lying) + body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING playsound(loc, 'goon/sounds/body_thud.ogg', ishuman(src) ? 40 : 15, 1, 0.3, mixer_channel = CHANNEL_MOB_SOUNDS) @@ -702,7 +706,13 @@ layer = initial(layer) remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) // Make sure it doesn't go out of the southern bounds of the tile when standing. - body_position_pixel_y_offset = (resize-1) * world.icon_size/2 + body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + +/// Returns what the body_position_pixel_y_offset should be if the current size were `value` +/mob/living/proc/get_pixel_y_offset_standing(value) + var/icon/living_icon = icon(icon) + var/height = living_icon.Height() + return (value-1) * height * 0.5 /mob/living/proc/update_density() if(HAS_TRAIT(src, TRAIT_UNDENSE)) @@ -1244,12 +1254,8 @@ loc_temp = ((1 - occupied_space.contents_thermal_insulation) * loc_temp) + (occupied_space.contents_thermal_insulation * bodytemperature) return loc_temp -/mob/living/cancel_camera() - ..() - cameraFollow = null - /// Checks if this mob can be actively tracked by cameras / AI. -/// Can optionally be passed a user, which is the mob tracking. +/// Can optionally be passed a user, which is the mob who is tracking src. /mob/living/proc/can_track(mob/living/user) //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end. if(SEND_SIGNAL(src, COMSIG_LIVING_CAN_TRACK, user) & COMPONENT_CANT_TRACK) @@ -1268,7 +1274,7 @@ if(invisibility || alpha == 0)//cloaked return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) - if(!near_camera(src)) + if(!GLOB.cameranet.checkCameraVis(src)) return FALSE return TRUE @@ -1376,8 +1382,7 @@ // Disconnect AI's in shells if(Robot.connected_ai) Robot.connected_ai.disconnect_shell() - if(Robot.mmi) - qdel(Robot.mmi) + QDEL_NULL(Robot.mmi) Robot.notify_ai(AI_NOTIFICATION_NEW_BORG) else for(var/obj/item/item in src) @@ -1857,6 +1862,11 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(NAMEOF(src, body_position)) set_body_position(var_value) . = TRUE + if(NAMEOF(src, current_size)) + if(var_value == 0) //prevents divisions of and by zero. + return FALSE + update_transform(var_value/current_size) + . = TRUE if(!isnull(.)) datum_flags |= DF_VAR_EDITED @@ -1867,8 +1877,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) switch(var_name) if(NAMEOF(src, maxHealth)) updatehealth() - if(NAMEOF(src, resize)) - update_transform() if(NAMEOF(src, lighting_cutoff)) sync_lighting_plane_cutoff() @@ -2331,8 +2339,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) /// Proc to append behavior to the condition of being floored. Called when the condition starts. /mob/living/proc/on_floored_start() if(body_position == STANDING_UP) //force them on the ground - set_lying_angle(pick(90, 270)) set_body_position(LYING_DOWN) + set_lying_angle(pick(90, 270)) on_fall() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 471dec0a9d2d..fc9ffb53cc45 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,8 +5,8 @@ hud_type = /datum/hud/living - ///Badminnery resize - var/resize = 1 + ///Tracks the current size of the mob in relation to its original size. Use update_transform(resize) to change it. + var/current_size = RESIZE_DEFAULT_SIZE var/lastattacker = null var/lastattackerckey = null @@ -61,6 +61,8 @@ VAR_PROTECTED/lying_angle = 0 /// Value of lying lying_angle before last change. TODO: Remove the need for this. var/lying_prev = 0 + /// Does the mob rotate when lying + var/rotate_on_lying = FALSE ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. var/last_special = 0 var/timeofdeath = 0 @@ -91,8 +93,6 @@ /// Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. var/now_pushing = null - var/cameraFollow = null - /// Time of death var/tod = null @@ -201,10 +201,12 @@ /// Is this mob allowed to be buckled/unbuckled to/from things? var/can_buckle_to = TRUE - ///The y amount a mob's sprite should be offset due to the current position they're in (e.g. lying down moves your sprite down) - var/body_position_pixel_x_offset = 0 ///The x amount a mob's sprite should be offset due to the current position they're in + var/body_position_pixel_x_offset = 0 + ///The y amount a mob's sprite should be offset due to the current position they're in or size (e.g. lying down moves your sprite down) var/body_position_pixel_y_offset = 0 + ///The height offset of a mob's maptext due to their current size. + var/body_maptext_height_offset = 0 /// FOV view that is applied from either nativeness or traits var/fov_view diff --git a/code/modules/mob/living/living_update_icons.dm b/code/modules/mob/living/living_update_icons.dm index be0d4daab7f2..a9e1a136800b 100644 --- a/code/modules/mob/living/living_update_icons.dm +++ b/code/modules/mob/living/living_update_icons.dm @@ -1,17 +1,66 @@ - -/// Called whenever the mob is to be resized or when lying/standing up for carbons. -/mob/living/update_transform() - perform_update_transform() // carbon mobs do it differently than silicons and simple animals. - SEND_SIGNAL(src, COMSIG_LIVING_POST_UPDATE_TRANSFORM) // ...and we want the signal to be sent last. - -/mob/living/proc/perform_update_transform() +/** + * Called whenever the mob is to be resized or when lying/standing up for carbons. + * IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. + */ +/mob/living/proc/update_transform(resize = RESIZE_DEFAULT_SIZE) var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/final_pixel_y = base_pixel_y + body_position_pixel_y_offset + /** + * pixel x/y/w/z all discard values after the decimal separator. + * That, coupled with the rendered interpolation, may make the + * icons look awfuller than they already are, or not, whatever. + * The solution to this nit is translating the missing decimals. + * also flooring increases the distance from 0 for negative numbers. + */ + var/abs_pixel_y_offset = 0 + var/translate = 0 + if(current_size != RESIZE_DEFAULT_SIZE) + var/standing_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(standing_offset) + translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(standing_offset) + var/final_dir = dir var/changed = FALSE + if(lying_angle != lying_prev && rotate_on_lying) + changed = TRUE + if(lying_angle && lying_prev == 0) + if(translate) + ntransform.Translate(0, -translate) + if(dir & (EAST|WEST)) //Standing to lying and facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + else if(translate && !lying_angle && lying_prev != 0) + ntransform.Translate(translate * (lying_prev == 270 ? -1 : 1), 0) + ///Done last, as it can mess with the translation. + ntransform.TurnTo(lying_prev, lying_angle) + if(resize != RESIZE_DEFAULT_SIZE) changed = TRUE + var/is_vertical = !lying_angle || !rotate_on_lying + ///scaling also affects translation, so we've to undo the old translate beforehand. + if(translate && is_vertical) + ntransform.Translate(0, -translate) ntransform.Scale(resize) - resize = RESIZE_DEFAULT_SIZE + current_size *= resize + //Update the height of the maptext according to the size of the mob so they don't overlap. + var/old_maptext_offset = body_maptext_height_offset + body_maptext_height_offset = initial(maptext_height) * (current_size - 1) * 0.5 + maptext_height += body_maptext_height_offset - old_maptext_offset + //Update final_pixel_y so our mob doesn't go out of the southern bounds of the tile when standing + if(is_vertical) //But not if the mob has been rotated. + //Make sure the body position y offset is also updated + body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(body_position_pixel_y_offset) + var/new_translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(body_position_pixel_y_offset) + if(new_translate) + ntransform.Translate(0, new_translate) + final_pixel_y = base_pixel_y + body_position_pixel_y_offset + + if(!changed) //Nothing has been changed, nothing has to be done. + return + + SEND_SIGNAL(src, COMSIG_PAUSE_FLOATING_ANIM, 0.3 SECONDS) + //if true, we want to avoid any animation time, it'll tween and not rotate at all otherwise. + var/is_opposite_angle = SIMPLIFY_DEGREES(lying_angle+180) == lying_prev + animate(src, transform = ntransform, time = is_opposite_angle ? 0 : UPDATE_TRANSFORM_ANIMATION_TIME, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT)) - if(changed) - animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT) + SEND_SIGNAL(src, COMSIG_LIVING_POST_UPDATE_TRANSFORM, resize, lying_angle, is_opposite_angle) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ce743b409ba8..a887550906bd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -44,7 +44,6 @@ var/obj/item/multitool/aiMulti ///Weakref to the bot the ai's commanding right now var/datum/weakref/bot_ref - var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever //MALFUNCTION @@ -64,7 +63,8 @@ var/camera_light_on = FALSE var/list/obj/machinery/camera/lit_cameras = list() - var/datum/trackable/track = new + ///The internal tool used to track players visible through cameras. + var/datum/trackable/ai_tracking_tool var/last_tablet_note_seen = null var/can_shunt = TRUE @@ -78,8 +78,8 @@ var/mob/camera/ai_eye/eyeobj var/sprint = 10 - var/cooldown = 0 - var/acceleration = 1 + var/last_moved = 0 + var/acceleration = TRUE var/obj/structure/ai_core/deactivated/linked_core //For exosuit control var/mob/living/silicon/robot/deployed_shell = null //For shell control @@ -195,6 +195,10 @@ builtInCamera = new (src) builtInCamera.network = list("ss13") + ai_tracking_tool = new(src) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_GLIDE_CHANGED, PROC_REF(tracked_glidesize_changed)) + add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_HANDS_BLOCKED), ROUNDSTART_TRAIT) alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z), camera_view = TRUE) @@ -207,7 +211,7 @@ switch(_key) if("`", "0") if(cam_prev) - cameraFollow = null //stop following something, we want to jump away. + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_prev) return if("1", "2", "3", "4", "5", "6", "7", "8", "9") @@ -218,7 +222,7 @@ return if(cam_hotkeys[_key]) //if this is false, no hotkey for this slot exists. cam_prev = eyeobj.loc - cameraFollow = null //stop following something, we want to jump away. + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_hotkeys[_key]) return return ..() @@ -234,6 +238,7 @@ QDEL_NULL(robot_control) QDEL_NULL(aiMulti) QDEL_NULL(alert_control) + QDEL_NULL(ai_tracking_tool) malfhack = null current = null bot_ref = null @@ -362,6 +367,26 @@ /mob/living/silicon/ai/cancel_camera() view_core() +/mob/living/silicon/ai/verb/ai_camera_track() + set name = "track" + set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass + + ai_tracking_tool.track_input(src) + +///Called when an AI finds their tracking target. +/mob/living/silicon/ai/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.setLoc(get_turf(target)) + else + view_core() + +/// Keeps our rate of gliding in step with the mob we're following +/mob/living/silicon/ai/proc/tracked_glidesize_changed(datum/trackable/source, mob/living/target, new_glide_size) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.glide_size = new_glide_size + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" @@ -480,24 +505,7 @@ else to_chat(src, span_notice("Unable to project to the holopad.")) if(href_list["track"]) - var/string = href_list["track"] - trackable_mobs() - var/list/trackeable = list() - trackeable += track.humans + track.others - var/list/target = list() - for(var/I in trackeable) - var/datum/weakref/to_resolve = trackeable[I] - var/mob/to_track = to_resolve.resolve() - if(!to_track || to_track.name != string) - continue - target += to_track - if(name == string) - target += src - if(length(target)) - cam_prev = get_turf(eyeobj) - ai_actual_track(pick(target)) - else - to_chat(src, "Target is not on or near any active cameras on the station.") + ai_tracking_tool.track_name(src, href_list["track"]) return if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list @@ -536,12 +544,12 @@ if(QDELETED(C)) return FALSE - if(!tracking) - cameraFollow = null - if(QDELETED(eyeobj)) view_core() return + + ai_tracking_tool.reset_tracking() + // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) return TRUE @@ -610,7 +618,7 @@ set category = "AI Commands" set name = "Jump To Network" unset_machine() - cameraFollow = null + ai_tracking_tool.reset_tracking() var/cameralist[0] if(incapacitated()) @@ -1076,7 +1084,6 @@ if(deployed_shell) //Forcibly call back AI in event of things such as damage, EMP or power loss. to_chat(src, span_danger("Your remote connection has been reset!")) deployed_shell.undeploy() - UnregisterSignal(deployed_shell, COMSIG_LIVING_DEATH) diag_hud_set_deployed() /mob/living/silicon/ai/resist() @@ -1121,6 +1128,14 @@ else if(.) REMOVE_TRAIT(src, TRAIT_INCAPACITATED, POWER_LACK_TRAIT) +/mob/living/silicon/ai/proc/show_camera_list() + var/list/cameras = get_camera_list(network) + var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) + if(isnull(camera)) + return + if(isnull(cameras[camera])) + return + switchCamera(cameras[camera]) /mob/living/silicon/on_handsblocked_start() return // AIs have no hands diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 52546c6109fe..03824857c4ef 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -6,30 +6,28 @@ // Will update all AI status displays with a blue screen of death INVOKE_ASYNC(src, PROC_REF(emote), "bsod") + if(!isnull(deployed_shell)) + disconnect_shell() + . = ..() cut_overlays() //remove portraits - var/old_icon = icon_state - if("[icon_state]_dead" in icon_states(icon)) - icon_state = "[icon_state]_dead" + var/base_icon = icon_state + if(icon_exists(icon, "[base_icon]_dead")) + icon_state = "[base_icon]_dead" else icon_state = "ai_dead" - if("[old_icon]_death_transition" in icon_states(icon)) - flick("[old_icon]_death_transition", src) - cameraFollow = null + if(icon_exists(icon, "[base_icon]_death_transition")) + flick("[base_icon]_death_transition", src) - set_anchored(FALSE) //unbolt floorbolts - status_flags |= CANPUSH //we want it to be pushable when unanchored on death - REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) //removes the anchor trait, because its not anchored anymore - move_resist = MOVE_FORCE_NORMAL - is_anchored = FALSE + if(is_anchored) + flip_anchored() if(eyeobj) eyeobj.setLoc(get_turf(src)) set_eyeobj_visible(FALSE) - GLOB.shuttle_caller_list -= src SSshuttle.autoEvac() @@ -41,12 +39,7 @@ if(explosive) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), loc, 3, 6, 12, null, 15), 1 SECONDS) - if(istype(loc, /obj/item/aicard/aitater)) - loc.icon_state = "aitater-404" - else if(istype(loc, /obj/item/aicard/aispook)) - loc.icon_state = "aispook-404" - else if(istype(loc, /obj/item/aicard)) - loc.icon_state = "aicard-404" + SSblackbox.ReportDeath(src) /mob/living/silicon/ai/proc/ShutOffDoomsdayDevice() if(nuking) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 9b72c455995b..a9ad9884045d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -165,9 +165,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) @@ -177,6 +178,16 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk + /obj/effect/overlay/camera_static name = "static" icon = null diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index e5390f9a3f07..0339a118c120 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -93,32 +93,33 @@ // It will also stream the chunk that the new loc is in. /mob/camera/ai_eye/proc/setLoc(destination, force_update = FALSE) - if(ai) - if(!isturf(ai.loc)) - return - destination = get_turf(destination) - if(!force_update && (destination == get_turf(src)) ) - return //we are already here! - if (destination) - abstract_move(destination) - else - moveToNullspace() - if(use_static) - ai.camera_visibility(src) - if(ai.client && !ai.multicam_on) - ai.client.set_eye(src) - update_ai_detect_hud() - update_parallax_contents() - //Holopad - if(istype(ai.current, /obj/machinery/holopad)) - var/obj/machinery/holopad/H = ai.current - if(!H.move_hologram(ai, destination)) - H.clear_holo(ai) - - if(ai.camera_light_on) - ai.light_cameras() - if(ai.master_multicam) - ai.master_multicam.refresh_view() + if(!ai) + return + if(!isturf(ai.loc)) + return + destination = get_turf(destination) + if(!force_update && (destination == get_turf(src))) + return //we are already here! + if (destination) + abstract_move(destination) + else + moveToNullspace() + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) + ai.client.set_eye(src) + update_ai_detect_hud() + update_parallax_contents() + //Holopad + if(istype(ai.current, /obj/machinery/holopad)) + var/obj/machinery/holopad/H = ai.current + if(!H.move_hologram(ai, destination)) + H.clear_holo(ai) + + if(ai.camera_light_on) + ai.light_cameras() + if(ai.master_multicam) + ai.master_multicam.refresh_view() /mob/camera/ai_eye/zMove(dir, turf/target, z_move_flags = NONE, recursions_left = 1, list/falling_movs) . = ..() @@ -149,37 +150,48 @@ return ..() /atom/proc/move_camera_by_click() - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - AI.cameraFollow = null - if (isturf(loc) || isturf(src)) - AI.eyeobj.setLoc(src) + if(!isAI(usr)) + return + var/mob/living/silicon/ai/AI = usr + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + AI.ai_tracking_tool.reset_tracking() + if (isturf(loc) || isturf(src)) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. - -/client/proc/AIMove(n, direct, mob/living/silicon/ai/user) - - var/initial = initial(user.sprint) - var/max_sprint = 50 - - if(user.cooldown && user.cooldown < world.timeofday) // 3 seconds - user.sprint = initial - - for(var/i = 0; i < max(user.sprint, initial); i += 20) - var/turf/step = get_turf(get_step(user.eyeobj, direct)) +#define SPRINT_PER_TICK 0.5 +#define MAX_SPRINT 50 +#define SPRINT_PER_STEP 20 +/mob/living/silicon/ai/proc/AIMove(direction) + if(last_moved && last_moved + 1 < world.timeofday) + // Decay sprint based off how long it took us to input this next move + var/missed_sprint = max((world.timeofday + 1) - last_moved, 0) * SPRINT_PER_TICK + sprint = max(sprint - missed_sprint * 7, initial(sprint)) + + // We move a full step, at least. Can't glide more with our current movement mode, so this is how I have to live + var/step_count = 0 + for(var/i = 0; i < max(sprint, initial(sprint)); i += SPRINT_PER_STEP) + step_count += 1 + var/turf/step = get_turf(get_step(eyeobj, direction)) if(step) - user.eyeobj.setLoc(step) + eyeobj.setLoc(step) + + // I'd like to make this scale with the steps we take, but it like, just can't + // So we're doin this instead + eyeobj.glide_size = world.icon_size - user.cooldown = world.timeofday + 5 - if(user.acceleration) - user.sprint = min(user.sprint + 0.5, max_sprint) + last_moved = world.timeofday + if(acceleration) + sprint = min(sprint + SPRINT_PER_TICK, MAX_SPRINT) else - user.sprint = initial + sprint = initial(sprint) + + ai_tracking_tool.reset_tracking() - if(!user.tracking) - user.cameraFollow = null +#undef SPRINT_PER_STEP +#undef MAX_SPRINT +#undef SPRINT_PER_TICK // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -188,7 +200,8 @@ H.clear_holo(src) else current = null - cameraFollow = null + if(ai_tracking_tool) + ai_tracking_tool.reset_tracking() unset_machine() if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) @@ -227,7 +240,7 @@ /mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() - if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) + if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker)) ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) /obj/effect/overlay/ai_detect_hud diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index bf29bf5f771e..81026bf11b99 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -3,9 +3,9 @@ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") /mob/living/silicon/robot/dust(just_ash, drop_items, force) - if(mmi) - qdel(mmi) - ..() + // You do not get MMI'd if you are dusted + QDEL_NULL(mmi) + return ..() /mob/living/silicon/robot/spawn_dust() new /obj/effect/decal/remains/robot(loc) @@ -16,7 +16,9 @@ /mob/living/silicon/robot/death(gibbed) if(stat == DEAD) return - if(!gibbed) + if(gibbed) + dump_into_mmi() + else logevent("FATAL -- SYSTEM HALT") modularInterface.shutdown_computer() . = ..() diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 76106a375666..f4d9f147b18b 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -73,7 +73,9 @@ var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() if(program) - program.force_full_update() + var/datum/tgui/active_ui = SStgui.get_open_ui(src, program.computer) + if(active_ui) + active_ui.send_full_update() picturesync() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3ec455370b5b..8962ff842c99 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -89,18 +89,6 @@ alert_control.listener.RegisterSignal(src, COMSIG_LIVING_DEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) alert_control.listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) -/mob/living/silicon/robot/model/syndicate/Initialize(mapload) - . = ..() - laws = new /datum/ai_laws/syndicate_override() - addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 5) - -/mob/living/silicon/robot/model/syndicate/create_modularInterface() - if(!modularInterface) - modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) - modularInterface.saved_identification = real_name - modularInterface.saved_job = "Cyborg" - return ..() - /mob/living/silicon/robot/set_suicide(suicide_state) . = ..() if(mmi) @@ -128,30 +116,12 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() - var/atom/T = drop_location()//To hopefully prevent run time errors. - if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - if(T) - mmi.forceMove(T) - if(mmi.brainmob) - if(mmi.brainmob.stat == DEAD) - mmi.brainmob.set_stat(CONSCIOUS) - mind.transfer_to(mmi.brainmob) - mmi.update_appearance() - else - to_chat(src, span_boldannounce("Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.")) - ghostize() - stack_trace("Borg MMI lacked a brainmob") - mmi = null - if(modularInterface) - QDEL_NULL(modularInterface) if(connected_ai) set_connected_ai(null) if(shell) GLOB.available_ai_shells -= src - else - if(T && istype(radio) && istype(radio.keyslot)) - radio.keyslot.forceMove(T) - radio.keyslot = null + + QDEL_NULL(modularInterface) QDEL_NULL(wires) QDEL_NULL(model) QDEL_NULL(eye_lights) @@ -162,7 +132,8 @@ QDEL_NULL(spark_system) QDEL_NULL(alert_control) QDEL_LIST(upgrades) - cell = null + QDEL_NULL(cell) + QDEL_NULL(robot_suit) return ..() /mob/living/silicon/robot/Topic(href, href_list) @@ -309,8 +280,9 @@ /mob/living/silicon/robot/proc/after_tip_over(mob/user) - if(hat) + if(hat && !HAS_TRAIT(hat, TRAIT_NODROP)) hat.forceMove(drop_location()) + unbuckle_all_mobs() ///For any special cases for robots after being righted. @@ -530,52 +502,62 @@ lampButton?.update_appearance() update_icons() -/mob/living/silicon/robot/proc/deconstruct() +/mob/living/silicon/robot/proc/cyborg_deconstruct() SEND_SIGNAL(src, COMSIG_BORG_SAFE_DECONSTRUCT) if(shell) undeploy() - var/turf/T = get_turf(src) + var/turf/drop_to = drop_location() if (robot_suit) - robot_suit.forceMove(T) - robot_suit.l_leg.forceMove(T) - robot_suit.l_leg = null - robot_suit.r_leg.forceMove(T) - robot_suit.r_leg = null - new /obj/item/stack/cable_coil(T, robot_suit.chest.wired) - robot_suit.chest.forceMove(T) - robot_suit.chest.wired = FALSE - robot_suit.chest = null - robot_suit.l_arm.forceMove(T) - robot_suit.l_arm = null - robot_suit.r_arm.forceMove(T) - robot_suit.r_arm = null - robot_suit.head.forceMove(T) - robot_suit.head.flash1.forceMove(T) - robot_suit.head.flash1.burn_out() - robot_suit.head.flash1 = null - robot_suit.head.flash2.forceMove(T) - robot_suit.head.flash2.burn_out() - robot_suit.head.flash2 = null - robot_suit.head = null - robot_suit.update_appearance() + robot_suit.drop_all_parts(drop_to) + else - new /obj/item/robot_suit(T) - new /obj/item/bodypart/leg/left/robot(T) - new /obj/item/bodypart/leg/right/robot(T) - new /obj/item/stack/cable_coil(T, 1) - new /obj/item/bodypart/chest/robot(T) - new /obj/item/bodypart/arm/left/robot(T) - new /obj/item/bodypart/arm/right/robot(T) - new /obj/item/bodypart/head/robot(T) - var/b - for(b=0, b != 2, b++) - var/obj/item/assembly/flash/handheld/F = new /obj/item/assembly/flash/handheld(T) - F.burn_out() - if (cell) //Sanity check. - cell.forceMove(T) - cell = null + new /obj/item/robot_suit(drop_to) + new /obj/item/bodypart/leg/left/robot(drop_to) + new /obj/item/bodypart/leg/right/robot(drop_to) + new /obj/item/stack/cable_coil(drop_to, 1) + new /obj/item/bodypart/chest/robot(drop_to) + new /obj/item/bodypart/arm/left/robot(drop_to) + new /obj/item/bodypart/arm/right/robot(drop_to) + new /obj/item/bodypart/head/robot(drop_to) + for(var/i in 1 to 2) + var/obj/item/assembly/flash/handheld/borgeye = new(drop_to) + borgeye.burn_out() + + cell?.forceMove(drop_to) // Cell can be null, if removed beforehand + radio?.keyslot?.forceMove(drop_to) + radio?.keyslot = null + + dump_into_mmi(drop_to) + qdel(src) + +/// Dumps the current occupant of the cyborg into an MMI at the passed location +/// Returns the borg's MMI on success +/mob/living/silicon/robot/proc/dump_into_mmi(atom/at_location = drop_location()) + if(isnull(mmi)) + return + + var/obj/item/mmi/removing = mmi + mmi.forceMove(at_location) // Nulls it out via exited + + if(isnull(mind)) // no one to transfer, just leave the MMI. + return mmi + + if(removing.brainmob) + if(removing.brainmob.stat == DEAD) + removing.brainmob.set_stat(CONSCIOUS) + mind.transfer_to(removing.brainmob) + removing.update_appearance() + + else + to_chat(src, span_boldannounce("Oops! Something went very wrong, your MMI was unable to receive your mind. \ + You have been ghosted. Please make a bug report so we can fix this bug.")) + ghostize() + stack_trace("Borg MMI lacked a brainmob") + + return mmi + /mob/living/silicon/robot/proc/notify_ai(notifytype, oldname, newname) if(!connected_ai) return @@ -730,9 +712,8 @@ hud_used.update_robot_modules_display() if (hasExpanded) - resize = 0.5 hasExpanded = FALSE - update_transform() + update_transform(0.5) logevent("Chassis model has been reset.") log_silicon("CYBORG: [key_name(src)] has reset their cyborg model.") model.transform_to(/obj/item/robot_model) @@ -746,9 +727,6 @@ return TRUE -/mob/living/silicon/robot/model/syndicate/ResetModel() - return - /mob/living/silicon/robot/proc/has_model() if(!model || model.type == /obj/item/robot_model) . = FALSE @@ -781,11 +759,17 @@ *Drones and pAIs might do this, after all. */ /mob/living/silicon/robot/Exited(atom/movable/gone, direction) - if(hat && hat == gone) + . = ..() + if(hat == gone) hat = null if(!QDELETED(src)) //Don't update icons if we are deleted. update_icons() - return ..() + + if(gone == cell) + cell = null + + if(gone == mmi) + mmi = null ///Use this to add upgrades to robots. It'll register signals for when the upgrade is moved or deleted, if not single use. /mob/living/silicon/robot/proc/add_to_upgrades(obj/item/borg/upgrade/new_upgrade, mob/user) @@ -899,15 +883,16 @@ /datum/action/innate/undeployment/Trigger(trigger_flags) if(!..()) return FALSE - var/mob/living/silicon/robot/R = owner + var/mob/living/silicon/robot/shell_to_disconnect = owner - R.undeploy() + shell_to_disconnect.undeploy() return TRUE /mob/living/silicon/robot/proc/undeploy() if(!deployed || !mind || !mainframe) return + mainframe.UnregisterSignal(src, COMSIG_LIVING_DEATH) mainframe.redeploy_action.Grant(mainframe) mainframe.redeploy_action.last_used_shell = src mind.transfer_to(mainframe) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 88cb1f2f0164..e9df047a1864 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -234,7 +234,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real cell.add_fingerprint(user) user.put_in_active_hand(cell) to_chat(user, span_notice("You remove \the [cell].")) - cell = null update_icons() diag_hud_set_borgcell() @@ -306,9 +305,9 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real spark_system.start() return to_chat(user, span_notice("You start to unfasten [src]'s securing bolts...")) - if(tool.use_tool(src, user, 50, volume=50) && !cell) + if(tool.use_tool(src, user, 5 SECONDS, volume = 50) && !cell) user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!")) - deconstruct() + cyborg_deconstruct() return /mob/living/silicon/robot/fire_act() diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 10b923d762bb..308a7a838c6e 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -202,10 +202,26 @@ cell = /obj/item/stock_parts/cell/hyper radio = /obj/item/radio/borg/syndicate +/mob/living/silicon/robot/model/syndicate/Initialize(mapload) + laws = new /datum/ai_laws/syndicate_override() + laws.associate(src) + . = ..() + addtimer(CALLBACK(src, PROC_REF(show_playstyle)), 0.5 SECONDS) + +/mob/living/silicon/robot/model/syndicate/create_modularInterface() + if(!modularInterface) + modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) + modularInterface.saved_identification = real_name + modularInterface.saved_job = "Cyborg" + return ..() + /mob/living/silicon/robot/model/syndicate/proc/show_playstyle() if(playstyle_string) to_chat(src, playstyle_string) +/mob/living/silicon/robot/model/syndicate/ResetModel() + return + /mob/living/silicon/robot/model/syndicate/medical icon_state = "synd_medical" playstyle_string = "You are a Syndicate medical cyborg!
\ diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index ccdabed241ab..87cd48e346ff 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -283,7 +283,7 @@ var/mob/living/silicon/robot/cyborg = loc if(cyborg.hat) cyborg.hat.forceMove(drop_location()) - cyborg.hat = null + cyborg.cut_overlays() cyborg.setDir(SOUTH) do_transform_delay() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 438fcc669f39..e4c1b704b0c7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -103,13 +103,6 @@ modularInterface.saved_job = "Cyborg" return ..() -/mob/living/silicon/robot/model/syndicate/create_modularInterface() - if(!modularInterface) - modularInterface = new /obj/item/modular_computer/pda/silicon/cyborg/syndicate(src) - modularInterface.saved_job = "Cyborg" - return ..() - - /mob/living/silicon/med_hud_set_health() return //we use a different hud @@ -461,7 +454,9 @@ modularInterface.borglog += "[station_time_timestamp()] - [string]" var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() if(program) - program.force_full_update() + var/datum/tgui/active_ui = SStgui.get_open_ui(src, program.computer) + if(active_ui) + active_ui.send_full_update() /// Same as the normal character name replacement, but updates the contents of the modular interface. /mob/living/silicon/fully_replace_character_name(oldname, newname) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 2d91afb67753..0990edfcc8f9 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -81,8 +81,7 @@ /mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload) . = ..() - resize = 0.8 - update_transform() + update_transform(0.8) /mob/living/simple_animal/bot/secbot/pingsky name = "Officer Pingsky" diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 691003fc4f12..8b063fed11fe 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -537,13 +537,12 @@ /// Induces fake death on a living mob. /mob/living/proc/fakedeath(source, silent = FALSE) - if(stat == DEAD) - return - if(!silent) - emote("deathgasp") - add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) - tod = station_time_timestamp() + if(stat != DEAD) + if(!silent) + emote("deathgasp") + tod = station_time_timestamp() + add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) ///Unignores all slowdowns that lack the IGNORE_NOSLOW flag. /mob/living/proc/unignore_slowdown(source) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 85cbfa556968..5dfdfcc0b78e 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -56,9 +56,11 @@ //Handle the exit here if(HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING) && istype(loc, /obj/machinery/atmospherics) && movement_type & VENTCRAWLING) - visible_message(span_notice("[src] begins climbing out from the ventilation system..."), span_notice("You begin climbing out from the ventilation system...")) + to_chat(src, span_notice("You begin climbing out from the ventilation system...")) if(has_client && isnull(client)) return + if(!do_after(src, 1 SECONDS, target = ventcrawl_target)) + return visible_message(span_notice("[src] scrambles out from the ventilation ducts!"),span_notice("You scramble out from the ventilation ducts.")) forceMove(ventcrawl_target.loc) REMOVE_TRAIT(src, TRAIT_MOVE_VENTCRAWLING, VENTCRAWLING_TRAIT) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index fd7c0cda9268..47f315130b64 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -84,7 +84,7 @@ if(mob.stat == DEAD) mob.ghostize() return FALSE - if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE) & COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE) + if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, new_loc, direct) & COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE) return FALSE var/mob/living/L = mob //Already checked for isliving earlier @@ -96,7 +96,8 @@ return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) - return AIMove(new_loc,direct,mob) + var/mob/living/silicon/ai/smoovin_ai = mob + return smoovin_ai.AIMove(direct) if(Process_Grab()) //are we restrained by someone's grip? return diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index bd17424d8482..b8b84f8782af 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -12,9 +12,6 @@ /mob/proc/update_icons() return -/mob/proc/update_transform() - return - ///Updates the handcuff overlay & HUD element. /mob/proc/update_worn_handcuffs() return diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index c9de59af0e25..2be75c7d0c65 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -143,14 +143,12 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /obj/item/modular_computer/proc/install_default_programs() SHOULD_CALL_PARENT(FALSE) for(var/programs in default_programs + starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs store_file(program_type) /obj/item/modular_computer/Destroy() STOP_PROCESSING(SSobj, src) - wipe_program(forced = TRUE) - for(var/datum/computer_file/program/idle as anything in idle_threads) - idle.kill_program(TRUE) + close_all_programs() //Some components will actually try and interact with this, so let's do it later QDEL_NULL(soundloop) QDEL_LIST(stored_files) @@ -457,7 +455,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar enabled = TRUE update_appearance() if(open_ui) - ui_interact(user) + update_tablet_open_uis(user) return TRUE else // Unpowered if(issynth) @@ -480,20 +478,14 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar active_program.event_networkfailure(FALSE) // Active program requires NTNet to run but we've just lost connection. Crash. for(var/datum/computer_file/program/idle_programs as anything in idle_threads) - if(idle_programs.program_state == PROGRAM_STATE_KILLED) - idle_threads.Remove(idle_programs) - continue idle_programs.process_tick(seconds_per_tick) idle_programs.ntnet_status = get_ntnet_status() if(idle_programs.requires_ntnet && !idle_programs.ntnet_status) idle_programs.event_networkfailure(TRUE) if(active_program) - if(active_program.program_state == PROGRAM_STATE_KILLED) - active_program = null - else - active_program.process_tick(seconds_per_tick) - active_program.ntnet_status = get_ntnet_status() + active_program.process_tick(seconds_per_tick) + active_program.ntnet_status = get_ntnet_status() handle_power(seconds_per_tick) // Handles all computer power interaction @@ -575,23 +567,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar data["PC_showexitprogram"] = !!active_program // Hides "Exit Program" button on mainscreen return data -///Wipes the computer's current program. Doesn't handle any of the niceties around doing this -/obj/item/modular_computer/proc/wipe_program(forced) - if(!active_program) - return - active_program.kill_program(forced) - active_program = null - -// Relays kill program request to currently active program. Use this to quit current program. -/obj/item/modular_computer/proc/kill_program(forced = FALSE) - wipe_program(forced) - var/mob/user = usr - if(user && istype(user)) - //Here to prevent programs sleeping in destroy - INVOKE_ASYNC(src, TYPE_PROC_REF(/datum, ui_interact), user) // Re-open the UI on this computer. It should show the main screen now. - update_appearance() - -/obj/item/modular_computer/proc/open_program(mob/user, datum/computer_file/program/program) +/obj/item/modular_computer/proc/open_program(mob/user, datum/computer_file/program/program, open_ui = TRUE) if(program.computer != src) CRASH("tried to open program that does not belong to this computer") @@ -601,11 +577,12 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar // The program is already running. Resume it. if(program in idle_threads) - program.program_state = PROGRAM_STATE_ACTIVE active_program = program program.alert_pending = FALSE idle_threads.Remove(program) - update_appearance() + if(open_ui) + update_tablet_open_uis(user) + update_appearance(UPDATE_ICON) return TRUE if(!program.is_supported_by_hardware(hardware_flag, 1, user)) @@ -624,8 +601,9 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar active_program = program program.alert_pending = FALSE - update_appearance() - ui_interact(user) + if(open_ui) + update_tablet_open_uis(user) + update_appearance(UPDATE_ICON) return TRUE // Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on) @@ -657,10 +635,13 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return SSmodular_computers.add_log("[src]: [text]") -/obj/item/modular_computer/proc/shutdown_computer(loud = 1) - kill_program(forced = TRUE) - for(var/datum/computer_file/program/idle_program in idle_threads) - idle_program.kill_program(forced = TRUE) +/obj/item/modular_computer/proc/close_all_programs() + active_program = null + for(var/datum/computer_file/program/idle as anything in idle_threads) + idle_threads.Remove(idle) + +/obj/item/modular_computer/proc/shutdown_computer(loud = TRUE) + close_all_programs() if(looping_sound) soundloop.stop() if(physical && loud) diff --git a/code/modules/modular_computers/computers/item/computer_files.dm b/code/modules/modular_computers/computers/item/computer_files.dm index 8299247c5ea8..296f5be09925 100644 --- a/code/modules/modular_computers/computers/item/computer_files.dm +++ b/code/modules/modular_computers/computers/item/computer_files.dm @@ -14,11 +14,9 @@ if(file_storing in stored_files) return FALSE - SEND_SIGNAL(file_storing, COMSIG_MODULAR_COMPUTER_FILE_ADDING) file_storing.computer = src - stored_files.Add(file_storing) used_capacity += file_storing.size - SEND_SIGNAL(file_storing, COMSIG_MODULAR_COMPUTER_FILE_ADDED) + SEND_SIGNAL(file_storing, COMSIG_MODULAR_COMPUTER_FILE_STORE, src) return TRUE /** @@ -35,15 +33,12 @@ return FALSE if(istype(file_removing, /datum/computer_file/program)) var/datum/computer_file/program/program_file = file_removing - if(program_file.program_state != PROGRAM_STATE_KILLED) - program_file.kill_program(TRUE) - if(program_file.program_state == PROGRAM_STATE_ACTIVE) - active_program = null + program_file.kill_program() - SEND_SIGNAL(file_removing, COMSIG_MODULAR_COMPUTER_FILE_DELETING) stored_files.Remove(file_removing) used_capacity -= file_removing.size SEND_SIGNAL(file_removing, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + qdel(file_removing) return TRUE /** diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index bea16f18546c..6b6230ed0d4c 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -23,12 +23,13 @@ // Used in following function to reduce copypaste /obj/item/modular_computer/proc/power_failure() - if(enabled) // Shut down the computer - if(active_program) - active_program.event_powerfailure(background = FALSE) - for(var/datum/computer_file/program/programs as anything in idle_threads) - programs.event_powerfailure(background = TRUE) - shutdown_computer(0) + if(!enabled) // Shut down the computer + return + if(active_program) + active_program.event_powerfailure() + for(var/datum/computer_file/program/programs as anything in idle_threads) + programs.event_powerfailure() + shutdown_computer(loud = FALSE) // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged /obj/item/modular_computer/proc/handle_power(seconds_per_tick) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 697371c91d8c..e8e6001413d9 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -1,3 +1,35 @@ +/** + * update_tablet_open_uis + * + * Will search the user to see if they have the tablet open. + * If they don't, we'll open a new UI depending on the tab the tablet is meant to be on. + * If they do, we'll update the interface and title, then update all static data and re-send assets. + * + * This is best called when you're actually changing the app, as we don't check + * if we're swapping to the current UI repeatedly. + * Args: + * user - The person whose UI we're updating. + */ +/obj/item/modular_computer/proc/update_tablet_open_uis(mob/user) + var/datum/tgui/active_ui = SStgui.get_open_ui(user, src) + if(!active_ui) + if(active_program) + active_ui = new(user, src, active_program.tgui_id, active_program.filedesc) + active_program.ui_interact(user, active_ui) + else + active_ui = new(user, src, "NtosMain") + return active_ui.open() + + if(active_program) + active_ui.interface = active_program.tgui_id + active_ui.title = active_program.filedesc + active_program.ui_interact(user, active_ui) + else + active_ui.interface = "NtosMain" + + active_ui.send_assets() + update_static_data_for_all_viewers() + /obj/item/modular_computer/interact(mob/user) if(enabled) ui_interact(user) @@ -23,23 +55,7 @@ ui = SStgui.try_update_ui(user, src, ui) if(!ui) - if(active_program) - ui = new(user, src, active_program.tgui_id, active_program.filedesc) - else - ui = new(user, src, "NtosMain") - ui.open() - return - - var/old_open_ui = ui.interface - if(active_program) - ui.interface = active_program.tgui_id - ui.title = active_program.filedesc - else - ui.interface = "NtosMain" - //opened a new UI - if(old_open_ui != ui.interface) - update_static_data(user, ui) - ui.send_assets() + update_tablet_open_uis(user) /obj/item/modular_computer/ui_assets(mob/user) var/list/data = list() @@ -49,14 +65,12 @@ return data /obj/item/modular_computer/ui_static_data(mob/user) - . = ..() var/list/data = list() if(active_program) data += active_program.ui_static_data(user) return data data["show_imprint"] = istype(src, /obj/item/modular_computer/pda) - return data /obj/item/modular_computer/ui_data(mob/user) @@ -65,6 +79,11 @@ data += active_program.ui_data(user) return data + data["pai"] = inserted_pai + data["has_light"] = has_light + data["light_on"] = light_on + data["comp_light_color"] = comp_light_color + data["login"] = list( IDName = saved_identification || "Unknown", IDJob = saved_job || "Unknown", @@ -93,10 +112,6 @@ "alert" = program.alert_pending, )) - data["has_light"] = has_light - data["light_on"] = light_on - data["comp_light_color"] = comp_light_color - data["pai"] = inserted_pai return data // Handles user's GUI input @@ -105,18 +120,15 @@ if(.) return - if(ishuman(usr) && !allow_chunky) //in /datum/computer_file/program/ui_act() too + if(ishuman(usr) && !allow_chunky) var/mob/living/carbon/human/human_user = usr if(human_user.check_chunky_fingers()) balloon_alert(human_user, "fingers are too big!") return TRUE - if(active_program) - active_program.ui_act(action, params, ui, state) - switch(action) if("PC_exit") - kill_program() + active_program.kill_program(usr) return TRUE if("PC_shutdown") shutdown_computer() @@ -124,32 +136,27 @@ if("PC_minimize") if(!active_program) return - //header programs can't be minimized. - if(active_program.header_program) - kill_program() - return TRUE - - idle_threads.Add(active_program) - active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs - - active_program = null - update_appearance() + active_program.background_program() + return TRUE if("PC_killprogram") var/prog = params["name"] var/datum/computer_file/program/killed_program = find_file_by_name(prog) - if(!istype(killed_program) || killed_program.program_state == PROGRAM_STATE_KILLED) + if(!istype(killed_program)) return - killed_program.kill_program(forced = TRUE) + killed_program.kill_program(usr) to_chat(usr, span_notice("Program [killed_program.filename].[killed_program.filetype] with PID [rand(100,999)] has been killed.")) + return TRUE if("PC_runprogram") open_program(usr, find_file_by_name(params["name"])) + return TRUE if("PC_toggle_light") - return toggle_flashlight() + toggle_flashlight() + return TRUE if("PC_light_color") var/mob/user = usr @@ -161,7 +168,8 @@ if(is_color_dark(new_color, 50) ) //Colors too dark are rejected to_chat(user, span_warning("That color is too dark! Choose a lighter one.")) new_color = null - return set_flashlight_color(new_color) + set_flashlight_color(new_color) + return TRUE if("PC_Eject_Disk") var/param = params["name"] @@ -205,9 +213,17 @@ update_appearance(UPDATE_ICON) if("interact") inserted_pai.attack_self(usr) - return UI_UPDATE + return TRUE + + if(active_program) + return active_program.ui_act(action, params, ui, state) /obj/item/modular_computer/ui_host() if(physical) return physical return src + +/obj/item/modular_computer/ui_close(mob/user) + . = ..() + if(active_program) + active_program.ui_close(user) diff --git a/code/modules/modular_computers/computers/item/disks/computer_disk.dm b/code/modules/modular_computers/computers/item/disks/computer_disk.dm index bd652a31c8e4..041abf341d0d 100644 --- a/code/modules/modular_computers/computers/item/disks/computer_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/computer_disk.dm @@ -17,7 +17,7 @@ /obj/item/computer_disk/Initialize(mapload) . = ..() for(var/programs in starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs add_file(program_type) /obj/item/computer_disk/Destroy(force) @@ -47,6 +47,7 @@ return FALSE stored_files.Remove(file) used_capacity -= file.size + qdel(file) return TRUE /obj/item/computer_disk/advanced diff --git a/code/modules/modular_computers/computers/item/disks/unique_disks.dm b/code/modules/modular_computers/computers/item/disks/unique_disks.dm new file mode 100644 index 000000000000..144fa52c65af --- /dev/null +++ b/code/modules/modular_computers/computers/item/disks/unique_disks.dm @@ -0,0 +1,8 @@ +/obj/item/computer_disk/syndicate + name = "golden data disk" + desc = "A data disk with some high-tech programs, probably expensive as hell." + icon_state = "datadisk8" + custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) + +/obj/item/computer_disk/syndicate/camera_app + starting_programs = list(/datum/computer_file/program/secureye/syndicate) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index ba7128a29fff..69d4f445ed04 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -1,19 +1,18 @@ -/obj/machinery/modular_computer/console/preset +/obj/machinery/modular_computer/preset ///List of programs the computer starts with, given on Initialize. var/list/datum/computer_file/starting_programs = list() -/obj/machinery/modular_computer/console/preset/Initialize(mapload) +/obj/machinery/modular_computer/preset/Initialize(mapload) . = ..() if(!cpu) return for(var/programs in starting_programs) - var/datum/computer_file/program/program_type = new programs + var/datum/computer_file/program_type = new programs cpu.store_file(program_type) // ===== ENGINEERING CONSOLE ===== -/obj/machinery/modular_computer/console/preset/engineering - console_department = "Engineering" +/obj/machinery/modular_computer/preset/engineering name = "engineering console" desc = "A stationary computer. This one comes preloaded with engineering programs." starting_programs = list( @@ -23,8 +22,7 @@ ) // ===== RESEARCH CONSOLE ===== -/obj/machinery/modular_computer/console/preset/research - console_department = "Research" +/obj/machinery/modular_computer/preset/research name = "research director's console" desc = "A stationary computer. This one comes preloaded with research programs." starting_programs = list( @@ -36,8 +34,7 @@ ) // ===== COMMAND CONSOLE ===== -/obj/machinery/modular_computer/console/preset/command - console_department = "Command" +/obj/machinery/modular_computer/preset/command name = "command console" desc = "A stationary computer. This one comes preloaded with command programs." starting_programs = list( @@ -46,8 +43,7 @@ ) // ===== IDENTIFICATION CONSOLE ===== -/obj/machinery/modular_computer/console/preset/id - console_department = "Identification" +/obj/machinery/modular_computer/preset/id name = "identification console" desc = "A stationary computer. This one comes preloaded with identification modification programs." starting_programs = list( @@ -57,17 +53,16 @@ /datum/computer_file/program/crew_manifest, ) -/obj/machinery/modular_computer/console/preset/id/centcom +/obj/machinery/modular_computer/preset/id/centcom desc = "A stationary computer. This one comes preloaded with CentCom identification modification programs." -/obj/machinery/modular_computer/console/preset/id/centcom/Initialize(mapload) +/obj/machinery/modular_computer/preset/id/centcom/Initialize(mapload) . = ..() var/datum/computer_file/program/card_mod/card_mod_centcom = cpu.find_file_by_name("plexagonidwriter") card_mod_centcom.is_centcom = TRUE // ===== CIVILIAN CONSOLE ===== -/obj/machinery/modular_computer/console/preset/civilian - console_department = "Civilian" +/obj/machinery/modular_computer/preset/civilian name = "civilian console" desc = "A stationary computer. This one comes preloaded with generic programs." starting_programs = list( @@ -76,8 +71,7 @@ ) // curator -/obj/machinery/modular_computer/console/preset/curator - console_department = "Civilian" +/obj/machinery/modular_computer/preset/curator name = "curator console" desc = "A stationary computer. This one comes preloaded with art programs." starting_programs = list( @@ -85,49 +79,51 @@ ) // ===== CARGO CHAT CONSOLES ===== -/obj/machinery/modular_computer/console/preset/cargochat +/obj/machinery/modular_computer/preset/cargochat name = "cargo chatroom console" desc = "A stationary computer. This one comes preloaded with a chatroom for your cargo requests." starting_programs = list( /datum/computer_file/program/chatclient, ) -/obj/machinery/modular_computer/console/preset/cargochat/Initialize(mapload) + ///Used in Initialize to set the chat client name. + var/console_department + +/obj/machinery/modular_computer/preset/cargochat/Initialize(mapload) . = ..() var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") chatprogram.username = "[lowertext(console_department)]_department" - chatprogram.program_state = PROGRAM_STATE_ACTIVE cpu.active_program = chatprogram -/obj/machinery/modular_computer/console/preset/cargochat/service +/obj/machinery/modular_computer/preset/cargochat/service console_department = "Service" -/obj/machinery/modular_computer/console/preset/cargochat/engineering +/obj/machinery/modular_computer/preset/cargochat/engineering console_department = "Engineering" -/obj/machinery/modular_computer/console/preset/cargochat/science +/obj/machinery/modular_computer/preset/cargochat/science console_department = "Science" -/obj/machinery/modular_computer/console/preset/cargochat/security +/obj/machinery/modular_computer/preset/cargochat/security console_department = "Security" -/obj/machinery/modular_computer/console/preset/cargochat/medical +/obj/machinery/modular_computer/preset/cargochat/medical console_department = "Medical" //ONE PER MAP PLEASE, IT MAKES A CARGOBUS FOR EACH ONE OF THESE -/obj/machinery/modular_computer/console/preset/cargochat/cargo +/obj/machinery/modular_computer/preset/cargochat/cargo console_department = "Cargo" name = "department chatroom console" desc = "A stationary computer. This one comes preloaded with a chatroom for incoming cargo requests. You may moderate it from this computer." -/obj/machinery/modular_computer/console/preset/cargochat/cargo/LateInitialize() +/obj/machinery/modular_computer/preset/cargochat/cargo/LateInitialize() . = ..() var/datum/computer_file/program/chatclient/chatprogram = cpu.find_file_by_name("ntnrc_client") chatprogram.username = "cargo_requests_operator" var/datum/ntnet_conversation/cargochat = chatprogram.create_new_channel("#cargobus", strong = TRUE) - for(var/obj/machinery/modular_computer/console/preset/cargochat/cargochat_console in GLOB.machines) + for(var/obj/machinery/modular_computer/preset/cargochat/cargochat_console in GLOB.machines) if(cargochat_console == src) continue var/datum/computer_file/program/chatclient/other_chatprograms = cargochat_console.cpu.find_file_by_name("ntnrc_client") diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 3cd0e341f0d2..e85b4edc197d 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -1,20 +1,18 @@ -// Modular Computer - device that runs various programs and operates with hardware -// DO NOT SPAWN THIS TYPE. Use /laptop/ or /console/ instead. +// Modular Computer - A machinery that is mostly just a host to the Modular Computer item. /obj/machinery/modular_computer name = "modular computer" desc = "You shouldn't see this. If you do, report it." //they should be examining the processor instead - - // Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..) - // must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently - // If you create a program which is limited to Laptops and Consoles you don't have to add it's icon_state overlay for Tablets too, for example. icon = 'icons/obj/modular_console.dmi' - icon_state = null - + icon_state = "console" idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 + density = TRUE + max_integrity = 300 + integrity_failure = 0.5 + ///The power cell, null by default as we use the APC we're in var/internal_cell = null ///A flag that describes this device type - var/hardware_flag = NONE + var/hardware_flag = PROGRAM_CONSOLE ///Power usage during last tick var/last_power_usage = 0 /// Amount of programs that can be ran at once @@ -22,9 +20,9 @@ ///Icon state when the computer is turned off. - var/icon_state_unpowered = null + var/icon_state_unpowered = "console-off" ///Icon state when the computer is turned on. - var/icon_state_powered = null + var/icon_state_powered = "console" ///Icon state overlay when the computer is turned on, but no program is loaded that would override the screen. var/screen_icon_state_menu = "menu" ///Icon state overlay when the computer is powered, but not 'switched on'. @@ -32,11 +30,11 @@ ///Amount of steel sheets refunded when disassembling an empty frame of this computer. var/steel_sheet_cost = 10 ///Light luminosity when turned on - var/light_strength = 0 + var/light_strength = 2 ///Power usage when the computer is open (screen is active) and can be interacted with. - var/base_active_power_usage = 100 + var/base_active_power_usage = 500 ///Power usage when the computer is idle and screen is off (currently only applies to laptops) - var/base_idle_power_usage = 10 + var/base_idle_power_usage = 100 ///CPU that handles most logic while this type only handles power and other specific things. var/obj/item/modular_computer/processor/cpu @@ -45,6 +43,8 @@ . = ..() cpu = new(src) cpu.physical = src + cpu.screen_on = TRUE + update_appearance() /obj/machinery/modular_computer/Destroy() QDEL_NULL(cpu) diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm deleted file mode 100644 index 2cbcb5ffdea8..000000000000 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ /dev/null @@ -1,24 +0,0 @@ -/obj/machinery/modular_computer/console - name = "console" - desc = "A stationary computer." - - icon = 'icons/obj/modular_console.dmi' - icon_state = "console" - icon_state_powered = "console" - icon_state_unpowered = "console-off" - hardware_flag = PROGRAM_CONSOLE - density = TRUE - base_idle_power_usage = 100 - base_active_power_usage = 500 - steel_sheet_cost = 10 - light_strength = 2 - max_integrity = 300 - integrity_failure = 0.5 - ///Used in New() to set network tag according to our area. - var/console_department = "" - -/obj/machinery/modular_computer/console/Initialize(mapload) - . = ..() - if(cpu) - cpu.screen_on = TRUE - update_appearance() diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 09325a09707b..b26df2bf475f 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -19,14 +19,12 @@ /datum/computer_file/New() ..() uid = file_uid++ - RegisterSignal(src, COMSIG_MODULAR_COMPUTER_FILE_ADDED, PROC_REF(on_install)) + RegisterSignal(src, COMSIG_MODULAR_COMPUTER_FILE_STORE, PROC_REF(on_install)) /datum/computer_file/Destroy(force) if(computer) - computer.remove_file(src) computer = null if(disk_host) - disk_host.remove_file(src) disk_host = null return ..() @@ -52,9 +50,9 @@ return temp ///Called post-installation of an application in a computer, after 'computer' var is set. -/datum/computer_file/proc/on_install() +/datum/computer_file/proc/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) SIGNAL_HANDLER - return + computer_installing.stored_files.Add(src) /** * Called when examining a modular computer @@ -87,8 +85,8 @@ * Arguments: * * background - Whether the app is running in the background. */ -/datum/computer_file/program/proc/event_powerfailure(background) - kill_program(forced = TRUE) +/datum/computer_file/program/proc/event_powerfailure() + kill_program() /** * Called when a computer program is crashing due to any required connection being shut off. @@ -96,7 +94,7 @@ * * background - Whether the app is running in the background. */ /datum/computer_file/program/proc/event_networkfailure(background) - kill_program(forced = TRUE) + kill_program() if(background) computer.visible_message(span_danger("\The [computer]'s screen displays a \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error")) else diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 71b5c6173ae2..92fab95c8605 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -7,8 +7,6 @@ var/list/required_access = list() /// List of required access to download or file host the program. Any match will do. var/list/transfer_access = list() - /// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running. - var/program_state = PROGRAM_STATE_KILLED /// User-friendly name of this program. var/filedesc = "Unknown Program" /// Short description of this program's function. @@ -43,6 +41,8 @@ var/alert_pending = FALSE /// How well this program will help combat detomatix viruses. var/detomatix_resistance = NONE + ///Boolean on whether or not only one copy of the app can exist. This means it deletes itself when cloned elsewhere. + var/unique_copy = FALSE /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() @@ -51,8 +51,17 @@ temp.program_icon_state = program_icon_state temp.requires_ntnet = requires_ntnet temp.usage_flags = usage_flags + if(unique_copy) + if(computer) + computer.remove_file(src) + if(disk_host) + disk_host.remove_file(src) return temp +///We are not calling parent as it's handled by the computer itself, this is only called after. +/datum/computer_file/program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + SHOULD_CALL_PARENT(FALSE) + // Relays icon update to the computer. /datum/computer_file/program/proc/update_computer_icon() if(computer) @@ -154,23 +163,43 @@ if(requires_ntnet) var/obj/item/card/id/ID = computer.computer_id_slot?.GetID() generate_network_log("Connection opened -- Program ID:[filename] User:[ID?"[ID.registered_name]":"None"]") - program_state = PROGRAM_STATE_ACTIVE return TRUE return FALSE /** * Kills the running program * - * Use this proc to kill the program. Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. - * Arguments: - * * forced - Boolean to determine if this was a forced close. Should be TRUE if the user did not willingly close the program. + * Use this proc to kill the program. + * Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. + * Args: + * - user - If there's a user, this is the person killing the program. **/ -/datum/computer_file/program/proc/kill_program(forced = FALSE) +/datum/computer_file/program/proc/kill_program(mob/user) SHOULD_CALL_PARENT(TRUE) - program_state = PROGRAM_STATE_KILLED + + if(src == computer.active_program) + computer.active_program = null + if(computer.enabled) + computer.update_tablet_open_uis(usr) if(src in computer.idle_threads) computer.idle_threads.Remove(src) + if(requires_ntnet) var/obj/item/card/id/ID = computer.computer_id_slot?.GetID() generate_network_log("Connection closed -- Program ID: [filename] User:[ID ? "[ID.registered_name]" : "None"]") + + computer.update_appearance(UPDATE_ICON) + return TRUE + +///Sends the running program to the background/idle threads. Header programs can't be minimized and will kill instead. +/datum/computer_file/program/proc/background_program() + SHOULD_CALL_PARENT(TRUE) + if(header_program) + return kill_program() + + computer.idle_threads.Add(src) + computer.active_program = null + + computer.update_tablet_open_uis(usr) + computer.update_appearance(UPDATE_ICON) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 0fac55e26b11..4f24b2c61d87 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -30,7 +30,7 @@ examine_text += span_info("Alt-click to eject the intelliCard.") return examine_text -/datum/computer_file/program/ai_restorer/kill_program(forced) +/datum/computer_file/program/ai_restorer/kill_program(mob/user) try_eject(forced = TRUE) return ..() @@ -98,11 +98,7 @@ return TRUE -/datum/computer_file/program/ai_restorer/ui_act(action, params) - . = ..() - if(.) - return - +/datum/computer_file/program/ai_restorer/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_beginReconstruction") if(!stored_card || !stored_card.AI) diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index f3cb91bc2920..e1205f92c6a8 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -51,6 +51,6 @@ . = ..(user) GLOB.alarmdisplay += src -/datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE) +/datum/computer_file/program/alarm_monitor/kill_program() GLOB.alarmdisplay -= src return ..() diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 0a80f1834eae..339dd3175ebe 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -32,18 +32,14 @@ target = null error = "Connection to destination relay lost." -/datum/computer_file/program/ntnet_dos/kill_program(forced = FALSE) +/datum/computer_file/program/ntnet_dos/kill_program(mob/user) if(target) target.dos_sources.Remove(src) target = null executed = FALSE + return ..() - ..() - -/datum/computer_file/program/ntnet_dos/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/ntnet_dos/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/relays as anything in GLOB.ntnet_relays) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 172fdc7fc42e..88aa48d0c312 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -39,10 +39,7 @@ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread spark_system.start() -/datum/computer_file/program/revelation/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/revelation/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_arm") armed = !armed diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 70e12343c2f3..a51d3345d101 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -94,11 +94,7 @@ return data /datum/computer_file/program/arcade/ui_act(action, list/params) - . = ..() - if(.) - return usr.played_game() - var/gamerSkillLevel = 0 var/gamerSkill = 0 if(usr?.mind) diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index b0a7c08a049e..6264531428f3 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -68,9 +68,6 @@ return data /datum/computer_file/program/atmosscan/ui_act(action, list/params) - . = ..() - if(.) - return switch(action) if("scantoggle") if(atmozphere_mode == ATMOZPHERE_SCAN_CLICK) diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 99e5db50c740..6385d9997dde 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -19,7 +19,7 @@ DL_source = null return ..() -/datum/computer_file/program/borg_monitor/kill_program(forced = FALSE) +/datum/computer_file/program/borg_monitor/kill_program(mob/user) loglist = null //Not everything is saved if you close an app DL_source = null DL_progress = 0 @@ -99,15 +99,10 @@ ) data["cyborgs"] += list(cyborg_data) data["DL_progress"] = DL_progress - data["borglog"] = loglist - return data -/datum/computer_file/program/borg_monitor/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/borg_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("messagebot") var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm index 9d2e227702f7..746737c9b849 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -58,9 +58,6 @@ return data /datum/computer_file/program/bounty_board/ui_act(action, list/params) - . = ..() - if(.) - return var/current_ref_num = params["request"] var/current_app_num = params["applicant"] var/datum/bank_account/request_target diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 1fd4eecd83d7..4386f612b53e 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -121,18 +121,31 @@ if(SSshuttle.supply_blocked) message = blockade_warning data["message"] = message - data["cart"] = list() - for(var/datum/supply_order/SO in SSshuttle.shopping_list) - data["cart"] += list(list( - "cost_type" = SO.cost_type, - "object" = SO.pack.name, - "cost" = SO.pack.get_cost(), - "id" = SO.id, - "orderer" = SO.orderer, - "paid" = !isnull(SO.paying_account), //paid by requester - "dep_order" = !!SO.department_destination, - "can_be_cancelled" = SO.can_be_cancelled, + var/cart_list = list() + for(var/datum/supply_order/order in SSshuttle.shopping_list) + if(cart_list[order.pack.name]) + cart_list[order.pack.name][1]["amount"]++ + cart_list[order.pack.name][1]["cost"] += order.get_final_cost() + if(order.department_destination) + cart_list[order.pack.name][1]["dep_order"]++ + if(!isnull(order.paying_account)) + cart_list[order.pack.name][1]["paid"]++ + continue + + cart_list[order.pack.name] = list(list( + "cost_type" = order.cost_type, + "object" = order.pack.name, + "cost" = order.get_final_cost(), + "id" = order.id, + "amount" = 1, + "orderer" = order.orderer, + "paid" = !isnull(order.paying_account) ? 1 : 0, //number of orders purchased privatly + "dep_order" = order.department_destination ? 1 : 0, //number of orders purchased by a department + "can_be_cancelled" = order.can_be_cancelled, )) + data["cart"] = list() + for(var/item_id in cart_list) + data["cart"] += cart_list[item_id] data["requests"] = list() for(var/datum/supply_order/SO in SSshuttle.request_list) @@ -147,9 +160,6 @@ return data /datum/computer_file/program/budgetorders/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("send") if(!SSshuttle.supply.canMove()) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index b1c51a8c5586..1f974f862fcc 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -79,7 +79,7 @@ return FALSE computer.crew_manifest_update = TRUE -/datum/computer_file/program/card_mod/kill_program(forced) +/datum/computer_file/program/card_mod/kill_program(mob/user) computer.crew_manifest_update = FALSE var/obj/item/card/id/inserted_auth_card = computer.computer_id_slot if(inserted_auth_card) @@ -87,10 +87,7 @@ return ..() -/datum/computer_file/program/card_mod/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/card_mod/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) var/mob/user = usr var/obj/item/card/id/inserted_auth_card = computer.computer_id_slot diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm index 9e8c6430af10..462c17aba706 100644 --- a/code/modules/modular_computers/file_system/programs/cargoship.dm +++ b/code/modules/modular_computers/file_system/programs/cargoship.dm @@ -27,9 +27,6 @@ return data /datum/computer_file/program/shipping/ui_act(action, list/params) - . = ..() - if(.) - return if(!computer.computer_id_slot) //We need an ID to successfully run return FALSE diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index a69791ae4da1..e0f261730012 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -17,9 +17,6 @@ return data /datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("PRG_print") if(computer) //This option should never be called if there is no printer diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index 377f469518c7..50fa29ccd5c4 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -13,10 +13,7 @@ var/open_file var/error -/datum/computer_file/program/filemanager/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/filemanager/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_deletefile") var/datum/computer_file/file = computer.find_file_by_name(params["name"]) @@ -60,6 +57,8 @@ var/datum/computer_file/F = computer.find_file_by_name(params["name"]) if(!F) return + if(computer.find_file_by_name(params["name"], computer.inserted_disk)) + return var/datum/computer_file/C = F.clone(FALSE) computer.inserted_disk.add_file(C) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/frontier.dm b/code/modules/modular_computers/file_system/programs/frontier.dm index 9e33256da74e..778fbab578ea 100644 --- a/code/modules/modular_computers/file_system/programs/frontier.dm +++ b/code/modules/modular_computers/file_system/programs/frontier.dm @@ -164,10 +164,7 @@ data["purchaseableBoosts"][partner.type] += node_id return data -/datum/computer_file/program/scipaper_program/ui_act(action, params) - . = ..() - if (.) - return +/datum/computer_file/program/scipaper_program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("et_alia") paper_to_be.et_alia = !paper_to_be.et_alia diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index 6c091a4a4f9d..cb059cf9663e 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -15,7 +15,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/change_position_cooldown = 30 ///Jobs blacklisted from having their slots edited. - var/list/blacklisted = list( + var/static/list/blacklisted = list( JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, @@ -36,7 +36,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/list/opened_positions = list() /datum/computer_file/program/job_management/New() - ..() + . = ..() change_position_cooldown = CONFIG_GET(number/id_console_jobslot_delay) @@ -67,9 +67,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /datum/computer_file/program/job_management/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return var/obj/item/card/id/user_id = computer.computer_id_slot if(!user_id || !(ACCESS_CHANGE_IDS in user_id.access)) return TRUE diff --git a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm index 39edf659cffa..25a2d1ad941b 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm @@ -7,7 +7,4 @@ /datum/computer_file/program/maintenance filetype = "MNT" available_on_ntnet = FALSE - -/datum/computer_file/program/maintenance/clone(rename = FALSE) - . = ..() - qdel(src) + unique_copy = TRUE diff --git a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm index 548dda4a750a..50276a1bcd81 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/camera.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/camera.dm @@ -49,9 +49,6 @@ return data /datum/computer_file/program/maintenance/camera/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return var/mob/living/user = usr switch(action) if("print_photo") diff --git a/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm index 77dfc8f4c284..9f8971fb7fa5 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/modsuit.dm @@ -42,7 +42,4 @@ return controlled_suit?.ui_static_data() /datum/computer_file/program/maintenance/modsuit_control/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - controlled_suit.ui_act(action, params, ui, state) + return controlled_suit?.ui_act(action, params, ui, state) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm b/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm index 5162aa7ddc0d..4c332d0d7d80 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/phys_scanner.dm @@ -18,9 +18,11 @@ var/mob/living/carbon/carbon = tapped_atom carbon.visible_message(span_notice("[user] analyzes [tapped_atom]'s vitals.")) last_record = healthscan(user, carbon, 1, tochat = FALSE) + var/datum/tgui/active_ui = SStgui.get_open_ui(user, computer) + if(active_ui) + active_ui.send_full_update(force = TRUE) -/datum/computer_file/program/maintenance/phys_scanner/ui_data(mob/user) +/datum/computer_file/program/maintenance/phys_scanner/ui_static_data(mob/user) var/list/data = list() - data["last_record"] = last_record return data diff --git a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm index 0248997e7954..fe6a25f15b1d 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/themes.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/themes.dm @@ -32,7 +32,6 @@ theme_app.imported_themes += theme_name theme_app.size += size qdel(src) - return ..() /datum/computer_file/program/maintenance/theme/cat theme_name = CAT_THEME_NAME diff --git a/code/modules/modular_computers/file_system/programs/newscasterapp.dm b/code/modules/modular_computers/file_system/programs/newscasterapp.dm index 0f0861ad9f1a..47e4f65d48f0 100644 --- a/code/modules/modular_computers/file_system/programs/newscasterapp.dm +++ b/code/modules/modular_computers/file_system/programs/newscasterapp.dm @@ -22,16 +22,10 @@ return ..() /datum/computer_file/program/newscaster/ui_data(mob/user) - var/list/data = list() - data += newscaster_ui.ui_data(user) - return data + return newscaster_ui.ui_data(user) /datum/computer_file/program/newscaster/ui_static_data(mob/user) - var/list/data = newscaster_ui.ui_static_data(user) - return data + return newscaster_ui.ui_static_data(user) -/datum/computer_file/program/newscaster/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - return newscaster_ui.ui_act(action, params, ui) +/datum/computer_file/program/newscaster/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) + return newscaster_ui.ui_act(action, params, ui, state) diff --git a/code/modules/modular_computers/file_system/programs/notepad.dm b/code/modules/modular_computers/file_system/programs/notepad.dm index aa5cbf94f35d..2e1eb52add5e 100644 --- a/code/modules/modular_computers/file_system/programs/notepad.dm +++ b/code/modules/modular_computers/file_system/programs/notepad.dm @@ -13,13 +13,10 @@ bringing you the best in electronics and software since 2467!" /datum/computer_file/program/notepad/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("UpdateNote") written_note = params["newnote"] - return UI_UPDATE + return TRUE /datum/computer_file/program/notepad/ui_data(mob/user) var/list/data = list() diff --git a/code/modules/modular_computers/file_system/programs/nt_pay.dm b/code/modules/modular_computers/file_system/programs/nt_pay.dm index 0204f704fe5b..bec8cebc05e1 100644 --- a/code/modules/modular_computers/file_system/programs/nt_pay.dm +++ b/code/modules/modular_computers/file_system/programs/nt_pay.dm @@ -18,9 +18,6 @@ var/wanted_token /datum/computer_file/program/nt_pay/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("Transaction") token = params["token"] diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 852987dc4400..efa61b2630cd 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -98,10 +98,7 @@ download_netspeed = NTNETSPEED_ETHERNET download_completion += download_netspeed -/datum/computer_file/program/ntnetdownload/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/ntnetdownload/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_downloadfile") if(!downloaded_file) @@ -150,7 +147,7 @@ "installed" = !!computer.find_file_by_name(programs.filename), "compatible" = check_compatibility(programs), "size" = programs.size, - "access" = (computer.obj_flags & EMAGGED) && programs.available_on_syndinet ? TRUE : programs.can_run(user,transfer = TRUE, access = access), + "access" = (computer.obj_flags & EMAGGED) && programs.available_on_syndinet ? TRUE : programs.can_run(user, transfer = TRUE, access = access), "verifiedsource" = programs.available_on_ntnet, )) @@ -165,6 +162,6 @@ return TRUE return FALSE -/datum/computer_file/program/ntnetdownload/kill_program(forced) +/datum/computer_file/program/ntnetdownload/kill_program(mob/user) abort_file_download() return ..() diff --git a/code/modules/modular_computers/file_system/programs/ntmessenger.dm b/code/modules/modular_computers/file_system/programs/ntmessenger.dm index e40dd4eaacb1..bb6bcaad592a 100644 --- a/code/modules/modular_computers/file_system/programs/ntmessenger.dm +++ b/code/modules/modular_computers/file_system/programs/ntmessenger.dm @@ -3,7 +3,6 @@ filedesc = "Direct Messenger" category = PROGRAM_CATEGORY_MISC program_icon_state = "command" - program_state = PROGRAM_STATE_BACKGROUND extended_desc = "This program allows old-school communication with other modular devices." size = 0 undeletable = TRUE // It comes by default in tablets, can't be downloaded, takes no space and should obviously not be able to be deleted. @@ -105,9 +104,6 @@ return GLOB.default_state /datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("PDA_ringSet") var/new_ringtone = tgui_input_text(usr, "Enter a new ringtone", "Ringtone", ringtone, MESSENGER_RINGTONE_MAX_LENGTH) @@ -119,27 +115,27 @@ return ringtone = new_ringtone - return UI_UPDATE + return TRUE if("PDA_ringer_status") ringer_status = !ringer_status - return UI_UPDATE + return TRUE if("PDA_sAndR") sending_and_receiving = !sending_and_receiving - return UI_UPDATE + return TRUE if("PDA_viewMessages") viewing_messages = !viewing_messages - return UI_UPDATE + return TRUE if("PDA_clearMessages") messages = list() - return UI_UPDATE + return TRUE if("PDA_changeSortStyle") sort_by_job = !sort_by_job - return UI_UPDATE + return TRUE if("PDA_sendEveryone") if(!sending_and_receiving) @@ -158,7 +154,7 @@ if(targets.len > 0) send_message(usr, targets, TRUE) - return UI_UPDATE + return TRUE if("PDA_sendMessage") if(!sending_and_receiving) @@ -182,19 +178,20 @@ var/obj/item/computer_disk/virus/disk = computer.inserted_disk if(istype(disk)) disk.send_virus(computer, target, usr) - return UI_UPDATE + update_static_data(usr, ui) + return TRUE send_message(usr, list(target)) - return UI_UPDATE + return TRUE if("PDA_clearPhoto") saved_image = null photo_path = null - return UI_UPDATE + return TRUE if("PDA_toggleVirus") sending_virus = !sending_virus - return UI_UPDATE + return TRUE if("PDA_selectPhoto") if(!issilicon(usr)) @@ -210,18 +207,15 @@ return TRUE /datum/computer_file/program/messenger/ui_static_data(mob/user) - var/list/data = ..() - + var/list/data = list() data["owner"] = computer.saved_identification - data["sortByJob"] = sort_by_job - data["isSilicon"] = issilicon(user) - return data /datum/computer_file/program/messenger/ui_data(mob/user) var/list/data = list() - data["messages"] = messages + data["sortByJob"] = sort_by_job + data["isSilicon"] = issilicon(user) data["messengers"] = ScrubMessengerList() data["ringer_status"] = ringer_status data["sending_and_receiving"] = sending_and_receiving @@ -233,7 +227,6 @@ if(disk && istype(disk)) data["virus_attach"] = TRUE data["sending_virus"] = sending_virus - return data ////////////////////// @@ -420,7 +413,7 @@ if(!computer.turn_on(usr, open_ui = FALSE)) return if(computer.active_program != src) - if(!computer.open_program(usr, src)) + if(!computer.open_program(usr, src, open_ui = FALSE)) return if(!href_list["close"] && usr.can_perform_action(computer, FORBID_TELEKINESIS_REACH)) switch(href_list["choice"]) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 3e7b8f19f134..aa780fc3cf8e 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -31,8 +31,10 @@ ///Cooldown timer between pings. COOLDOWN_DECLARE(ping_cooldown) -/datum/computer_file/program/chatclient/New() - username = "DefaultUser[rand(100, 999)]" +/datum/computer_file/program/chatclient/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) + . = ..() + if(!username) + username = "DefaultUser[rand(100, 999)]" /datum/computer_file/program/chatclient/Destroy() for(var/datum/ntnet_conversation/discussion as anything in conversations) @@ -47,10 +49,7 @@ active_channel = new_converstaion.id return new_converstaion -/datum/computer_file/program/chatclient/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/chatclient/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) var/datum/ntnet_conversation/channel = SSmodular_computers.get_chat_channel_by_id(active_channel) var/authed = FALSE if(channel && ((channel.channel_operator == src) || netadmin_mode)) @@ -101,13 +100,13 @@ if(netadmin_mode) netadmin_mode = FALSE channel?.add_client(src) - return UI_UPDATE + return TRUE var/mob/living/user = usr - if(can_run(user, TRUE, ACCESS_NETWORK)) + if(can_run(user, TRUE, list(ACCESS_NETWORK))) for(var/datum/ntnet_conversation/channels as anything in SSmodular_computers.chat_channels) channels.remove_client(src) netadmin_mode = TRUE - return UI_UPDATE + return TRUE if("PRG_changename") var/newname = reject_bad_chattext(params["new_name"], USERNAME_SIZE) newname = replacetext(newname, " ", "_") @@ -117,7 +116,7 @@ if(src in anychannel.active_clients) anychannel.add_status_message("[username] is now known as [newname].") username = newname - return UI_UPDATE + return TRUE if("PRG_savelog") if(!channel) return @@ -179,7 +178,7 @@ /datum/computer_file/program/chatclient/process_tick(seconds_per_tick) . = ..() var/datum/ntnet_conversation/channel = SSmodular_computers.get_chat_channel_by_id(active_channel) - if(program_state != PROGRAM_STATE_KILLED) + if(src in computer.idle_threads) ui_header = "ntnrc_idle.gif" if(channel) // Remember the last message. If there is no message in the channel remember null. @@ -201,7 +200,7 @@ channel.offline_clients.Remove(src) channel.active_clients.Add(src) -/datum/computer_file/program/chatclient/kill_program(forced = FALSE) +/datum/computer_file/program/chatclient/kill_program(mob/user) for(var/datum/ntnet_conversation/channel as anything in SSmodular_computers.chat_channels) channel.go_offline(src) active_channel = null @@ -209,16 +208,11 @@ /datum/computer_file/program/chatclient/ui_static_data(mob/user) var/list/data = list() - data["can_admin"] = can_run(user, FALSE, ACCESS_NETWORK) data["selfref"] = REF(src) //used to verify who is you, as usernames can be copied. - data["username"] = username - data["adminmode"] = netadmin_mode return data /datum/computer_file/program/chatclient/ui_data(mob/user) var/list/data = list() - if(!SSmodular_computers.chat_channels) - return data var/list/all_channels = list() for(var/datum/ntnet_conversation/conversations as anything in SSmodular_computers.chat_channels) @@ -244,7 +238,8 @@ authed = TRUE clients.Add(list(list( "name" = channel_client.username, - "status" = channel_client.program_state, + "online" = (channel_client == channel_client.computer.active_program), + "away" = (channel_client in channel_client.computer.idle_threads), "muted" = (channel_client in channel.muted_clients), "operator" = (channel.channel_operator == channel_client), "ref" = REF(channel_client), @@ -261,6 +256,9 @@ data["messages"] = messages data["is_operator"] = (channel.channel_operator == src) || netadmin_mode + data["username"] = username + data["adminmode"] = netadmin_mode + data["can_admin"] = can_run(user, FALSE, list(ACCESS_NETWORK)) data["authed"] = authed return data diff --git a/code/modules/modular_computers/file_system/programs/portrait_printer.dm b/code/modules/modular_computers/file_system/programs/portrait_printer.dm index b7ff4ca20a17..68c94e87e8d3 100644 --- a/code/modules/modular_computers/file_system/programs/portrait_printer.dm +++ b/code/modules/modular_computers/file_system/programs/portrait_printer.dm @@ -43,10 +43,7 @@ get_asset_datum(/datum/asset/simple/portraits) ) -/datum/computer_file/program/portrait_printer/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/portrait_printer/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("search") if(search_string != params["to_search"]) diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 5f6fde5736b4..811adb0337a3 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -29,7 +29,7 @@ return return FALSE -/datum/computer_file/program/radar/kill_program(forced = FALSE) +/datum/computer_file/program/radar/kill_program(mob/user) objects = list() selected = null STOP_PROCESSING(SSfastprocess, src) @@ -62,10 +62,7 @@ data["target"] = trackinfo return data -/datum/computer_file/program/radar/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/radar/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("selecttarget") selected = params["ref"] @@ -318,7 +315,7 @@ RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(on_nuke_armed)) -/datum/computer_file/program/radar/fission360/kill_program(forced) +/datum/computer_file/program/radar/fission360/kill_program(mob/user) UnregisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED) return ..() diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm index 0d8cec963785..960702d608cc 100644 --- a/code/modules/modular_computers/file_system/programs/records.dm +++ b/code/modules/modular_computers/file_system/programs/records.dm @@ -63,9 +63,7 @@ return all_records - - -/datum/computer_file/program/records/ui_data(mob/user) +/datum/computer_file/program/records/ui_static_data(mob/user) var/list/data = list() data["records"] = GetRecordsReadable() data["mode"] = mode diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index baf6cafd7a2c..52bfafdcf8e9 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -14,7 +14,7 @@ ///Access granted by the used to summon robots. var/list/current_access = list() ///List of all ping types you can annoy drones with. - var/list/drone_ping_types = list( + var/static/list/drone_ping_types = list( "Low", "Medium", "High", @@ -84,18 +84,15 @@ return data /datum/computer_file/program/robocontrol/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if (.) - return var/mob/current_user = ui.user var/obj/item/card/id/id_card = computer?.computer_id_slot - var/list/standard_actions = list( + var/static/list/standard_actions = list( "patroloff", "patrolon", "ejectpai", ) - var/list/MULE_actions = list( + var/static/list/MULE_actions = list( "stop", "go", "home", @@ -110,13 +107,13 @@ ) var/mob/living/simple_animal/bot/simple_bot = locate(params["robot"]) in GLOB.bots_list if (action in standard_actions) - simple_bot.bot_control(action, current_user, current_access) + simple_bot.bot_control(action, current_user, id_card?.GetAccess()) if (action in MULE_actions) - simple_bot.bot_control(action, current_user, current_access, TRUE) + simple_bot.bot_control(action, current_user, id_card?.GetAccess(), TRUE) switch(action) if("summon") - simple_bot.bot_control(action, current_user, id_card ? id_card.access : current_access) + simple_bot.bot_control(action, current_user, id_card ? id_card.access : id_card?.GetAccess()) if("ejectcard") if(!computer || !computer.computer_id_slot) return diff --git a/code/modules/modular_computers/file_system/programs/robotact.dm b/code/modules/modular_computers/file_system/programs/robotact.dm index b218aad9113d..e64691ccba2a 100644 --- a/code/modules/modular_computers/file_system/programs/robotact.dm +++ b/code/modules/modular_computers/file_system/programs/robotact.dm @@ -84,10 +84,7 @@ data["borgUpgrades"] = cyborg.upgrades return data -/datum/computer_file/program/robotact/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/robotact/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) //Implied type, memes var/obj/item/modular_computer/pda/silicon/tablet = computer var/mob/living/silicon/robot/cyborg = tablet.silicon_owner @@ -140,17 +137,3 @@ return if(cyborg.emagged || istype(cyborg, /mob/living/silicon/robot/model/syndicate)) //This option shouldn't even be showing otherwise cyborg.self_destruct(cyborg) - -/** - * Forces a full update of the UI, if currently open. - * - * Forces an update that includes refreshing ui_static_data. Called by - * law changes and borg log additions. - */ -/datum/computer_file/program/robotact/proc/force_full_update() - if(!istype(computer, /obj/item/modular_computer/pda/silicon)) - return - var/obj/item/modular_computer/pda/silicon/tablet = computer - var/datum/tgui/active_ui = SStgui.get_open_ui(tablet.silicon_owner, src) - if(active_ui) - active_ui.send_full_update() diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index dc680c435f90..1fd00e163345 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -14,18 +14,42 @@ tgui_id = "NtosSecurEye" program_icon = "eye" + ///Boolean on whether or not the app will make noise when flipping around the channels. + var/spying = FALSE + var/list/network = list("ss13") + ///List of weakrefs of all users watching the program. + var/list/concurrent_users = list() + /// Weakref to the active camera var/datum/weakref/camera_ref /// The turf where the camera was last updated. var/turf/last_camera_turf - var/list/concurrent_users = list() // Stuff needed to render the map var/atom/movable/screen/map_view/cam_screen + /// All the plane masters that need to be applied. var/atom/movable/screen/background/cam_background -/datum/computer_file/program/secureye/New() + ///Internal tracker used to find a specific person and keep them on cameras. + var/datum/trackable/internal_tracker + +///Syndicate subtype that has no access restrictions and is available on Syndinet +/datum/computer_file/program/secureye/syndicate + filename = "syndeye" + filedesc = "SyndEye" + extended_desc = "This program allows for illegal access to security camera networks." + transfer_access = list() + available_on_ntnet = FALSE + available_on_syndinet = TRUE + requires_ntnet = FALSE + usage_flags = PROGRAM_ALL + unique_copy = TRUE + + network = list("ss13", "mine", "rd", "labor", "ordnance", "minisat") + spying = TRUE + +/datum/computer_file/program/secureye/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. @@ -44,26 +68,28 @@ /datum/computer_file/program/secureye/Destroy() QDEL_NULL(cam_screen) QDEL_NULL(cam_background) + QDEL_NULL(internal_tracker) + last_camera_turf = null return ..() -/datum/computer_file/program/secureye/ui_interact(mob/user, datum/tgui/ui) - // Update UI - ui = SStgui.try_update_ui(user, src, ui) +/datum/computer_file/program/secureye/kill_program(mob/user) + if(user) + ui_close(user) + return ..() +/datum/computer_file/program/secureye/ui_interact(mob/user, datum/tgui/ui) // Update the camera, showing static if necessary and updating data if the location has moved. update_active_camera_screen() - if(!ui) - var/user_ref = REF(user) - var/is_living = isliving(user) - // Ghosts shouldn't count towards concurrent users, which produces - // an audible terminal_on click. - if(is_living) - concurrent_users += user_ref - // Register map objects - cam_screen.display_to(user) - user.client.register_map_obj(cam_background) - return ..() + var/user_ref = REF(user) + var/is_living = isliving(user) + // Ghosts shouldn't count towards concurrent users, which produces + // an audible terminal_on click. + if(is_living) + concurrent_users += user_ref + // Register map objects + cam_screen.display_to(user) + user.client.register_map_obj(cam_background) /datum/computer_file/program/secureye/ui_status(mob/user) . = ..() @@ -73,49 +99,81 @@ /datum/computer_file/program/secureye/ui_data() var/list/data = list() - data["network"] = network data["activeCamera"] = null var/obj/machinery/camera/active_camera = camera_ref?.resolve() if(active_camera) data["activeCamera"] = list( name = active_camera.c_tag, + ref = REF(active_camera), status = active_camera.status, ) return data -/datum/computer_file/program/secureye/ui_static_data() +/datum/computer_file/program/secureye/ui_static_data(mob/user) var/list/data = list() + data["network"] = network data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + data["can_spy"] = !!spying + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] data["cameras"] += list(list( name = C.c_tag, + ref = REF(C), )) return data -/datum/computer_file/program/secureye/ui_act(action, params) +/datum/computer_file/program/secureye/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - if(action == "switch_camera") - var/c_tag = format_text(params["name"]) - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/selected_camera = cameras[c_tag] - camera_ref = WEAKREF(selected_camera) - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) - - if(!selected_camera) + switch(action) + if("switch_camera") + var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras + if(selected_camera) + camera_ref = WEAKREF(selected_camera) + else + camera_ref = null + if(!spying) + playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + if(isnull(camera_ref)) + return TRUE + if(internal_tracker) + internal_tracker.reset_tracking() + + update_active_camera_screen() return TRUE - update_active_camera_screen() + if("start_tracking") + if(!internal_tracker) + internal_tracker = new(src) + RegisterSignal(internal_tracker, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + internal_tracker.track_input(usr) + return TRUE - return TRUE +/datum/computer_file/program/secureye/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + var/datum/camerachunk/target_camerachunk = GLOB.cameranet.getTurfVis(get_turf(target)) + if(!target_camerachunk) + CRASH("[src] was able to track [target] through /datum/trackable, but was not on a visible turf to cameras.") + for(var/obj/machinery/camera/cameras as anything in target_camerachunk.cameras["[target.z]"]) + var/found_target = locate(target) in cameras.can_see() + if(!found_target) + continue + var/new_camera = WEAKREF(cameras) + if(camera_ref == new_camera) + return + camera_ref = new_camera + update_active_camera_screen() + return /datum/computer_file/program/secureye/ui_close(mob/user) . = ..() + //don't track anyone while we're shutting off. + if(internal_tracker) + internal_tracker.reset_tracking() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. @@ -125,7 +183,9 @@ // Turn off the console if(length(concurrent_users) == 0 && is_living) camera_ref = null - playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + last_camera_turf = null + if(!spying) + playsound(computer, 'sound/machines/terminal_off.ogg', 25, FALSE) /datum/computer_file/program/secureye/proc/update_active_camera_screen() var/obj/machinery/camera/active_camera = camera_ref?.resolve() @@ -168,26 +228,4 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/datum/computer_file/program/secureye/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if(!is_station_level(camera_turf.z))//Only show station cameras. - continue - L.Add(cam) - var/list/camlist = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - camlist["[cam.c_tag]"] = cam - return camlist - #undef DEFAULT_MAP_SIZE diff --git a/code/modules/modular_computers/file_system/programs/signalcommander.dm b/code/modules/modular_computers/file_system/programs/signalcommander.dm index a92d744e5259..6d636bab370a 100644 --- a/code/modules/modular_computers/file_system/programs/signalcommander.dm +++ b/code/modules/modular_computers/file_system/programs/signalcommander.dm @@ -19,7 +19,7 @@ . = ..() set_frequency(signal_frequency) -/datum/computer_file/program/signal_commander/kill_program(forced) +/datum/computer_file/program/signal_commander/kill_program(mob/user) . = ..() SSradio.remove_object(computer, signal_frequency) @@ -32,9 +32,6 @@ return data /datum/computer_file/program/signal_commander/ui_act(action, list/params) - . = ..() - if(.) - return switch(action) if("signal") INVOKE_ASYNC(src, PROC_REF(signal)) diff --git a/code/modules/modular_computers/file_system/programs/skill_tracker.dm b/code/modules/modular_computers/file_system/programs/skill_tracker.dm index a3ba60acde86..c68cffb33740 100644 --- a/code/modules/modular_computers/file_system/programs/skill_tracker.dm +++ b/code/modules/modular_computers/file_system/programs/skill_tracker.dm @@ -51,9 +51,6 @@ return null /datum/computer_file/program/skill_tracker/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("PRG_reward") var/skill_type = find_skilltype(params["skill"]) diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 0aebf2271994..a29c670313c7 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -22,7 +22,7 @@ refresh() /// Apparently destroy calls this [/datum/computer_file/Destroy]. Here just to clean our references. -/datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE) +/datum/computer_file/program/supermatter_monitor/kill_program(mob/user) for(var/supermatter in supermatters) clear_supermatter(supermatter) return ..() @@ -54,10 +54,7 @@ data["focus_uid"] = focused_supermatter?.uid return data -/datum/computer_file/program/supermatter_monitor/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/supermatter_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_refresh") refresh() diff --git a/code/modules/modular_computers/file_system/programs/statusdisplay.dm b/code/modules/modular_computers/file_system/programs/statusdisplay.dm index 2f29775d77b2..d55bafb2e9c1 100644 --- a/code/modules/modular_computers/file_system/programs/statusdisplay.dm +++ b/code/modules/modular_computers/file_system/programs/statusdisplay.dm @@ -74,9 +74,6 @@ log_game("[key_name(usr)] has changed the station status display message to \"[picture]\" [loc_name(usr)]") /datum/computer_file/program/status/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("setStatusMessage") upper_text = reject_bad_text(params["upperText"] || "", MAX_STATUS_LINE_LENGTH) @@ -89,7 +86,6 @@ /datum/computer_file/program/status/ui_static_data(mob/user) var/list/data = list() data["maxStatusLineLength"] = MAX_STATUS_LINE_LENGTH - return data /datum/computer_file/program/status/ui_data(mob/user) diff --git a/code/modules/modular_computers/file_system/programs/techweb.dm b/code/modules/modular_computers/file_system/programs/techweb.dm index 65e2070be06b..52129d39997e 100644 --- a/code/modules/modular_computers/file_system/programs/techweb.dm +++ b/code/modules/modular_computers/file_system/programs/techweb.dm @@ -89,9 +89,6 @@ return data /datum/computer_file/program/science/ui_act(action, list/params) - . = ..() - if (.) - return // Check if the console is locked to block any actions occuring if (locked && action != "toggleLock") computer.say("Console is locked, cannot perform further actions.") diff --git a/code/modules/modular_computers/file_system/programs/theme_selector.dm b/code/modules/modular_computers/file_system/programs/theme_selector.dm index 45972a76136b..7700f5089245 100644 --- a/code/modules/modular_computers/file_system/programs/theme_selector.dm +++ b/code/modules/modular_computers/file_system/programs/theme_selector.dm @@ -24,10 +24,7 @@ return data -/datum/computer_file/program/themeify/ui_act(action, params) - . = ..() - if(.) - return +/datum/computer_file/program/themeify/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) switch(action) if("PRG_change_theme") var/selected_theme = params["selected_theme"] diff --git a/code/modules/modular_computers/file_system/programs/wirecarp.dm b/code/modules/modular_computers/file_system/programs/wirecarp.dm index f33660a3752d..9045fcc76b2a 100644 --- a/code/modules/modular_computers/file_system/programs/wirecarp.dm +++ b/code/modules/modular_computers/file_system/programs/wirecarp.dm @@ -12,9 +12,6 @@ program_icon = "network-wired" /datum/computer_file/program/ntnetmonitor/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return switch(action) if("resetIDS") SSmodular_computers.intrusion_detection_alarm = FALSE diff --git a/code/modules/power/apc/apc_malf.dm b/code/modules/power/apc/apc_malf.dm index 77dfc3f5a0eb..f13b588842a8 100644 --- a/code/modules/power/apc/apc_malf.dm +++ b/code/modules/power/apc/apc_malf.dm @@ -77,26 +77,29 @@ disk_pinpointers.alert = FALSE /obj/machinery/power/apc/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) + . = ..() + if(!.) + return if(card.AI) to_chat(user, span_warning("[card] is already occupied!")) - return + return FALSE if(!occupier) to_chat(user, span_warning("There's nothing in [src] to transfer!")) - return + return FALSE if(!occupier.mind || !occupier.client) to_chat(user, span_warning("[occupier] is either inactive or destroyed!")) - return + return FALSE if(!occupier.parent.stat) to_chat(user, span_warning("[occupier] is refusing all attempts at transfer!") ) - return + return FALSE if(transfer_in_progress) to_chat(user, span_warning("There's already a transfer in progress!")) - return + return FALSE if(interaction != AI_TRANS_TO_CARD || occupier.stat) - return + return FALSE var/turf/user_turf = get_turf(user) if(!user_turf) - return + return FALSE transfer_in_progress = TRUE user.visible_message(span_notice("[user] slots [card] into [src]..."), span_notice("Transfer process initiated. Sending request for AI approval...")) playsound(src, 'sound/machines/click.ogg', 50, TRUE) @@ -105,21 +108,21 @@ to_chat(user, span_danger("AI denied transfer request. Process terminated.")) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) transfer_in_progress = FALSE - return + return FALSE if(user.loc != user_turf) to_chat(user, span_danger("Location changed. Process terminated.")) to_chat(occupier, span_warning("[user] moved away! Transfer canceled.")) transfer_in_progress = FALSE - return + return FALSE to_chat(user, span_notice("AI accepted request. Transferring stored intelligence to [card]...")) to_chat(occupier, span_notice("Transfer starting. You will be moved to [card] shortly.")) if(!do_after(user, 50, target = src)) to_chat(occupier, span_warning("[user] was interrupted! Transfer canceled.")) transfer_in_progress = FALSE - return + return FALSE if(!occupier || !card) transfer_in_progress = FALSE - return + return FALSE user.visible_message(span_notice("[user] transfers [occupier] to [card]!"), span_notice("Transfer complete! [occupier] is now stored in [card].")) to_chat(occupier, span_notice("Transfer complete! You've been stored in [user]'s [card.name].")) occupier.forceMove(card) @@ -128,4 +131,4 @@ occupier.cancel_camera() occupier = null transfer_in_progress = FALSE - return + return TRUE diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 0508e3b1f880..579bf1d1fb26 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -49,7 +49,7 @@ var/ghost_notification_message = "IT'S LOOSE" flags_1 = SUPERMATTER_IGNORES_1 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION /obj/singularity/Initialize(mapload, starting_energy = 50) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index c8d95ade25bc..579010243e28 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -26,7 +26,7 @@ obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION pixel_x = -32 pixel_y = -32 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | SHUTTLE_CRUSH_PROOF flags_1 = SUPERMATTER_IGNORES_1 var/energy diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index f26118c7ca81..217bb74a8c7a 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -556,6 +556,17 @@ var/chassis_name = "super-kinetic accelerator" /obj/item/borg/upgrade/modkit/chassis_mod/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user) +//monkestation edit start + if(is_type_in_list(KA, list(/obj/item/gun/energy/recharge/kinetic_accelerator/glock, + /obj/item/gun/energy/recharge/kinetic_accelerator/m79, + /obj/item/gun/energy/recharge/kinetic_accelerator/meme, + /obj/item/gun/energy/recharge/kinetic_accelerator/railgun, + /obj/item/gun/energy/recharge/kinetic_accelerator/repeater, + /obj/item/gun/energy/recharge/kinetic_accelerator/shockwave, + /obj/item/gun/energy/recharge/kinetic_accelerator/shotgun))) + to_chat(user, span_warning("[src] is not compatible with [KA].")) + return FALSE +//monkestation edit end . = ..() if(.) KA.icon_state = chassis_icon diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9e01e08f821a..5d622cbba70b 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -286,16 +286,18 @@ p_orange.link_portal(p_blue) p_blue.link_portal(p_orange) -/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/W, turf/target) - var/obj/effect/portal/P = new /obj/effect/portal(target, 300, null, FALSE, null) - RegisterSignal(P, COMSIG_QDELETING, PROC_REF(on_portal_destroy)) - if(istype(W, /obj/projectile/beam/wormhole/orange)) +/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/wormhole_beam, turf/target) + var/obj/effect/portal/new_portal = new /obj/effect/portal(target, 300, null, FALSE, null) + RegisterSignal(new_portal, COMSIG_QDELETING, PROC_REF(on_portal_destroy)) + if(istype(wormhole_beam, /obj/projectile/beam/wormhole/orange)) qdel(p_orange) - p_orange = P - P.icon_state = "portal1" + p_orange = new_portal + new_portal.icon_state = "portal1" + new_portal.set_light_color(COLOR_MOSTLY_PURE_ORANGE) + new_portal.update_light() else qdel(p_blue) - p_blue = P + p_blue = new_portal crosslink() /obj/item/gun/energy/wormhole_projector/core_inserted diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm similarity index 69% rename from code/modules/reagents/chemistry/reagents/alcohol_reagents.dm rename to code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 2b6a402c22cf..4c508a9533a1 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -108,15 +108,8 @@ taste_description = "mild carbonated malt" ph = 4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/beer - required_drink_type = /datum/reagent/consumable/ethanol/beer - name = "glass of beer" - desc = "A freezing pint of beer." - icon_state = "beerglass" - // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? /datum/reagent/consumable/ethanol/beer/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() @@ -132,11 +125,6 @@ ph = 5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/beer/light - required_drink_type = /datum/reagent/consumable/ethanol/beer/light - name = "glass of light beer" - desc = "A freezing pint of watery light beer." - /datum/reagent/consumable/ethanol/beer/maltliquor name = "Malt Liquor" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is stronger than usual, super cheap, and super terrible." @@ -145,11 +133,6 @@ ph = 4.8 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/beer/light - required_drink_type = /datum/reagent/consumable/ethanol/beer/maltliquor - name = "glass of malt liquor" - desc = "A freezing pint of malt liquor." - /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. This variety is dyed a festive green." @@ -158,12 +141,6 @@ ph = 6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/beer/green - required_drink_type = /datum/reagent/consumable/ethanol/beer/green - name = "glass of green beer" - desc = "A freezing pint of green beer. Festive." - icon_state = "greenbeerglass" - /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.color != color) drinker.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) @@ -181,16 +158,6 @@ ph = 6 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/kahlua - required_drink_type = /datum/reagent/consumable/ethanol/kahlua - icon_state ="shotglasscream" - -/datum/glass_style/drinking_glass/kahlua - required_drink_type = /datum/reagent/consumable/ethanol/kahlua - name = "glass of RR coffee liquor" - desc = "DAMN, THIS THING LOOKS ROBUST!" - icon_state ="kahluaglass" - /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.set_dizzy_if_lower(10 SECONDS * REM * seconds_per_tick) drinker.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) @@ -210,16 +177,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/shot_glass/whiskey - required_drink_type = /datum/reagent/consumable/ethanol/whiskey - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/whiskey - required_drink_type = /datum/reagent/consumable/ethanol/whiskey - name = "glass of whiskey" - desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." - icon_state = "whiskeyglass" - /datum/reagent/consumable/ethanol/whiskey/kong name = "Kong" description = "Makes You Go Ape!®" @@ -227,14 +184,6 @@ taste_description = "the grip of a giant ape" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/whiskey/kong - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong - -/datum/glass_style/drinking_glass/whiskey/kong - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong - name = "glass of Kong" - desc = "Makes You Go Ape!®" - /datum/reagent/consumable/ethanol/whiskey/candycorn name = "Candy Corn Liquor" description = "Like they drank in 2D speakeasies." @@ -242,14 +191,6 @@ taste_description = "pancake syrup" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/whiskey/candycorn - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn - -/datum/glass_style/drinking_glass/whiskey/candycorn - required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn - name = "glass of candy corn liquor" - desc = "Good for your Imagination." - /datum/reagent/consumable/ethanol/whiskey/candycorn/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(SPT_PROB(5, seconds_per_tick)) drinker.adjust_hallucinations(4 SECONDS * REM * seconds_per_tick) @@ -266,12 +207,6 @@ taste_description = "jitters and death" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/thirteenloko - required_drink_type = /datum/reagent/consumable/ethanol/thirteenloko - name = "glass of Thirteen Loko" - desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - icon_state = "thirteen_loko_glass" - /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) drinker.AdjustSleeping(-40 * REM * seconds_per_tick) @@ -331,16 +266,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS //Very high proof default_container = /obj/item/reagent_containers/cup/glass/bottle/vodka -/datum/glass_style/shot_glass/vodka - required_drink_type = /datum/reagent/consumable/ethanol/vodka - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/vodka - required_drink_type = /datum/reagent/consumable/ethanol/vodka - name = "glass of vodka" - desc = "The glass contain wodka. Xynta." - icon_state = "ginvodkaglass" - /datum/reagent/consumable/ethanol/bilk name = "Bilk" description = "This appears to be beer mixed with milk. Disgusting." @@ -350,12 +275,6 @@ taste_description = "desperation and lactate" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bilk - required_drink_type = /datum/reagent/consumable/ethanol/bilk - name = "glass of bilk" - desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - icon_state = "glass_brown" - /datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.getBruteLoss() && SPT_PROB(5, seconds_per_tick)) drinker.heal_bodypart_damage(brute = 1) @@ -372,13 +291,6 @@ ph = 3.5 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/threemileisland - required_drink_type = /datum/reagent/consumable/ethanol/threemileisland - name = "Three Mile Island Ice Tea" - desc = "A glass of this is sure to prevent a meltdown." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "threemileislandglass" - /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) return ..() @@ -393,12 +305,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/gin - required_drink_type = /datum/reagent/consumable/ethanol/gin - name = "glass of gin" - desc = "A crystal clear glass of Griffeater gin." - icon_state = "ginvodkaglass" - /datum/reagent/consumable/ethanol/rum name = "Rum" description = "Yohoho and all that." @@ -408,16 +314,6 @@ ph = 6.5 default_container = /obj/item/reagent_containers/cup/glass/bottle/rum -/datum/glass_style/shot_glass/rum - required_drink_type = /datum/reagent/consumable/ethanol/rum - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/rum - required_drink_type = /datum/reagent/consumable/ethanol/rum - name = "glass of rum" - desc = "Now you want to pray for a pirate suit, don't you?" - icon_state = "rumglass" - /datum/reagent/consumable/ethanol/tequila name = "Tequila" description = "A strong and mildly flavoured, Mexican produced spirit. Feeling thirsty, hombre?" @@ -428,16 +324,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/shot_glass/tequila - required_drink_type = /datum/reagent/consumable/ethanol/tequila - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/tequila - required_drink_type = /datum/reagent/consumable/ethanol/tequila - name = "glass of tequila" - desc = "Now all that's missing is the weird colored shades!" - icon_state = "tequilaglass" - /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" description = "You suddenly feel a craving for a martini..." @@ -447,16 +333,6 @@ ph = 3.25 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/vermouth - required_drink_type = /datum/reagent/consumable/ethanol/vermouth - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/vermouth - required_drink_type = /datum/reagent/consumable/ethanol/vermouth - name = "glass of vermouth" - desc = "You wonder why you're even drinking this straight." - icon_state = "vermouthglass" - /datum/reagent/consumable/ethanol/wine name = "Wine" description = "A premium alcoholic beverage made from distilled grape juice." @@ -468,16 +344,6 @@ glass_price = DRINK_PRICE_STOCK default_container = /obj/item/reagent_containers/cup/glass/bottle/wine -/datum/glass_style/shot_glass/wine - required_drink_type = /datum/reagent/consumable/ethanol/wine - icon_state = "shotglassred" - -/datum/glass_style/drinking_glass/wine - required_drink_type = /datum/reagent/consumable/ethanol/wine - name = "glass of wine" - desc = "A very classy looking drink." - icon_state = "wineglass" - /datum/reagent/consumable/ethanol/wine/on_merge(data) . = ..() if(src.data && data && data["vintage"] != src.data["vintage"]) @@ -512,12 +378,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/grappa - required_drink_type = /datum/reagent/consumable/ethanol/grappa - name = "glass of grappa" - desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." - icon_state = "grappa" - /datum/reagent/consumable/ethanol/amaretto name = "Amaretto" description = "A gentle drink that carries a sweet aroma." @@ -527,16 +387,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/shot_glass/amaretto - required_drink_type = /datum/reagent/consumable/ethanol/amaretto - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/amaretto - required_drink_type = /datum/reagent/consumable/ethanol/amaretto - name = "glass of amaretto" - desc = "A sweet and syrupy looking drink." - icon_state = "amarettoglass" - /datum/reagent/consumable/ethanol/cognac name = "Cognac" description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication." @@ -547,16 +397,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/shot_glass/cognac - required_drink_type = /datum/reagent/consumable/ethanol/cognac - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/cognac - required_drink_type = /datum/reagent/consumable/ethanol/cognac - name = "glass of cognac" - desc = "Damn, you feel like some kind of French aristocrat just by holding this." - icon_state = "cognacglass" - /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" description = "A powerful alcoholic drink. Rumored to cause hallucinations but does not." @@ -565,16 +405,6 @@ taste_description = "death and licorice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/absinthe - required_drink_type = /datum/reagent/consumable/ethanol/absinthe - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/absinthe - required_drink_type = /datum/reagent/consumable/ethanol/absinthe - name = "glass of absinthe" - desc = "It's as strong as it smells." - icon_state = "absinthe" - /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(SPT_PROB(5, seconds_per_tick) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) drinker.adjust_hallucinations(8 SECONDS) @@ -589,12 +419,6 @@ addiction_types = list(/datum/addiction/alcohol = 5, /datum/addiction/maintenance_drugs = 2) chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/hooch - required_drink_type = /datum/reagent/consumable/ethanol/hooch - name = "Hooch" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - icon_state = "glass_brown2" - /datum/reagent/consumable/ethanol/ale name = "Ale" description = "A dark alcoholic beverage made with malted barley and yeast." @@ -605,12 +429,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/hooch - required_drink_type = /datum/reagent/consumable/ethanol/hooch - name = "glass of ale" - desc = "A freezing pint of delicious Ale." - icon_state = "aleglass" - /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." @@ -623,17 +441,6 @@ // This drink is really popular with a certain demographic. var/teenage_girl_quality = DRINK_VERYGOOD -/datum/glass_style/shot_glass/goldschlager - required_drink_type = /datum/reagent/consumable/ethanol/goldschlager - icon_state = "shotglassgold" - -/datum/glass_style/drinking_glass/goldschlager - required_drink_type = /datum/reagent/consumable/ethanol/goldschlager - name = "glass of goldschlager" - desc = "100% proof that teen girls will drink anything with gold in it." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "goldschlagerglass" - /datum/reagent/consumable/ethanol/goldschlager/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) // Reset quality each time, since the bottle can be shared quality = initial(quality) @@ -666,17 +473,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_HIGH -/datum/glass_style/shot_glass/patron - required_drink_type = /datum/reagent/consumable/ethanol/patron - icon_state = "shotglassclear" - -/datum/glass_style/drinking_glass/patron - required_drink_type = /datum/reagent/consumable/ethanol/patron - name = "glass of patron" - desc = "Drinking patron in the bar, with all the subpar ladies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "patronglass" - /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" description = "An all time classic, mild cocktail." @@ -688,13 +484,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/gintonic - required_drink_type = /datum/reagent/consumable/ethanol/gintonic - name = "Gin and Tonic" - desc = "A mild but still great cocktail. Drink up, like a true Englishman." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gintonicglass" - /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" description = "Rum, mixed with cola." @@ -705,12 +494,6 @@ ph = 4 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/rum_coke - required_drink_type = /datum/reagent/consumable/ethanol/rum_coke - name = "Rum and Coke" - desc = "The classic go-to of space-fratboys." - icon_state = "whiskeycolaglass" - /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" description = "Viva la Revolucion! Viva Cuba Libre!" @@ -720,13 +503,6 @@ taste_description = "a refreshing marriage of citrus and rum" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/cuba_libre - required_drink_type = /datum/reagent/consumable/ethanol/cuba_libre - name = "Cuba Libre" - desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cubalibreglass" - /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/cubano, seconds_per_tick, times_fired) if(cubano.mind && cubano.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. cubano.adjustBruteLoss(-1 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) @@ -745,12 +521,6 @@ taste_description = "cola" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/whiskey_cola - required_drink_type = /datum/reagent/consumable/ethanol/whiskey_cola - name = "whiskey cola" - desc = "An innocent-looking mixture of cola and whiskey. Delicious." - icon_state = "whiskeycolaglass" - /datum/reagent/consumable/ethanol/martini name = "Classic Martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." @@ -761,12 +531,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/martini - required_drink_type = /datum/reagent/consumable/ethanol/martini - name = "Classic Martini" - desc = "Damn, the bartender even stirred it, not shook it." - icon_state = "martiniglass" - /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." @@ -776,11 +540,6 @@ taste_description = "shaken, not stirred" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/vodkamartini - required_drink_type = /datum/reagent/consumable/ethanol/vodkamartini - name = "Vodka martini" - desc = "A bastardisation of the classic martini. Still great." - icon_state = "martiniglass" /datum/reagent/consumable/ethanol/white_russian name = "White Russian" @@ -791,13 +550,6 @@ taste_description = "bitter cream" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/white_russian - required_drink_type = /datum/reagent/consumable/ethanol/white_russian - name = "White Russian" - desc = "A very nice looking drink. But that's just, like, your opinion, man." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "whiterussianglass" - /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." @@ -807,13 +559,6 @@ taste_description = "oranges" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/screwdrivercocktail - required_drink_type = /datum/reagent/consumable/ethanol/screwdrivercocktail - name = "Screwdriver" - desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "screwdriverglass" - /datum/reagent/consumable/ethanol/screwdrivercocktail/on_transfer(atom/atom, methods = TOUCH, trans_volume) if(!(methods & INGEST)) return ..() @@ -868,13 +613,6 @@ taste_description = "sweet 'n creamy" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/booger - required_drink_type = /datum/reagent/consumable/ethanol/booger - name = "Booger" - desc = "Ewww..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "booger" - /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." @@ -884,13 +622,6 @@ taste_description = "tomatoes with a hint of lime" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bloody_mary - required_drink_type = /datum/reagent/consumable/ethanol/bloody_mary - name = "Bloody Mary" - desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bloodymaryglass" - /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) drinker.blood_volume = min(drinker.blood_volume + (3 * REM * seconds_per_tick), BLOOD_VOLUME_NORMAL) //Bloody Mary quickly restores blood loss. @@ -908,13 +639,6 @@ metabolized_traits = list(TRAIT_FEARLESS, TRAIT_ANALGESIA) var/tough_text -/datum/glass_style/drinking_glass/brave_bull - required_drink_type = /datum/reagent/consumable/ethanol/brave_bull - name = "Brave Bull" - desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bravebullglass" - /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/drinker) . = ..() tough_text = pick("brawny", "tenacious", "tough", "hardy", "sturdy") //Tuff stuff @@ -939,13 +663,6 @@ glass_price = DRINK_PRICE_MEDIUM var/obj/effect/light_holder -/datum/glass_style/drinking_glass/tequila_sunrise - required_drink_type = /datum/reagent/consumable/ethanol/tequila_sunrise - name = "tequila Sunrise" - desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tequilasunriseglass" - /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/drinker) . = ..() to_chat(drinker, span_notice("You feel gentle warmth spread through your body!")) @@ -972,18 +689,6 @@ taste_description = "spicy toxins" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/toxins_special - required_drink_type = /datum/reagent/consumable/ethanol/toxins_special - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "toxinsspecialglass" - -/datum/glass_style/drinking_glass/toxins_special - required_drink_type = /datum/reagent/consumable/ethanol/toxins_special - name = "Toxins Special" - desc = "Whoah, this thing is on FIRE!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "toxinsspecialglass" - /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) drinker.adjust_bodytemperature(15 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() @@ -1002,13 +707,6 @@ bypass_restriction = TRUE var/datum/brain_trauma/special/beepsky/beepsky_hallucination -/datum/glass_style/drinking_glass/beepsky_smash - required_drink_type = /datum/reagent/consumable/ethanol/beepsky_smash - name = "Beepsky Smash" - desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "beepskysmashglass" - /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/drinker) if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) metabolization_rate = 0.8 @@ -1053,12 +751,6 @@ taste_description = "creamy alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/irish_cream - required_drink_type = /datum/reagent/consumable/ethanol/irish_cream - name = "Irish Cream" - desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - icon_state = "irishcreamglass" - /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." @@ -1069,13 +761,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED var/dorf_mode = FALSE -/datum/glass_style/drinking_glass/manly_dorf - required_drink_type = /datum/reagent/consumable/ethanol/manly_dorf - name = "The Manly Dorf" - desc = "A manly concoction made from Ale and Beer. Intended for true men only." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "manlydorfglass" - /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/drinker) . = ..() if(ishuman(drinker)) @@ -1100,13 +785,6 @@ taste_description = "a mixture of cola and alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/longislandicedtea - required_drink_type = /datum/reagent/consumable/ethanol/longislandicedtea - name = "Long Island Iced Tea" - desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "longislandicedteaglass" - /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." @@ -1115,12 +793,6 @@ taste_description = "bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/moonshine - required_drink_type = /datum/reagent/consumable/ethanol/moonshine - name = "Moonshine" - desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - icon_state = "glass_clear" - /datum/reagent/consumable/ethanol/b52 name = "B-52" description = "Coffee, Irish Cream, and cognac. You will get bombed." @@ -1131,18 +803,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/shot_glass/b52 - required_drink_type = /datum/reagent/consumable/ethanol/b52 - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b52glass" - -/datum/glass_style/drinking_glass/b52 - required_drink_type = /datum/reagent/consumable/ethanol/b52 - name = "B-52" - desc = "Kahlua, Irish Cream, and cognac. You will get bombed." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b52glass" - /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/drinker) . = ..() playsound(drinker, 'sound/effects/explosion_distant.ogg', 100, FALSE) @@ -1156,13 +816,6 @@ taste_description = "giving up on the day" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/irishcoffee - required_drink_type = /datum/reagent/consumable/ethanol/irishcoffee - name = "Irish Coffee" - desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "irishcoffeeglass" - /datum/reagent/consumable/ethanol/margarita name = "Margarita" description = "On the rocks with salt on the rim. Arriba~!" @@ -1173,13 +826,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/margarita - required_drink_type = /datum/reagent/consumable/ethanol/margarita - name = "Margarita" - desc = "On the rocks with salt on the rim. Arriba~!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "margaritaglass" - /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" description = "For the lactose-intolerant. Still as classy as a White Russian." @@ -1189,13 +835,6 @@ taste_description = "bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/black_russian - required_drink_type = /datum/reagent/consumable/ethanol/black_russian - name = "Black Russian" - desc = "For the lactose-intolerant. Still as classy as a White Russian." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blackrussianglass" - /datum/reagent/consumable/ethanol/manhattan name = "Manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." @@ -1206,13 +845,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/manhattan - required_drink_type = /datum/reagent/consumable/ethanol/manhattan - name = "Manhattan" - desc = "The Detective's undercover drink of choice. He never could stomach gin..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "manhattanglass" - /datum/reagent/consumable/ethanol/manhattan_proj name = "Manhattan Project" description = "A scientist's drink of choice, for pondering ways to blow up the station." @@ -1222,13 +854,6 @@ taste_description = "death, the destroyer of worlds" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/manhattan_proj - required_drink_type = /datum/reagent/consumable/ethanol/manhattan_proj - name = "Manhattan Project" - desc = "A scientist's drink of choice, for thinking how to blow up the station." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "proj_manhattanglass" - /datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.set_drugginess(1 MINUTES * REM * seconds_per_tick) return ..() @@ -1242,12 +867,6 @@ taste_description = "soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/whiskeysoda - required_drink_type = /datum/reagent/consumable/ethanol/whiskeysoda - name = "whiskey soda" - desc = "Ultimate refreshment." - icon_state = "whiskeysodaglass2" - /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" description = "The ultimate refreshment. Not what it sounds like." @@ -1257,13 +876,6 @@ taste_description = "Jack Frost's piss" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/antifreeze - required_drink_type = /datum/reagent/consumable/ethanol/antifreeze - name = "Anti-freeze" - desc = "The ultimate refreshment." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "antifreeze" - /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() @@ -1277,13 +889,6 @@ taste_description = "creamy berries" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/barefoot - required_drink_type = /datum/reagent/consumable/ethanol/barefoot - name = "Barefoot" - desc = "Barefoot and pregnant." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "b&p" - /datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(ishuman(drinker)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. var/mob/living/carbon/human/unshoed = drinker @@ -1301,13 +906,6 @@ taste_description = "refreshing cold" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/snowwhite - required_drink_type = /datum/reagent/consumable/ethanol/snowwhite - name = "Snow White" - desc = "A cold refreshment." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "snowwhite" - /datum/reagent/consumable/ethanol/demonsblood name = "Demon's Blood" description = "AHHHH!!!!" @@ -1318,13 +916,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/demonsblood - required_drink_type = /datum/reagent/consumable/ethanol/demonsblood - name = "Demons Blood" - desc = "Just looking at this thing makes the hair at the back of your neck stand up." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "demonsblood" - /datum/reagent/consumable/ethanol/demonsblood/on_mob_metabolize(mob/living/metabolizer) . = ..() RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED, PROC_REF(pre_bloodcrawl_consumed)) @@ -1362,13 +953,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/devilskiss - required_drink_type = /datum/reagent/consumable/ethanol/devilskiss - name = "Devils Kiss" - desc = "Creepy time!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "devilskiss" - /datum/reagent/consumable/ethanol/devilskiss/on_mob_metabolize(mob/living/metabolizer) . = ..() RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED, PROC_REF(on_bloodcrawl_consumed)) @@ -1413,13 +997,6 @@ taste_description = "tart bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/vodkatonic - required_drink_type = /datum/reagent/consumable/ethanol/vodkatonic - name = "vodka and tonic" - desc = "For when a gin and tonic isn't Russian enough." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "vodkatonicglass" - /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" description = "Refreshingly lemony, deliciously dry." @@ -1429,13 +1006,6 @@ taste_description = "dry, tart lemons" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/ginfizz - required_drink_type = /datum/reagent/consumable/ethanol/ginfizz - name = "gin fizz" - desc = "Refreshingly lemony, deliciously dry." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "ginfizzglass" - /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama Mama" description = "A tropical cocktail with a complex blend of flavors." @@ -1445,13 +1015,6 @@ taste_description = "pineapple, coconut, and a hint of coffee" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bahama_mama - required_drink_type = /datum/reagent/consumable/ethanol/bahama_mama - name = "Bahama Mama" - desc = "A tropical cocktail with a complex blend of flavors." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bahama_mama" - /datum/reagent/consumable/ethanol/singulo name = "Singulo" description = "A blue-space beverage!" @@ -1485,13 +1048,6 @@ drinker.emote("burp") return ..() -/datum/glass_style/drinking_glass/singulo - required_drink_type = /datum/reagent/consumable/ethanol/singulo - name = "Singulo" - desc = "A blue-space beverage." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "singulo" - /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" description = "A spicy Vodka! Might be a little hot for the little guys!" @@ -1505,13 +1061,6 @@ drinker.adjust_bodytemperature(50 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. return ..() -/datum/glass_style/drinking_glass/sbiten - required_drink_type = /datum/reagent/consumable/ethanol/sbiten - name = "Sbiten" - desc = "A spicy mix of Vodka and Spice. Very hot." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sbitenglass" - /datum/reagent/consumable/ethanol/red_mead name = "Red Mead" description = "The true Viking drink! Even though it has a strange red color." @@ -1521,13 +1070,6 @@ taste_description = "sweet and salty alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/red_mead - required_drink_type = /datum/reagent/consumable/ethanol/red_mead - name = "Red Mead" - desc = "A true Viking's beverage, made with the blood of their enemies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "red_meadglass" - /datum/reagent/consumable/ethanol/mead name = "Mead" description = "A Viking drink, though a cheap one." @@ -1538,13 +1080,6 @@ taste_description = "sweet, sweet alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/mead - required_drink_type = /datum/reagent/consumable/ethanol/mead - name = "Mead" - desc = "A drink from Valhalla." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "meadglass" - /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" description = "A beer which is so cold the air around it freezes." @@ -1553,12 +1088,6 @@ taste_description = "refreshingly cold" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/iced_beer - required_drink_type = /datum/reagent/consumable/ethanol/iced_beer - name = "iced beer" - desc = "A beer so frosty, the air around it freezes." - icon_state = "iced_beerglass" - /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) //310.15 is the normal bodytemp. return ..() @@ -1571,13 +1100,6 @@ taste_description = "a poor excuse for alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/grog - required_drink_type = /datum/reagent/consumable/ethanol/grog - name = "Grog" - desc = "A fine and cepa drink for Space." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "grogglass" - /datum/reagent/consumable/ethanol/aloe name = "Aloe" description = "So very, very, very good." @@ -1589,12 +1111,6 @@ //somewhat annoying mix glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/aloe - required_drink_type = /datum/reagent/consumable/ethanol/aloe - name = "Aloe" - desc = "Very, very, very good." - icon_state = "aloe" - /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" description = "A nice, strangely named drink." @@ -1604,12 +1120,6 @@ taste_description = "lemons" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/andalusia - required_drink_type = /datum/reagent/consumable/ethanol/andalusia - name = "Andalusia" - desc = "A nice, strangely named drink." - icon_state = "andalusia" - /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" description = "A drink made from your allies. Not as sweet as those made from your enemies." @@ -1620,13 +1130,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/alliescocktail - required_drink_type = /datum/reagent/consumable/ethanol/alliescocktail - name = "Allies cocktail" - desc = "A drink made from your allies." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alliescocktail" - /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" description = "A drink for the daring, can be deadly if incorrectly prepared!" @@ -1636,12 +1139,6 @@ taste_description = "stomach acid" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/acid_spit - required_drink_type = /datum/reagent/consumable/ethanol/acid_spit - name = "Acid Spit" - desc = "A drink from Nanotrasen. Made from live aliens." - icon_state = "acidspitglass" - /datum/reagent/consumable/ethanol/amasec name = "Amasec" description = "Official drink of the Nanotrasen Gun-Club!" @@ -1651,13 +1148,6 @@ taste_description = "dark and metallic" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/amasec - required_drink_type = /datum/reagent/consumable/ethanol/amasec - name = "Amasec" - desc = "Always handy before COMBAT!!!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "amasecglass" - /datum/reagent/consumable/ethanol/changelingsting name = "Changeling Sting" description = "You take a tiny sip and feel a burning sensation..." @@ -1667,13 +1157,6 @@ taste_description = "your brain coming out your nose" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/changelingsting - required_drink_type = /datum/reagent/consumable/ethanol/changelingsting - name = "Changeling Sting" - desc = "A stingy drink." - icon = 'icons/obj/drinks/soda.dmi' - icon_state = "changelingsting" - /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) @@ -1688,12 +1171,6 @@ taste_description = "the spirit of Ireland" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/irishcarbomb - required_drink_type = /datum/reagent/consumable/ethanol/irishcarbomb - name = "Irish Car Bomb" - desc = "An Irish car bomb." - icon_state = "irishcarbomb" - /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" description = "Tastes like terrorism!" @@ -1703,13 +1180,6 @@ taste_description = "purified antagonism" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/syndicatebomb - required_drink_type = /datum/reagent/consumable/ethanol/syndicatebomb - name = "Syndicate Bomb" - desc = "A syndicate bomb." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "syndicatebomb" - /datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(SPT_PROB(2.5, seconds_per_tick)) playsound(get_turf(drinker), 'sound/effects/explosionfar.ogg', 100, TRUE) @@ -1724,13 +1194,6 @@ taste_description = "psychic links" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/hiveminderaser - required_drink_type = /datum/reagent/consumable/ethanol/hiveminderaser - name = "Hivemind Eraser" - desc = "For when even mindshields can't save you." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hiveminderaser" - /datum/reagent/consumable/ethanol/erikasurprise name = "Erika Surprise" description = "The surprise is, it's green!" @@ -1740,13 +1203,6 @@ taste_description = "tartness and bananas" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/erikasurprise - required_drink_type = /datum/reagent/consumable/ethanol/erikasurprise - name = "Erika Surprise" - desc = "The surprise is, it's green!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "erikasurprise" - /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" description = "Only for the experienced. You think you see sand floating in the glass." @@ -1757,13 +1213,6 @@ taste_description = "a beach" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/driestmartini - required_drink_type = /datum/reagent/consumable/ethanol/driestmartini - name = "Driest Martini" - desc = "Only for the experienced. You think you see sand floating in the glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "driestmartiniglass" - /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" description = "A drink from Clown Heaven." @@ -1774,13 +1223,6 @@ taste_description = "a bad joke" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bananahonk - required_drink_type = /datum/reagent/consumable/ethanol/bananahonk - name = "Banana Honk" - desc = "A drink from Clown Heaven." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bananahonkglass" - /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) @@ -1798,13 +1240,6 @@ taste_description = "a pencil eraser" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/silencer - required_drink_type = /datum/reagent/consumable/ethanol/silencer - name = "Silencer" - desc = "A drink from Mime Heaven." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "silencerglass" - /datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) @@ -1821,13 +1256,6 @@ taste_description = "molasses and a mouthful of pool water" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/drunkenblumpkin - required_drink_type = /datum/reagent/consumable/ethanol/drunkenblumpkin - name = "Drunken Blumpkin" - desc = "A drink for the drunks." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "drunkenblumpkin" - /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" description = "Lemon juice/whiskey/sugar mixture. Moderate alcohol content." @@ -1836,12 +1264,6 @@ quality = DRINK_GOOD taste_description = "sour lemons" -/datum/glass_style/drinking_glass/whiskey_sour - required_drink_type = /datum/reagent/consumable/ethanol/whiskey_sour - name = "whiskey sour" - desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." - icon_state = "whiskey_sour" - /datum/reagent/consumable/ethanol/hcider name = "Hard Cider" description = "Apple juice, for adults." @@ -1852,16 +1274,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/shot_glass/hcider - required_drink_type = /datum/reagent/consumable/ethanol/hcider - icon_state = "shotglassbrown" - -/datum/glass_style/drinking_glass/hcider - required_drink_type = /datum/reagent/consumable/ethanol/hcider - name = "hard cider" - desc = "Tastes like autumn... no wait, fall!" - icon_state = "whiskeyglass" - /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" 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~ @@ -1872,13 +1284,6 @@ taste_description = "charged metal" // the same as teslium, honk honk. chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/fetching_fizz - required_drink_type = /datum/reagent/consumable/ethanol/fetching_fizz - name = "Fetching Fizz" - desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "fetching_fizz" - /datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) for(var/obj/item/stack/ore/O in orange(3, drinker)) step_towards(O, get_turf(drinker)) @@ -1896,13 +1301,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/hearty_punch - required_drink_type = /datum/reagent/consumable/ethanol/hearty_punch - name = "Hearty Punch" - desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hearty_punch" - /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.health <= 0) drinker.adjustBruteLoss(-3 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) @@ -1922,12 +1320,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/bacchus_blessing - required_drink_type = /datum/reagent/consumable/ethanol/bacchus_blessing - name = "Bacchus' Blessing" - desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - icon_state = "glass_brown2" - /datum/reagent/consumable/ethanol/atomicbomb name = "Atomic Bomb" description = "Nuclear proliferation never tasted so good." @@ -1938,13 +1330,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_HIGH -/datum/glass_style/drinking_glass/atomicbomb - required_drink_type = /datum/reagent/consumable/ethanol/atomicbomb - name = "Atomic Bomb" - desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "atomicbombglass" - /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.set_drugginess(100 SECONDS * REM * seconds_per_tick) if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) @@ -1970,13 +1355,6 @@ taste_description = "your brains smashed out by a lemon wrapped around a gold brick" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/gargle_blaster - required_drink_type = /datum/reagent/consumable/ethanol/gargle_blaster - name = "Pan-Galactic Gargle Blaster" - desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gargleblasterglass" - /datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) switch(current_cycle) @@ -2004,13 +1382,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/neurotoxin - required_drink_type = /datum/reagent/consumable/ethanol/neurotoxin - name = "Neurotoxin" - desc = "A drink that is guaranteed to knock you silly." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "neurotoxinglass" - /datum/reagent/consumable/ethanol/neurotoxin/proc/pick_paralyzed_limb() return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) @@ -2057,13 +1428,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/hippies_delight - required_drink_type = /datum/reagent/consumable/ethanol/hippies_delight - name = "Hippie's Delight" - desc = "A drink enjoyed by people during the 1960's." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "hippiesdelightglass" - /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.set_slurring_if_lower(1 SECONDS * REM * seconds_per_tick) @@ -2106,20 +1470,6 @@ taste_description = "custard and alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/drinking_glass/eggnog - required_drink_type = /datum/reagent/consumable/ethanol/eggnog - name = "eggnog" - desc = "For enjoying the most wonderful time of the year." - icon_state = "glass_yellow" - drink_type = FRUIT - -/datum/glass_style/has_foodtype/juicebox/eggnog - required_drink_type = /datum/reagent/consumable/ethanol/eggnog - name = "carton of eggnog" - desc = "Tasty grape juice in a fun little container. Non-alcoholic!" - icon_state = "grapebox" - drink_type = FRUIT - /datum/reagent/consumable/ethanol/narsour name = "Nar'Sour" description = "Side effects include self-mutilation and hoarding plasteel." @@ -2130,13 +1480,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/narsour - required_drink_type = /datum/reagent/consumable/ethanol/narsour - name = "Nar'Sour" - desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "narsour" - /datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_timed_status_effect(6 SECONDS * REM * seconds_per_tick, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) drinker.adjust_stutter_up_to(6 SECONDS * REM * seconds_per_tick, 6 SECONDS) @@ -2150,12 +1493,6 @@ taste_description = "a warm flowery orange taste which recalls the ocean air and summer wind of the caribbean" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/triple_sec - required_drink_type = /datum/reagent/consumable/ethanol/triple_sec - name = "Triple Sec" - desc = "A glass of straight Triple Sec." - icon_state = "glass_orange" - /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" description = "A minty liqueur excellent for refreshing, cool drinks." @@ -2164,12 +1501,6 @@ taste_description = "a minty, cool, and invigorating splash of cold streamwater" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/creme_de_menthe - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_menthe - name = "Creme de Menthe" - desc = "You can almost feel the first breath of spring just looking at it." - icon_state = "glass_green" - /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" description = "A chocolatey liqueur excellent for adding dessert notes to beverages and bribing sororities." @@ -2178,12 +1509,6 @@ taste_description = "a slick and aromatic hint of chocolates swirling in a bite of alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/creme_de_cacao - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_cacao - name = "Creme de Cacao" - desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." - icon_state = "glass_brown" - /datum/reagent/consumable/ethanol/creme_de_coconut name = "Creme de Coconut" description = "A coconut liqueur for smooth, creamy, tropical drinks." @@ -2192,12 +1517,6 @@ taste_description = "a sweet milky flavor with notes of toasted sugar" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/creme_de_coconut - required_drink_type = /datum/reagent/consumable/ethanol/creme_de_coconut - name = "Creme de Coconut" - desc = "An unintimidating glass of coconut liqueur." - icon_state = "glass_white" - /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" description = "Kicks just as hard as licking the power cell on a baton, but tastier." @@ -2207,13 +1526,6 @@ taste_description = "an invigorating bitter freshness which suffuses your being; no enemy of the station will go unrobusted this day" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/quadruple_sec - required_drink_type = /datum/reagent/consumable/ethanol/quadruple_sec - name = "Quadruple Sec" - desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "quadruple_sec" - /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) @@ -2232,13 +1544,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/quintuple_sec - required_drink_type = /datum/reagent/consumable/ethanol/quintuple_sec - name = "Quintuple Sec" - desc = "Now you are become law, destroyer of clowns." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "quintuple_sec" - /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. var/obj/item/organ/internal/liver/liver = drinker.get_organ_slot(ORGAN_SLOT_LIVER) @@ -2257,13 +1562,6 @@ taste_description = "chocolate and mint dancing around your mouth" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/grasshopper - required_drink_type = /datum/reagent/consumable/ethanol/grasshopper - name = "Grasshopper" - desc = "You weren't aware edible beverages could be that green." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "grasshopper" - /datum/reagent/consumable/ethanol/stinger name = "Stinger" description = "A snappy way to end the day." @@ -2273,13 +1571,6 @@ taste_description = "a slap on the face in the best possible way" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/stinger - required_drink_type = /datum/reagent/consumable/ethanol/stinger - name = "Stinger" - desc = "You wonder what would happen if you pointed this at a heat source..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "stinger" - /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" description = "Soothing hot herbal brew with restorative properties. Hints of citrus and berry flavors." @@ -2293,17 +1584,6 @@ glass_price = DRINK_PRICE_HIGH bypass_restriction = TRUE -/datum/glass_style/shot_glass/bastion_bourbon - required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/bastion_bourbon - required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon - name = "Bastion Bourbon" - desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bastion_bourbon" - /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/drinker) . = ..() var/heal_points = 10 @@ -2338,17 +1618,6 @@ nutriment_factor = 2 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/squirt_cider - required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider - icon_state = "shotglassgreen" - -/datum/glass_style/drinking_glass/squirt_cider - required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider - name = "Squirt Cider" - desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "squirt_cider" - /datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.satiety += 5 * REM * seconds_per_tick //for context, vitamins give 15 satiety per second ..() @@ -2363,13 +1632,6 @@ taste_description = "ethylic alcohol with a hint of sugar" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/fringe_weaver - required_drink_type = /datum/reagent/consumable/ethanol/fringe_weaver - name = "Fringe Weaver" - desc = "It's a wonder it doesn't spill out of the glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "fringe_weaver" - /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" description = "Sweet, light, and fruity - as girly as it gets." @@ -2380,13 +1642,6 @@ nutriment_factor = 2 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/sugar_rush - required_drink_type = /datum/reagent/consumable/ethanol/sugar_rush - name = "Sugar Rush" - desc = "If you can't mix a Sugar Rush, you can't tend bar." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sugar_rush" - /datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.satiety -= 10 * REM * seconds_per_tick //junky as hell! a whole glass will keep you from being able to eat junk food ..() @@ -2402,13 +1657,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/crevice_spike - required_drink_type = /datum/reagent/consumable/ethanol/crevice_spike - name = "Crevice Spike" - desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "crevice_spike" - /datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/drinker) //damage only applies when drink first enters system and won't again until drink metabolizes out . = ..() drinker.adjustBruteLoss(3 * min(5,volume), required_bodytype = affected_bodytype) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 @@ -2422,12 +1670,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/sake - required_drink_type = /datum/reagent/consumable/ethanol/sake - name = "cup of sake" - desc = "A traditional cup of sake." - icon_state = "sakecup" - /datum/reagent/consumable/ethanol/peppermint_patty name = "Peppermint Patty" description = "This lightly alcoholic drink combines the benefits of menthol and cocoa." @@ -2437,19 +1679,11 @@ quality = DRINK_GOOD chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/peppermint_patty - required_drink_type = /datum/reagent/consumable/ethanol/peppermint_patty - name = "Peppermint Patty" - desc = "A boozy minty hot cocoa that warms your belly on a cold night." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "peppermint_patty" - /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.apply_status_effect(/datum/status_effect/throat_soothed) drinker.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, drinker.get_body_temp_normal()) ..() - /datum/reagent/consumable/ethanol/alexander name = "Alexander" description = "Named after a Greek hero, this mix is said to embolden a user's shield as if they were in a phalanx." @@ -2460,13 +1694,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED var/obj/item/shield/mighty_shield -/datum/glass_style/drinking_glass/alexander - required_drink_type = /datum/reagent/consumable/ethanol/alexander - name = "Alexander" - desc = "A creamy, indulgent delight that is stronger than it seems." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alexander" - /datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/drinker) . = ..() if(ishuman(drinker)) @@ -2497,13 +1724,6 @@ taste_description = "sweet, creamy cacao" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/amaretto_alexander - required_drink_type = /datum/reagent/consumable/ethanol/amaretto_alexander - name = "Amaretto Alexander" - desc = "A creamy, indulgent delight that is in fact as gentle as it seems." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "alexanderam" - /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" description = "The one ride you'll gladly give up the wheel for." @@ -2514,13 +1734,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/sidecar - required_drink_type = /datum/reagent/consumable/ethanol/sidecar - name = "Sidecar" - desc = "The one ride you'll gladly give up the wheel for." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sidecar" - /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" description = "A provocatively named classic. Funny enough, doctors recommend drinking it before taking a nap while underneath bedsheets." @@ -2531,13 +1744,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/between_the_sheets - required_drink_type = /datum/reagent/consumable/ethanol/between_the_sheets - name = "Between the Sheets" - desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "between_the_sheets" - /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/drinker, seconds_per_tick, times_fired) ..() var/is_between_the_sheets = FALSE @@ -2569,13 +1775,6 @@ taste_description = "divine windiness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/kamikaze - required_drink_type = /datum/reagent/consumable/ethanol/kamikaze - name = "Kamikaze" - desc = "Divinely windy." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "kamikaze" - /datum/reagent/consumable/ethanol/mojito name = "Mojito" description = "A drink that looks as refreshing as it tastes." @@ -2586,13 +1785,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/mojito - required_drink_type = /datum/reagent/consumable/ethanol/mojito - name = "Mojito" - desc = "A drink that looks as refreshing as it tastes." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mojito" - /datum/reagent/consumable/ethanol/moscow_mule name = "Moscow Mule" description = "A chilly drink that reminds you of the Derelict." @@ -2602,13 +1794,6 @@ taste_description = "refreshing spiciness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/moscow_mule - required_drink_type = /datum/reagent/consumable/ethanol/moscow_mule - name = "Moscow Mule" - desc = "A chilly drink that reminds you of the Derelict." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "moscow_mule" - /datum/reagent/consumable/ethanol/fernet name = "Fernet" description = "An incredibly bitter herbal liqueur used as a digestif." @@ -2617,11 +1802,6 @@ taste_description = "utter bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/fernet - required_drink_type = /datum/reagent/consumable/ethanol/fernet - name = "glass of fernet" - desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum - /datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) drinker.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) @@ -2638,13 +1818,6 @@ taste_description = "sweet relief" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/fernet_cola - required_drink_type = /datum/reagent/consumable/ethanol/fernet_cola - name = "glass of fernet cola" - desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godlyblend" - /datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) drinker.adjustToxLoss(0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) @@ -2662,12 +1835,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_HIGH -/datum/glass_style/drinking_glass/fanciulli - required_drink_type = /datum/reagent/consumable/ethanol/fanciulli - name = "glass of fanciulli" - desc = "A glass of Fanciulli. It's just Manhattan with Fernet." - icon_state = "fanciulli" - /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_nutrition(-5 * REM * seconds_per_tick) drinker.overeatduration = 0 @@ -2689,12 +1856,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/branca_menta - required_drink_type = /datum/reagent/consumable/ethanol/branca_menta - name = "glass of branca menta" - desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this - icon_state = "minted_fernet" - /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, T0C) return ..() @@ -2716,13 +1877,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/blank_paper - required_drink_type = /datum/reagent/consumable/ethanol/blank_paper - name = "glass of blank paper" - desc = "A fizzy cocktail for those looking to start fresh." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blank_paper" - /datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) @@ -2741,13 +1895,6 @@ var/list/tastes = list("bad coding" = 1) //List of tastes. See above. ph = 4 -/datum/glass_style/drinking_glass/fruit_wine - required_drink_type = /datum/reagent/consumable/ethanol/fruit_wine - // This should really be dynamic like "glass of pineapple wine" or something - // but seeing as fruit wine half doesn't work already I'm not inclined to add support for that now - name = "glass of fruit wine" - desc = "A wine made from grown plants." - /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) if(!data) return @@ -2852,12 +1999,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/champagne - required_drink_type = /datum/reagent/consumable/ethanol/champagne - name = "Champagne" - desc = "The flute clearly displays the slowly rising bubbles." - icon_state = "champagne_glass" - /datum/reagent/consumable/ethanol/wizz_fizz name = "Wizz Fizz" description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild." @@ -2867,13 +2008,6 @@ taste_description = "friendship! It is magic, after all" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/wizz_fizz - required_drink_type = /datum/reagent/consumable/ethanol/wizz_fizz - name = "Wizz Fizz" - desc = "The glass bubbles and froths with an almost magical intensity." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "wizz_fizz" - /datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting if(drinker?.mind?.has_antag_datum(/datum/antagonist/wizard)) @@ -2892,13 +2026,6 @@ taste_description = "the pain of ten thousand slain mosquitos" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bug_spray - required_drink_type = /datum/reagent/consumable/ethanol/bug_spray - name = "Bug Spray" - desc = "Your eyes begin to water as the sting of alcohol reaches them." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "bug_spray" - /datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) //Bugs should not drink Bug spray. if(ismoth(drinker) || isflyperson(drinker)) @@ -2919,12 +2046,6 @@ taste_description = "an honest day's work at the orchard" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/applejack - required_drink_type = /datum/reagent/consumable/ethanol/applejack - name = "Applejack" - desc = "You feel like you could drink this all neight." - icon_state = "applejack_glass" - /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" description = "A light cocktail perfect for sipping with a slice of pie." @@ -2934,17 +2055,6 @@ taste_description = "a sweet and sour slice of apple" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/shot_glass/jack_rose - required_drink_type = /datum/reagent/consumable/ethanol/jack_rose - icon_state = "shotglassred" - -/datum/glass_style/drinking_glass/jack_rose - required_drink_type = /datum/reagent/consumable/ethanol/jack_rose - name = "Jack Rose" - desc = "Enough of these, and you really will start to suppose your toeses are roses." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "jack_rose" - /datum/reagent/consumable/ethanol/turbo name = "Turbo" description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart." @@ -2954,13 +2064,6 @@ taste_description = "the outlaw spirit" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/turbo - required_drink_type = /datum/reagent/consumable/ethanol/turbo - name = "Turbo" - desc = "A turbulent cocktail for outlaw hoverbikers." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "turbo" - /datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(SPT_PROB(2, seconds_per_tick)) to_chat(drinker, span_notice("[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")) @@ -2976,13 +2079,6 @@ taste_description = "simpler times" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/old_timer - required_drink_type = /datum/reagent/consumable/ethanol/old_timer - name = "Old Timer" - desc = "WARNING! May cause premature aging!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "old_timer" - /datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, seconds_per_tick, times_fired) if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) metabolizer.age += 1 @@ -3012,13 +2108,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED metabolized_traits = list(TRAIT_SHOCKIMMUNE) -/datum/glass_style/drinking_glass/rubberneck - required_drink_type = /datum/reagent/consumable/ethanol/rubberneck - name = "Rubberneck" - desc = "A popular drink amongst those adhering to an all synthetic diet." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "rubberneck" - /datum/reagent/consumable/ethanol/duplex name = "Duplex" description = "An inseparable combination of two fruity drinks." @@ -3028,13 +2117,6 @@ taste_description = "green apples and blue raspberries" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/duplex - required_drink_type = /datum/reagent/consumable/ethanol/duplex - name = "Duplex" - desc = "To imbibe one component separately from the other is consider a great faux pas." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "duplex" - /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" description = "A strong dark ale brewed by space-monks." @@ -3044,13 +2126,6 @@ taste_description = "dried plums and malt" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/trappist - required_drink_type = /datum/reagent/consumable/ethanol/trappist - name = "Trappist Beer" - desc = "boozy Catholicism in a glass." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "trappistglass" - /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.mind?.holy_role) drinker.adjustFireLoss(-2.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) @@ -3067,13 +2142,6 @@ bypass_restriction = TRUE var/stored_teleports = 0 -/datum/glass_style/drinking_glass/blazaam - required_drink_type = /datum/reagent/consumable/ethanol/blazaam - name = "Blazaam" - desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "blazaamglass" - /datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.get_drunk_amount() > 40) if(stored_teleports) @@ -3093,13 +2161,6 @@ quality = DRINK_FANTASTIC taste_description = "triumph with a hint of bitterness" -/datum/glass_style/drinking_glass/planet_cracker - required_drink_type = /datum/reagent/consumable/ethanol/planet_cracker - name = "Planet Cracker" - 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." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "planet_cracker" - /datum/reagent/consumable/ethanol/mauna_loa name = "Mauna Loa" description = "Extremely hot; not for the faint of heart!" @@ -3110,13 +2171,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED bypass_restriction = TRUE -/datum/glass_style/drinking_glass/mauna_loa - required_drink_type = /datum/reagent/consumable/ethanol/mauna_loa - name = "Mauna Loa" - desc = "Lavaland in a drink... mug... volcano... thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mauna_loa" - /datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) // Heats the user up while the reagent is in the body. Occasionally makes you burst into flames. drinker.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick) @@ -3133,14 +2187,6 @@ quality = DRINK_NICE taste_description = "sugary tartness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - metabolized_traits = list(TRAIT_ANALGESIA) - -/datum/glass_style/drinking_glass/painkiller - required_drink_type = /datum/reagent/consumable/ethanol/painkiller - name = "Painkiller" - desc = "A combination of tropical juices and rum. Surely this will make you feel better." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "painkiller" /datum/reagent/consumable/ethanol/pina_colada name = "Pina Colada" @@ -3150,13 +2196,6 @@ quality = DRINK_FANTASTIC taste_description = "pineapple, coconut, and a hint of the ocean" -/datum/glass_style/drinking_glass/pina_colada - required_drink_type = /datum/reagent/consumable/ethanol/pina_colada - name = "Pina Colada" - desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pina_colada" - /datum/reagent/consumable/ethanol/pina_olivada name = "Piña Olivada" description = "An oddly designed concoction of olive oil and pineapple juice." @@ -3179,12 +2218,6 @@ to_chat(drinker, span_notice(pick(messages))) return ..() -/datum/glass_style/drinking_glass/pina_olivada - required_drink_type = /datum/reagent/consumable/ethanol/pina_olivada - name = "Piña Olivada" - desc = "A balance of fruity pineapple with thick, rich olive oil. Stir well before drinking." - icon_state = "pina_olivada" - /datum/reagent/consumable/ethanol/pruno // pruno mix is in drink_reagents name = "Pruno" color = "#E78108" @@ -3193,12 +2226,6 @@ taste_description = "your tastebuds being individually shanked" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/pruno - required_drink_type = /datum/reagent/consumable/ethanol/pruno - name = "glass of pruno" - desc = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done." - icon_state = "glass_orange" - /datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_disgust(5 * REM * seconds_per_tick) ..() @@ -3212,13 +2239,6 @@ taste_description = "sweetness followed by a soft sourness and warmth" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/ginger_amaretto - required_drink_type = /datum/reagent/consumable/ethanol/ginger_amaretto - name = "Ginger Amaretto" - desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gingeramaretto" - /datum/reagent/consumable/ethanol/godfather name = "Godfather" description = "A rough cocktail with illegal connections." @@ -3229,13 +2249,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/godfather - required_drink_type = /datum/reagent/consumable/ethanol/godfather - name = "Godfather" - desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godfather" - /datum/reagent/consumable/ethanol/godmother name = "Godmother" description = "A twist on a classic, liked more by mature women." @@ -3245,13 +2258,6 @@ taste_description = "sweetness and a zesty twist" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/godmother - required_drink_type = /datum/reagent/consumable/ethanol/godmother - name = "Godmother" - desc = "A lovely fresh smelling cocktail, a true Sicilian delight." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "godmother" - /datum/reagent/consumable/ethanol/kortara name = "Kortara" description = "A sweet, milky nut-based drink enjoyed on Tizira. Frequently mixed with fruit juices and cocoa for extra refreshment." @@ -3261,12 +2267,6 @@ taste_description = "sweet nectar" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/kortara - required_drink_type = /datum/reagent/consumable/ethanol/kortara - name = "glass of kortara" - desc = "The fermented nectar of the Korta nut, as enjoyed by lizards galaxywide." - icon_state = "kortara_glass" - /datum/reagent/consumable/ethanol/kortara/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(drinker.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) drinker.heal_bodypart_damage(1,0) @@ -3281,13 +2281,6 @@ taste_description = "mint choc chip" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/sea_breeze - required_drink_type = /datum/reagent/consumable/ethanol/sea_breeze - name = "Sea Breeze" - desc = "Minty, chocolatey, and creamy. It's like drinkable mint chocolate chip!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "sea_breeze" - /datum/reagent/consumable/ethanol/sea_breeze/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.apply_status_effect(/datum/status_effect/throat_soothed) ..() @@ -3301,13 +2294,6 @@ taste_description = "strikes and gutters" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/white_tiziran - required_drink_type = /datum/reagent/consumable/ethanol/white_tiziran - name = "White Tiziran" - desc = "I had a rough night and I hate the fucking humans, man." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "white_tiziran" - /datum/reagent/consumable/ethanol/drunken_espatier name = "Drunken Espatier" description = "Look, if you had to get into a shootout in the cold vacuum of space, you'd want to be drunk too." @@ -3317,13 +2303,6 @@ taste_description = "sorrow" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/drunken_espatier - required_drink_type = /datum/reagent/consumable/ethanol/drunken_espatier - name = "Drunken Espatier" - desc = "A drink to make facing death easier." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "drunken_espatier" - /datum/reagent/consumable/ethanol/drunken_espatier/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.add_mood_event("numb", /datum/mood_event/narcotic_medium, name) //comfortably numb ..() @@ -3346,13 +2325,6 @@ nutriment_factor = 3 * REAGENTS_METABOLISM chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/protein_blend - required_drink_type = /datum/reagent/consumable/ethanol/protein_blend - name = "Protein Blend" - desc = "Vile, even by lizard standards." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "protein_blend" - /datum/reagent/consumable/ethanol/protein_blend/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) drinker.adjust_nutrition(2 * REM * seconds_per_tick) if(!islizard(drinker)) @@ -3370,11 +2342,6 @@ taste_description = "sweet 'shrooms" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/mushi_kombucha - required_drink_type = /datum/reagent/consumable/ethanol/mushi_kombucha - name = "glass of mushi kombucha" - icon_state = "glass_orange" - /datum/reagent/consumable/ethanol/triumphal_arch name = "Triumphal Arch" description = "A drink celebrating the Lizard Empire and its military victories. It's popular at bars on Unification Day." @@ -3384,13 +2351,6 @@ taste_description = "victory" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/triumphal_arch - required_drink_type = /datum/reagent/consumable/ethanol/triumphal_arch - name = "Triumphal Arch" - desc = "A toast to the Empire, long may it stand." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "triumphal_arch" - /datum/reagent/consumable/ethanol/triumphal_arch/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(islizard(drinker)) drinker.add_mood_event("triumph", /datum/mood_event/memories_of_home, name) @@ -3406,13 +2366,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED var/datum/brain_trauma/special/bluespace_prophet/prophet_trauma -/datum/glass_style/drinking_glass/the_juice - required_drink_type = /datum/reagent/consumable/ethanol/the_juice - name = "The Juice" - desc = "A concoction of not-so-edible things that apparently lets you feel like you're in two places at once" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "thejuice" - /datum/reagent/consumable/ethanol/the_juice/on_mob_metabolize(mob/living/carbon/drinker) . = ..() prophet_trauma = new() @@ -3456,12 +2409,6 @@ taste_description = "blue orange" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/curacao - required_drink_type = /datum/reagent/consumable/ethanol/curacao - name = "glass of curaçao" - desc = "It's blue, da ba dee." - icon_state = "curacao" - /datum/reagent/consumable/ethanol/navy_rum //IN THE NAVY name = "Navy Rum" description = "Rum as the finest sailors drink." @@ -3471,12 +2418,6 @@ taste_description = "a life on the waves" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/navy_rum - required_drink_type = /datum/reagent/consumable/ethanol/navy_rum - name = "glass of navy rum" - desc = "Splice the mainbrace, and God save the King." - icon_state = "ginvodkaglass" - /datum/reagent/consumable/ethanol/bitters //why do they call them bitters, anyway? they're more spicy than anything else name = "Andromeda Bitters" description = "A bartender's best friend, often used to lend a delicate spiciness to any drink. Produced in New Trinidad, now and forever." @@ -3486,12 +2427,6 @@ taste_description = "spiced alcohol" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bitters - required_drink_type = /datum/reagent/consumable/ethanol/bitters - name = "glass of bitters" - desc = "Typically you'd want to mix this with something- but you do you." - icon_state = "bitters" - /datum/reagent/consumable/ethanol/admiralty //navy rum, vermouth, fernet name = "Admiralty" description = "A refined, bitter drink made with navy rum, vermouth and fernet." @@ -3501,13 +2436,6 @@ taste_description = "haughty arrogance" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/admiralty - required_drink_type = /datum/reagent/consumable/ethanol/admiralty - name = "Admiralty" - desc = "Hail to the Admiral, for he brings fair tidings, and rum too." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "admiralty" - /datum/reagent/consumable/ethanol/long_haul //Rum, Curacao, Sugar, dash of bitters, lengthened with soda water name = "Long Haul" description = "A favourite amongst freighter pilots, unscrupulous smugglers, and nerf herders." @@ -3517,13 +2445,6 @@ taste_description = "companionship" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/long_haul - required_drink_type = /datum/reagent/consumable/ethanol/long_haul - name = "Long Haul" - desc = "A perfect companion for a lonely long haul flight." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "long_haul" - /datum/reagent/consumable/ethanol/long_john_silver //navy rum, bitters, lemonade name = "Long John Silver" description = "A long drink of navy rum, bitters, and lemonade. Particularly popular aboard the Mothic Fleet as it's light on ration credits and heavy on flavour." @@ -3533,13 +2454,6 @@ taste_description = "rum and spices" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/long_john_silver - required_drink_type = /datum/reagent/consumable/ethanol/long_john_silver - name = "Long John Silver" - desc = "Named for a famous pirate, who may or may not have been fictional. But hey, why let the truth get in the way of a good yarn?" //Chopper Reid says "How the fuck are ya?" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "long_john_silver" - /datum/reagent/consumable/ethanol/tropical_storm //dark rum, pineapple juice, triple citrus, curacao name = "Tropical Storm" description = "A taste of the Caribbean in one glass." @@ -3549,13 +2463,6 @@ taste_description = "the tropics" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/tropical_storm - required_drink_type = /datum/reagent/consumable/ethanol/tropical_storm - name = "Tropical Storm" - desc = "Less destructive than the real thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tropical_storm" - /datum/reagent/consumable/ethanol/dark_and_stormy //rum and ginger beer- simple and classic name = "Dark and Stormy" description = "A classic drink arriving to thunderous applause." //thank you, thank you, I'll be here forever @@ -3565,13 +2472,6 @@ taste_description = "ginger and rum" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/dark_and_stormy - required_drink_type = /datum/reagent/consumable/ethanol/dark_and_stormy - name = "Dark and Stormy" - desc = "Thunder and lightning, very very frightening." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "dark_and_stormy" - /datum/reagent/consumable/ethanol/salt_and_swell //navy rum, tochtause syrup, egg whites, dash of saline-glucose solution name = "Salt and Swell" description = "A bracing sour with an interesting salty taste." @@ -3581,13 +2481,6 @@ taste_description = "salt and spice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/salt_and_swell - required_drink_type = /datum/reagent/consumable/ethanol/salt_and_swell - name = "Salt and Swell" - desc = "Ah, I do like to be beside the seaside." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "salt_and_swell" - /datum/reagent/consumable/ethanol/tiltaellen //yoghurt, salt, vinegar name = "Tiltällen" description = "A lightly fermented yoghurt drink with salt and a light dash of vinegar. Has a distinct sour cheesy flavour." @@ -3597,12 +2490,6 @@ taste_description = "sour cheesy yoghurt" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/tiltaellen - required_drink_type = /datum/reagent/consumable/ethanol/tiltaellen - name = "glass of tiltällen" - desc = "Eww... it's curdled." - icon_state = "tiltaellen" - /datum/reagent/consumable/ethanol/tich_toch name = "Tich Toch" description = "A mix of Tiltällen, Töchtaüse Syrup, and vodka. It's not exactly to everyones' tastes." @@ -3612,13 +2499,6 @@ taste_description = "spicy sour cheesy yoghurt" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/tich_toch - required_drink_type = /datum/reagent/consumable/ethanol/tich_toch - name = "Tich Toch" - desc = "Oh god." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "tich_toch" - /datum/reagent/consumable/ethanol/helianthus name = "Helianthus" description = "A dark yet radiant mixture of absinthe and hallucinogens. The choice of all true artists." @@ -3630,13 +2510,6 @@ var/hal_amt = 4 var/hal_cap = 24 -/datum/glass_style/drinking_glass/helianthus - required_drink_type = /datum/reagent/consumable/ethanol/helianthus - name = "Helianthus" - desc = "Another reason to cut off an ear..." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "helianthus" - /datum/reagent/consumable/ethanol/helianthus/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(SPT_PROB(5, seconds_per_tick)) drinker.adjust_hallucinations_up_to(4 SECONDS * REM * seconds_per_tick, 48 SECONDS) @@ -3653,12 +2526,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/plumwine - required_drink_type = /datum/reagent/consumable/ethanol/plumwine - name = "plum wine" - desc = "Looks like an evening of writing fine poetry." - icon_state = "plumwineglass" - /datum/reagent/consumable/ethanol/the_hat name = "The Hat" description = "A fancy drink, usually served in a man's hat." @@ -3669,12 +2536,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/the_hat - required_drink_type = /datum/reagent/consumable/ethanol/the_hat - name = "The Hat" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "thehatglass" - /datum/reagent/consumable/ethanol/gin_garden name = "Gin Garden" description = "Excellent cooling alcoholic drink with not so ordinary taste." @@ -3684,13 +2545,6 @@ taste_description = "light gin with sweet ginger and cucumber" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/gin_garden - required_drink_type = /datum/reagent/consumable/ethanol/gin_garden - name = "gin garden" - desc = "Hey, someone forgot the herb and... the cucumber in my cocktail!" - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gin_garden" - /datum/reagent/consumable/ethanol/gin_garden/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) doll.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) ..() @@ -3703,13 +2557,6 @@ taste_description = "static with a hint of sweetness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/wine_voltaic - required_drink_type = /datum/reagent/consumable/ethanol/wine_voltaic - name = "Voltaic Yellow Wine" - desc = "Electrically charged wine. Recharges etherials, but also nontoxic." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "wine_voltaic" - /datum/reagent/consumable/ethanol/wine_voltaic/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. . = ..() if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) @@ -3729,13 +2576,6 @@ taste_description = "the howling storm" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/telepole - required_drink_type = /datum/reagent/consumable/ethanol/telepole - name = "Telepole" - desc = "A liquid grounding rod. Recharges etherials and grants temporary shock resistance." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "telepole" - /datum/reagent/consumable/ethanol/telepole/on_mob_metabolize(mob/living/affected_mob) . = ..() ADD_TRAIT(affected_mob, TRAIT_SHOCKIMMUNE, type) @@ -3763,13 +2603,6 @@ taste_description = "victory, with a hint of insanity" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/pod_tesla - required_drink_type = /datum/reagent/consumable/ethanol/pod_tesla - name = "Pod Tesla" - desc = "Ride the lightning! Recharges etherials, suppresses phobias, and grants strong temporary shock resistance." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pod_tesla" - /datum/reagent/consumable/ethanol/pod_tesla/on_mob_metabolize(mob/living/affected_mob) ..() affected_mob.add_traits(list(TRAIT_SHOCKIMMUNE,TRAIT_TESLA_SHOCKIMMUNE,TRAIT_FEARLESS), type) @@ -3788,5 +2621,6 @@ var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * 5) + #undef ALCOHOL_EXPONENT #undef ALCOHOL_THRESHOLD_MODIFIER diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm similarity index 70% rename from code/modules/reagents/chemistry/reagents/drink_reagents.dm rename to code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 4cd2835deba0..21a3538c2aba 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -1,9 +1,3 @@ - - -///////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////// - /datum/reagent/consumable/orangejuice name = "Orange Juice" description = "Both delicious AND rich in Vitamin C, what more do you need?" @@ -13,20 +7,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice -/datum/glass_style/has_foodtype/drinking_glass/orangejuice - required_drink_type = /datum/reagent/consumable/orangejuice - name = "glass of orange juice" - desc = "Vitamins! Yay!" - icon_state = "glass_orange" - drink_type = FRUIT | BREAKFAST - -/datum/glass_style/has_foodtype/juicebox/orangejuice - required_drink_type = /datum/reagent/consumable/orangejuice - name = "orange juice box" - desc = "A great source of vitamins. Stay healthy!" - icon_state = "orangebox" - drink_type = FRUIT | BREAKFAST - /datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getOxyLoss() && SPT_PROB(16, seconds_per_tick)) affected_mob.adjustOxyLoss(-1, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) @@ -41,12 +21,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice -/datum/glass_style/drinking_glass/tomatojuice - required_drink_type = /datum/reagent/consumable/tomatojuice - name = "glass of tomato juice" - desc = "Are you sure this is tomato juice?" - icon_state = "glass_red" - /datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getFireLoss() && SPT_PROB(10, seconds_per_tick)) affected_mob.heal_bodypart_damage(0, 1) @@ -62,12 +36,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/limejuice -/datum/glass_style/drinking_glass/limejuice - required_drink_type = /datum/reagent/consumable/limejuice - name = "glass of lime juice" - desc = "A glass of sweet-sour lime juice." - icon_state = "glass_green" - /datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) @@ -81,12 +49,6 @@ taste_description = "carrots" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/carrotjuice - required_drink_type = /datum/reagent/consumable/carrotjuice - name = "glass of carrot juice" - desc = "It's just like a carrot but without crunching." - icon_state = "carrotjuice" - /datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_eye_blur(-2 SECONDS * REM * seconds_per_tick) affected_mob.adjust_temp_blindness(-2 SECONDS * REM * seconds_per_tick) @@ -105,12 +67,6 @@ taste_description = "berries" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/berryjuice - required_drink_type = /datum/reagent/consumable/berryjuice - name = "glass of berry juice" - desc = "Berry juice. Or maybe it's jam. Who cares?" - icon_state = "berryjuice" - /datum/reagent/consumable/applejuice name = "Apple Juice" description = "The sweet juice of an apple, fit for all ages." @@ -118,13 +74,6 @@ taste_description = "apples" ph = 3.2 // ~ 2.7 -> 3.7 -/datum/glass_style/has_foodtype/juicebox/applejuice - required_drink_type = /datum/reagent/consumable/applejuice - name = "apple juice box" - desc = "Sweet apple juice. Don't be late for school!" - icon_state = "juicebox" - drink_type = FRUIT - /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" description = "A tasty juice blended from various kinds of very deadly and toxic berries." @@ -132,12 +81,6 @@ taste_description = "berries" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/poisonberryjuice - required_drink_type = /datum/reagent/consumable/poisonberryjuice - name = "glass of berry juice" - desc = "Berry juice. Or maybe it's poison. Who cares?" - icon_state = "poisonberryjuice" - /datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjustToxLoss(1 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) . = TRUE @@ -150,12 +93,6 @@ taste_description = "juicy watermelon" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/watermelonjuice - required_drink_type = /datum/reagent/consumable/watermelonjuice - name = "glass of watermelon juice" - desc = "A glass of watermelon juice." - icon_state = "glass_red" - /datum/reagent/consumable/lemonjuice name = "Lemon Juice" description = "This juice is VERY sour." @@ -164,12 +101,6 @@ ph = 2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/lemonjuice - required_drink_type = /datum/reagent/consumable/lemonjuice - name = "glass of lemon juice" - desc = "Sour..." - icon_state = "lemonglass" - /datum/reagent/consumable/banana name = "Banana Juice" description = "The raw essence of a banana. HONK" @@ -177,12 +108,6 @@ taste_description = "banana" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/banana - required_drink_type = /datum/reagent/consumable/banana - name = "glass of banana juice" - desc = "The raw essence of a banana. HONK." - icon_state = "banana" - /datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(affected_mob)) @@ -201,12 +126,6 @@ required_drink_type = /datum/reagent/consumable/nothing icon_state = "shotglass" -/datum/glass_style/drinking_glass/nothing - required_drink_type = /datum/reagent/consumable/nothing - name = "nothing" - desc = "Absolutely nothing." - icon_state = "nothing" - /datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) if(ishuman(drinker) && HAS_TRAIT(drinker, TRAIT_MIMING)) drinker.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) @@ -251,12 +170,6 @@ taste_description = "irish sadness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/potato_juice - required_drink_type = /datum/reagent/consumable/potato_juice - name = "glass of potato juice" - desc = "Bleh..." - icon_state = "glass_brown" - /datum/reagent/consumable/grapejuice name = "Grape Juice" description = "The juice of a bunch of grapes. Guaranteed non-alcoholic." @@ -264,13 +177,6 @@ taste_description = "grape soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/juicebox/grapejuice - required_drink_type = /datum/reagent/consumable/grapejuice - name = "grape juice box" - desc = "Tasty grape juice in a fun little container. Non-alcoholic!" - icon_state = "grapebox" - drink_type = FRUIT - /datum/reagent/consumable/plumjuice name = "Plum Juice" description = "Refreshing and slightly acidic beverage." @@ -278,13 +184,6 @@ taste_description = "plums" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/drinking_glass/plumjuice - required_drink_type = /datum/reagent/consumable/plumjuice - name = "glass of plum juice" - desc = "Noice." - icon_state = "plumjuiceglass" - drink_type = FRUIT - /datum/reagent/consumable/milk name = "Milk" description = "An opaque white liquid produced by the mammary glands of mammals." @@ -294,20 +193,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/milk -/datum/glass_style/has_foodtype/drinking_glass/milk - required_drink_type = /datum/reagent/consumable/milk - name = "glass of milk" - desc = "White and nutritious goodness!" - icon_state = "glass_white" - drink_type = DAIRY | BREAKFAST - -/datum/glass_style/has_foodtype/juicebox/milk - required_drink_type = /datum/reagent/consumable/milk - name = "carton of milk" - desc = "An excellent source of calcium for growing space explorers." - icon_state = "milkbox" - drink_type = DAIRY | BREAKFAST - // Milk is good for humans, but bad for plants. The sugars cannot be used by plants, and the milk fat harms growth. Not shrooms though. I can't deal with this now... /datum/reagent/consumable/milk/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() @@ -333,12 +218,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/condiment/soymilk -/datum/glass_style/drinking_glass/soymilk - required_drink_type = /datum/reagent/consumable/soymilk - name = "glass of soy milk" - desc = "White and nutritious soy goodness!" - icon_state = "glass_white" - /datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) affected_mob.heal_bodypart_damage(1, 0) @@ -353,12 +232,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/cream -/datum/glass_style/drinking_glass/cream - required_drink_type = /datum/reagent/consumable/cream - name = "glass of cream" - desc = "Ewwww..." - icon_state = "glass_white" - /datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) affected_mob.heal_bodypart_damage(1, 0) @@ -375,11 +248,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_STOCK -/datum/glass_style/drinking_glass/coffee - required_drink_type = /datum/reagent/consumable/coffee - name = "glass of coffee" - desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - icon_state = "glass_brown" /datum/reagent/consumable/coffee/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) affected_mob.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) @@ -406,12 +274,6 @@ glass_price = DRINK_PRICE_STOCK default_container = /obj/item/reagent_containers/cup/glass/mug/tea -/datum/glass_style/drinking_glass/tea - required_drink_type = /datum/reagent/consumable/tea - name = "glass of tea" - desc = "Drinking it from here would not seem right." - icon_state = "teaglass" - /datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) @@ -461,13 +323,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/lemonade - required_drink_type = /datum/reagent/consumable/lemonade - name = "pitcher of lemonade" - desc = "This drink leaves you feeling nostalgic for some reason." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "lemonpitcher" - /datum/reagent/consumable/tea/arnold_palmer name = "Arnold Palmer" description = "Encourages the patient to go golfing." @@ -477,13 +332,6 @@ taste_description = "bitter tea" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/arnold_palmer - required_drink_type = /datum/reagent/consumable/tea/arnold_palmer - name = "Arnold Palmer" - desc = "You feel like taking a few golf swings after a few swigs of this." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "arnold_palmer" - /datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_notice("[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")) @@ -498,13 +346,6 @@ taste_description = "bitter coldness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/icecoffee - required_drink_type = /datum/reagent/consumable/icecoffee - name = "iced coffee" - desc = "A drink to perk you up and refresh you!" - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "icedcoffeeglass" - /datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) @@ -522,13 +363,6 @@ taste_description = "bitter coldness and a hint of smoke" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/hot_ice_coffee - required_drink_type = /datum/reagent/consumable/hot_ice_coffee - name = "hot ice coffee" - desc = "A sharp drink - This can't have come cheap." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "hoticecoffee" - /datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) @@ -547,13 +381,6 @@ taste_description = "sweet tea" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/icetea - required_drink_type = /datum/reagent/consumable/icetea - name = "iced tea" - desc = "All natural, antioxidant-rich flavour sensation." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "icedteaglass" - /datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-2 SECONDS * REM * seconds_per_tick) @@ -571,12 +398,6 @@ taste_description = "cola" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/space_cola - required_drink_type = /datum/reagent/consumable/space_cola - name = "glass of Space Cola" - desc = "A glass of refreshing Space Cola." - icon_state = "spacecola" - /datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) @@ -590,12 +411,6 @@ taste_description = "fruity overlysweet cola" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/roy_rogers - required_drink_type = /datum/reagent/consumable/roy_rogers - name = "Roy Rogers" - desc = "90% sugar in a glass." - icon_state = "royrogers" - /datum/reagent/consumable/roy_rogers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.set_jitter_if_lower(12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-10 SECONDS * REM * seconds_per_tick) @@ -610,13 +425,6 @@ taste_description = "the future" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/nuka_cola - required_drink_type = /datum/reagent/consumable/nuka_cola - name = "glass of Nuka Cola" - desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." - icon = 'icons/obj/drinks/soda.dmi' - icon_state = "nuka_colaglass" - /datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/affected_mob) ..() affected_mob.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) @@ -647,12 +455,6 @@ /// If we activated the effect var/effect_enabled = FALSE -/datum/glass_style/drinking_glass/rootbeer - required_drink_type = /datum/reagent/consumable/rootbeer - name = "glass of root beer" - desc = "A glass of highly potent, incredibly sugary root beer." - icon_state = "spacecola" - /datum/reagent/consumable/rootbeer/on_mob_end_metabolize(mob/living/affected_mob) REMOVE_TRAIT(affected_mob, TRAIT_DOUBLE_TAP, type) if(current_cycle > 10) @@ -685,11 +487,13 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED metabolized_traits = list(TRAIT_SHOCKIMMUNE) -/datum/glass_style/drinking_glass/grey_bull - required_drink_type = /datum/reagent/consumable/grey_bull - name = "glass of Grey Bull" - desc = "Surprisingly it isn't grey." - icon_state = "grey_bull_glass" + +/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/affected_atom) + ..() + /* var/obj/item/organ/internal/liver/liver = affected_atom.get_organ_slot(ORGAN_SLOT_LIVER) + if(HAS_TRAIT(liver, TRAIT_MAINTENANCE_METABOLISM)) + affected_atom.add_mood_event("maintenance_fun", /datum/mood_event/maintenance_high) + metabolization_rate *= 0.8 */ /datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.set_jitter_if_lower(40 SECONDS * REM * seconds_per_tick) @@ -706,12 +510,6 @@ taste_description = "sweet citrus soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/spacemountainwind - required_drink_type = /datum/reagent/consumable/spacemountainwind - name = "glass of Space Mountain Wind" - desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - icon_state = "Space_mountain_wind_glass" - /datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(-14 SECONDS * REM * seconds_per_tick) affected_mob.AdjustSleeping(-20 * REM * seconds_per_tick) @@ -727,12 +525,6 @@ taste_description = "cherry soda" // FALSE ADVERTISING chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/dr_gibb - required_drink_type = /datum/reagent/consumable/dr_gibb - name = "glass of Dr. Gibb" - desc = "Dr. Gibb. Not as dangerous as the container_name might imply." - icon_state = "dr_gibb_glass" - /datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) @@ -745,12 +537,6 @@ taste_description = "cherry soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/space_up - required_drink_type = /datum/reagent/consumable/space_up - name = "glass of Space-Up" - desc = "Space-up. It helps you keep your cool." - icon_state = "space-up_glass" - /datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -762,12 +548,6 @@ taste_description = "tangy lime and lemon soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/lemon_lime - required_drink_type = /datum/reagent/consumable/lemon_lime - name = "glass of lemon-lime" - desc = "You're pretty certain a real fruit has never actually touched this." - icon_state = "lemonlime" - /datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -779,12 +559,6 @@ taste_description = "sweet and salty tang" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/pwr_game - required_drink_type = /datum/reagent/consumable/pwr_game - name = "glass of Pwr Game" - desc = "Goes well with a Vlad's salad." - icon_state = "pwrgame" - /datum/reagent/consumable/pwr_game/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() if(exposed_mob?.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && (methods & INGEST) && !HAS_TRAIT(exposed_mob, TRAIT_GAMERGOD)) @@ -805,12 +579,6 @@ taste_description = "carbonated metallic soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/shamblers - required_drink_type = /datum/reagent/consumable/shamblers - name = "glass of Shambler's juice" - desc = "Mmm mm, shambly." - icon_state = "shamblerjuice" - /datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -822,12 +590,6 @@ taste_description = "carbonated water" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/sodawater - required_drink_type = /datum/reagent/consumable/sodawater - name = "glass of soda water" - desc = "Soda water. Why not make a scotch and soda?" - icon_state = "glass_clearcarb" - // 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. /datum/reagent/consumable/sodawater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -850,12 +612,6 @@ taste_description = "tart and fresh" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/tonic - required_drink_type = /datum/reagent/consumable/tonic - name = "glass of tonic water" - desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - icon_state = "glass_clearcarb" - /datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) @@ -890,12 +646,6 @@ taste_description = "barbecue and nostalgia" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/monkey_energy - required_drink_type = /datum/reagent/consumable/monkey_energy - name = "glass of Monkey Energy" - desc = "You can unleash the ape, but without the pop of the can?" - icon_state = "monkey_energy_glass" - /datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.set_jitter_if_lower(80 SECONDS * REM * seconds_per_tick) affected_mob.adjust_dizzy(2 SECONDS * REM * seconds_per_tick) @@ -927,12 +677,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/ice -/datum/glass_style/drinking_glass/ice - required_drink_type = /datum/reagent/consumable/ice - name = "glass of ice" - desc = "Generally, you're supposed to put something else in there too..." - icon_state = "iceglass" - /datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -946,13 +690,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/soy_latte - required_drink_type = /datum/reagent/consumable/soy_latte - name = "soy latte" - desc = "A nice and refreshing beverage while you're reading." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "soy_latte" - /datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) @@ -973,13 +710,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_EASY -/datum/glass_style/drinking_glass/cafe_latte - required_drink_type = /datum/reagent/consumable/cafe_latte - name = "cafe latte" - desc = "A nice, strong and refreshing beverage while you're reading." - icon = 'icons/obj/drinks/coffee.dmi' - icon_state = "cafe_latte" - /datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_dizzy(-10 SECONDS * REM * seconds_per_tick) affected_mob.adjust_drowsiness(-12 SECONDS * REM * seconds_per_tick) @@ -999,13 +729,6 @@ taste_description = "homely fruit" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/doctor_delight - required_drink_type = /datum/reagent/consumable/doctor_delight - name = "Doctor's Delight" - desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "doctorsdelightglass" - /datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) @@ -1027,13 +750,6 @@ taste_description = "sweet tangy fruit" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/cinderella - required_drink_type = /datum/reagent/consumable/cinderella - name = "Cinderella" - desc = "There is not a single drop of alcohol in this thing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cinderella" - /datum/reagent/consumable/cinderella/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) return ..() @@ -1048,13 +764,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/cherryshake - required_drink_type = /datum/reagent/consumable/cherryshake - name = "cherry shake" - desc = "A cherry flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "cherryshake" - /datum/reagent/consumable/bluecherryshake name = "Blue Cherry Shake" description = "An exotic milkshake." @@ -1064,13 +773,6 @@ taste_description = "creamy blue cherry" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bluecherryshake - required_drink_type = /datum/reagent/consumable/bluecherryshake - name = "blue cherry shake" - desc = "An exotic blue milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "bluecherryshake" - /datum/reagent/consumable/vanillashake name = "Vanilla Shake" description = "A vanilla flavored milkshake. The basics are still good." @@ -1081,13 +783,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/vanillashake - required_drink_type = /datum/reagent/consumable/vanillashake - name = "vanilla shake" - desc = "A vanilla flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "vanillashake" - /datum/reagent/consumable/caramelshake name = "Caramel Shake" description = "A caramel flavored milkshake. Your teeth hurt looking at it." @@ -1098,13 +793,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/caramelshake - required_drink_type = /datum/reagent/consumable/caramelshake - name = "caramel shake" - desc = "A caramel flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "caramelshake" - /datum/reagent/consumable/choccyshake name = "Chocolate Shake" description = "A frosty chocolate milkshake." @@ -1115,13 +803,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/choccyshake - required_drink_type = /datum/reagent/consumable/choccyshake - name = "chocolate shake" - desc = "A chocolate flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "choccyshake" - /datum/reagent/consumable/strawberryshake name = "Strawberry Shake" description = "A strawberry milkshake." @@ -1132,13 +813,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/strawberryshake - required_drink_type = /datum/reagent/consumable/strawberryshake - name = "strawberry shake" - desc = "A strawberry flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "strawberryshake" - /datum/reagent/consumable/bananashake name = "Banana Shake" description = "A banana milkshake. Stuff that clowns drink at their honkday parties." @@ -1149,13 +823,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED glass_price = DRINK_PRICE_MEDIUM -/datum/glass_style/drinking_glass/bananashake - required_drink_type = /datum/reagent/consumable/bananashake - name = "banana shake" - desc = "A banana flavored milkshake." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "bananashake" - /datum/reagent/consumable/pumpkin_latte name = "Pumpkin Latte" description = "A mix of pumpkin juice and coffee." @@ -1165,13 +832,6 @@ taste_description = "creamy pumpkin" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/pumpkin_latte - required_drink_type = /datum/reagent/consumable/pumpkin_latte - name = "pumpkin latte" - desc = "A mix of coffee and pumpkin juice." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "pumpkin_latte" - /datum/reagent/consumable/gibbfloats name = "Gibb Floats" description = "Ice cream on top of a Dr. Gibb glass." @@ -1181,13 +841,6 @@ taste_description = "creamy cherry" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/gibbfloats - required_drink_type = /datum/reagent/consumable/gibbfloats - name = "Gibbfloat" - desc = "Dr. Gibb with ice cream on top." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "gibbfloats" - /datum/reagent/consumable/pumpkinjuice name = "Pumpkin Juice" description = "Juiced from real pumpkin." @@ -1210,13 +863,6 @@ taste_description = "extreme bitterness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/triple_citrus - required_drink_type = /datum/reagent/consumable/triple_citrus - name = "glass of triple citrus" - desc = "A mixture of citrus juices. Tangy, yet smooth." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "triplecitrus" //needs own sprite mine are trash //your sprite is great tho - /datum/reagent/consumable/grape_soda name = "Grape Soda" description = "Beloved by children and teetotalers." @@ -1224,10 +870,6 @@ taste_description = "grape soda" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/grape_soda - required_drink_type = /datum/reagent/consumable/grape_soda - name = "glass of grape juice" - /datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -1240,13 +882,6 @@ taste_description = "chocolate milk" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/juicebox/chocolate_milk - required_drink_type = /datum/reagent/consumable/milk/chocolate_milk - name = "carton of chocolate milk" - desc = "Milk for cool kids!" - icon_state = "chocolatebox" - drink_type = SUGAR | DAIRY - /datum/reagent/consumable/hot_coco name = "Hot Coco" description = "Made with love! And coco beans." @@ -1255,13 +890,6 @@ taste_description = "creamy chocolate" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/drinking_glass/hot_coco - required_drink_type = /datum/reagent/consumable/hot_coco - name = "glass of hot coco" - desc = "A favorite winter drink to warm you up." - icon_state = "chocolateglass" - drink_type = SUGAR | DAIRY - /datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) if(affected_mob.getBruteLoss() && SPT_PROB(10, seconds_per_tick)) @@ -1280,13 +908,6 @@ taste_description = "thick creamy chocolate" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/italian_coco - required_drink_type = /datum/reagent/consumable/italian_coco - name = "glass of italian coco" - desc = "A spin on a winter favourite, made to please." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "italiancoco" - /datum/reagent/consumable/italian_coco/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, 0, affected_mob.get_body_temp_normal()) return ..() @@ -1299,12 +920,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/menthol -/datum/glass_style/drinking_glass/menthol - required_drink_type = /datum/reagent/consumable/menthol - name = "glass of menthol" - desc = "Tastes naturally minty, and imparts a very mild numbing sensation." - icon_state = "glass_green" - /datum/reagent/consumable/menthol/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) affected_mob.apply_status_effect(/datum/status_effect/throat_soothed) ..() @@ -1316,11 +931,6 @@ taste_description = "sweet pomegranates" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/grenadine - required_drink_type = /datum/reagent/consumable/grenadine - name = "glass of grenadine" - desc = "Delicious flavored syrup." - /datum/reagent/consumable/parsnipjuice name = "Parsnip Juice" description = "Why..." @@ -1328,11 +938,6 @@ taste_description = "parsnip" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/drinking_glass/parsnipjuice - required_drink_type = /datum/reagent/consumable/parsnipjuice - name = "glass of parsnip juice" - drink_type = FRUIT - /datum/reagent/consumable/pineapplejuice name = "Pineapple Juice" description = "Tart, tropical, and hotly debated." @@ -1341,19 +946,6 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED default_container = /obj/item/reagent_containers/cup/glass/bottle/juice/pineapplejuice -/datum/glass_style/has_foodtype/drinking_glass/pineapplejuice - required_drink_type = /datum/reagent/consumable/pineapplejuice - name = "glass of pineapple juice" - desc = "Tart, tropical, and hotly debated." - drink_type = FRUIT | PINEAPPLE - -/datum/glass_style/has_foodtype/juicebox/pineapplejuice - required_drink_type = /datum/reagent/consumable/pineapplejuice - name = "pineapple juice box" - desc = "Why would you even want this?" - icon_state = "pineapplebox" - drink_type = FRUIT | PINEAPPLE - /datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink name = "Peach Juice" description = "Just peachy." @@ -1361,11 +953,6 @@ taste_description = "peaches" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/has_foodtype/drinking_glass/peachjuice - required_drink_type = /datum/reagent/consumable/peachjuice - name = "glass of peach juice" - drink_type = FRUIT - /datum/reagent/consumable/cream_soda name = "Cream Soda" description = "A classic space-American vanilla flavored soft drink." @@ -1374,13 +961,6 @@ taste_description = "fizzy vanilla" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/cream_soda - required_drink_type = /datum/reagent/consumable/cream_soda - name = "Cream Soda" - desc = "A classic space-American vanilla flavored soft drink." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cream_soda" - /datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) ..() @@ -1393,12 +973,6 @@ taste_description = "sweet ginger spice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/sol_dry - required_drink_type = /datum/reagent/consumable/sol_dry - name = "Sol Dry" - desc = "A soothing, mellow drink made from ginger." - icon_state = "soldry" - /datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) ..() @@ -1411,13 +985,6 @@ taste_description = "sweet cherry syrup and ginger spice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/shirley_temple - required_drink_type = /datum/reagent/consumable/shirley_temple - name = "Shirley Temple" - desc = "Ginger ale with processed grenadine. " - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "shirleytemple" - /datum/reagent/consumable/shirley_temple/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_disgust(-3 * REM * seconds_per_tick) return ..() @@ -1432,30 +999,21 @@ bypass_restriction = TRUE var/current_size = RESIZE_DEFAULT_SIZE -/datum/glass_style/drinking_glass/red_queen - required_drink_type = /datum/reagent/consumable/red_queen - name = "Red Queen" - desc = "DRINK ME." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "red_queen" - /datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(SPT_PROB(50, seconds_per_tick)) return ..() var/newsize = pick(0.5, 0.75, 1, 1.50, 2) newsize *= RESIZE_DEFAULT_SIZE - affected_mob.resize = newsize/current_size + affected_mob.update_transform(newsize/current_size) current_size = newsize - affected_mob.update_transform() if(SPT_PROB(23, seconds_per_tick)) affected_mob.emote("sneeze") ..() /datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.resize = RESIZE_DEFAULT_SIZE/current_size + affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - affected_mob.update_transform() ..() /datum/reagent/consumable/bungojuice @@ -1465,12 +1023,6 @@ taste_description = "succulent bungo" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/bungojuice - required_drink_type = /datum/reagent/consumable/bungojuice - name = "glass of bungo juice" - desc = "Exotic! You feel like you are on vacation already." - icon_state = "glass_yellow" - /datum/reagent/consumable/prunomix name = "Pruno Mixture" color = "#E78108" @@ -1478,12 +1030,6 @@ taste_description = "garbage" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/prunomix - required_drink_type = /datum/reagent/consumable/prunomix - name = "glass of pruno mixture" - desc = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." - icon_state = "glass_orange" - /datum/reagent/consumable/aloejuice name = "Aloe Juice" color = "#A3C48B" @@ -1491,12 +1037,6 @@ taste_description = "vegetable" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/aloejuice - required_drink_type = /datum/reagent/consumable/aloejuice - name = "glass of aloe juice" - desc = "A healthy and refreshing juice." - icon_state = "glass_yellow" - /datum/reagent/consumable/aloejuice/on_mob_life(mob/living/affected_mob, seconds_per_tick, times_fired) if(affected_mob.getToxLoss() && SPT_PROB(16, seconds_per_tick)) affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) @@ -1511,13 +1051,6 @@ taste_description = "cool refreshing watermelon" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/agua_fresca - required_drink_type = /datum/reagent/consumable/agua_fresca - name = "Agua Fresca" - desc = "90% water, but still refreshing." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "aguafresca" - /datum/reagent/consumable/agua_fresca/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) if(affected_mob.getToxLoss() && SPT_PROB(10, seconds_per_tick)) @@ -1532,12 +1065,6 @@ taste_description = "mushrooms" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/mushroom_tea - required_drink_type = /datum/reagent/consumable/mushroom_tea - name = "glass of mushroom tea" - desc = "Oddly savoury for a drink." - icon_state = "mushroom_tea_glass" - /datum/reagent/consumable/mushroom_tea/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) if(islizard(affected_mob)) affected_mob.adjustOxyLoss(-0.5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) @@ -1553,12 +1080,6 @@ taste_description = "fiery itchy pain" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/toechtauese_juice - required_drink_type = /datum/reagent/consumable/toechtauese_juice - name = "glass of töchtaüse juice" - desc = "Raw, unadulterated töchtaüse juice. One swig will fill you with regrets." - icon_state = "toechtauese_syrup" - /datum/reagent/consumable/toechtauese_syrup name = "Töchtaüse Syrup" description = "A harsh spicy and bitter syrup, made from töchtaüse berries. Useful as an ingredient, both for food and cocktails." @@ -1567,12 +1088,6 @@ taste_description = "sugar, spice, and nothing nice" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/toechtauese_syrup - required_drink_type = /datum/reagent/consumable/toechtauese_syrup - name = "glass of töchtaüse syrup" - desc = "Not for drinking on its own." - icon_state = "toechtauese_syrup" - /datum/reagent/consumable/strawberry_banana name = "strawberry banana smoothie" description = "A classic smoothie made from strawberries and bananas." @@ -1581,13 +1096,6 @@ taste_description = "strawberry and banana" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/strawberry_banana - required_drink_type = /datum/reagent/consumable/strawberry_banana - name = "strawberry banana smoothie" - desc = "A classic drink which countless souls have bonded over..." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "strawberry_banana" - /datum/reagent/consumable/berry_blast name = "berry blast smoothie" description = "A classic smoothie made from mixed berries." @@ -1596,13 +1104,6 @@ taste_description = "mixed berry" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/berry_blast - required_drink_type = /datum/reagent/consumable/berry_blast - name = "berry blast smoothie" - desc = "A classic drink, freshly made with hand picked berries. Or, maybe not." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "berry_blast" - /datum/reagent/consumable/funky_monkey name = "funky monkey smoothie" description = "A classic smoothie made from chocolate and bananas." @@ -1611,13 +1112,6 @@ taste_description = "chocolate and banana" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/funky_monkey - required_drink_type = /datum/reagent/consumable/funky_monkey - name = "funky monkey smoothie" - desc = "A classic drink made with chocolate and banana. No monkeys were harmed, officially." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "funky_monkey" - /datum/reagent/consumable/green_giant name = "green giant smoothie" description = "A green vegetable smoothie, made without vegetables." @@ -1626,13 +1120,6 @@ taste_description = "green, just green" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/green_giant - required_drink_type = /datum/reagent/consumable/green_giant - name = "green giant smoothie" - desc = "A classic drink, if you enjoy juiced wheatgrass and chia seeds." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "green_giant" - /datum/reagent/consumable/melon_baller name = "melon baller smoothie" description = "A classic smoothie made from melons." @@ -1641,13 +1128,6 @@ taste_description = "fresh melon" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/melon_baller - required_drink_type = /datum/reagent/consumable/melon_baller - name = "melon baller smoothie" - desc = "A wonderfully fresh melon smoothie. Guaranteed to brighten your day." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "melon_baller" - /datum/reagent/consumable/vanilla_dream name = "vanilla dream smoothie" description = "A classic smoothie made from vanilla and fresh cream." @@ -1656,13 +1136,6 @@ taste_description = "creamy vanilla" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/vanilla_dream - required_drink_type = /datum/reagent/consumable/vanilla_dream - name = "vanilla dream smoothie" - desc = "A classic drink made with vanilla and fresh cream." - icon = 'icons/obj/drinks/shakes.dmi' - icon_state = "vanilla_dream" - /datum/reagent/consumable/cucumberjuice name = "Cucumber Juice" description = "Ordinary cucumber juice, nothing from the fantasy world." @@ -1670,27 +1143,14 @@ taste_description = "light cucumber" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/cucumberjuice - required_drink_type = /datum/reagent/consumable/cucumberjuice - name = "glass of cucumber juice" - desc = "A glass of cucumber juice." - icon_state = "glass_cucumber" - /datum/reagent/consumable/cucumberlemonade name = "Cucumber Lemonade" - description = "Cucumber juice, sugar and soda, what else is needed for happiness?" + description = "Cucumber juice, sugar, and soda; what else do I need?" color = "#6cd87a" quality = DRINK_GOOD taste_description = "citrus soda with cucumber" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/cucumberlemonade - required_drink_type = /datum/reagent/consumable/cucumberlemonade - name = "cucumber lemonade" - desc = "The smell of cucumber from lemonade, I'm sure I won't get poisoned?." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "cucumber_lemonade" - /datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) doll.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, doll.get_body_temp_normal()) if(doll.getToxLoss() && SPT_PROB(10, seconds_per_tick)) @@ -1704,13 +1164,6 @@ taste_description = "sludge seeping down your throat" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/glass_style/drinking_glass/mississippi_queen - required_drink_type = /datum/reagent/consumable/mississippi_queen - name = "Mississippi Queen" - desc = "Mullets and cut-up jorts not included." - icon = 'icons/obj/drinks/mixed_drinks.dmi' - icon_state = "mississippiglass" - /datum/reagent/consumable/mississippi_queen/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) switch(current_cycle) if(10 to 20) diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm new file mode 100644 index 000000000000..eda3827876c3 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm @@ -0,0 +1,239 @@ +/datum/glass_style/drinking_glass/beer + required_drink_type = /datum/reagent/consumable/ethanol/beer + name = "glass of beer" + desc = "A freezing pint of beer." + icon_state = "beerglass" + +/datum/glass_style/drinking_glass/beer/light + required_drink_type = /datum/reagent/consumable/ethanol/beer/light + name = "glass of light beer" + desc = "A freezing pint of watery light beer." + +/datum/glass_style/drinking_glass/beer/light + required_drink_type = /datum/reagent/consumable/ethanol/beer/maltliquor + name = "glass of malt liquor" + desc = "A freezing pint of malt liquor." + +/datum/glass_style/drinking_glass/beer/green + required_drink_type = /datum/reagent/consumable/ethanol/beer/green + name = "glass of green beer" + desc = "A freezing pint of green beer. Festive." + icon_state = "greenbeerglass" + +/datum/glass_style/drinking_glass/kahlua + required_drink_type = /datum/reagent/consumable/ethanol/kahlua + name = "glass of RR coffee liquor" + desc = "DAMN, THIS THING LOOKS ROBUST!" + icon_state ="kahluaglass" + +/datum/glass_style/drinking_glass/whiskey + required_drink_type = /datum/reagent/consumable/ethanol/whiskey + name = "glass of whiskey" + desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + icon_state = "whiskeyglass" + +/datum/glass_style/drinking_glass/whiskey/kong + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong + name = "glass of Kong" + desc = "Makes You Go Ape!®" + +/datum/glass_style/drinking_glass/whiskey/candycorn + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn + name = "glass of candy corn liquor" + desc = "Good for your Imagination." + +/datum/glass_style/drinking_glass/thirteenloko + required_drink_type = /datum/reagent/consumable/ethanol/thirteenloko + name = "glass of Thirteen Loko" + desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." + icon_state = "thirteen_loko_glass" + +/datum/glass_style/drinking_glass/vodka + required_drink_type = /datum/reagent/consumable/ethanol/vodka + name = "glass of vodka" + desc = "The glass contain wodka. Xynta." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/gin + required_drink_type = /datum/reagent/consumable/ethanol/gin + name = "glass of gin" + desc = "A crystal clear glass of Griffeater gin." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/rum + required_drink_type = /datum/reagent/consumable/ethanol/rum + name = "glass of rum" + desc = "Now you want to pray for a pirate suit, don't you?" + icon_state = "rumglass" + +/datum/glass_style/drinking_glass/tequila + required_drink_type = /datum/reagent/consumable/ethanol/tequila + name = "glass of tequila" + desc = "Now all that's missing is the weird colored shades!" + icon_state = "tequilaglass" + +/datum/glass_style/drinking_glass/vermouth + required_drink_type = /datum/reagent/consumable/ethanol/vermouth + name = "glass of vermouth" + desc = "You wonder why you're even drinking this straight." + icon_state = "vermouthglass" + +/datum/glass_style/drinking_glass/wine + required_drink_type = /datum/reagent/consumable/ethanol/wine + name = "glass of wine" + desc = "A very classy looking drink." + icon_state = "wineglass" + +/datum/glass_style/drinking_glass/grappa + required_drink_type = /datum/reagent/consumable/ethanol/grappa + name = "glass of grappa" + desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." + icon_state = "grappa" + +/datum/glass_style/drinking_glass/amaretto + required_drink_type = /datum/reagent/consumable/ethanol/amaretto + name = "glass of amaretto" + desc = "A sweet and syrupy looking drink." + icon_state = "amarettoglass" +/datum/glass_style/drinking_glass/cognac + required_drink_type = /datum/reagent/consumable/ethanol/cognac + name = "glass of cognac" + desc = "Damn, you feel like some kind of French aristocrat just by holding this." + icon_state = "cognacglass" + +/datum/glass_style/drinking_glass/absinthe + required_drink_type = /datum/reagent/consumable/ethanol/absinthe + name = "glass of absinthe" + desc = "It's as strong as it smells." + icon_state = "absinthe" + +/datum/glass_style/drinking_glass/hooch + required_drink_type = /datum/reagent/consumable/ethanol/hooch + name = "glass of ale" + desc = "A freezing pint of delicious Ale." + icon_state = "aleglass" + +/datum/glass_style/drinking_glass/goldschlager + required_drink_type = /datum/reagent/consumable/ethanol/goldschlager + name = "glass of goldschlager" + desc = "100% proof that teen girls will drink anything with gold in it." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "goldschlagerglass" + +/datum/glass_style/drinking_glass/patron + required_drink_type = /datum/reagent/consumable/ethanol/patron + name = "glass of patron" + desc = "Drinking patron in the bar, with all the subpar ladies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "patronglass" + +/datum/glass_style/drinking_glass/sake + required_drink_type = /datum/reagent/consumable/ethanol/sake + name = "cup of sake" + desc = "A traditional cup of sake." + icon_state = "sakecup" + +/datum/glass_style/drinking_glass/fernet + required_drink_type = /datum/reagent/consumable/ethanol/fernet + name = "glass of fernet" + desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum + +/datum/glass_style/drinking_glass/fruit_wine + required_drink_type = /datum/reagent/consumable/ethanol/fruit_wine + // This should really be dynamic like "glass of pineapple wine" or something + // but seeing as fruit wine half doesn't work already I'm not inclined to add support for that now + name = "glass of fruit wine" + desc = "A wine made from grown plants." + +/datum/glass_style/drinking_glass/champagne + required_drink_type = /datum/reagent/consumable/ethanol/champagne + name = "Champagne" + desc = "The flute clearly displays the slowly rising bubbles." + icon_state = "champagne_glass" + +/datum/glass_style/drinking_glass/pruno + required_drink_type = /datum/reagent/consumable/ethanol/pruno + name = "glass of pruno" + desc = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/navy_rum + required_drink_type = /datum/reagent/consumable/ethanol/navy_rum + name = "glass of navy rum" + desc = "Splice the mainbrace, and God save the King." + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/curacao + required_drink_type = /datum/reagent/consumable/ethanol/curacao + name = "glass of curaçao" + desc = "It's blue, da ba dee." + icon_state = "curacao" + +/datum/glass_style/drinking_glass/bitters + required_drink_type = /datum/reagent/consumable/ethanol/bitters + name = "glass of bitters" + desc = "Typically you'd want to mix this with something- but you do you." + icon_state = "bitters" + + +// Shot glasses + +/datum/glass_style/shot_glass/kahlua + required_drink_type = /datum/reagent/consumable/ethanol/kahlua + icon_state ="shotglasscream" + +/datum/glass_style/shot_glass/whiskey + required_drink_type = /datum/reagent/consumable/ethanol/whiskey + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/whiskey/kong + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/kong + +/datum/glass_style/shot_glass/whiskey/candycorn + required_drink_type = /datum/reagent/consumable/ethanol/whiskey/candycorn + +/datum/glass_style/shot_glass/vodka + required_drink_type = /datum/reagent/consumable/ethanol/vodka + icon_state = "shotglassclear" + +/datum/glass_style/shot_glass/rum + required_drink_type = /datum/reagent/consumable/ethanol/rum + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/tequila + required_drink_type = /datum/reagent/consumable/ethanol/tequila + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/vermouth + required_drink_type = /datum/reagent/consumable/ethanol/vermouth + icon_state = "shotglassclear" + +/datum/glass_style/shot_glass/wine + required_drink_type = /datum/reagent/consumable/ethanol/wine + icon_state = "shotglassred" + +/datum/glass_style/shot_glass/amaretto + required_drink_type = /datum/reagent/consumable/ethanol/amaretto + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/cognac + required_drink_type = /datum/reagent/consumable/ethanol/cognac + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/absinthe + required_drink_type = /datum/reagent/consumable/ethanol/absinthe + icon_state = "shotglassgreen" + +/datum/glass_style/drinking_glass/hooch + required_drink_type = /datum/reagent/consumable/ethanol/hooch + name = "Hooch" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + icon_state = "glass_brown2" + +/datum/glass_style/shot_glass/goldschlager + required_drink_type = /datum/reagent/consumable/ethanol/goldschlager + icon_state = "shotglassgold" + +/datum/glass_style/shot_glass/patron + required_drink_type = /datum/reagent/consumable/ethanol/patron + icon_state = "shotglassclear" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm new file mode 100644 index 000000000000..79ba13a4acb4 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm @@ -0,0 +1,75 @@ +// Coffees and Teas + +/datum/glass_style/drinking_glass/coffee + required_drink_type = /datum/reagent/consumable/coffee + name = "glass of coffee" + desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/tea + required_drink_type = /datum/reagent/consumable/tea + name = "glass of tea" + desc = "Drinking it from here would not seem right." + icon_state = "teaglass" + +/datum/glass_style/drinking_glass/icecoffee + required_drink_type = /datum/reagent/consumable/icecoffee + name = "iced coffee" + desc = "A drink to perk you up and refresh you!" + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "icedcoffeeglass" + +/datum/glass_style/drinking_glass/hot_ice_coffee + required_drink_type = /datum/reagent/consumable/hot_ice_coffee + name = "hot ice coffee" + desc = "A sharp drink - This can't have come cheap." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "hoticecoffee" + +/datum/glass_style/drinking_glass/icetea + required_drink_type = /datum/reagent/consumable/icetea + name = "iced tea" + desc = "All natural, antioxidant-rich flavour sensation." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "icedteaglass" + +/datum/glass_style/drinking_glass/soy_latte + required_drink_type = /datum/reagent/consumable/soy_latte + name = "soy latte" + desc = "A nice and refreshing beverage while you're reading." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "soy_latte" + +/datum/glass_style/drinking_glass/cafe_latte + required_drink_type = /datum/reagent/consumable/cafe_latte + name = "cafe latte" + desc = "A nice, strong and refreshing beverage while you're reading." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "cafe_latte" + +/datum/glass_style/drinking_glass/pumpkin_latte + required_drink_type = /datum/reagent/consumable/pumpkin_latte + name = "pumpkin latte" + desc = "A mix of coffee and pumpkin juice." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pumpkin_latte" + +/datum/glass_style/has_foodtype/drinking_glass/hot_coco + required_drink_type = /datum/reagent/consumable/hot_coco + name = "glass of hot coco" + desc = "A favorite winter drink to warm you up." + icon_state = "chocolateglass" + drink_type = SUGAR | DAIRY + +/datum/glass_style/drinking_glass/italian_coco + required_drink_type = /datum/reagent/consumable/italian_coco + name = "glass of italian coco" + desc = "A spin on a winter favourite, made to please." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "italiancoco" + +/datum/glass_style/drinking_glass/mushroom_tea + required_drink_type = /datum/reagent/consumable/mushroom_tea + name = "glass of mushroom tea" + desc = "Oddly savoury for a drink." + icon_state = "mushroom_tea_glass" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm new file mode 100644 index 000000000000..4a6592abe0ee --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm @@ -0,0 +1,34 @@ +// Dairy + +/datum/glass_style/has_foodtype/drinking_glass/milk + required_drink_type = /datum/reagent/consumable/milk + name = "glass of milk" + desc = "White and nutritious goodness!" + icon_state = "glass_white" + drink_type = DAIRY | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/milk + required_drink_type = /datum/reagent/consumable/milk + name = "carton of milk" + desc = "An excellent source of calcium for growing space explorers." + icon_state = "milkbox" + drink_type = DAIRY | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/chocolate_milk + required_drink_type = /datum/reagent/consumable/milk/chocolate_milk + name = "carton of chocolate milk" + desc = "Milk for cool kids!" + icon_state = "chocolatebox" + drink_type = SUGAR | DAIRY + +/datum/glass_style/drinking_glass/soymilk + required_drink_type = /datum/reagent/consumable/soymilk + name = "glass of soy milk" + desc = "White and nutritious soy goodness!" + icon_state = "glass_white" + +/datum/glass_style/drinking_glass/cream + required_drink_type = /datum/reagent/consumable/cream + name = "glass of cream" + desc = "Ewwww..." + icon_state = "glass_white" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm new file mode 100644 index 000000000000..6f837d8f5158 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/juices.dm @@ -0,0 +1,175 @@ +// Fruit/veggie juices and syrups + +/datum/glass_style/has_foodtype/drinking_glass/orangejuice + required_drink_type = /datum/reagent/consumable/orangejuice + name = "glass of orange juice" + desc = "Vitamins! Yay!" + icon_state = "glass_orange" + drink_type = FRUIT | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/orangejuice + required_drink_type = /datum/reagent/consumable/orangejuice + name = "orange juice box" + desc = "A great source of vitamins. Stay healthy!" + icon_state = "orangebox" + drink_type = FRUIT | BREAKFAST + +/datum/glass_style/has_foodtype/juicebox/applejuice + required_drink_type = /datum/reagent/consumable/applejuice + name = "apple juice box" + desc = "Sweet apple juice. Don't be late for school!" + icon_state = "juicebox" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/juicebox/grapejuice + required_drink_type = /datum/reagent/consumable/grapejuice + name = "grape juice box" + desc = "Tasty grape juice in a fun little container. Non-alcoholic!" + icon_state = "grapebox" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/plumjuice + required_drink_type = /datum/reagent/consumable/plumjuice + name = "glass of plum juice" + desc = "Noice." + icon_state = "plumjuiceglass" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/parsnipjuice + required_drink_type = /datum/reagent/consumable/parsnipjuice + name = "glass of parsnip juice" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/drinking_glass/pineapplejuice + required_drink_type = /datum/reagent/consumable/pineapplejuice + name = "glass of pineapple juice" + desc = "Tart, tropical, and hotly debated." + drink_type = FRUIT | PINEAPPLE + +/datum/glass_style/has_foodtype/juicebox/pineapplejuice + required_drink_type = /datum/reagent/consumable/pineapplejuice + name = "pineapple juice box" + desc = "Why would you even want this?" + icon_state = "pineapplebox" + drink_type = FRUIT | PINEAPPLE + +/datum/glass_style/has_foodtype/drinking_glass/peachjuice + required_drink_type = /datum/reagent/consumable/peachjuice + name = "glass of peach juice" + drink_type = FRUIT + +/datum/glass_style/drinking_glass/tomatojuice + required_drink_type = /datum/reagent/consumable/tomatojuice + name = "glass of tomato juice" + desc = "Are you sure this is tomato juice?" + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/limejuice + required_drink_type = /datum/reagent/consumable/limejuice + name = "glass of lime juice" + desc = "A glass of sweet-sour lime juice." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/carrotjuice + required_drink_type = /datum/reagent/consumable/carrotjuice + name = "glass of carrot juice" + desc = "It's just like a carrot but without crunching." + icon_state = "carrotjuice" + +/datum/glass_style/drinking_glass/berryjuice + required_drink_type = /datum/reagent/consumable/berryjuice + name = "glass of berry juice" + desc = "Berry juice. Or maybe it's jam. Who cares?" + icon_state = "berryjuice" + +/datum/glass_style/drinking_glass/poisonberryjuice + required_drink_type = /datum/reagent/consumable/poisonberryjuice + name = "glass of berry juice" + desc = "Berry juice. Or maybe it's poison. Who cares?" + icon_state = "poisonberryjuice" + +/datum/glass_style/drinking_glass/watermelonjuice + required_drink_type = /datum/reagent/consumable/watermelonjuice + name = "glass of watermelon juice" + desc = "A glass of watermelon juice." + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/lemonjuice + required_drink_type = /datum/reagent/consumable/lemonjuice + name = "glass of lemon juice" + desc = "Sour..." + icon_state = "lemonglass" + +/datum/glass_style/drinking_glass/banana + required_drink_type = /datum/reagent/consumable/banana + name = "glass of banana juice" + desc = "The raw essence of a banana. HONK." + icon_state = "banana" + +/datum/glass_style/drinking_glass/nothing + required_drink_type = /datum/reagent/consumable/nothing + name = "nothing" + desc = "Absolutely nothing." + icon_state = "nothing" + +/datum/glass_style/drinking_glass/potato_juice + required_drink_type = /datum/reagent/consumable/potato_juice + name = "glass of potato juice" + desc = "Bleh..." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/bungojuice + required_drink_type = /datum/reagent/consumable/bungojuice + name = "glass of bungo juice" + desc = "Exotic! You feel like you are on vacation already." + icon_state = "glass_yellow" + +/datum/glass_style/drinking_glass/prunomix + required_drink_type = /datum/reagent/consumable/prunomix + name = "glass of pruno mixture" + desc = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/aloejuice + required_drink_type = /datum/reagent/consumable/aloejuice + name = "glass of aloe juice" + desc = "A healthy and refreshing juice." + icon_state = "glass_yellow" + +/datum/glass_style/drinking_glass/toechtauese_juice + required_drink_type = /datum/reagent/consumable/toechtauese_juice + name = "glass of töchtaüse juice" + desc = "Raw, unadulterated töchtaüse juice. One swig will fill you with regrets." + icon_state = "toechtauese_syrup" + +/datum/glass_style/drinking_glass/toechtauese_syrup + required_drink_type = /datum/reagent/consumable/toechtauese_syrup + name = "glass of töchtaüse syrup" + desc = "Not for drinking on its own." + icon_state = "toechtauese_syrup" + +/datum/glass_style/drinking_glass/cucumberjuice + required_drink_type = /datum/reagent/consumable/cucumberjuice + name = "glass of cucumber juice" + desc = "A glass of cucumber juice." + icon_state = "glass_cucumber" + + +// Effectively misc + +/datum/glass_style/drinking_glass/menthol + required_drink_type = /datum/reagent/consumable/menthol + name = "glass of menthol" + desc = "Tastes naturally minty, and imparts a very mild numbing sensation." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/grenadine + required_drink_type = /datum/reagent/consumable/grenadine + name = "glass of grenadine" + desc = "Delicious flavored syrup." + +/datum/glass_style/drinking_glass/ice + required_drink_type = /datum/reagent/consumable/ice + name = "glass of ice" + desc = "Generally, you're supposed to put something else in there too..." + icon_state = "iceglass" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm new file mode 100644 index 000000000000..e3da44023b16 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm @@ -0,0 +1,929 @@ +/datum/glass_style/drinking_glass/bilk + required_drink_type = /datum/reagent/consumable/ethanol/bilk + name = "glass of bilk" + desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/threemileisland + required_drink_type = /datum/reagent/consumable/ethanol/threemileisland + name = "Three Mile Island Ice Tea" + desc = "A glass of this is sure to prevent a meltdown." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "threemileislandglass" + +/datum/glass_style/drinking_glass/gintonic + required_drink_type = /datum/reagent/consumable/ethanol/gintonic + name = "Gin and Tonic" + desc = "A mild but still great cocktail. Drink up, like a true Englishman." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gintonicglass" + +/datum/glass_style/drinking_glass/rum_coke + required_drink_type = /datum/reagent/consumable/ethanol/rum_coke + name = "Rum and Coke" + desc = "The classic go-to of space-fratboys." + icon_state = "whiskeycolaglass" + +/datum/glass_style/drinking_glass/cuba_libre + required_drink_type = /datum/reagent/consumable/ethanol/cuba_libre + name = "Cuba Libre" + desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cubalibreglass" + +/datum/glass_style/drinking_glass/whiskey_cola + required_drink_type = /datum/reagent/consumable/ethanol/whiskey_cola + name = "whiskey cola" + desc = "An innocent-looking mixture of cola and whiskey. Delicious." + icon_state = "whiskeycolaglass" + +/datum/glass_style/drinking_glass/martini + required_drink_type = /datum/reagent/consumable/ethanol/martini + name = "Classic Martini" + desc = "Damn, the bartender even stirred it, not shook it." + icon_state = "martiniglass" + +/datum/glass_style/drinking_glass/vodkamartini + required_drink_type = /datum/reagent/consumable/ethanol/vodkamartini + name = "Vodka martini" + desc = "A bastardisation of the classic martini. Still great." + icon_state = "martiniglass" + +/datum/glass_style/drinking_glass/white_russian + required_drink_type = /datum/reagent/consumable/ethanol/white_russian + name = "White Russian" + desc = "A very nice looking drink. But that's just, like, your opinion, man." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "whiterussianglass" + +/datum/glass_style/drinking_glass/screwdrivercocktail + required_drink_type = /datum/reagent/consumable/ethanol/screwdrivercocktail + name = "Screwdriver" + desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "screwdriverglass" + +/datum/glass_style/drinking_glass/booger + required_drink_type = /datum/reagent/consumable/ethanol/booger + name = "Booger" + desc = "Ewww..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "booger" + +/datum/glass_style/drinking_glass/bloody_mary + required_drink_type = /datum/reagent/consumable/ethanol/bloody_mary + name = "Bloody Mary" + desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bloodymaryglass" + +/datum/glass_style/drinking_glass/brave_bull + required_drink_type = /datum/reagent/consumable/ethanol/brave_bull + name = "Brave Bull" + desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bravebullglass" + +/datum/glass_style/drinking_glass/tequila_sunrise + required_drink_type = /datum/reagent/consumable/ethanol/tequila_sunrise + name = "tequila Sunrise" + desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tequilasunriseglass" + +/datum/glass_style/drinking_glass/toxins_special + required_drink_type = /datum/reagent/consumable/ethanol/toxins_special + name = "Toxins Special" + desc = "Whoah, this thing is on FIRE!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "toxinsspecialglass" + +/datum/glass_style/drinking_glass/beepsky_smash + required_drink_type = /datum/reagent/consumable/ethanol/beepsky_smash + name = "Beepsky Smash" + desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "beepskysmashglass" + +/datum/glass_style/drinking_glass/irish_cream + required_drink_type = /datum/reagent/consumable/ethanol/irish_cream + name = "Irish Cream" + desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + icon_state = "irishcreamglass" + +/datum/glass_style/drinking_glass/manly_dorf + required_drink_type = /datum/reagent/consumable/ethanol/manly_dorf + name = "The Manly Dorf" + desc = "A manly concoction made from Ale and Beer. Intended for true men only." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "manlydorfglass" + +/datum/glass_style/drinking_glass/longislandicedtea + required_drink_type = /datum/reagent/consumable/ethanol/longislandicedtea + name = "Long Island Iced Tea" + desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "longislandicedteaglass" + +/datum/glass_style/drinking_glass/moonshine + required_drink_type = /datum/reagent/consumable/ethanol/moonshine + name = "Moonshine" + desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + icon_state = "glass_clear" + +/datum/glass_style/drinking_glass/b52 + required_drink_type = /datum/reagent/consumable/ethanol/b52 + name = "B-52" + desc = "Kahlua, Irish Cream, and cognac. You will get bombed." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b52glass" + +/datum/glass_style/drinking_glass/irishcoffee + required_drink_type = /datum/reagent/consumable/ethanol/irishcoffee + name = "Irish Coffee" + desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + icon = 'icons/obj/drinks/coffee.dmi' + icon_state = "irishcoffeeglass" + +/datum/glass_style/drinking_glass/margarita + required_drink_type = /datum/reagent/consumable/ethanol/margarita + name = "Margarita" + desc = "On the rocks with salt on the rim. Arriba~!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "margaritaglass" + +/datum/glass_style/drinking_glass/black_russian + required_drink_type = /datum/reagent/consumable/ethanol/black_russian + name = "Black Russian" + desc = "For the lactose-intolerant. Still as classy as a White Russian." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blackrussianglass" + +/datum/glass_style/drinking_glass/manhattan + required_drink_type = /datum/reagent/consumable/ethanol/manhattan + name = "Manhattan" + desc = "The Detective's undercover drink of choice. He never could stomach gin..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "manhattanglass" + +/datum/glass_style/drinking_glass/manhattan_proj + required_drink_type = /datum/reagent/consumable/ethanol/manhattan_proj + name = "Manhattan Project" + desc = "A scientist's drink of choice, for thinking how to blow up the station." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "proj_manhattanglass" + +/datum/glass_style/drinking_glass/whiskeysoda + required_drink_type = /datum/reagent/consumable/ethanol/whiskeysoda + name = "whiskey soda" + desc = "Ultimate refreshment." + icon_state = "whiskeysodaglass2" + +/datum/glass_style/drinking_glass/antifreeze + required_drink_type = /datum/reagent/consumable/ethanol/antifreeze + name = "Anti-freeze" + desc = "The ultimate refreshment." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "antifreeze" + +/datum/glass_style/drinking_glass/barefoot + required_drink_type = /datum/reagent/consumable/ethanol/barefoot + name = "Barefoot" + desc = "Barefoot and pregnant." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b&p" + +/datum/glass_style/drinking_glass/snowwhite + required_drink_type = /datum/reagent/consumable/ethanol/snowwhite + name = "Snow White" + desc = "A cold refreshment." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "snowwhite" + +/datum/glass_style/drinking_glass/demonsblood + required_drink_type = /datum/reagent/consumable/ethanol/demonsblood + name = "Demons Blood" + desc = "Just looking at this thing makes the hair at the back of your neck stand up." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "demonsblood" + +/datum/glass_style/drinking_glass/devilskiss + required_drink_type = /datum/reagent/consumable/ethanol/devilskiss + name = "Devils Kiss" + desc = "Creepy time!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "devilskiss" + +/datum/glass_style/drinking_glass/vodkatonic + required_drink_type = /datum/reagent/consumable/ethanol/vodkatonic + name = "vodka and tonic" + desc = "For when a gin and tonic isn't Russian enough." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "vodkatonicglass" + +/datum/glass_style/drinking_glass/ginfizz + required_drink_type = /datum/reagent/consumable/ethanol/ginfizz + name = "gin fizz" + desc = "Refreshingly lemony, deliciously dry." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "ginfizzglass" + +/datum/glass_style/drinking_glass/bahama_mama + required_drink_type = /datum/reagent/consumable/ethanol/bahama_mama + name = "Bahama Mama" + desc = "A tropical cocktail with a complex blend of flavors." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bahama_mama" + +/datum/glass_style/drinking_glass/singulo + required_drink_type = /datum/reagent/consumable/ethanol/singulo + name = "Singulo" + desc = "A blue-space beverage." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "singulo" + +/datum/glass_style/drinking_glass/sbiten + required_drink_type = /datum/reagent/consumable/ethanol/sbiten + name = "Sbiten" + desc = "A spicy mix of Vodka and Spice. Very hot." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sbitenglass" + +/datum/glass_style/drinking_glass/red_mead + required_drink_type = /datum/reagent/consumable/ethanol/red_mead + name = "Red Mead" + desc = "A true Viking's beverage, made with the blood of their enemies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_meadglass" + +/datum/glass_style/drinking_glass/mead + required_drink_type = /datum/reagent/consumable/ethanol/mead + name = "Mead" + desc = "A drink from Valhalla." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "meadglass" + +/datum/glass_style/drinking_glass/iced_beer + required_drink_type = /datum/reagent/consumable/ethanol/iced_beer + name = "iced beer" + desc = "A beer so frosty, the air around it freezes." + icon_state = "iced_beerglass" + +/datum/glass_style/drinking_glass/grog + required_drink_type = /datum/reagent/consumable/ethanol/grog + name = "Grog" + desc = "A fine and cepa drink for Space." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "grogglass" + +/datum/glass_style/drinking_glass/aloe + required_drink_type = /datum/reagent/consumable/ethanol/aloe + name = "Aloe" + desc = "Very, very, very good." + icon_state = "aloe" + +/datum/glass_style/drinking_glass/andalusia + required_drink_type = /datum/reagent/consumable/ethanol/andalusia + name = "Andalusia" + desc = "A nice, strangely named drink." + icon_state = "andalusia" + +/datum/glass_style/drinking_glass/alliescocktail + required_drink_type = /datum/reagent/consumable/ethanol/alliescocktail + name = "Allies cocktail" + desc = "A drink made from your allies." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alliescocktail" + +/datum/glass_style/drinking_glass/acid_spit + required_drink_type = /datum/reagent/consumable/ethanol/acid_spit + name = "Acid Spit" + desc = "A drink from Nanotrasen. Made from live aliens." + icon_state = "acidspitglass" + +/datum/glass_style/drinking_glass/amasec + required_drink_type = /datum/reagent/consumable/ethanol/amasec + name = "Amasec" + desc = "Always handy before COMBAT!!!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "amasecglass" + +/datum/glass_style/drinking_glass/changelingsting + required_drink_type = /datum/reagent/consumable/ethanol/changelingsting + name = "Changeling Sting" + desc = "A stingy drink." + icon = 'icons/obj/drinks/soda.dmi' + icon_state = "changelingsting" + +/datum/glass_style/drinking_glass/irishcarbomb + required_drink_type = /datum/reagent/consumable/ethanol/irishcarbomb + name = "Irish Car Bomb" + desc = "An Irish car bomb." + icon_state = "irishcarbomb" + +/datum/glass_style/drinking_glass/syndicatebomb + required_drink_type = /datum/reagent/consumable/ethanol/syndicatebomb + name = "Syndicate Bomb" + desc = "A syndicate bomb." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "syndicatebomb" + +/datum/glass_style/drinking_glass/hiveminderaser + required_drink_type = /datum/reagent/consumable/ethanol/hiveminderaser + name = "Hivemind Eraser" + desc = "For when even mindshields can't save you." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hiveminderaser" + +/datum/glass_style/drinking_glass/erikasurprise + required_drink_type = /datum/reagent/consumable/ethanol/erikasurprise + name = "Erika Surprise" + desc = "The surprise is, it's green!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "erikasurprise" + +/datum/glass_style/drinking_glass/driestmartini + required_drink_type = /datum/reagent/consumable/ethanol/driestmartini + name = "Driest Martini" + desc = "Only for the experienced. You think you see sand floating in the glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "driestmartiniglass" + +/datum/glass_style/drinking_glass/bananahonk + required_drink_type = /datum/reagent/consumable/ethanol/bananahonk + name = "Banana Honk" + desc = "A drink from Clown Heaven." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bananahonkglass" + +/datum/glass_style/drinking_glass/silencer + required_drink_type = /datum/reagent/consumable/ethanol/silencer + name = "Silencer" + desc = "A drink from Mime Heaven." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "silencerglass" + +/datum/glass_style/drinking_glass/drunkenblumpkin + required_drink_type = /datum/reagent/consumable/ethanol/drunkenblumpkin + name = "Drunken Blumpkin" + desc = "A drink for the drunks." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "drunkenblumpkin" + +/datum/glass_style/drinking_glass/whiskey_sour + required_drink_type = /datum/reagent/consumable/ethanol/whiskey_sour + name = "whiskey sour" + desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." + icon_state = "whiskey_sour" + +/datum/glass_style/drinking_glass/hcider + required_drink_type = /datum/reagent/consumable/ethanol/hcider + name = "hard cider" + desc = "Tastes like autumn... no wait, fall!" + icon_state = "whiskeyglass" + +/datum/glass_style/drinking_glass/fetching_fizz + required_drink_type = /datum/reagent/consumable/ethanol/fetching_fizz + name = "Fetching Fizz" + desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "fetching_fizz" + +/datum/glass_style/drinking_glass/hearty_punch + required_drink_type = /datum/reagent/consumable/ethanol/hearty_punch + name = "Hearty Punch" + desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hearty_punch" + +/datum/glass_style/drinking_glass/bacchus_blessing + required_drink_type = /datum/reagent/consumable/ethanol/bacchus_blessing + name = "Bacchus' Blessing" + desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" + icon_state = "glass_brown2" + +/datum/glass_style/drinking_glass/atomicbomb + required_drink_type = /datum/reagent/consumable/ethanol/atomicbomb + name = "Atomic Bomb" + desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "atomicbombglass" + +/datum/glass_style/drinking_glass/gargle_blaster + required_drink_type = /datum/reagent/consumable/ethanol/gargle_blaster + name = "Pan-Galactic Gargle Blaster" + desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gargleblasterglass" + +/datum/glass_style/drinking_glass/neurotoxin + required_drink_type = /datum/reagent/consumable/ethanol/neurotoxin + name = "Neurotoxin" + desc = "A drink that is guaranteed to knock you silly." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "neurotoxinglass" + +/datum/glass_style/drinking_glass/hippies_delight + required_drink_type = /datum/reagent/consumable/ethanol/hippies_delight + name = "Hippie's Delight" + desc = "A drink enjoyed by people during the 1960's." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "hippiesdelightglass" + +/datum/glass_style/has_foodtype/drinking_glass/eggnog + required_drink_type = /datum/reagent/consumable/ethanol/eggnog + name = "eggnog" + desc = "For enjoying the most wonderful time of the year." + icon_state = "glass_yellow" + drink_type = FRUIT + +/datum/glass_style/has_foodtype/juicebox/eggnog + required_drink_type = /datum/reagent/consumable/ethanol/eggnog + name = "carton of eggnog" + desc = "A big juicebox for adults." + icon_state = "nog2" + drink_type = FRUIT + +/datum/glass_style/drinking_glass/narsour + required_drink_type = /datum/reagent/consumable/ethanol/narsour + name = "Nar'Sour" + desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "narsour" + +/datum/glass_style/drinking_glass/triple_sec + required_drink_type = /datum/reagent/consumable/ethanol/triple_sec + name = "Triple Sec" + desc = "A glass of straight Triple Sec." + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/creme_de_menthe + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_menthe + name = "Creme de Menthe" + desc = "You can almost feel the first breath of spring just looking at it." + icon_state = "glass_green" + +/datum/glass_style/drinking_glass/creme_de_cacao + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_cacao + name = "Creme de Cacao" + desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." + icon_state = "glass_brown" + +/datum/glass_style/drinking_glass/creme_de_coconut + required_drink_type = /datum/reagent/consumable/ethanol/creme_de_coconut + name = "Creme de Coconut" + desc = "An unintimidating glass of coconut liqueur." + icon_state = "glass_white" + +/datum/glass_style/drinking_glass/quadruple_sec + required_drink_type = /datum/reagent/consumable/ethanol/quadruple_sec + name = "Quadruple Sec" + desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "quadruple_sec" + +/datum/glass_style/drinking_glass/quintuple_sec + required_drink_type = /datum/reagent/consumable/ethanol/quintuple_sec + name = "Quintuple Sec" + desc = "Now you are become law, destroyer of clowns." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "quintuple_sec" + +/datum/glass_style/drinking_glass/grasshopper + required_drink_type = /datum/reagent/consumable/ethanol/grasshopper + name = "Grasshopper" + desc = "You weren't aware edible beverages could be that green." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "grasshopper" + +/datum/glass_style/drinking_glass/stinger + required_drink_type = /datum/reagent/consumable/ethanol/stinger + name = "Stinger" + desc = "You wonder what would happen if you pointed this at a heat source..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "stinger" + +/datum/glass_style/drinking_glass/bastion_bourbon + required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon + name = "Bastion Bourbon" + desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bastion_bourbon" + +/datum/glass_style/drinking_glass/squirt_cider + required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider + name = "Squirt Cider" + desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "squirt_cider" + +/datum/glass_style/drinking_glass/fringe_weaver + required_drink_type = /datum/reagent/consumable/ethanol/fringe_weaver + name = "Fringe Weaver" + desc = "It's a wonder it doesn't spill out of the glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "fringe_weaver" + +/datum/glass_style/drinking_glass/sugar_rush + required_drink_type = /datum/reagent/consumable/ethanol/sugar_rush + name = "Sugar Rush" + desc = "If you can't mix a Sugar Rush, you can't tend bar." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sugar_rush" + +/datum/glass_style/drinking_glass/crevice_spike + required_drink_type = /datum/reagent/consumable/ethanol/crevice_spike + name = "Crevice Spike" + desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "crevice_spike" + +/datum/glass_style/drinking_glass/peppermint_patty + required_drink_type = /datum/reagent/consumable/ethanol/peppermint_patty + name = "Peppermint Patty" + desc = "A boozy minty hot cocoa that warms your belly on a cold night." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "peppermint_patty" + +/datum/glass_style/drinking_glass/alexander + required_drink_type = /datum/reagent/consumable/ethanol/alexander + name = "Alexander" + desc = "A creamy, indulgent delight that is stronger than it seems." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alexander" + +/datum/glass_style/drinking_glass/amaretto_alexander + required_drink_type = /datum/reagent/consumable/ethanol/amaretto_alexander + name = "Amaretto Alexander" + desc = "A creamy, indulgent delight that is in fact as gentle as it seems." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "alexanderam" + +/datum/glass_style/drinking_glass/sidecar + required_drink_type = /datum/reagent/consumable/ethanol/sidecar + name = "Sidecar" + desc = "The one ride you'll gladly give up the wheel for." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sidecar" + +/datum/glass_style/drinking_glass/between_the_sheets + required_drink_type = /datum/reagent/consumable/ethanol/between_the_sheets + name = "Between the Sheets" + desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "between_the_sheets" + +/datum/glass_style/drinking_glass/kamikaze + required_drink_type = /datum/reagent/consumable/ethanol/kamikaze + name = "Kamikaze" + desc = "Divinely windy." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kamikaze" + +/datum/glass_style/drinking_glass/mojito + required_drink_type = /datum/reagent/consumable/ethanol/mojito + name = "Mojito" + desc = "A drink that looks as refreshing as it tastes." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mojito" + +/datum/glass_style/drinking_glass/moscow_mule + required_drink_type = /datum/reagent/consumable/ethanol/moscow_mule + name = "Moscow Mule" + desc = "A chilly drink that reminds you of the Derelict." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "moscow_mule" + +/datum/glass_style/drinking_glass/fernet_cola + required_drink_type = /datum/reagent/consumable/ethanol/fernet_cola + name = "glass of fernet cola" + desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godlyblend" + +/datum/glass_style/drinking_glass/fanciulli + required_drink_type = /datum/reagent/consumable/ethanol/fanciulli + name = "glass of fanciulli" + desc = "A glass of Fanciulli. It's just Manhattan with Fernet." + icon_state = "fanciulli" + +/datum/glass_style/drinking_glass/branca_menta + required_drink_type = /datum/reagent/consumable/ethanol/branca_menta + name = "glass of branca menta" + desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this + icon_state = "minted_fernet" + +/datum/glass_style/drinking_glass/blank_paper + required_drink_type = /datum/reagent/consumable/ethanol/blank_paper + name = "glass of blank paper" + desc = "A fizzy cocktail for those looking to start fresh." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blank_paper" + +/datum/glass_style/drinking_glass/wizz_fizz + required_drink_type = /datum/reagent/consumable/ethanol/wizz_fizz + name = "Wizz Fizz" + desc = "The glass bubbles and froths with an almost magical intensity." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "wizz_fizz" + +/datum/glass_style/drinking_glass/bug_spray + required_drink_type = /datum/reagent/consumable/ethanol/bug_spray + name = "Bug Spray" + desc = "Your eyes begin to water as the sting of alcohol reaches them." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bug_spray" + +/datum/glass_style/drinking_glass/applejack + required_drink_type = /datum/reagent/consumable/ethanol/applejack + name = "Applejack" + desc = "You feel like you could drink this all neight." + icon_state = "applejack_glass" + +/datum/glass_style/drinking_glass/jack_rose + required_drink_type = /datum/reagent/consumable/ethanol/jack_rose + name = "Jack Rose" + desc = "Enough of these, and you really will start to suppose your toeses are roses." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "jack_rose" + +/datum/glass_style/drinking_glass/turbo + required_drink_type = /datum/reagent/consumable/ethanol/turbo + name = "Turbo" + desc = "A turbulent cocktail for outlaw hoverbikers." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "turbo" + +/datum/glass_style/drinking_glass/old_timer + required_drink_type = /datum/reagent/consumable/ethanol/old_timer + name = "Old Timer" + desc = "WARNING! May cause premature aging!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "old_timer" + +/datum/glass_style/drinking_glass/rubberneck + required_drink_type = /datum/reagent/consumable/ethanol/rubberneck + name = "Rubberneck" + desc = "A popular drink amongst those adhering to an all synthetic diet." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "rubberneck" + +/datum/glass_style/drinking_glass/duplex + required_drink_type = /datum/reagent/consumable/ethanol/duplex + name = "Duplex" + desc = "To imbibe one component separately from the other is consider a great faux pas." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "duplex" + +/datum/glass_style/drinking_glass/trappist + required_drink_type = /datum/reagent/consumable/ethanol/trappist + name = "Trappist Beer" + desc = "boozy Catholicism in a glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "trappistglass" + +/datum/glass_style/drinking_glass/blazaam + required_drink_type = /datum/reagent/consumable/ethanol/blazaam + name = "Blazaam" + desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blazaamglass" + +/datum/glass_style/drinking_glass/planet_cracker + required_drink_type = /datum/reagent/consumable/ethanol/planet_cracker + name = "Planet Cracker" + 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." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "planet_cracker" + +/datum/glass_style/drinking_glass/mauna_loa + required_drink_type = /datum/reagent/consumable/ethanol/mauna_loa + name = "Mauna Loa" + desc = "Lavaland in a drink... mug... volcano... thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mauna_loa" + +/datum/glass_style/drinking_glass/painkiller + required_drink_type = /datum/reagent/consumable/ethanol/painkiller + name = "Painkiller" + desc = "A combination of tropical juices and rum. Surely this will make you feel better." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "painkiller" + +/datum/glass_style/drinking_glass/pina_colada + required_drink_type = /datum/reagent/consumable/ethanol/pina_colada + name = "Pina Colada" + desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pina_colada" + +/datum/glass_style/drinking_glass/pina_olivada + required_drink_type = /datum/reagent/consumable/ethanol/pina_olivada + name = "Piña Olivada" + desc = "A balance of fruity pineapple with thick, rich olive oil. Stir well before drinking." + icon_state = "pina_olivada" + +/datum/glass_style/drinking_glass/ginger_amaretto + required_drink_type = /datum/reagent/consumable/ethanol/ginger_amaretto + name = "Ginger Amaretto" + desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gingeramaretto" + +/datum/glass_style/drinking_glass/godfather + required_drink_type = /datum/reagent/consumable/ethanol/godfather + name = "Godfather" + desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godfather" + +/datum/glass_style/drinking_glass/godmother + required_drink_type = /datum/reagent/consumable/ethanol/godmother + name = "Godmother" + desc = "A lovely fresh smelling cocktail, a true Sicilian delight." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "godmother" + +/datum/glass_style/drinking_glass/kortara + required_drink_type = /datum/reagent/consumable/ethanol/kortara + name = "glass of kortara" + desc = "The fermented nectar of the Korta nut, as enjoyed by lizards galaxywide." + icon_state = "kortara_glass" + +/datum/glass_style/drinking_glass/sea_breeze + required_drink_type = /datum/reagent/consumable/ethanol/sea_breeze + name = "Sea Breeze" + desc = "Minty, chocolatey, and creamy. It's like drinkable mint chocolate chip!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sea_breeze" + +/datum/glass_style/drinking_glass/white_tiziran + required_drink_type = /datum/reagent/consumable/ethanol/white_tiziran + name = "White Tiziran" + desc = "I had a rough night and I hate the fucking humans, man." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "white_tiziran" + +/datum/glass_style/drinking_glass/drunken_espatier + required_drink_type = /datum/reagent/consumable/ethanol/drunken_espatier + name = "Drunken Espatier" + desc = "A drink to make facing death easier." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "drunken_espatier" + +/datum/glass_style/drinking_glass/protein_blend + required_drink_type = /datum/reagent/consumable/ethanol/protein_blend + name = "Protein Blend" + desc = "Vile, even by lizard standards." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "protein_blend" + +/datum/glass_style/drinking_glass/mushi_kombucha + required_drink_type = /datum/reagent/consumable/ethanol/mushi_kombucha + name = "glass of mushi kombucha" + icon_state = "glass_orange" + +/datum/glass_style/drinking_glass/triumphal_arch + required_drink_type = /datum/reagent/consumable/ethanol/triumphal_arch + name = "Triumphal Arch" + desc = "A toast to the Empire, long may it stand." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "triumphal_arch" + +/datum/glass_style/drinking_glass/the_juice + required_drink_type = /datum/reagent/consumable/ethanol/the_juice + name = "The Juice" + desc = "A concoction of not-so-edible things that apparently lets you feel like you're in two places at once" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "thejuice" + +/datum/glass_style/drinking_glass/admiralty + required_drink_type = /datum/reagent/consumable/ethanol/admiralty + name = "Admiralty" + desc = "Hail to the Admiral, for he brings fair tidings, and rum too." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "admiralty" + +/datum/glass_style/drinking_glass/long_haul + required_drink_type = /datum/reagent/consumable/ethanol/long_haul + name = "Long Haul" + desc = "A perfect companion for a lonely long haul flight." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "long_haul" + +/datum/glass_style/drinking_glass/long_john_silver + required_drink_type = /datum/reagent/consumable/ethanol/long_john_silver + name = "Long John Silver" + desc = "Named for a famous pirate, who may or may not have been fictional. But hey, why let the truth get in the way of a good yarn?" //Chopper Reid says "How the fuck are ya?" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "long_john_silver" + +/datum/glass_style/drinking_glass/tropical_storm + required_drink_type = /datum/reagent/consumable/ethanol/tropical_storm + name = "Tropical Storm" + desc = "Less destructive than the real thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tropical_storm" + +/datum/glass_style/drinking_glass/dark_and_stormy + required_drink_type = /datum/reagent/consumable/ethanol/dark_and_stormy + name = "Dark and Stormy" + desc = "Thunder and lightning, very very frightening." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "dark_and_stormy" + +/datum/glass_style/drinking_glass/salt_and_swell + required_drink_type = /datum/reagent/consumable/ethanol/salt_and_swell + name = "Salt and Swell" + desc = "Ah, I do like to be beside the seaside." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "salt_and_swell" + +/datum/glass_style/drinking_glass/tiltaellen + required_drink_type = /datum/reagent/consumable/ethanol/tiltaellen + name = "glass of tiltällen" + desc = "Eww... it's curdled." + icon_state = "tiltaellen" + +/datum/glass_style/drinking_glass/tich_toch + required_drink_type = /datum/reagent/consumable/ethanol/tich_toch + name = "Tich Toch" + desc = "Oh god." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tich_toch" + +/datum/glass_style/drinking_glass/helianthus + required_drink_type = /datum/reagent/consumable/ethanol/helianthus + name = "Helianthus" + desc = "Another reason to cut off an ear..." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "helianthus" + +/datum/glass_style/drinking_glass/plumwine + required_drink_type = /datum/reagent/consumable/ethanol/plumwine + name = "plum wine" + desc = "Looks like an evening of writing fine poetry." + icon_state = "plumwineglass" + +/datum/glass_style/drinking_glass/the_hat + required_drink_type = /datum/reagent/consumable/ethanol/the_hat + name = "The Hat" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "thehatglass" + +/datum/glass_style/drinking_glass/gin_garden + required_drink_type = /datum/reagent/consumable/ethanol/gin_garden + name = "gin garden" + desc = "Hey, someone forgot the herb and... the cucumber in my cocktail!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gin_garden" + +/datum/glass_style/drinking_glass/wine_voltaic + required_drink_type = /datum/reagent/consumable/ethanol/wine_voltaic + name = "Voltaic Yellow Wine" + desc = "Electrically charged wine. Recharges ethereals, but also nontoxic." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "wine_voltaic" + +/datum/glass_style/drinking_glass/telepole + required_drink_type = /datum/reagent/consumable/ethanol/telepole + name = "Telepole" + desc = "A liquid grounding rod. Recharges ethereals and grants temporary shock resistance." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "telepole" + +/datum/glass_style/drinking_glass/pod_tesla + required_drink_type = /datum/reagent/consumable/ethanol/pod_tesla + name = "Pod Tesla" + desc = "Ride the lightning! Recharges ethereals, suppresses phobias, and grants strong temporary shock resistance." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "pod_tesla" + + +// Shot glasses + +/datum/glass_style/shot_glass/toxins_special + required_drink_type = /datum/reagent/consumable/ethanol/toxins_special + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "toxinsspecialglass" + +/datum/glass_style/shot_glass/b52 + required_drink_type = /datum/reagent/consumable/ethanol/b52 + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "b52glass" + +/datum/glass_style/shot_glass/hcider + required_drink_type = /datum/reagent/consumable/ethanol/hcider + icon_state = "shotglassbrown" + +/datum/glass_style/shot_glass/bastion_bourbon + required_drink_type = /datum/reagent/consumable/ethanol/bastion_bourbon + icon_state = "shotglassgreen" + +/datum/glass_style/shot_glass/squirt_cider + required_drink_type = /datum/reagent/consumable/ethanol/squirt_cider + icon_state = "shotglassgreen" + +/datum/glass_style/shot_glass/jack_rose + required_drink_type = /datum/reagent/consumable/ethanol/jack_rose + icon_state = "shotglassred" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm new file mode 100644 index 000000000000..9074aff95ef5 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_drinks.dm @@ -0,0 +1,77 @@ +// Mixed drinks + +/datum/glass_style/drinking_glass/lemonade + required_drink_type = /datum/reagent/consumable/lemonade + name = "pitcher of lemonade" + desc = "This drink leaves you feeling nostalgic for some reason." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "lemonpitcher" + +/datum/glass_style/drinking_glass/arnold_palmer + required_drink_type = /datum/reagent/consumable/tea/arnold_palmer + name = "Arnold Palmer" + desc = "You feel like taking a few golf swings after a few swigs of this." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "arnold_palmer" + +/datum/glass_style/drinking_glass/roy_rogers + required_drink_type = /datum/reagent/consumable/roy_rogers + name = "Roy Rogers" + desc = "90% sugar in a glass." + icon_state = "royrogers" + +/datum/glass_style/drinking_glass/doctor_delight + required_drink_type = /datum/reagent/consumable/doctor_delight + name = "Doctor's Delight" + desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "doctorsdelightglass" + +/datum/glass_style/drinking_glass/cinderella + required_drink_type = /datum/reagent/consumable/cinderella + name = "Cinderella" + desc = "There is not a single drop of alcohol in this thing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cinderella" + +/datum/glass_style/drinking_glass/triple_citrus + required_drink_type = /datum/reagent/consumable/triple_citrus + name = "glass of triple citrus" + desc = "A mixture of citrus juices. Tangy, yet smooth." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "triplecitrus" + +/datum/glass_style/drinking_glass/shirley_temple + required_drink_type = /datum/reagent/consumable/shirley_temple + name = "Shirley Temple" + desc = "Ginger ale with processed grenadine. " + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "shirleytemple" + +/datum/glass_style/drinking_glass/red_queen + required_drink_type = /datum/reagent/consumable/red_queen + name = "Red Queen" + desc = "DRINK ME." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_queen" + +/datum/glass_style/drinking_glass/agua_fresca + required_drink_type = /datum/reagent/consumable/agua_fresca + name = "Agua Fresca" + desc = "90% water, but still refreshing." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "aguafresca" + +/datum/glass_style/drinking_glass/cucumberlemonade + required_drink_type = /datum/reagent/consumable/cucumberlemonade + name = "cucumber lemonade" + desc = "The smell of cucumber from lemonade, I'm sure I won't get poisoned." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cucumber_lemonade" + +/datum/glass_style/drinking_glass/mississippi_queen + required_drink_type = /datum/reagent/consumable/mississippi_queen + name = "Mississippi Queen" + desc = "Mullets and cut-up jorts not included." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "mississippiglass" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm new file mode 100644 index 000000000000..9b39c87062a1 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/smoothies_shakes.dm @@ -0,0 +1,100 @@ + +// Shakes and smoothies + +/datum/glass_style/drinking_glass/cherryshake + required_drink_type = /datum/reagent/consumable/cherryshake + name = "cherry shake" + desc = "A cherry flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "cherryshake" + +/datum/glass_style/drinking_glass/bluecherryshake + required_drink_type = /datum/reagent/consumable/bluecherryshake + name = "blue cherry shake" + desc = "An exotic blue milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "bluecherryshake" + +/datum/glass_style/drinking_glass/vanillashake + required_drink_type = /datum/reagent/consumable/vanillashake + name = "vanilla shake" + desc = "A vanilla flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "vanillashake" + +/datum/glass_style/drinking_glass/caramelshake + required_drink_type = /datum/reagent/consumable/caramelshake + name = "caramel shake" + desc = "A caramel flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "caramelshake" + +/datum/glass_style/drinking_glass/choccyshake + required_drink_type = /datum/reagent/consumable/choccyshake + name = "chocolate shake" + desc = "A chocolate flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "choccyshake" + +/datum/glass_style/drinking_glass/strawberryshake + required_drink_type = /datum/reagent/consumable/strawberryshake + name = "strawberry shake" + desc = "A strawberry flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "strawberryshake" + +/datum/glass_style/drinking_glass/bananashake + required_drink_type = /datum/reagent/consumable/bananashake + name = "banana shake" + desc = "A banana flavored milkshake." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "bananashake" + +/datum/glass_style/drinking_glass/gibbfloats + required_drink_type = /datum/reagent/consumable/gibbfloats + name = "Gibbfloat" + desc = "Dr. Gibb with ice cream on top." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "gibbfloats" + +/datum/glass_style/drinking_glass/strawberry_banana + required_drink_type = /datum/reagent/consumable/strawberry_banana + name = "strawberry banana smoothie" + desc = "A classic drink which countless souls have bonded over..." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "strawberry_banana" + +/datum/glass_style/drinking_glass/berry_blast + required_drink_type = /datum/reagent/consumable/berry_blast + name = "berry blast smoothie" + desc = "A classic drink, freshly made with hand picked berries. Or, maybe not." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "berry_blast" + +/datum/glass_style/drinking_glass/funky_monkey + required_drink_type = /datum/reagent/consumable/funky_monkey + name = "funky monkey smoothie" + desc = "A classic drink made with chocolate and banana. No monkeys were harmed, officially." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "funky_monkey" + +/datum/glass_style/drinking_glass/green_giant + required_drink_type = /datum/reagent/consumable/green_giant + name = "green giant smoothie" + desc = "A classic drink, if you enjoy juiced wheatgrass and chia seeds." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "green_giant" + +/datum/glass_style/drinking_glass/melon_baller + required_drink_type = /datum/reagent/consumable/melon_baller + name = "melon baller smoothie" + desc = "A wonderfully fresh melon smoothie. Guaranteed to brighten your day." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "melon_baller" + +/datum/glass_style/drinking_glass/vanilla_dream + required_drink_type = /datum/reagent/consumable/vanilla_dream + name = "vanilla dream smoothie" + desc = "A classic drink made with vanilla and fresh cream." + icon = 'icons/obj/drinks/shakes.dmi' + icon_state = "vanilla_dream" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm new file mode 100644 index 000000000000..75c03448b3d6 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm @@ -0,0 +1,97 @@ +// Soft Drinks/Sodas + +/datum/glass_style/drinking_glass/space_cola + required_drink_type = /datum/reagent/consumable/space_cola + name = "glass of Space Cola" + desc = "A glass of refreshing Space Cola." + icon_state = "spacecola" + +/datum/glass_style/drinking_glass/nuka_cola + required_drink_type = /datum/reagent/consumable/nuka_cola + name = "glass of Nuka Cola" + desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." + icon = 'icons/obj/drinks/soda.dmi' + icon_state = "nuka_colaglass" + +/datum/glass_style/drinking_glass/rootbeer + required_drink_type = /datum/reagent/consumable/rootbeer + name = "glass of root beer" + desc = "A glass of highly potent, incredibly sugary root beer." + icon_state = "spacecola" + +/datum/glass_style/drinking_glass/grey_bull + required_drink_type = /datum/reagent/consumable/grey_bull + name = "glass of Grey Bull" + desc = "Surprisingly it isn't grey." + icon_state = "grey_bull_glass" + +/datum/glass_style/drinking_glass/spacemountainwind + required_drink_type = /datum/reagent/consumable/spacemountainwind + name = "glass of Space Mountain Wind" + desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." + icon_state = "Space_mountain_wind_glass" + +/datum/glass_style/drinking_glass/dr_gibb + required_drink_type = /datum/reagent/consumable/dr_gibb + name = "glass of Dr. Gibb" + desc = "Dr. Gibb. Not as dangerous as the container_name might imply." + icon_state = "dr_gibb_glass" + +/datum/glass_style/drinking_glass/space_up + required_drink_type = /datum/reagent/consumable/space_up + name = "glass of Space-Up" + desc = "Space-up. It helps you keep your cool." + icon_state = "space-up_glass" + +/datum/glass_style/drinking_glass/lemon_lime + required_drink_type = /datum/reagent/consumable/lemon_lime + name = "glass of lemon-lime" + desc = "You're pretty certain a real fruit has never actually touched this." + icon_state = "lemonlime" + +/datum/glass_style/drinking_glass/pwr_game + required_drink_type = /datum/reagent/consumable/pwr_game + name = "glass of Pwr Game" + desc = "Goes well with a Vlad's salad." + icon_state = "pwrgame" + +/datum/glass_style/drinking_glass/shamblers + required_drink_type = /datum/reagent/consumable/shamblers + name = "glass of Shambler's juice" + desc = "Mmm mm, shambly." + icon_state = "shamblerjuice" + +/datum/glass_style/drinking_glass/sodawater + required_drink_type = /datum/reagent/consumable/sodawater + name = "glass of soda water" + desc = "Soda water. Why not make a scotch and soda?" + icon_state = "glass_clearcarb" + +/datum/glass_style/drinking_glass/tonic + required_drink_type = /datum/reagent/consumable/tonic + name = "glass of tonic water" + desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." + icon_state = "glass_clearcarb" + +/datum/glass_style/drinking_glass/monkey_energy + required_drink_type = /datum/reagent/consumable/monkey_energy + name = "glass of Monkey Energy" + desc = "You can unleash the ape, but without the pop of the can?" + icon_state = "monkey_energy_glass" + +/datum/glass_style/drinking_glass/grape_soda + required_drink_type = /datum/reagent/consumable/grape_soda + name = "glass of grape juice" + +/datum/glass_style/drinking_glass/cream_soda + required_drink_type = /datum/reagent/consumable/cream_soda + name = "Cream Soda" + desc = "A classic space-American vanilla flavored soft drink." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "cream_soda" + +/datum/glass_style/drinking_glass/sol_dry + required_drink_type = /datum/reagent/consumable/sol_dry + name = "Sol Dry" + desc = "A soothing, mellow drink made from ginger." + icon_state = "soldry" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ffa7b5b6d4a5..cd100853d4e9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2533,15 +2533,13 @@ if(200 to INFINITY) newsize = 3.5*RESIZE_DEFAULT_SIZE - affected_mob.resize = newsize/current_size + affected_mob.update_transform(newsize/current_size) current_size = newsize - affected_mob.update_transform() ..() /datum/reagent/growthserum/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.resize = RESIZE_DEFAULT_SIZE/current_size + affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - affected_mob.update_transform() ..() /datum/reagent/plastic_polymers diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 5400e381c529..aad8860acaeb 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -265,7 +265,7 @@ /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) . = ..() holder_mob.adjustOxyLoss(0.5*REM, FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) - if(data?["method"] & INGEST) + if((data?["method"] & INGEST) && holder_mob.stat != DEAD) holder_mob.fakedeath(type) /datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/holder_mob) @@ -292,7 +292,8 @@ if(5 to 8) affected_mob.stamina.adjust(-40 * REM * seconds_per_tick, 0) if(9 to INFINITY) - affected_mob.fakedeath(type) + if(affected_mob.stat != DEAD) + affected_mob.fakedeath(type) ..() return TRUE @@ -672,9 +673,8 @@ /datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) var/newsize = 1.1 * RESIZE_DEFAULT_SIZE - affected_mob.resize = newsize/current_size + affected_mob.update_transform(newsize/current_size) current_size = newsize - affected_mob.update_transform() toxpwr = 0.1 * volume affected_mob.adjustBruteLoss((0.3 * volume) * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) @@ -686,9 +686,8 @@ ..() /datum/reagent/toxin/venom/on_mob_end_metabolize(mob/living/affected_mob) - affected_mob.resize = RESIZE_DEFAULT_SIZE/current_size + affected_mob.update_transform(RESIZE_DEFAULT_SIZE/current_size) current_size = RESIZE_DEFAULT_SIZE - affected_mob.update_transform() ..() /datum/reagent/toxin/fentanyl diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 147b55067c75..ea56463d1fba 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -16,6 +16,8 @@ slot_flags = ITEM_SLOT_BELT var/ignore_flags = NONE var/infinite = FALSE + /// If TRUE, won't play a noise when injecting. + var/stealthy = FALSE /obj/item/reagent_containers/hypospray/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -41,6 +43,8 @@ if(reagents.total_volume && (ignore_flags || affected_mob.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) // Ignore flag should be checked first or there will be an error message. to_chat(affected_mob, span_warning("You feel a tiny prick!")) to_chat(user, span_notice("You inject [affected_mob] with [src].")) + if(!stealthy) + playsound(affected_mob, 'sound/items/hypospray.ogg', 50, TRUE) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 5e2b6d631be8..1fe250219162 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -9,7 +9,7 @@ max_integrity = 200 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON - obj_flags = CAN_BE_HIT | USES_TGUI + obj_flags = CAN_BE_HIT /// The internal air reservoir of the disposal var/datum/gas_mixture/air_contents diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 1bbdd4b14820..794d631c8ce5 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -96,6 +96,7 @@ Slimecrossing Weapons item_flags = ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE slot_flags = NONE + antimagic_flags = NONE force = 5 max_charges = 1 //Recharging costs blood. recharge_rate = 1 diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 0d968ed817fb..a02524e06447 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -21,26 +21,22 @@ All ShuttleMove procs go here return var/shuttle_dir = shuttle.dir - for(var/i in contents) - var/atom/movable/thing = i - if(ismob(thing)) - if(isliving(thing)) - var/mob/living/M = thing - if(M.buckled) - M.buckled.unbuckle_mob(M, 1) - if(M.pulledby) - M.pulledby.stop_pulling() - M.stop_pulling() - M.visible_message(span_warning("[shuttle] slams into [M]!")) - SSblackbox.record_feedback("tally", "shuttle_gib", 1, M.type) - log_shuttle("[key_name(M)] was shuttle gibbed by [shuttle].") - M.investigate_log("has been gibbed by [shuttle].", INVESTIGATE_DEATHS) - M.gib() - - - else //non-living mobs shouldn't be affected by shuttles, which is why this is an else - if(istype(thing, /obj/effect/abstract) || istype(thing, /obj/singularity) || istype(thing, /obj/energy_ball)) + for(var/atom/movable/thing as anything in contents) + if(thing.resistance_flags & SHUTTLE_CRUSH_PROOF) + continue + if(isliving(thing)) + var/mob/living/living_thing = thing + if(living_thing.incorporeal_move) // Don't crush incorporeal things continue + living_thing.buckled?.unbuckle_mob(living_thing, force = TRUE) + living_thing.pulledby?.stop_pulling() + living_thing.stop_pulling() + living_thing.visible_message(span_warning("[shuttle] slams into [living_thing]!")) + SSblackbox.record_feedback("tally", "shuttle_gib", 1, living_thing.type) + log_shuttle("[key_name(living_thing)] was shuttle gibbed by [shuttle].") + living_thing.investigate_log("has been gibbed by [shuttle].", INVESTIGATE_DEATHS) + living_thing.gib() + else if(!ismob(thing)) if(!thing.anchored) step(thing, shuttle_dir) else diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index f0d40f495c75..076b4b4d630e 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -174,10 +174,10 @@ /obj/item/bodypart/chest/robot/get_cell() return cell -/obj/item/bodypart/chest/robot/handle_atom_del(atom/chest_atom) - if(chest_atom == cell) +/obj/item/bodypart/chest/robot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null - return ..() /obj/item/bodypart/chest/robot/Destroy() QDEL_NULL(cell) @@ -225,8 +225,6 @@ screwtool.play_tool_sound(src) to_chat(user, span_notice("Remove [cell] from [src].")) cell.forceMove(drop_location()) - cell = null - /obj/item/bodypart/chest/robot/examine(mob/user) . = ..() @@ -246,11 +244,8 @@ if(wired) new /obj/item/stack/cable_coil(drop_loc, 1) wired = FALSE - if(cell) - cell.forceMove(drop_loc) - cell = null - ..() - + cell?.forceMove(drop_loc) + return ..() /obj/item/bodypart/head/robot name = "cyborg head" @@ -285,12 +280,12 @@ var/obj/item/assembly/flash/handheld/flash1 = null var/obj/item/assembly/flash/handheld/flash2 = null -/obj/item/bodypart/head/robot/handle_atom_del(atom/head_atom) - if(head_atom == flash1) +/obj/item/bodypart/head/robot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == flash1) flash1 = null - if(head_atom == flash2) + if(gone == flash2) flash2 = null - return ..() /obj/item/bodypart/head/robot/Destroy() QDEL_NULL(flash1) @@ -336,28 +331,17 @@ if(flash1 || flash2) prytool.play_tool_sound(src) to_chat(user, span_notice("You remove the flash from [src].")) - if(flash1) - flash1.forceMove(drop_location()) - flash1 = null - if(flash2) - flash2.forceMove(drop_location()) - flash2 = null + flash1?.forceMove(drop_location()) + flash2?.forceMove(drop_location()) else to_chat(user, span_warning("There is no flash to remove from [src].")) return TRUE - /obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal) var/atom/drop_loc = drop_location() - if(flash1) - flash1.forceMove(drop_loc) - flash1 = null - if(flash2) - flash2.forceMove(drop_loc) - flash2 = null - ..() - - + flash1?.forceMove(drop_loc) + flash2?.forceMove(drop_loc) + return ..() // Prosthetics - Cheap, mediocre, and worse than organic limbs // The fact they dont have a internal biotype means theyre a lot weaker defensively, diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 837b10443f21..ecc968f33836 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -12,8 +12,24 @@ name = "HUD implant" desc = "These cybernetic eyes will display a HUD over everything you see. Maybe." slot = ORGAN_SLOT_HUD + actions_types = list(/datum/action/item_action/toggle_hud) var/HUD_type = 0 var/HUD_trait = null + /// Whether the HUD implant is on or off + var/toggled_on = TRUE + + +/obj/item/organ/internal/cyberimp/eyes/hud/proc/toggle_hud(mob/living/carbon/eye_owner) + if(toggled_on) + if(HUD_type) + var/datum/atom_hud/hud = GLOB.huds[HUD_type] + hud.hide_from(eye_owner) + toggled_on = FALSE + else + if(HUD_type) + var/datum/atom_hud/hud = GLOB.huds[HUD_type] + hud.show_to(eye_owner) + toggled_on = TRUE /obj/item/organ/internal/cyberimp/eyes/hud/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = TRUE) . = ..() @@ -24,6 +40,7 @@ hud.show_to(eye_owner) if(HUD_trait) ADD_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) + toggled_on = TRUE /obj/item/organ/internal/cyberimp/eyes/hud/Remove(mob/living/carbon/eye_owner, special = FALSE) . = ..() @@ -32,6 +49,7 @@ hud.hide_from(eye_owner) if(HUD_trait) REMOVE_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) + toggled_on = FALSE /obj/item/organ/internal/cyberimp/eyes/hud/medical name = "Medical HUD implant" diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 17ede9fa5948..6e196b52af5e 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -50,26 +50,27 @@ /// Native FOV that will be applied if a config is enabled var/native_fov = FOV_90_DEGREES -/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_owner, special = FALSE, drop_if_replaced = FALSE) +/obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) . = ..() if(!.) return - owner.cure_blind(NO_EYES) + eye_recipient.cure_blind(NO_EYES) apply_damaged_eye_effects() - refresh() + refresh(eye_recipient, inserting = TRUE) /// Refreshes the visuals of the eyes -/// If call_update is TRUE, we also will call udpate_body -/obj/item/organ/internal/eyes/proc/refresh(call_update = TRUE) +/// If call_update is TRUE, we also will call update_body +/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, inserting = FALSE, call_update = TRUE) owner.update_sight() owner.update_tint() - if(!ishuman(owner)) + if(!ishuman(eye_owner)) return - var/mob/living/carbon/human/affected_human = owner - old_eye_color_left = affected_human.eye_color_left - old_eye_color_right = affected_human.eye_color_right + var/mob/living/carbon/human/affected_human = eye_owner + if(inserting) // we only want to be setting old_eye_color the one time + old_eye_color_left = affected_human.eye_color_left + old_eye_color_right = affected_human.eye_color_right if(initial(eye_color_left)) affected_human.eye_color_left = eye_color_left else @@ -81,10 +82,10 @@ if(HAS_TRAIT(affected_human, TRAIT_NIGHT_VISION) && !lighting_cutoff) lighting_cutoff = LIGHTING_CUTOFF_REAL_LOW if(CONFIG_GET(flag/native_fov) && native_fov) - owner.add_fov_trait(type, native_fov) + affected_human.add_fov_trait(type, native_fov) if(call_update) - owner.dna?.species?.handle_body(affected_human) //updates eye icon + affected_human.dna?.species?.handle_body(affected_human) //updates eye icon /obj/item/organ/internal/eyes/Remove(mob/living/carbon/eye_owner, special = FALSE) . = ..() @@ -337,7 +338,6 @@ eye.update_brightness(victim) victim.become_blind(FLASHLIGHT_EYES) - /obj/item/organ/internal/eyes/robotic/flashlight/on_remove(mob/living/carbon/victim) . = ..() eye.on = FALSE @@ -354,7 +354,11 @@ /obj/item/organ/internal/eyes/robotic/shield/emp_act(severity) return -#define RGB2EYECOLORSTRING(definitionvar) ("[copytext_char(definitionvar, 2, 3)][copytext_char(definitionvar, 4, 5)][copytext_char(definitionvar, 6, 7)]") +#define MATCH_LIGHT_COLOR 1 +#define USE_CUSTOM_COLOR 0 +#define UPDATE_LIGHT 0 +#define UPDATE_EYES_LEFT 1 +#define UPDATE_EYES_RIGHT 2 /obj/item/organ/internal/eyes/robotic/glow name = "High Luminosity Eyes" @@ -362,196 +366,291 @@ eye_color_left = "000" eye_color_right = "000" actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) - var/current_color_string = "#ffffff" - var/active = FALSE var/max_light_beam_distance = 5 - var/light_beam_distance = 5 - var/light_object_range = 2 - var/light_object_power = 2 - var/list/obj/effect/abstract/eye_lighting/eye_lighting - var/obj/effect/abstract/eye_lighting/on_mob - var/image/mob_overlay - var/datum/component/mobhook + var/obj/item/flashlight/eyelight/glow/eye + /// The overlay that is used when both eyes are set to match the light color + var/mutable_appearance/eyes_overlay + /// The overlay that is used when custom color selection is enabled, for the left eye + var/mutable_appearance/eyes_overlay_left + /// The overlay that is used when custom color selection is enabled, for the right eye + var/mutable_appearance/eyes_overlay_right + /// Whether or not to match the eye color to the light or use a custom selection + var/eye_color_mode = MATCH_LIGHT_COLOR + /// The selected color for the light beam itself + var/current_color_string = "#ffffff" + /// The custom selected eye color for the left eye. Defaults to the mob's natural eye color + var/current_left_color_string + /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color + var/current_right_color_string /obj/item/organ/internal/eyes/robotic/glow/Initialize(mapload) . = ..() - mob_overlay = image('icons/mob/species/human/human_face.dmi', "eyes_glow_gs") + eye = new /obj/item/flashlight/eyelight/glow /obj/item/organ/internal/eyes/robotic/glow/Destroy() - terminate_effects() . = ..() + deactivate(close_ui = TRUE) + QDEL_NULL(eye) -/obj/item/organ/internal/eyes/robotic/glow/Remove(mob/living/carbon/eye_owner, special = FALSE) - terminate_effects() +/obj/item/organ/internal/eyes/robotic/glow/emp_act() . = ..() + if(!eye.on || . & EMP_PROTECT_SELF) + return + deactivate(close_ui = TRUE) -/obj/item/organ/internal/eyes/robotic/glow/proc/terminate_effects() - if(owner && active) - deactivate() - active = FALSE - clear_visuals(TRUE) - STOP_PROCESSING(SSfastprocess, src) +/// We have to do this here because on_insert gets called before refresh(), which we need to have been called for old_eye_color vars to be set +/obj/item/organ/internal/eyes/robotic/glow/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) + . = ..() + current_left_color_string = old_eye_color_left + current_right_color_string = old_eye_color_right + +/obj/item/organ/internal/eyes/robotic/glow/on_insert(mob/living/carbon/eye_recipient) + . = ..() + deactivate(close_ui = TRUE) + eye.forceMove(eye_recipient) + +/obj/item/organ/internal/eyes/robotic/glow/on_remove(mob/living/carbon/eye_owner) + deactivate(eye_owner, close_ui = TRUE) + QDEL_NULL(eyes_overlay) + QDEL_NULL(eyes_overlay_left) + QDEL_NULL(eyes_overlay_right) + eye.forceMove(src) + return ..() + +/obj/item/organ/internal/eyes/robotic/glow/ui_state(mob/user) + return GLOB.default_state + +/obj/item/organ/internal/eyes/robotic/glow/ui_status(mob/user) + if(!QDELETED(owner)) + if(owner == user) + return min( + ui_status_user_is_abled(user, src), + ui_status_only_living(user), + ) + else return UI_CLOSE + return ..() + +/obj/item/organ/internal/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "HighLuminosityEyesMenu") + ui.autoupdate = FALSE + ui.open() + +/obj/item/organ/internal/eyes/robotic/glow/ui_data(mob/user) + var/list/data = list() + + data["eyeColor"] = list( + mode = eye_color_mode, + hasOwner = owner ? TRUE : FALSE, + left = current_left_color_string, + right = current_right_color_string, + ) + data["lightColor"] = current_color_string + data["range"] = eye.light_outer_range + + return data + +/obj/item/organ/internal/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if(.) + return -/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(owner, action) + switch(action) + if("set_range") + var/new_range = params["new_range"] + set_beam_range(new_range) + return TRUE + if("pick_color") + var/new_color = tgui_color_picker( + usr, + "Choose eye color color:", + "High Luminosity Eyes Menu", + current_color_string + ) + if(new_color) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update) + return TRUE + if("enter_color") + var/new_color = lowertext(params["new_color"]) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update, sanitize = TRUE) + return TRUE + if("random_color") + var/to_update = params["to_update"] + randomize_color(to_update) + return TRUE + if("toggle_eye_color") + toggle_eye_color_mode() + return TRUE + +/obj/item/organ/internal/eyes/robotic/glow/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/organ_action/toggle)) toggle_active() else if(istype(action, /datum/action/item_action/organ_action/use)) - prompt_for_controls(owner) - + ui_interact(user) + +/** + * Activates the light + * + * Turns on the attached flashlight object, updates the mob overlay to be added. + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/activate() + eye.on = TRUE + if(eye.light_outer_range) // at range 0 we are just going to make the eyes glow emissively, no light overlay + eye.set_light_on(TRUE) + update_mob_eyes_overlay() + +/** + * Deactivates the light + * + * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. + * Arguments: + * * mob/living/carbon/eye_owner - the mob who the eyes belong to, for passing to update_mob_eyes_overlay + * * close_ui - whether or not to close the ui + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) + if(close_ui) + SStgui.close_uis(src) + eye.on = FALSE + eye.set_light_on(FALSE) + update_mob_eyes_overlay(eye_owner) + +/** + * Randomizes the light color + * + * Picks a random color and sets the beam color to that + * Arguments: + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) + var/new_color = "#" + for(var/i in 1 to 3) + new_color += num2hex(rand(0, 255), 2) + set_beam_color(new_color, to_update) + +/** + * Setter function for the light's range + * + * Sets the light range of the attached flashlight object + * Includes some 'unique' logic to accomodate for some quirks of the lighting system + * Arguments: + * * new_range - the new range to set + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_range(new_range) + var/old_light_range = eye.light_outer_range + if(old_light_range == 0 && new_range > 0 && eye.on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) + eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. + eye.set_light_on(TRUE) + eye.set_light_range(new_outer_range = clamp(new_range, 0, max_light_beam_distance)) + +/** + * Setter function for the light's color + * + * Sets the light color of the attached flashlight object. Sets the eye color vars of this eye organ as well and then updates the mob's eye color. + * Arguments: + * * newcolor - the new color hex string to set + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + * * sanitize - whether the hex string should be sanitized + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) + var/newcolor_string + if(sanitize) + newcolor_string = sanitize_hexcolor(newcolor) + else + newcolor_string = newcolor + switch(to_update) + if(UPDATE_LIGHT) + current_color_string = newcolor_string + eye.set_light_color(newcolor_string) + if(UPDATE_EYES_LEFT) + current_left_color_string = newcolor_string + if(UPDATE_EYES_RIGHT) + current_right_color_string = newcolor_string + + update_mob_eye_color() + +/** + * Toggle the attached flashlight object on or off + */ /obj/item/organ/internal/eyes/robotic/glow/proc/toggle_active() - if(active) + if(eye.on) deactivate() else activate() -/obj/item/organ/internal/eyes/robotic/glow/proc/prompt_for_controls(mob/user) - var/color = tgui_color_picker(owner, "Select Color", "Select color", "#ffffff") - if(!color || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user) +/** + * Toggles for the eye color mode + * + * Toggles the eye color mode on or off and then calls an update on the mob's eye color + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/toggle_eye_color_mode() + eye_color_mode = !eye_color_mode + update_mob_eye_color() + +/** + * Updates the mob eye color + * + * Updates the eye color to reflect on the mob's body if it's possible to do so + * Arguments: + * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) + switch(eye_color_mode) + if(MATCH_LIGHT_COLOR) + eye_color_left = current_color_string + eye_color_right = current_color_string + if(USE_CUSTOM_COLOR) + eye_color_left = current_left_color_string + eye_color_right = current_right_color_string + + if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. return - var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num - var/old_active = active // Get old active because set_distance() -> clear_visuals() will set it to FALSE. - set_distance(clamp(range, 0, max_light_beam_distance)) - assume_rgb(color) - // Reactivate if eyes were already active for real time colour swapping! - if(old_active) - activate(FALSE) - -/obj/item/organ/internal/eyes/robotic/glow/proc/assume_rgb(newcolor) - current_color_string = newcolor - eye_color_left = RGB2EYECOLORSTRING(current_color_string) - eye_color_right = eye_color_left - if(!QDELETED(owner) && ishuman(owner)) //Other carbon mobs don't have eye color. - owner.dna.species.handle_body(owner) - -/obj/item/organ/internal/eyes/robotic/glow/proc/cycle_mob_overlay() - remove_mob_overlay() - mob_overlay.color = current_color_string - add_mob_overlay() - -/obj/item/organ/internal/eyes/robotic/glow/proc/add_mob_overlay() - if(!QDELETED(owner)) - owner.add_overlay(mob_overlay) -/obj/item/organ/internal/eyes/robotic/glow/proc/remove_mob_overlay() - if(!QDELETED(owner)) - owner.cut_overlay(mob_overlay) - -/obj/item/organ/internal/eyes/robotic/glow/emp_act() - . = ..() - if(!active || . & EMP_PROTECT_SELF) + eye_owner.dna.species.handle_body(eye_owner) + update_mob_eyes_overlay() + +/** + * Updates the emissive mob eye overlay + * + * When the light is on, the overlay(s) are added. When it is disabled, they are cut. + * Adds one or two overlays depending on what the eye_color_mode toggle is set to. + * Arguments: + * * mob/living/carbon/eye_owner - the mob to add the overlay to + */ +/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eyes_overlay(mob/living/carbon/eye_owner = owner) + if(QDELETED(eye_owner)) return - deactivate(silent = TRUE) - -/obj/item/organ/internal/eyes/robotic/glow/on_insert(mob/living/carbon/eye_owner) - . = ..() - RegisterSignal(eye_owner, COMSIG_ATOM_DIR_CHANGE, PROC_REF(update_visuals)) -/obj/item/organ/internal/eyes/robotic/glow/on_remove(mob/living/carbon/eye_owner) - . = ..() - UnregisterSignal(eye_owner, COMSIG_ATOM_DIR_CHANGE) + if(!ishuman(eye_owner)) + return -/obj/item/organ/internal/eyes/robotic/glow/Destroy() - QDEL_NULL(mobhook) // mobhook is not our component - return ..() + eye_owner.cut_overlay(eyes_overlay) + eye_owner.cut_overlay(eyes_overlay_left) + eye_owner.cut_overlay(eyes_overlay_right) -/obj/item/organ/internal/eyes/robotic/glow/proc/activate(silent = FALSE) - start_visuals() - if(!silent) - to_chat(owner, span_warning("Your [src] clicks and makes a whining noise, before shooting out a beam of light!")) - cycle_mob_overlay() - -/obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(silent = FALSE) - clear_visuals() - if(!silent) - to_chat(owner, span_warning("Your [src] shuts off!")) - remove_mob_overlay() - -/obj/item/organ/internal/eyes/robotic/glow/proc/update_visuals(datum/source, olddir, newdir) - SIGNAL_HANDLER - if(!active) - return // Don't update if we're not active! - if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob) - regenerate_light_effects() - var/turf/scanfrom = get_turf(owner) - var/scandir = owner.dir - if (newdir && scandir != newdir) // COMSIG_ATOM_DIR_CHANGE happens before the dir change, but with a reference to the new direction. - scandir = newdir - if(!istype(scanfrom)) - clear_visuals() - var/turf/scanning = scanfrom - var/stop = FALSE - on_mob.set_light_flags(on_mob.light_flags & ~LIGHT_ATTACHED) - on_mob.forceMove(scanning) - for(var/i in 1 to light_beam_distance) - scanning = get_step(scanning, scandir) - if(IS_OPAQUE_TURF(scanning)) - stop = TRUE - var/obj/effect/abstract/eye_lighting/lighting = LAZYACCESS(eye_lighting, i) - if(stop) - lighting.forceMove(src) - else - lighting.forceMove(scanning) - -/obj/item/organ/internal/eyes/robotic/glow/proc/clear_visuals(delete_everything = FALSE) - if(delete_everything) - QDEL_LIST(eye_lighting) - QDEL_NULL(on_mob) - else - for(var/obj/effect/abstract/eye_lighting/lighting as anything in eye_lighting) - lighting.forceMove(src) - if(!QDELETED(on_mob)) - on_mob.set_light_flags(on_mob.light_flags | LIGHT_ATTACHED) - on_mob.forceMove(src) - active = FALSE - -/obj/item/organ/internal/eyes/robotic/glow/proc/start_visuals() - if(!islist(eye_lighting)) - eye_lighting = list() - regenerate_light_effects() - if((eye_lighting.len < light_beam_distance) || !on_mob) - regenerate_light_effects() - sync_light_effects() - active = TRUE - update_visuals() - -/obj/item/organ/internal/eyes/robotic/glow/proc/set_distance(dist) - light_beam_distance = dist - regenerate_light_effects() - -/obj/item/organ/internal/eyes/robotic/glow/proc/regenerate_light_effects() - clear_visuals(TRUE) - on_mob = new (src, light_object_range, light_object_power, current_color_string, LIGHT_ATTACHED) - for(var/i in 1 to light_beam_distance) - LAZYADD(eye_lighting, new /obj/effect/abstract/eye_lighting(src, light_object_range, light_object_power, current_color_string)) - sync_light_effects() - - -/obj/item/organ/internal/eyes/robotic/glow/proc/sync_light_effects() - for(var/obj/effect/abstract/eye_lighting/eye_lighting as anything in eye_lighting) - eye_lighting.set_light_color(current_color_string) - on_mob?.set_light_color(current_color_string) - - -/obj/effect/abstract/eye_lighting - light_system = MOVABLE_LIGHT - var/obj/item/organ/internal/eyes/robotic/glow/parent - - -/obj/effect/abstract/eye_lighting/Initialize(mapload, light_object_range, light_object_power, current_color_string, light_flags) - . = ..() - parent = loc - if(!istype(parent)) - stack_trace("/obj/effect/abstract/eye_lighting added to improper parent ([loc]). Deleting.") - return INITIALIZE_HINT_QDEL - if(!isnull(light_object_range)) - set_light_range(light_object_range) - if(!isnull(light_object_power)) - set_light_power(light_object_power) - if(!isnull(current_color_string)) - set_light_color(current_color_string) - if(!isnull(light_flags)) - set_light_flags(light_flags) + if(!eye.on) + return + switch(eye_color_mode) + if(MATCH_LIGHT_COLOR) + eyes_overlay = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) + eyes_overlay.color = current_color_string + eye_owner.add_overlay(eyes_overlay) + if(USE_CUSTOM_COLOR) + eyes_overlay_left = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs_left", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) + eyes_overlay_right = emissive_appearance('icons/mob/species/human/human_face.dmi', "eyes_glow_gs_right", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) + eyes_overlay_left.color = eye_color_left + eyes_overlay_right.color = eye_color_right + eye_owner.add_overlay(eyes_overlay_left) + eye_owner.add_overlay(eyes_overlay_right) + +#undef MATCH_LIGHT_COLOR +#undef USE_CUSTOM_COLOR +#undef UPDATE_LIGHT +#undef UPDATE_EYES_LEFT +#undef UPDATE_EYES_RIGHT /obj/item/organ/internal/eyes/moth name = "moth eyes" @@ -619,5 +718,3 @@ adapt_light.forceMove(src) REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) return ..() - -#undef RGB2EYECOLORSTRING diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 055c4e509f66..b815ceca40f4 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -56,6 +56,7 @@ attack_verb_simple = list("burn") tool_behaviour = TOOL_CAUTERY toolspeed = 1 + heat = 500 /obj/item/cautery/ignition_effect(atom/ignitable_atom, mob/user) . = span_notice("[user] touches the end of [src] to \the [ignitable_atom], igniting it with a puff of smoke.") diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png index 712e7f1a0ecb..63efd8fd17af 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png index ac412207c236..e43584b63a01 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png index 3b723129ac84..853ef8453830 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png index 61656a888921..5cdeedeffca7 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png differ diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 914e9953dbdf..6276d4dcac20 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -259,8 +259,6 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) //Same to above. Needs a client / mob / hallucination to observe it to exist. ignore += typesof(/obj/projectile/hallucination) ignore += typesof(/obj/item/hallucinated) - //Can't pass in a thing to glow - ignore += typesof(/obj/effect/abstract/eye_lighting) //We don't have a pod ignore += typesof(/obj/effect/pod_landingzone_effect) ignore += typesof(/obj/effect/pod_landingzone) diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 07949feb6261..e5fd0cde007d 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -19,7 +19,8 @@ desc = "The Syndicate surgery duffel bag is a toolkit containing all surgery tools, surgical drapes, \ a Syndicate brand MMI, a straitjacket, and a muzzle." item = /obj/item/storage/backpack/duffelbag/syndie/surgery - cost = 3 + cost = 4 + surplus = 66 /datum/uplink_item/device_tools/encryptionkey name = "Syndicate Encryption Key" @@ -82,11 +83,10 @@ item = /obj/item/storage/box/syndie_kit/syndicate_teleporter cost = 8 -/datum/uplink_item/device_tools/camera_bug - name = "Camera Bug" - desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \ - Bugging cameras allows you to disable them remotely." - item = /obj/item/camera_bug +/datum/uplink_item/device_tools/camera_app + name = "SyndEye Program" + desc = "A data disk containing a unique PC app that allows you to watch cameras and track crewmembers." + item = /obj/item/computer_disk/syndicate/camera_app cost = 1 surplus = 90 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm index 34fc9eedb0ff..87c9fd6c96c0 100644 --- a/code/modules/uplink/uplink_items/implant.dm +++ b/code/modules/uplink/uplink_items/implant.dm @@ -9,11 +9,14 @@ /datum/uplink_item/implants/freedom name = "Freedom Implant" - desc = "An implant injected into the body and later activated at the user's will. It will attempt to free the \ - user from common restraints such as handcuffs." + desc = "Can be activated to release common restraints such as handcuffs, legcuffs, and even bolas tethered around the legs." item = /obj/item/storage/box/syndie_kit/imp_freedom cost = 5 +/datum/uplink_item/implants/freedom/New() + . = ..() + desc += " Implant has enough energy for [FREEDOM_IMPLANT_CHARGES] uses before it becomes inert and harmlessly self-destructs." + /datum/uplink_item/implants/radio name = "Internal Syndicate Radio Implant" desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \ diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 39ded315381a..deae8acc20fe 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -116,6 +116,7 @@ /obj/item/clothing/head/tragic = 2, /obj/item/clothing/head/harlequinhat =2,//MONKESTATION EDIT ADDITION /obj/item/clothing/under/costume/harlequin =2,//MONKESTATION EDIT ADDITION + /obj/item/clothing/shoes/clown_shoes/harlequin_boots =2,//MONKESTATION EDIT ADDITION /obj/item/clothing/under/costume/tragic = 2, /obj/item/clothing/under/costume/streetmime = 1, /obj/item/clothing/mask/gas/clown_hat/yellow = 1, diff --git a/html/changelogs/AutoChangeLog-pr-1485.yml b/html/changelogs/AutoChangeLog-pr-1485.yml new file mode 100644 index 000000000000..a898b812a2e4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1485.yml @@ -0,0 +1,6 @@ +author: "AlbertNanotracen" +delete-after: True +changes: + - rscadd: "Added a station version of sandy dirt floors." + - qol: "Dirt in chicken pens can be crowbarred up and replaced." + - image: "Added a new icon for the station version of the sandy dirt tile" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1503.yml b/html/changelogs/AutoChangeLog-pr-1503.yml new file mode 100644 index 000000000000..1201e0704c7d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1503.yml @@ -0,0 +1,6 @@ +author: "Absolucy" +delete-after: True +changes: + - bugfix: "The experimental cloner ghost poll now shows what the clone will actually look like, rather than a nugget." + - bugfix: "The experimental cloner should 100% work properly now." + - qol: "Experimental cloners no longer delete records upon a successful clone, but they will no longer start clones while autoprocessing is enabled either." \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml index 8797a4855fb0..8500ca48db1c 100644 --- a/html/changelogs/archive/2024-03.yml +++ b/html/changelogs/archive/2024-03.yml @@ -339,3 +339,170 @@ armor. - qol: Added a message to the zed when they succesfully infect someone. - code_imp: Turned some proc names into snake_case rather than, uh, nospacecase. +2024-03-25: + AlbertNanotracen: + - rscadd: Immunity scanner now shows symptoms for recorded diseases. + - balance: Aluxive has a stronger instant effect. + - balance: Aetericilide is effective as preventative medication but not much value + once infected. (Also its max strength was lowered to 3x base strength from 5x + base strength) + - bugfix: Retrovirus now utilizes its multiplier for its effects rather than its + constant max_multiplier. + DATA-xPUNGED, KnigTheThrasher: + - rscadd: You can now boop fellow crew members by targeting their mouth on help + mode, try it on your local clown! + - sound: Increased the volume of shuttle welcome sound because it was too quiet. + DexeeXI: + - rscdel: Virus extrapolators no longer spawn in l3 bioclosets or pathologist kits. +2024-03-26: + AlbertNanotracen: + - bugfix: Placing a mouse inside your chef hat will once more allow it to pilot + you around. + - rscadd: A player-controlled mouse inside your chef hat can compel you to perform + complex actions, such as flipping and spinning. You will obey because the mouse + knows better than you do. + - bugfix: Gunthers no longer kill Gubbucks instead of breeding with them + - bugfix: gutlunches will stop having too many children + - balance: gutlunches are no longer in the mining faction + wraith-54321: + - code_imp: added support for key based antag huds +2024-03-27: + Absolucy: + - bugfix: Fixed cigarettes not being smokeable without a space helmet + internals. + - bugfix: Fixed being unable to melee lavaland tendrils. + - balance: (Melbert) Rats are now 5x less likely to decide to eat a cable when idling. + (1%, down from 5%) + - rscadd: (Kapu) Lockers, crates, and machines no longer block click attempts in + adjacency checks. Basically, you can reach tables cornered between lockers/machines. + - qol: (Rhials) Ventcrawling mobs have a 1 second delay/warning before exiting the + ventilation. + - qol: (LT3) ID card linking now preloads your bank account number. + - bugfix: (Kapu) Blood once again appears as small drops instead of splatters during + minor bleeding. + - qol: (dieamond13) Gives roundstart prisoners a key memory of what their crime + is. + - balance: (Noodlecat) Heretic robes now have wound armor. + - balance: (Noodlecat) Heretic blades now have knife-level wound bonuses. + - bugfix: (Shadow-Quill) The CRAB-17 will now only take whole credits, as fractional + credits were found to be worth less. + - qol: (JohnFulpWillard) Health Analyzers now show embeds in bodyparts on examine. + - qol: (mc-oofert) Latejoining crew start with crowbars if arrivals enviromental + power is OFF. + - image: (SandPoot) Changed screentips icons to something a lot fancier unified + with the LMB / RMB text. + - qol: (SandPoot) There are accessibility preferences to disable this! Look for + "Screentip context with images" beside the other screentip preferences. + - rscadd: (Rhials) Nuclear Operatives, in an attempt to appeal to the more "tacticool" + members of their cause, have begun using callsigns to designate themselves. + Check your preferences to set your Operative Alias! + - qol: (Rhials) At the request of the more vain members of the cause, hair dye has + been added to the Operative Firebase dorms. + - qol: (carlarctg) Heretic runes no longer have every single transparent pixel set + to 1 alpha, to make it easier to click on objects. + - qol: (carlarctg) Clearing heretic runes with mansus grasp takes 0.4 seconds of + standing still, to prevent you from accidentally clearing it in combat. + - code_imp: (carlarctg) Added code for effect remover element to use a windup if + set. + - qol: (Momo8289) Cryotubes will now notify medbay if the patient within is dead, + and will eject them if auto is on. + - qol: (Momo8289) Cryotubes will now automatically turn on when a patient enters + it if auto is on, but you can no longer close the cryotube on yourself. + - qol: (LT3) TGUI will now wait longer trying to reconnect to a new round. + - qol: (Shroopy) Implanted HUDs can now be toggled on and off with an action. + - sound: (Tattle) nerfed the police whistle volume. + - bugfix: (carlarctg) Cauteries now have 'heat', like lighters, welders, etc. + - qol: (carlarctg) You can smoke with a space helmet as long as you have internals + on. + - qol: (LT3) Being connected to an IV now has a visual indicator. + - rscadd: (uaioy) Added 2 pocket quick equip keybinds. + - qol: (nikothedude) Departmental order consoles now alert their department via + radio when their cooldown expires. + - rscadd: (Thunder12345) Crewmembers arriving very late will not always have time + to finish their breakfast. + - bugfix: (Dawnseer) fixed an oversight - Made Goliath Cloak and Goliath Cloak Hood + fireproof. And Goliath hide. + - balance: (iwishforducks) Railings now only cost 2 rods and are much easier to + construct. But they can now be destroyed much easier and cut with wirecutters + without unwrenching. + - balance: (Melbert) If your server has non-human morgue cadavers enabled, you will + be guaranteed one human cadaver no matter what. + - balance: (Melbert) All maps now have an additional morgue cadaver roundstart. + - qol: (MTandi) You can fill microwave with stuff by hitting it with a box full + of stuff. + - balance: (Melbert) Body temperature from being lit on fire will soft cap at 1,200 + K. It will still increase beyond this, but with diminishing returns. For example, + at 5,000 K, fire will heat 67x weaker. + - sound: (carlarctg) Adds a sound effect for hypospray/medipen injections. Doesn't + affect sleepy pens. + - rscadd: (mc-oofert, Ghommie) added a new hallucination, your mother. + - refactor: Improved shuttle gibbing code, adding a new resistance flag, `SHUTTLE_CRUSH_PROOF`. + - bugfix: Immortality revival spectres can no longer be crushed by shuttles. + - rscadd: The ghost of Poly can no longer be shuttle-crushed, nor can anything incorporeal. + - qol: Antag/event token requests now time out after 5 minutes of inaction. + - admin: Improved the admin notification for token requests. + - sound: Added a sound whenever an token is rejected. + AlbertNanotracen: + - bugfix: Plants with no product defined will no longer have a chance to return + early on harvest. + Gboster, Kapu1178: + - qol: 'Gboster: made the asteroid magnet into a TGUI' + - rscadd: 'Kapu1178: The magnet now has a 60 second cooldown between uses.' + - bugfix: 'Kapu1178: Summoned asteroids are removed from the list of available asteroids.' + - bugfix: 'Kapu1178: Fixed a bug that allowed you to summon multiple asteroids at + once.' + KnigTheThrasher: + - rscadd: Blind support for booping + - rscadd: Chat message when someone boops you + - bugfix: Removed a duped door when meta rolls a sinularity engine +2024-03-28: + Absolucy: + - bugfix: Chameleon holsters, thermals, and sechuds can be locked with multitools, + like all other chameleon items. + - bugfix: Fix incorrect pixel_y shift after getting up, which resulted in the player + being shifted 6 pixels down. + - bugfix: fix modular computers (i.e hop's id console) being borked + DexeeXI: + - balance: spectral music items are halloween or badmin only. + Gboster-0: + - code_imp: PKA code got cleaned up + NicoDeLuna: + - rscadd: added harlequin boots + Rhials, Jolly-66, MrMelbert, Jacquerel, cnleth, Ghommie, MelokGleb and KREKS, McRamon: + - sound: Revolutionaries now have their own stinger that plays upon becoming that + antagonist. + - spellcheck: Changeling hallucination sting will now tell you it costs 10 chemicals. + It always did, but now its there. Cheers? + - bugfix: Ling Augmented Eyesight now no longer causes you to lose the effects of + your Meson glasses + - bugfix: Ling Augmented Eyesight now more consistently tracks the flash protection + / vulnerability it confers. + - qol: Changeling Emporium is now sorted alphabetically. + - qol: Changeling Emporium now has a search bar! + - refactor: Refactored display-ing of antag objectives in their UIs + - rscadd: Traitors, Changelings, Heretics, Wizards, Malfunctioning AIs, and Ninjas + can now all reject their original objectives and provide one of their own in + its place. A Heretic doing this will no longer be able to ascend. + - rscadd: '"Custom" objectives which aren''t mechanically tracked will no longer + report success or failure upon round end.' + - qol: Space Ninja spider charges will now display where they can be detonated when + examined, if you are a ninja. + - bugfix: Changeling tentacle and bloodchiller from xenobio will no longer stop + working if you have antimagic + - spellcheck: Replaced an irrelevant tip of the round about scars with a better + one + - rscadd: Added a new 0 cost passive changeling ability, the Defibrillator Grasp. + - rscadd: DNA sing is now no longer innate, but 0 cost, allowing changelings to + not take it if they don't plan on using it. + - balance: The Changeling Space Suit has been replaced by a new ability which makes + you passively spaceproof without replacing your clothing. + - admin: Editing the atmos sensitivity variables on a basic mob during the game + will now actually do something. + - rscadd: Added the daily (roundstart) message server key to the Chief Engineer's + memories. + - image: New sprites for changeling powers and items. Woooh. + - bugfix: Fix ling revival for full-dead lings + Tattle: + - image: removed a stray gray pixel from the milk containers + Tractor Mann: + - rscadd: Now thats what i call music! 22 new songs have been added to the bartenders + jukebox and lobby! diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index 7405085c2409..10121115a625 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 23570f8d9722..aa4eb88431df 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_changeling.dmi b/icons/hud/screen_changeling.dmi index 61d3513cbfa3..c3bab062ac49 100644 Binary files a/icons/hud/screen_changeling.dmi and b/icons/hud/screen_changeling.dmi differ diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index 0969b03725e1..bb3634a1dde1 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 558045a0656b..c9aa15345388 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/inhands/antag/changeling_lefthand.dmi b/icons/mob/inhands/antag/changeling_lefthand.dmi index daf0e2fb3f62..a3723f8dab01 100644 Binary files a/icons/mob/inhands/antag/changeling_lefthand.dmi and b/icons/mob/inhands/antag/changeling_lefthand.dmi differ diff --git a/icons/mob/inhands/antag/changeling_righthand.dmi b/icons/mob/inhands/antag/changeling_righthand.dmi index aa2144c5962b..d3f320a38a9f 100644 Binary files a/icons/mob/inhands/antag/changeling_righthand.dmi and b/icons/mob/inhands/antag/changeling_righthand.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index 62f6f6a3fa1a..c796081a6414 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters.dmi and b/icons/mob/simple/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/species/human/human_face.dmi b/icons/mob/species/human/human_face.dmi index 02960bb8859f..04d3f66cf6ac 100644 Binary files a/icons/mob/species/human/human_face.dmi and b/icons/mob/species/human/human_face.dmi differ diff --git a/icons/obj/drinks/boxes.dmi b/icons/obj/drinks/boxes.dmi index 8ed76d9760ac..a0408465ee13 100644 Binary files a/icons/obj/drinks/boxes.dmi and b/icons/obj/drinks/boxes.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 3358d1e3ea5f..93ab67c804cc 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/icons/obj/weapons/changeling_items.dmi b/icons/obj/weapons/changeling_items.dmi index 4c26dfea49ef..ca577e6d2b28 100644 Binary files a/icons/obj/weapons/changeling_items.dmi and b/icons/obj/weapons/changeling_items.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 3cac4bb44013..e464b61ff89c 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/ui_icons/screentips/cursor_hints.dmi b/icons/ui_icons/screentips/cursor_hints.dmi new file mode 100644 index 000000000000..2fdbb2d04d50 Binary files /dev/null and b/icons/ui_icons/screentips/cursor_hints.dmi differ diff --git a/monkestation/code/datums/meta_tokens.dm b/monkestation/code/datums/meta_tokens.dm index 751dd4a01af7..454e5eb8fcd5 100644 --- a/monkestation/code/datums/meta_tokens.dm +++ b/monkestation/code/datums/meta_tokens.dm @@ -37,6 +37,10 @@ GLOBAL_LIST_INIT(patreon_etoken_values, list( var/event_token_month = 0 ///what token event do we currently have queued var/datum/twitch_event/queued_token_event + /// The timer for the antag token timeout + var/antag_timeout + /// The timer for the event token timeout + var/event_timeout /datum/meta_token_holder/New(client/creator) . = ..() @@ -128,6 +132,9 @@ GLOBAL_LIST_INIT(patreon_etoken_values, list( in_queue = null in_queued_tier = null queued_donor = FALSE + if(antag_timeout) + deltimer(antag_timeout) + antag_timeout = null /datum/meta_token_holder/proc/reject_antag_token() if(!in_queue) @@ -135,9 +142,24 @@ GLOBAL_LIST_INIT(patreon_etoken_values, list( to_chat(owner, span_boldwarning("Your request to play as [in_queue] has been denied.")) logger.Log(LOG_CATEGORY_META, "[owner]'s antag token for [in_queue] has been denied.") + SEND_SOUND(owner, sound('sound/misc/compiler-failure.ogg', volume = 50)) in_queue = null in_queued_tier = null queued_donor = FALSE + if(antag_timeout) + deltimer(antag_timeout) + antag_timeout = null + +/datum/meta_token_holder/proc/timeout_antag_token() + if(!in_queue) + return + to_chat(owner, span_boldwarning("Your request to play as [in_queue] wasn't answered within 5 minutes. Better luck next time!")) + logger.Log(LOG_CATEGORY_META, "[owner]'s antag token for [in_queue] has timed out.") + SEND_SOUND(owner, sound('sound/misc/compiler-failure.ogg', volume = 50)) + in_queue = null + in_queued_tier = null + queued_donor = FALSE + antag_timeout = null /datum/meta_token_holder/proc/adjust_event_tokens(amount) check_event_tokens(owner) @@ -162,6 +184,9 @@ GLOBAL_LIST_INIT(patreon_etoken_values, list( adjust_event_tokens(-queued_token_event.token_cost) SStwitch.add_to_queue(initial(queued_token_event.id_tag)) queued_token_event = null + if(event_timeout) + deltimer(event_timeout) + event_timeout = null /datum/meta_token_holder/proc/reject_token_event() if(!queued_token_event) @@ -169,4 +194,17 @@ GLOBAL_LIST_INIT(patreon_etoken_values, list( to_chat(owner, span_boldwarning("Your request to trigger [queued_token_event] has been denied.")) logger.Log(LOG_CATEGORY_META, "[owner]'s event token for [queued_token_event] has been denied.") + SEND_SOUND(owner, sound('sound/misc/compiler-failure.ogg', volume = 50)) + queued_token_event = null + if(event_timeout) + deltimer(event_timeout) + event_timeout = null + +/datum/meta_token_holder/proc/timeout_event_token() + if(!queued_token_event) + return + logger.Log(LOG_CATEGORY_META, "[owner]'s event token for [queued_token_event] has timed out.") + to_chat(owner, span_boldwarning("Your request to trigger [queued_token_event] wasn't answered within 5 minutes. Better luck next time!")) + SEND_SOUND(owner, sound('sound/misc/compiler-failure.ogg', volume = 50)) queued_token_event = null + event_timeout = null diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 8ee36f54a0c8..b1e36308e4a7 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -51,6 +51,8 @@ var/list/unattached_flesh var/flesh_number = 0 var/datum/bank_account/current_insurance + /// Whether autoprocessing will automatically clone, or just scan. + var/auto_clone = TRUE fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED diff --git a/monkestation/code/game/machinery/computer/cloning.dm b/monkestation/code/game/machinery/computer/cloning.dm index 11eb1828904f..3dcd237a4b90 100644 --- a/monkestation/code/game/machinery/computer/cloning.dm +++ b/monkestation/code/game/machinery/computer/cloning.dm @@ -7,7 +7,7 @@ name = "record" var/list/fields = list() -/obj/machinery/computer/cloning //hippie start, re-add cloning +/obj/machinery/computer/cloning //monke start, re-add cloning name = "cloning console" desc = "Used to clone people and manage DNA." icon_screen = "dna" @@ -60,10 +60,11 @@ if(pod.is_operational && pod.efficiency > 5) return TRUE -/obj/machinery/computer/cloning/proc/GetAvailableEfficientPod(mind = null) +/obj/machinery/computer/cloning/proc/GetAvailableEfficientPod(mind = null, cloning = FALSE) if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/pod = P + for(var/obj/machinery/clonepod/pod as anything in pods) + if(cloning & !pod.auto_clone) + continue if(pod.occupant && pod.clonemind == mind) return pod else if(!. && pod.is_operational && !(pod.occupant || pod.mess) && pod.efficiency > 5) @@ -79,21 +80,17 @@ if(scanner.occupant && scanner.scan_level > 2) scan_occupant(scanner.occupant) - for(var/datum/data/record/R in records) - var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mindref"]) + for(var/datum/data/record/record in records) + var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(record.fields["mindref"], TRUE) - if(!pod) + if(QDELETED(pod) || !pod.auto_clone || !QDELETED(pod.occupant)) return - - if(pod.occupant) - break - - var/result = grow_clone_from_record(pod, R) + var/result = grow_clone_from_record(pod, record) if(result & CLONING_SUCCESS) - temp = "[R.fields["name"]] => Cloning cycle in progress..." - log_cloning("Cloning of [key_name(R.fields["mindref"])] automatically started via autoprocess - [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") + temp = "[record.fields["name"]] => Cloning cycle in progress..." + log_cloning("Cloning of [key_name(record.fields["mindref"])] automatically started via autoprocess - [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") if(result & CLONING_DELETE_RECORD) - records -= R + records -= record /obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner) @@ -539,7 +536,7 @@ scantemp = "Unable to locate valid genetic data." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return - + if(isbrain(mob_occupant)) dna = B.stored_dna if(!body_only && HAS_TRAIT(mob_occupant, TRAIT_SUICIDED)) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 07d3eba78da3..3c49c3caf090 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -7,78 +7,97 @@ req_access = null circuit = /obj/item/circuitboard/machine/clonepod/experimental internal_radio = FALSE + VAR_PRIVATE + static/list/image/cached_clone_images + +/obj/machinery/clonepod/experimental/Destroy() + clear_human_dummy(REF(src)) + return ..() //Start growing a human clone in the pod! -/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) - if(panel_open) - return NONE - if(mess || attempting) +/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) + if(panel_open || mess || attempting) return NONE attempting = TRUE //One at a time!! countdown.start() - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) + var/mob/living/carbon/human/clonee = new /mob/living/carbon/human(src) - H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features) + clonee.hardset_dna(ui, mutation_index, null, clonee.real_name, blood_type, mrace, features) if(efficiency > 2) var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) - H.dna.remove_mutation_group(unclean_mutations) + clonee.dna.remove_mutation_group(unclean_mutations) if(efficiency > 5 && prob(20)) - H.easy_random_mutate(POSITIVE) + clonee.easy_random_mutate(POSITIVE) if(efficiency < 3 && prob(50)) - var/mob/M = H.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) - if(ismob(M)) - H = M + var/mob/new_mob = clonee.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) + if(ismob(new_mob)) + clonee = new_mob - occupant = H + occupant = clonee if(!clonename) //to prevent null names clonename = "clone ([rand(1,999)])" - H.real_name = clonename + clonee.real_name = clonename icon_state = "pod_1" //Get the clone body ready - maim_clone(H) - ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) - H.Unconscious(80) + maim_clone(clonee) + ADD_TRAIT(clonee, TRAIT_STABLEHEART, CLONING_POD_TRAIT) + ADD_TRAIT(clonee, TRAIT_STABLELIVER, CLONING_POD_TRAIT) + ADD_TRAIT(clonee, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) + ADD_TRAIT(clonee, TRAIT_MUTE, CLONING_POD_TRAIT) + ADD_TRAIT(clonee, TRAIT_NOBREATH, CLONING_POD_TRAIT) + ADD_TRAIT(clonee, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) + clonee.Unconscious(80) var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( "Do you want to play as [clonename]'s defective clone?", poll_time = 10 SECONDS, - target_mob = H, + target_mob = clonee, ignore_category = POLL_IGNORE_DEFECTIVECLONE, - pic_source = H, + pic_source = get_clone_preview(clonee.dna) || clonee, role_name_text = "defective clone" ) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - H.key = C.key + var/mob/dead/observer/candidate = pick(candidates) + clonee.key = candidate.key if(grab_ghost_when == CLONER_FRESH_CLONE) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") + clonee.grab_ghost() + to_chat(clonee, span_notice("Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?")) if(grab_ghost_when == CLONER_MATURE_CLONE) - H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost - to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") - - if(H) - H.faction |= factions + clonee.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost + to_chat(clonee.get_ghost(TRUE), span_notice("Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.")) - H.set_cloned_appearance() - - H.set_suicide(FALSE) + if(!QDELETED(clonee)) + clonee.faction |= factions + clonee.set_cloned_appearance() + clonee.set_suicide(FALSE) attempting = FALSE - return CLONING_DELETE_RECORD | CLONING_SUCCESS //so that we don't spam clones with autoprocess unless we leave a body in the scanner + return CLONING_SUCCESS //so that we don't spam clones with autoprocess unless we leave a body in the scanner + +/obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) + RETURN_TYPE(/image) + if(!istype(clone_dna) || QDELING(clone_dna)) + return + var/key = copytext_char(md5("[clone_dna.unique_identity][clone_dna.unique_features][clone_dna.species.type][clone_dna.body_height]"), 1, 8) + var/image/preview = LAZYACCESS(cached_clone_images, key) + if(!isnull(preview)) + return preview + var/mob/living/carbon/human/dummy/preview_dummy = generate_or_wait_for_human_dummy(REF(src)) + clone_dna.transfer_identity(preview_dummy, transfer_SE = FALSE, transfer_species = TRUE) + preview_dummy.set_cloned_appearance() + preview_dummy.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE) + preview = getFlatIcon(preview_dummy) + unset_busy_human_dummy(REF(src)) + LAZYSET(cached_clone_images, key, preview) + return preview //Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. /obj/machinery/computer/prototype_cloning diff --git a/monkestation/code/game/objects/items/miningweapons.dm b/monkestation/code/game/objects/items/miningweapons.dm index 5f40110608ae..e75d782c75bc 100644 --- a/monkestation/code/game/objects/items/miningweapons.dm +++ b/monkestation/code/game/objects/items/miningweapons.dm @@ -181,322 +181,9 @@ overrides_twohandrequired = TRUE override_twohandedsprite = TRUE - /obj/item/kinetic_crusher/claw/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, \ speed = 5 SECONDS, \ effectiveness = 100, \ ) - -//Proto-Kinetic Accelerators - -/obj/item/gun/energy/recharge/kinetic_accelerator/railgun - name = "proto-kinetic railgun" - desc = "Before the nice streamlined and modern day Proto-Kinetic Accelerator was created, multiple designs were drafted by the Mining Research and Development \ - team. Many were failures, including this one, which came out too bulky and too ineffective. Well recently the MR&D Team got drunk and said 'fuck it we ball' and \ - went back to the bulky design, overclocked it, and made it functional, turning it into what is essentially a literal man portable particle accelerator. \ - The design results in a massive hard to control blast of kinetic energy, with the power to punch right through creatures and cause massive damage. The \ - only problem with the design is that it is so bulky you need to carry it with two hands, and the technology has been outfitted with a special firing pin \ - that denies use near or on the station, due to its destructive nature." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticrailgun" - base_icon_state = "kineticrailgun" - inhand_icon_state = "kineticgun" - w_class = WEIGHT_CLASS_HUGE - pin = /obj/item/firing_pin/wastes - recharge_time = 3 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/railgun) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_HEAVY - can_bayonet = FALSE - max_mod_capacity = 0 //fuck off - recoil = 3 //railgun go brrrrr - gun_flags = NOT_A_REAL_GUN - disablemodification = TRUE - -/obj/item/gun/energy/recharge/kinetic_accelerator/repeater - name = "proto-kinetic repeater" - desc = "During the pizza party celebrating the release of the new crusher designs, the Mining Research and Development team members were only allowed one slice. \ - One member exclaimed 'I wish we could have more than one slice' and another replied 'I wish we could shoot the accelerator more than once' and thus, the repeater \ - on the spot. The repeater trades a bit of power for the ability to fire three shots before becoming empty, while retaining the ability to fully recharge in one \ - go. The extra technology packed inside to make this possible unfortunately reduces mod space meaning you cant carry as many mods compared to a regular accelerator." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticrepeater" - base_icon_state = "kineticrepeater" - inhand_icon_state = "kineticgun" - recharge_time = 2 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/repeater) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 - max_mod_capacity = 60 - -/obj/item/gun/energy/recharge/kinetic_accelerator/shotgun - name = "proto-kinetic shotgun" - desc = "During the crusher design pizza party, one member of the Mining Research and Development team brought out a real riot shotgun, and killed three \ - other research members with one blast. The MR&D Director immedietly thought of a genuis idea, creating the proto-kinetic shotgun moments later, which he \ - immedietly used to execute the research member who brought the real shotgun. The proto-kinetic shotgun trades off some mod capacity and cooldown in favor \ - of firing three shots at once with reduce range and power. The total damage of all three shots is higher than a regular PKA but the individual shots are weaker." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticshotgun" - base_icon_state = "kineticshotgun" - inhand_icon_state = "kineticgun" - recharge_time = 2 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/shotgun) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 - max_mod_capacity = 60 - -/obj/item/gun/energy/recharge/kinetic_accelerator/glock - name = "proto-kinetic pistol" - desc = "During the pizza party for the Mining Research and Development team, one special snowflake researcher wanted a mini murphy instead of a regular \ - pizza slice, so reluctantly the Director bought him his mini murphy, which the dumbass immedietly dropped ontop of a PKA. Suddenly the idea to create \ - a 'build your own PKA' design was created. The proto-kinetic pistol is arguably worse than the base PKA, sporting lower damage and range. But this lack \ - of base efficiency allows room for nearly double the mods, making it truely 'your own PKA'." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticpistol" - base_icon_state = "kineticpistol" - inhand_icon_state = "kineticgun" - recharge_time = 2 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/glock) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = FALSE - max_mod_capacity = 200 - -/obj/item/gun/energy/recharge/kinetic_accelerator/shockwave - name = "proto-kinetic shockwave" - desc = "Quite frankly, we have no idea how the Mining Research and Development team came up with this one, all we know is that alot of \ - beer was involved. This proto-kinetic design will slam the ground, creating a shockwave around the user, with the same power as the base PKA.\ - The only downside is the lowered mod capacity, the lack of range it offers, and the higher cooldown, but its pretty good for clearing rocks." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticshockwave" - base_icon_state = "kineticshockwave" - inhand_icon_state = "kineticgun" - recharge_time = 2 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/shockwave) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = FALSE - max_mod_capacity = 60 - -/obj/item/gun/energy/recharge/kinetic_accelerator/m79 - name = "proto-kinetic grenade launcher" - desc = "Made in a drunk frenzy during the creation of the kinetic railgun, the kinetic grenade launcher fires the same bombs used by \ - the mining modsuit. Due to the technology needed to pack the bombs into this weapon, there is no space for modification." - icon = 'monkestation/icons/obj/guns/guns.dmi' - icon_state = "kineticglauncher" - base_icon_state = "kineticglauncher" - inhand_icon_state = "kineticgun" - pin = /obj/item/firing_pin/wastes - recharge_time = 2 SECONDS - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/m79) - item_flags = NONE - obj_flags = UNIQUE_RENAME - w_class = WEIGHT_CLASS_HUGE - weapon_weight = WEAPON_HEAVY - can_bayonet = FALSE - max_mod_capacity = 0 - disablemodification = TRUE - -//Accelerator Casing -/obj/item/ammo_casing/energy/kinetic/railgun - projectile_type = /obj/projectile/kinetic/railgun - select_name = "kinetic" - e_cost = 500 - fire_sound = 'sound/weapons/beam_sniper.ogg' - -/obj/item/ammo_casing/energy/kinetic/repeater - projectile_type = /obj/projectile/kinetic/repeater - select_name = "kinetic" - e_cost = 150 //about three shots - fire_sound = 'sound/weapons/kenetic_accel.ogg' - -/obj/item/ammo_casing/energy/kinetic/shotgun - projectile_type = /obj/projectile/kinetic/shotgun - select_name = "kinetic" - e_cost = 500 - pellets = 3 - variance = 50 - fire_sound = 'sound/weapons/kenetic_accel.ogg' - -/obj/item/ammo_casing/energy/kinetic/glock - projectile_type = /obj/projectile/kinetic/glock - select_name = "kinetic" - e_cost = 500 - fire_sound = 'sound/weapons/kenetic_accel.ogg' - -/obj/item/ammo_casing/energy/kinetic/shockwave - projectile_type = /obj/projectile/kinetic/shockwave - select_name = "kinetic" - e_cost = 500 - pellets = 8 - variance = 360 - fire_sound = 'sound/weapons/gun/general/cannon.ogg' - -/obj/item/ammo_casing/energy/kinetic/m79 - projectile_type = /obj/projectile/bullet/reusable/mining_bomb //uses the mining bomb projectile from the mining modsuit - select_name = "kinetic" - e_cost = 500 - fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' - -//Accelerator Projectiles -/obj/projectile/kinetic/railgun - name = "hyper kinetic force" - icon_state = null - damage = 100 - damage_type = BRUTE - armor_flag = BOMB - range = 7 - log_override = TRUE - pressure_decrease = 0.10 //Pressured enviorments are a no go for the railgun - speed = 0.1 //NYOOM - projectile_piercing = PASSMOB - -/obj/projectile/kinetic/repeater - name = "rapid kinetic force" - icon_state = null - damage = 20 - damage_type = BRUTE - armor_flag = BOMB - range = 4 - log_override = TRUE - -/obj/projectile/kinetic/shotgun - name = "split kinetic force" - icon_state = null - damage = 20 - damage_type = BRUTE - armor_flag = BOMB - range = 3 - log_override = TRUE - -/obj/projectile/kinetic/glock - name = "light kinetic force" - icon_state = null - damage = 10 - damage_type = BRUTE - armor_flag = BOMB - range = 3 - log_override = TRUE - -/obj/projectile/kinetic/shockwave - name = "concussive kinetic force" - icon_state = null - damage = 40 - damage_type = BRUTE - armor_flag = BOMB - range = 1 - log_override = TRUE - -//Wastes firing pin - restricts a weapon to only outside when mining - based on area defines not z-level - -/obj/item/firing_pin/wastes - name = "Wastes firing pin" - desc = "This safety firing pin allows weapons to be fired only outside on the wastes of lavaland or icemoon." - fail_message = "Wastes check failed! - Try getting further from the station first." - pin_hot_swappable = FALSE - pin_removable = FALSE - var/list/wastes = list(/area/icemoon/underground/unexplored/rivers, - /area/icemoon/surface/outdoors, - /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters, - /area/icemoon/underground/unexplored/rivers/deep/shoreline, - /area/icemoon/underground/explored, - /area/lavaland/surface/outdoors, - /area/lavaland/surface/outdoors/unexplored/danger, - /area/lavaland/surface/outdoors/unexplored, - /area/lavaland/surface/outdoors/explored, - /area/ocean/generated, - /area/ocean/generated_above, - /area/ruin/) - -/obj/item/firing_pin/wastes/pin_auth(mob/living/user) - if(!istype(user)) - return FALSE - if (is_type_in_list(get_area(user), wastes)) - return TRUE - return FALSE - - -//ADMIN ONLY MEMES -/obj/item/gun/energy/recharge/kinetic_accelerator/meme - name = "adminium reaper" - desc = "Mining RnD broke the fabric of space time, please return to your nearest centralcommand officer. WARNING FROM THE MINING RND DIRECTOR : DO NOT RAPIDLY PULL TRIGGER : FABRIC OF SPACE TIME LIABLE TO BREAK " - icon_state = "kineticgun" - base_icon_state = "kineticgun" - inhand_icon_state = "kineticgun" - recharge_time = 0.1 - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/meme) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 - max_mod_capacity = 420 - -/obj/item/ammo_casing/energy/kinetic/meme - projectile_type = /obj/projectile/kinetic/meme - select_name = "kinetic" - e_cost = 1 - pellets = 69 - variance = 90 - fire_sound = 'sound/effects/adminhelp.ogg' - variance = 3 - -/obj/projectile/kinetic/meme - name = "proto kinetic meme force" - icon_state = null - damage = 420 - damage_type = BRUTE - range = 300 - log_override = TRUE - pressure_decrease = 1 - dismemberment = 10 - catastropic_dismemberment = TRUE - hitsound = 'sound/effects/adminhelp.ogg' - -/obj/item/gun/energy/recharge/kinetic_accelerator/meme/nonlethal - name = "adminium stunner" - desc = "Mining RnD broke the fabric of space time AGAIN, please return to your nearest centralcommand officer. WARNING FROM THE MINING RND DIRECTOR : DO NOT RAPIDLY PULL TRIGGER : FABRIC OF SPACE TIME LIABLE TO BREAK \ - Im being bullied by the admins" - icon_state = "kineticgun" - base_icon_state = "kineticgun" - inhand_icon_state = "kineticgun" - recharge_time = 0.1 - ammo_type = list(/obj/item/ammo_casing/energy/kinetic/meme/nonlethal) - can_bayonet = FALSE - max_mod_capacity = 0 - -/obj/item/ammo_casing/energy/kinetic/meme/nonlethal - projectile_type = /obj/projectile/kinetic/meme/nonlethal - select_name = "kinetic" - fire_sound = 'sound/effects/adminhelp.ogg' - -/obj/projectile/kinetic/meme/nonlethal - name = "surprisingly soft proto kinetic meme force" - damage = 0 - dismemberment = 0 - catastropic_dismemberment = FALSE - stun = 69 - knockdown = 69 - paralyze = 69 - immobilize = 69 - unconscious = 69 - eyeblur = 69 - drowsy = 69 SECONDS - jitter = 69 SECONDS - stamina = 69 SECONDS - stutter = 69 SECONDS - slur = 69 SECONDS diff --git a/monkestation/code/game/turfs/open/floor/misc_floor.dm b/monkestation/code/game/turfs/open/floor/misc_floor.dm new file mode 100644 index 000000000000..994ceea4107b --- /dev/null +++ b/monkestation/code/game/turfs/open/floor/misc_floor.dm @@ -0,0 +1,29 @@ +/obj/item/stack/tile/sandy_dirt + name = "sandy dirt tiles" + singular_name = "sandy dirt tile" + desc = "A flat tile of dirt." + icon = 'monkestation/icons/obj/tiles.dmi' + icon_state = "tile_sandy_dirt" + inhand_icon_state = "tile-sepia" + turf_type = /turf/open/floor/sandy_dirt + merge_type = /obj/item/stack/tile/sandy_dirt + +/turf/open/floor/sandy_dirt + gender = PLURAL + name = "dirt" + desc = "Upon closer examination, it's still dirt." + icon = 'icons/turf/floors.dmi' + icon_state = "sand" + base_icon_state = "sand" + bullet_bounce_sound = null + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + tiled_dirt = FALSE + + floor_tile = /obj/item/stack/tile/sandy_dirt + +/turf/open/floor/sandy_dirt/break_tile() + . = ..() + icon_state = "sand_damaged" diff --git a/monkestation/code/modules/antagonists/_common/antag_datum.dm b/monkestation/code/modules/antagonists/_common/antag_datum.dm index 084283f4b0d5..32928dc0d131 100644 --- a/monkestation/code/modules/antagonists/_common/antag_datum.dm +++ b/monkestation/code/modules/antagonists/_common/antag_datum.dm @@ -1,3 +1,7 @@ +/datum/antagonist + ///The key or list of keys that are valid to see our antag hud/of huds we can see + var/list/hud_keys + /datum/antagonist/proc/antag_token(datum/mind/hosts_mind, mob/spender) SHOULD_CALL_PARENT(FALSE) if(isobserver(spender)) diff --git a/monkestation/code/modules/antagonists/_common/antag_hud.dm b/monkestation/code/modules/antagonists/_common/antag_hud.dm new file mode 100644 index 000000000000..a69c203c15cb --- /dev/null +++ b/monkestation/code/modules/antagonists/_common/antag_hud.dm @@ -0,0 +1,20 @@ +/datum/atom_hud/alternate_appearance/basic/has_antagonist + ///The key or list of keys that are valid to see this hud, if unset then it will display to everyone with the antag datum like normal + var/list/valid_keys + +/datum/atom_hud/alternate_appearance/basic/has_antagonist/mobShouldSee(mob/M) + var/datum/antagonist/antag_datum = M.mind?.has_antag_datum(antag_datum_type) + if(!antag_datum) + return FALSE + + if(!valid_keys) + return TRUE + + var/islist_datum_keys = islist(antag_datum.hud_keys) + if(islist(valid_keys)) + if(islist_datum_keys) + return length(valid_keys - antag_datum.hud_keys) != length(valid_keys) + return antag_datum.hud_keys in valid_keys + else if(islist_datum_keys) + return valid_keys in antag_datum.hud_keys + return valid_keys == antag_datum.hud_keys diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm index d1769261d410..0ea3c8152080 100644 --- a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm @@ -75,7 +75,7 @@ /// Cleanup our currently loaded mining template /proc/CleanupAsteroidMagnet(turf/center, size) - var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center, size, space_only = FALSE) + var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center, size, baseturf_only = FALSE) for(var/turf/T as anything in turfs_to_destroy) CHECK_TICK @@ -88,12 +88,12 @@ T.ChangeTurf(/turf/baseturf_bottom) /// Sanitizes a block of turfs to prevent writing over undesired locations -/proc/ReserveTurfsForAsteroidGeneration(turf/center, size, space_only = TRUE) +/proc/ReserveTurfsForAsteroidGeneration(turf/center, size, baseturf_only = TRUE) . = list() var/list/turfs = RANGE_TURFS(size, center) for(var/turf/T as anything in turfs) - if(space_only && !isspaceturf(T)) + if(baseturf_only && !islevelbaseturf(T)) continue if(!(istype(T.loc, /area/station/cargo/mining/asteroid_magnet))) continue diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm index dfc3e33c5f42..82014ce46e2c 100644 --- a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm @@ -3,6 +3,7 @@ /obj/machinery/asteroid_magnet name = "asteroid magnet computer" + desc = "Control panel for the asteroid magnet." icon_state = "blackbox" resistance_flags = INDESTRUCTIBLE use_power = NO_POWER_USE @@ -28,10 +29,18 @@ var/coords_x = 0 var/coords_y = 0 - var/ping_result = "N/A
...
" + var/ping_result = "Awaiting first ping" /// Status of the user interface var/status = STATUS_OKAY + /// Boolean to keep track of state and protect against double summoning + var/summon_in_progress = FALSE + /// Are we currently automatically pinging the target? + var/Auto_pinging = FALSE + + + /// The cooldown between uses. + COOLDOWN_DECLARE(summon_cd) /obj/machinery/asteroid_magnet/Initialize(mapload) . = ..() @@ -51,186 +60,6 @@ GenerateMap() -/obj/machinery/asteroid_magnet/Topic(href, href_list) - . = ..() - if(.) - return - - var/list/map_offsets = map.return_offsets() - var/list/map_bounds = map.return_bounds() - var/value = text2num(href_list["x"] || href_list["y"]) - if(!isnull(value)) // round(null) = 0 - value = round(value, 1) - if("x" in href_list) - coords_x = WRAP(coords_x + map_offsets[1] + value, map_bounds[1] + map_offsets[1], map_bounds[2] + map_offsets[1]) - coords_x -= map_offsets[1] - updateUsrDialog() - - else if("y" in href_list) - coords_y = WRAP(coords_y + map_offsets[2] + value, map_bounds[3] + map_offsets[2], map_bounds[4] + map_offsets[2]) - coords_y -= map_offsets[2] - updateUsrDialog() - return - - if(href_list["ping"]) - ping(coords_x, coords_y) - updateUsrDialog() - return - - if(href_list["select"]) - var/datum/mining_template/T = locate(href_list["select"]) in available_templates - if(!T) - return - selected_template = T - updateUsrDialog() - return - - if(href_list["summon_selected"]) - summon_sequence() - return - -/obj/machinery/asteroid_magnet/ui_interact(mob/user, datum/tgui/ui) - var/content = list() - - content += {" -
-
- - Magnet Controls - - "} - - // X selector - content += {" -
- - X-Axis - -
-
[button_element(src, "-100", "x=-100")]
-
[button_element(src, "-10", "x=-10")]
-
[button_element(src, "-1", "x=-1")]
-
- [coords_x] -
-
[button_element(src, "1", "x=1")]
-
[button_element(src, "10", "x=10")]
-
[button_element(src, "100", "x=100")]
- --- -
-
- "} - - // Y selector - content += {" -
- - Y-Axis - -
-
[button_element(src, "-100", "y=-100")]
-
[button_element(src, "-10", "y=-10")]
-
[button_element(src, "-1", "y=-1")]
-
- [coords_y] -
-
[button_element(src, "1", "y=1")]
-
[button_element(src, "10", "y=10")]
-
[button_element(src, "100", "y=100")]
- --- -
-
- "} - - // Ping button - content += {" -
- - Ping - -
- [ping_result] -
-
- [button_element(src, "PING", "ping=1")] -
-
- "} - - // Summoner - content += {" -
- - Summon - -
- [status] -
-
- [button_element(src, "SUMMON", "summon_selected=1")] -
-
- "} - - // Close coordinates fieldset - content += "
" - - // Asteroids list fieldset - content += {" -
- - Celestial Bodies - - "} - // Selected asteroid container - var/asteroid_name - var/asteroid_desc - if(selected_template) - asteroid_name = selected_template.name - asteroid_desc = jointext(selected_template.get_description(), "") - - content += {" -
-
- [asteroid_name || "N/A"] -
- [asteroid_desc ? "
[asteroid_desc]
" : "
N/A
"] -
- "} - - // Asteroid list container - content += {" -
- "} - - var/i = 0 - for(var/datum/mining_template/template as anything in available_templates) - i++ - var/bg_color = i % 2 == 0 ? "#7c5500" : "#533200" - if(selected_template == template) - bg_color = "#e67300 !important" - content += {" -
- [template.name] ([template.x],[template.y]) -
- "} - - content += "
" - - content += {" - - "} - - - var/datum/browser/popup = new(user, "asteroidmagnet", name, 920, 475) - popup.set_content(jointext(content,"")) - popup.set_window_options("can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;") - popup.open() - /obj/machinery/asteroid_magnet/proc/ping(coords_x, coords_y) var/datum/mining_template/T = map.return_coordinate(coords_x, coords_y) if(T && !T.found) @@ -257,30 +86,41 @@ if(dx < 0) // If the X-axis distance is negative, put it between 181 and 359. 180 and 360/0 are impossible, as that requires X == 0. angle = 360 - angle - ping_result = "AZIMUTH
[round(angle, 0.01)]" + ping_result = "AZIMUTH [round(angle, 0.01)]" else - ping_result = "ERR" + ping_result = "UKNOWN ERROR, NO ASTEROIDS DETECTED. PLEASE CONTACT CENTCOM TECHNICIANS" /// Test to see if we should clear the magnet area. /// Returns FALSE if it can clear, returns a string error message if it can't. -/obj/machinery/asteroid_magnet/proc/check_for_magnet_errors() +/obj/machinery/asteroid_magnet/proc/check_for_magnet_errors(datum/mining_template/template) . = FALSE - if(isnull(selected_template)) - return "ERROR N1" + if(summon_in_progress) + return "ERROR: ASTEROID ALREADY BEING SUMMONED" + + if(!COOLDOWN_FINISHED(src, summon_cd)) + return "ERROR: MAGNET COOLING DOWN" + + if(isnull(template)) + return "ERROR: ASTEROID NOT DETECTED" + + if(template.summoned) + return "ERROR: ASTEROID ALREADY SUMMONED" for(var/mob/M as mob in range(area_size + 1, center_turf)) if(isliving(M)) - return "ERROR C3" + return "ERROR: HEAT SIGNATURES DETECTED ON THE ASTEROID" /// Performs a full summoning sequence, including putting up boundaries, clearing out the area, and bringing in the new asteroid. /obj/machinery/asteroid_magnet/proc/summon_sequence(datum/mining_template/template) - var/magnet_error = check_for_magnet_errors() + var/magnet_error = check_for_magnet_errors(template) if(magnet_error) status = magnet_error updateUsrDialog() return var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) + + summon_in_progress = TRUE A.area_flags |= NOTELEPORT // We dont want people getting nuked during the generation sequence status = "Summoning[ellipsis()]" available_templates -= template @@ -289,21 +129,24 @@ var/time = world.timeofday var/list/forcefields = PlaceForcefield() CleanupTemplate() - PlaceTemplate(selected_template) + PlaceTemplate(template) /// This process should take ATLEAST 20 seconds time = (world.timeofday + 20 SECONDS) - time if(time > 0) - addtimer(CALLBACK(src, PROC_REF(_FinishSummonSequence), forcefields), time) + addtimer(CALLBACK(src, PROC_REF(_FinishSummonSequence), template, forcefields), time) else - _FinishSummonSequence(forcefields) + _FinishSummonSequence(template, forcefields) return -/obj/machinery/asteroid_magnet/proc/_FinishSummonSequence(list/forcefields) +/obj/machinery/asteroid_magnet/proc/_FinishSummonSequence(datum/mining_template/template, list/forcefields) QDEL_LIST(forcefields) var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) A.area_flags &= ~NOTELEPORT // Annnnd done + summon_in_progress = FALSE + template.summoned = TRUE + COOLDOWN_START(src, summon_cd, 1 MINUTE) status = STATUS_OKAY updateUsrDialog() @@ -326,7 +169,7 @@ /obj/machinery/asteroid_magnet/proc/CleanupTemplate() PRIVATE_PROC(TRUE) - var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center_turf, area_size, space_only = FALSE) + var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center_turf, area_size, baseturf_only = FALSE) for(var/turf/T as anything in turfs_to_destroy) CHECK_TICK @@ -384,5 +227,79 @@ while (collisions <= MAX_COLLISIONS_BEFORE_ABORT) +/obj/machinery/asteroid_magnet/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AsteroidMagnet") + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/asteroid_magnet/ui_data(mob/user) + . = ..() + var/list/data = list() + + data["coords_x"] = coords_x + data["coords_y"] = coords_y + data["ping_result"] = ping_result + data["Auto_pinging"] = Auto_pinging + + var/list/asteroid_data = list() + for(var/datum/mining_template/asteroid as anything in available_templates) + asteroid_data += list(list( + "name" = "[asteroid.name] ([asteroid.x] [asteroid.y])", + "ref" = REF(asteroid), + "size" = asteroid.size, + "rarity" = asteroid.rarity, + )) + data["asteroids"] = asteroid_data + + return data + +/obj/machinery/asteroid_magnet/ui_act(action, list/params) // im sorry for this code + . = ..() + if (.) + return + + var/list/map_offsets = map.return_offsets() + var/list/map_bounds = map.return_bounds() + switch(action) + if("Change X Coordinates") + var/amount = params["Position_Change"] + if(amount == 0) // if position change is zero, we are trying to reset the coordinates instead of changing them + coords_x = 0 + if(Auto_pinging) + ping(coords_x, coords_y) + return + + coords_x = WRAP(coords_x + map_offsets[1] + amount, map_bounds[1] + map_offsets[1], map_bounds[2] + map_offsets[1]) + coords_x -= map_offsets[1] + if(Auto_pinging) + ping(coords_x, coords_y) + + if("Change Y Coordinates") + var/amount = params["Position_Change"] + if(amount == 0) // if position change is zero, we are trying to reset the coordinates instead of changing them + coords_y = 0 + if(Auto_pinging) + ping(coords_x, coords_y) + return + + coords_y = WRAP(coords_y + map_offsets[2] + amount, map_bounds[3] + map_offsets[2], map_bounds[4] + map_offsets[2]) + coords_y -= map_offsets[2] + if(Auto_pinging) + ping(coords_x, coords_y) + + if("TogglePinging") + Auto_pinging = !Auto_pinging + + if("ping") + ping(coords_x, coords_y) + + if("select") + var/datum/mining_template/asteroid = locate(params["asteroid_reference"]) in available_templates + selected_template = asteroid + summon_sequence(selected_template) + #undef MAX_COLLISIONS_BEFORE_ABORT #undef STATUS_OKAY diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm index 3b184047d5d5..2edf807938a5 100644 --- a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm @@ -11,9 +11,11 @@ // Asteroid Map location var/x var/y - var/found = FALSE - + /// Has this template been located by players? + var/found = FALSE + /// Has this template been summoned? + var/summoned = FALSE /datum/mining_template/New(center, max_size) . = ..() diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm b/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm index 56030039bb4e..e34c47298175 100644 --- a/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm +++ b/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm @@ -1,9 +1,9 @@ /* * For a new plane of (x,x'),(y,y') : offset_x,offset_y,x_size,y_size * - * //Sign changes must account for 0-crossing + * // Sign changes must account for 0-crossing * (-100,100),(0,0) : 101,1,201,1 - * //Otherwise, it does not + * // Otherwise, it does not * (-100,-50),(0,0) : 101,1,50,1 * (50,100) , (0,0) : -49,1,50,1 */ diff --git a/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_datum.dm b/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_datum.dm index ab8cddfd2434..613f44e9d4fb 100644 --- a/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_datum.dm +++ b/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_datum.dm @@ -94,6 +94,7 @@ TRAIT_VIRUSIMMUNE, TRAIT_TOXIMMUNE, TRAIT_HARDLY_WOUNDED, + TRAIT_NO_MIRROR_REFLECTION ) /** diff --git a/monkestation/code/modules/cassettes/track_folder/base_tracks.json b/monkestation/code/modules/cassettes/track_folder/base_tracks.json index 502858a7ac67..c2fc7b594d9b 100644 --- a/monkestation/code/modules/cassettes/track_folder/base_tracks.json +++ b/monkestation/code/modules/cassettes/track_folder/base_tracks.json @@ -4964,5 +4964,205 @@ "secret": false, "lobby": false, "jukebox": true + }, + { + "url" : "https://files.catbox.moe/8jfqnz.mp3", + "title": "CRISIS CITY: ACT 1", + "duration": 1500, + "artist": "SEGA", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/y2yn8p.mp3", + "title": "CRISIS CITY: ACT 2", + "duration": 1830, + "artist": "SEGA", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/5qhvax.mp3", + "title": "Dangerous", + "duration": 2780, + "artist": "Big Data & Joywave", + "genre": "Rock", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/amy1g1.mp3", + "title": "Electric Avenue", + "duration": 2280, + "artist": "Eddy Grant", + "genre": "Disco, Funk, Soul, and R&B", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/1plpjp.mp3", + "title": "Hardware Store", + "duration": 2230, + "artist": "Weird Al Yankovic", + "genre": "Rock", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/995vw3.mp3", + "title": "Hayloft", + "duration": 1810, + "artist": "Mother Mother", + "genre": "Rock", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/bg1e3t.mp3", + "title": "Hayloft II", + "duration": 2150, + "artist": "Mother Mother", + "genre": "Rock", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/6ka39h.mp3", + "title": "INVISIBLE", + "duration": 1910, + "artist": "Duran Duran", + "genre": "Pop", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/q2flt8.mp3", + "title": "Messages from the Stars", + "duration": 4600, + "artist": "The Rah Band", + "genre": "Disco, Funk, Soul, and R&B", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/b75c8c.mp3", + "title": "Midnight City", + "duration": 2440, + "artist": "M83", + "genre": "Electronic", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/m6mznt.mp3", + "title": "My Way (2008 Remaster)", + "duration": 2760, + "artist": "Frank Sinatra", + "genre": "Pop", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/9i8ich.mp3", + "title": "My Way Of Life", + "duration": 1870, + "artist": "Frank Sinatra", + "genre": "Pop", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/aa1f1q.mp3", + "title": "Tequila", + "duration": 1340, + "artist": "The Champs", + "genre": "Rock", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/dxud77.mp3", + "title": "TF2: Faster Than A Speeding Bullet", + "duration": 850, + "artist": "Valve Studio Orchestra", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/xs9sjk.mp3", + "title": "TF2: Main Theme", + "duration": 720, + "artist": "Valve Studio Orchestra", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/k80s76.mp3", + "title": "TF2: Right Behind You", + "duration": 1010, + "artist": "Valve Studio Orchestra", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/x18qw0.mp3", + "title": "TF2: Rocket Jump Waltz", + "duration": 320, + "artist": "Valve Studio Orchestra", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/bfj6e7.mp3", + "title": "TF2: Rocket Jump Waltz (Remix)", + "duration": 1900, + "artist": "Squiller", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/9i47e3.mp3", + "title": "TF2: Soldier Of Dance", + "duration": 680, + "artist": "Valve Studio Orchestra", + "genre": "Video Game", + "secret": false, + "lobby": false, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/ro7172.mp3", + "title": "The Set Up", + "duration": 2430, + "artist": "Favored Nations", + "genre": "Pop", + "secret": false, + "lobby": false, + "jukebox": true } ] diff --git a/monkestation/code/modules/client/verbs.dm b/monkestation/code/modules/client/verbs.dm index 505627ebbf73..663221f424bf 100644 --- a/monkestation/code/modules/client/verbs.dm +++ b/monkestation/code/modules/client/verbs.dm @@ -57,9 +57,12 @@ GLOBAL_LIST_INIT(antag_token_config, load_antag_token_config()) client_token_holder.in_queue = new chosen_antagonist to_chat(src, span_boldnotice("Your request has been sent to the admins.")) - SEND_NOTFIED_ADMIN_MESSAGE('sound/items/bikehorn.ogg', "[span_admin("[span_prefix("ANTAG TOKEN:")] [key_name(src)] \ - [ADMIN_APPROVE_ANTAG_TOKEN(src)] [ADMIN_REJECT_ANTAG_TOKEN(src)] | \ - [src] has requested to use their antag token to be a [chosen_antagonist::name].")]") + send_formatted_admin_message( \ + "[ADMIN_LOOKUPFLW(src)] has requested to use their antag token to be a [chosen_antagonist::name].\n\n[ADMIN_APPROVE_ANTAG_TOKEN(src)] | [ADMIN_REJECT_ANTAG_TOKEN(src)]", \ + title = "Antag Token Request", \ + color_override = "orange" \ + ) + client_token_holder.antag_timeout = addtimer(CALLBACK(client_token_holder, TYPE_PROC_REF(/datum/meta_token_holder, timeout_antag_token)), 5 MINUTES, TIMER_STOPPABLE | TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME) /client/verb/trigger_token_event() set category = "IC" @@ -92,9 +95,12 @@ GLOBAL_LIST_INIT(antag_token_config, load_antag_token_config()) client_token_holder.queued_token_event = selected_event to_chat(src, span_boldnotice("Your request has been sent.")) logger.Log(LOG_CATEGORY_META, "[usr] has requested to use their event tokens to trigger [selected_event.event_name]([selected_event]).") - SEND_NOTFIED_ADMIN_MESSAGE('sound/items/bikehorn.ogg', "[span_admin("[span_prefix("TOKEN EVENT:")] [key_name(src)] \ - [ADMIN_APPROVE_TOKEN_EVENT(src)] [ADMIN_REJECT_TOKEN_EVENT(src)] | \ - [src] has requested use their event tokens to trigger [selected_event.event_name]([selected_event]).")]") + send_formatted_admin_message( \ + "[ADMIN_LOOKUPFLW(src)] has requested use their event tokens to trigger [selected_event.event_name]([selected_event]).\n\n[ADMIN_APPROVE_TOKEN_EVENT(src)] | [ADMIN_REJECT_TOKEN_EVENT(src)]", \ + title = "Event Token Request", \ + color_override = "orange" \ + ) + client_token_holder.event_timeout = addtimer(CALLBACK(client_token_holder, TYPE_PROC_REF(/datum/meta_token_holder, timeout_event_token)), 5 MINUTES, TIMER_STOPPABLE | TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME) return to_chat(src, "You dont have enough tokens to trigger this event.") diff --git a/monkestation/code/modules/clothing/shoes/clown.dm b/monkestation/code/modules/clothing/shoes/clown.dm index 30e92ca0d7a1..fc78311da038 100644 --- a/monkestation/code/modules/clothing/shoes/clown.dm +++ b/monkestation/code/modules/clothing/shoes/clown.dm @@ -22,3 +22,11 @@ icon = 'icons/obj/clothing/shoes.dmi' squeak_sound = list('monkestation/sound/effects/clown_jingle1.ogg'=1, 'monkestation/sound/effects/clown_jingle2.ogg') //jingHONK jinglHONK jHONKgle jiHONKgle +/obj/item/clothing/shoes/clown_shoes/harlequin_boots + name = "harlequin boots" + desc = "For the more serious clowns, Now with a internal bell" + icon = 'monkestation/icons/obj/clothing/shoes.dmi' + icon_state = "harlequin_boots" + worn_icon = 'monkestation/icons/mob/clothing/feet.dmi' + worn_icon_state = "harlequin_boots" + squeak_sound = list('monkestation/sound/effects/clown_jingle1.ogg'=1, 'monkestation/sound/effects/clown_jingle2.ogg') \ No newline at end of file diff --git a/monkestation/code/modules/ghost_players/arena/fight_button.dm b/monkestation/code/modules/ghost_players/arena/fight_button.dm index 980ad44fe9e8..494b68f8c2e7 100644 --- a/monkestation/code/modules/ghost_players/arena/fight_button.dm +++ b/monkestation/code/modules/ghost_players/arena/fight_button.dm @@ -25,7 +25,7 @@ /obj/item/grenade/clusterbuster, /obj/item/spear/bamboospear, /obj/item/reagent_containers/spray/chemsprayer/magical, //unsure if this would cause issues but they do already have access to a full chem lab so it should be fine - /obj/item/gun/energy/laser/instakill, //first to hit the other wins, very fast matches +// /obj/item/gun/energy/laser/instakill, //first to hit the other wins, very fast matches /obj/item/melee/baton/security/loaded, /obj/item/chainsaw, /obj/item/melee/energy/sword/saber, diff --git a/monkestation/code/modules/mining/accelerators/_wastes_pin.dm b/monkestation/code/modules/mining/accelerators/_wastes_pin.dm new file mode 100644 index 000000000000..e121efe29d61 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/_wastes_pin.dm @@ -0,0 +1,26 @@ +//Wastes firing pin - restricts a weapon to only outside when mining - based on area defines not z-level +/obj/item/firing_pin/wastes + name = "Wastes firing pin" + desc = "This safety firing pin allows weapons to be fired only outside on the wastes of lavaland or icemoon." + fail_message = "Wastes check failed! - Try getting further from the station first." + pin_hot_swappable = FALSE + pin_removable = FALSE + var/list/wastes = list( + /area/icemoon/surface/outdoors, + /area/icemoon/underground/unexplored, + /area/icemoon/underground/explored, + + /area/lavaland/surface/outdoors, + + /area/ocean/generated, + /area/ocean/generated_above, + + /area/ruin, + ) + +/obj/item/firing_pin/wastes/pin_auth(mob/living/user) + if(!istype(user)) + return FALSE + if (is_type_in_list(get_area(user), wastes)) + return TRUE + return FALSE diff --git a/monkestation/code/modules/mining/accelerators/admin.dm b/monkestation/code/modules/mining/accelerators/admin.dm new file mode 100644 index 000000000000..20c55d48ce30 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/admin.dm @@ -0,0 +1,50 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/meme + name = "adminium reaper" + desc = "Mining RnD broke the fabric of space time, please return to your nearest centralcommand officer. WARNING FROM THE MINING RND DIRECTOR : DO NOT RAPIDLY PULL TRIGGER : FABRIC OF SPACE TIME LIABLE TO BREAK " + recharge_time = 0.1 + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/meme) + max_mod_capacity = 420 + +/obj/item/gun/energy/recharge/kinetic_accelerator/meme/nonlethal + name = "adminium stunner" + desc = "Mining RnD broke the fabric of space time AGAIN, please return to your nearest centralcommand officer. WARNING FROM THE MINING RND DIRECTOR : DO NOT RAPIDLY PULL TRIGGER : FABRIC OF SPACE TIME LIABLE TO BREAK \ + Im being bullied by the admins" + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/meme/nonlethal) + can_bayonet = FALSE + max_mod_capacity = 0 + +/obj/item/ammo_casing/energy/kinetic/meme + projectile_type = /obj/projectile/kinetic/meme + e_cost = 1 + pellets = 69 + variance = 90 + fire_sound = 'sound/effects/adminhelp.ogg' + +/obj/projectile/kinetic/meme + name = "proto kinetic meme force" + damage = 420 + range = 300 + pressure_decrease = 1 + dismemberment = 10 + catastropic_dismemberment = TRUE + hitsound = 'sound/effects/adminhelp.ogg' + +/obj/item/ammo_casing/energy/kinetic/meme/nonlethal + projectile_type = /obj/projectile/kinetic/meme/nonlethal + +/obj/projectile/kinetic/meme/nonlethal + name = "surprisingly soft proto kinetic meme force" + damage = 0 + dismemberment = 0 + catastropic_dismemberment = FALSE + stun = 69 + knockdown = 69 + paralyze = 69 + immobilize = 69 + unconscious = 69 + eyeblur = 69 + drowsy = 69 SECONDS + jitter = 69 SECONDS + stamina = 69 SECONDS + stutter = 69 SECONDS + slur = 69 SECONDS diff --git a/monkestation/code/modules/mining/accelerators/grenade.dm b/monkestation/code/modules/mining/accelerators/grenade.dm new file mode 100644 index 000000000000..46fcfbaa8007 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/grenade.dm @@ -0,0 +1,19 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/m79 + name = "proto-kinetic grenade launcher" + desc = "Made in a drunk frenzy during the creation of the kinetic railgun, the kinetic grenade launcher fires the same bombs used by \ + the mining modsuit. Due to the technology needed to pack the bombs into this weapon, there is no space for modification." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticglauncher" + base_icon_state = "kineticglauncher" + pin = /obj/item/firing_pin/wastes + recharge_time = 2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/m79) + w_class = WEIGHT_CLASS_HUGE + weapon_weight = WEAPON_HEAVY + can_bayonet = FALSE + max_mod_capacity = 0 + disablemodification = TRUE + +/obj/item/ammo_casing/energy/kinetic/m79 + projectile_type = /obj/projectile/bullet/reusable/mining_bomb //uses the mining bomb projectile from the mining modsuit + fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' diff --git a/monkestation/code/modules/mining/accelerators/pistol.dm b/monkestation/code/modules/mining/accelerators/pistol.dm new file mode 100644 index 000000000000..92445da67488 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/pistol.dm @@ -0,0 +1,20 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/glock + name = "proto-kinetic pistol" + desc = "During the pizza party for the Mining Research and Development team, one special snowflake researcher wanted a mini murphy instead of a regular \ + pizza slice, so reluctantly the Director bought him his mini murphy, which the dumbass immedietly dropped ontop of a PKA. Suddenly the idea to create \ + a 'build your own PKA' design was created. The proto-kinetic pistol is arguably worse than the base PKA, sporting lower damage and range. But this lack \ + of base efficiency allows room for nearly double the mods, making it truely 'your own PKA'." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticpistol" + base_icon_state = "kineticpistol" + recharge_time = 2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/glock) + can_bayonet = FALSE + max_mod_capacity = 200 + +/obj/item/ammo_casing/energy/kinetic/glock + projectile_type = /obj/projectile/kinetic/glock + +/obj/projectile/kinetic/glock + name = "light kinetic force" + damage = 10 diff --git a/monkestation/code/modules/mining/accelerators/railgun.dm b/monkestation/code/modules/mining/accelerators/railgun.dm new file mode 100644 index 000000000000..406d40db7d65 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/railgun.dm @@ -0,0 +1,32 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/railgun + name = "proto-kinetic railgun" + desc = "Before the nice streamlined and modern day Proto-Kinetic Accelerator was created, multiple designs were drafted by the Mining Research and Development \ + team. Many were failures, including this one, which came out too bulky and too ineffective. Well recently the MR&D Team got drunk and said 'fuck it we ball' and \ + went back to the bulky design, overclocked it, and made it functional, turning it into what is essentially a literal man portable particle accelerator. \ + The design results in a massive hard to control blast of kinetic energy, with the power to punch right through creatures and cause massive damage. The \ + only problem with the design is that it is so bulky you need to carry it with two hands, and the technology has been outfitted with a special firing pin \ + that denies use near or on the station, due to its destructive nature." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticrailgun" + base_icon_state = "kineticrailgun" + w_class = WEIGHT_CLASS_HUGE + pin = /obj/item/firing_pin/wastes + recharge_time = 3 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/railgun) + weapon_weight = WEAPON_HEAVY + can_bayonet = FALSE + max_mod_capacity = 0 // Fuck off + recoil = 3 // Railgun go brrrrr + disablemodification = TRUE + +/obj/item/ammo_casing/energy/kinetic/railgun + projectile_type = /obj/projectile/kinetic/railgun + fire_sound = 'sound/weapons/beam_sniper.ogg' + +/obj/projectile/kinetic/railgun + name = "hyper kinetic force" + damage = 100 + range = 7 + pressure_decrease = 0.10 // Pressured enviorments are a no go for the railgun + speed = 0.1 // NYOOM + projectile_piercing = PASSMOB diff --git a/monkestation/code/modules/mining/accelerators/repeater.dm b/monkestation/code/modules/mining/accelerators/repeater.dm new file mode 100644 index 000000000000..3141ba0fa6ae --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/repeater.dm @@ -0,0 +1,21 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/repeater + name = "proto-kinetic repeater" + desc = "During the pizza party celebrating the release of the new crusher designs, the Mining Research and Development team members were only allowed one slice. \ + One member exclaimed 'I wish we could have more than one slice' and another replied 'I wish we could shoot the accelerator more than once' and thus, the repeater \ + on the spot. The repeater trades a bit of power for the ability to fire three shots before becoming empty, while retaining the ability to fully recharge in one \ + go. The extra technology packed inside to make this possible unfortunately reduces mod space meaning you cant carry as many mods compared to a regular accelerator." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticrepeater" + base_icon_state = "kineticrepeater" + recharge_time = 2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/repeater) + max_mod_capacity = 60 + +/obj/item/ammo_casing/energy/kinetic/repeater + projectile_type = /obj/projectile/kinetic/repeater + e_cost = 150 //about three shots + +/obj/projectile/kinetic/repeater + name = "rapid kinetic force" + damage = 20 + range = 4 diff --git a/monkestation/code/modules/mining/accelerators/shockwave.dm b/monkestation/code/modules/mining/accelerators/shockwave.dm new file mode 100644 index 000000000000..e6f2185b2c16 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/shockwave.dm @@ -0,0 +1,22 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/shockwave + name = "proto-kinetic shockwave" + desc = "Quite frankly, we have no idea how the Mining Research and Development team came up with this one, all we know is that alot of \ + beer was involved. This proto-kinetic design will slam the ground, creating a shockwave around the user, with the same power as the base PKA.\ + The only downside is the lowered mod capacity, the lack of range it offers, and the higher cooldown, but its pretty good for clearing rocks." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticshockwave" + base_icon_state = "kineticshockwave" + recharge_time = 2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/shockwave) + can_bayonet = FALSE + max_mod_capacity = 60 + +/obj/item/ammo_casing/energy/kinetic/shockwave + projectile_type = /obj/projectile/kinetic/shockwave + pellets = 8 + variance = 360 + fire_sound = 'sound/weapons/gun/general/cannon.ogg' + +/obj/projectile/kinetic/shockwave + name = "concussive kinetic force" + range = 1 diff --git a/monkestation/code/modules/mining/accelerators/shotgun.dm b/monkestation/code/modules/mining/accelerators/shotgun.dm new file mode 100644 index 000000000000..6c02f4013a49 --- /dev/null +++ b/monkestation/code/modules/mining/accelerators/shotgun.dm @@ -0,0 +1,21 @@ +/obj/item/gun/energy/recharge/kinetic_accelerator/shotgun + name = "proto-kinetic shotgun" + desc = "During the crusher design pizza party, one member of the Mining Research and Development team brought out a real riot shotgun, and killed three \ + other research members with one blast. The MR&D Director immedietly thought of a genuis idea, creating the proto-kinetic shotgun moments later, which he \ + immedietly used to execute the research member who brought the real shotgun. The proto-kinetic shotgun trades off some mod capacity and cooldown in favor \ + of firing three shots at once with reduce range and power. The total damage of all three shots is higher than a regular PKA but the individual shots are weaker." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "kineticshotgun" + base_icon_state = "kineticshotgun" + recharge_time = 2 SECONDS + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/shotgun) + max_mod_capacity = 60 + +/obj/item/ammo_casing/energy/kinetic/shotgun + projectile_type = /obj/projectile/kinetic/shotgun + pellets = 3 + variance = 50 + +/obj/projectile/kinetic/shotgun + name = "split kinetic force" + damage = 20 diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm index c1c613d5dbff..1c47846bc659 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm @@ -31,7 +31,7 @@ min_players = 30 roundstart = TRUE earliest_start = 0 SECONDS - weight = 4 + weight = 20 max_occurrences = 1 /datum/round_event/antagonist/solo/bloodcult diff --git a/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm index f5a7ab9804f0..799de17f47ad 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm @@ -31,7 +31,7 @@ min_players = 30 roundstart = TRUE earliest_start = 0 SECONDS - weight = 4 + weight = 20 max_occurrences = 1 /datum/round_event/antagonist/solo/clockcult diff --git a/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm b/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm index 3848053211e6..471d533f675e 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm @@ -34,7 +34,7 @@ min_players = 35 roundstart = TRUE earliest_start = 0 SECONDS - weight = 1 //these are meant to be very rare + weight = 5 //these are meant to be very rare max_occurrences = 1 /datum/round_event/antagonist/solo/clown_operative diff --git a/monkestation/code/modules/storytellers/converted_events/solo/malf.dm b/monkestation/code/modules/storytellers/converted_events/solo/malf.dm index d5cb6f3fb621..d2ac47c982b3 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/malf.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/malf.dm @@ -15,7 +15,7 @@ maximum_antags = 1 exclusive_roles = list(JOB_AI) required_enemies = 4 - weight = 2 + weight = 10 min_players = 35 max_occurrences = 1 diff --git a/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm b/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm index 0299cbea2b5c..9929c537500c 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm @@ -34,7 +34,7 @@ min_players = 35 roundstart = TRUE earliest_start = 0 SECONDS - weight = 4 + weight = 20 max_occurrences = 3 /datum/round_event/antagonist/solo/nuclear_operative diff --git a/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm b/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm index 48ae15bf4317..b0be932a37b2 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm @@ -31,7 +31,7 @@ min_players = 35 roundstart = TRUE earliest_start = 0 SECONDS - weight = 0 //value was 3, we need to manually test if this works or not before allowing it normally + weight = 15 //value was 3, we need to manually test if this works or not before allowing it normally max_occurrences = 1 /datum/antagonist/rev/head/event_trigger diff --git a/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm b/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm index 12d081b8fcea..b55f9f507bbf 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm @@ -21,7 +21,7 @@ required_enemies = 5 roundstart = TRUE earliest_start = 0 SECONDS - weight = 2 + weight = 10 min_players = 35 max_occurrences = 1 diff --git a/monkestation/icons/mob/clothing/feet.dmi b/monkestation/icons/mob/clothing/feet.dmi index 85a44b104650..c08c98c308e6 100644 Binary files a/monkestation/icons/mob/clothing/feet.dmi and b/monkestation/icons/mob/clothing/feet.dmi differ diff --git a/monkestation/icons/obj/clothing/shoes.dmi b/monkestation/icons/obj/clothing/shoes.dmi index 1880c29f579d..e0924e8e0ade 100644 Binary files a/monkestation/icons/obj/clothing/shoes.dmi and b/monkestation/icons/obj/clothing/shoes.dmi differ diff --git a/monkestation/icons/obj/tiles.dmi b/monkestation/icons/obj/tiles.dmi index 5bdd17f76b5c..1089b9644645 100644 Binary files a/monkestation/icons/obj/tiles.dmi and b/monkestation/icons/obj/tiles.dmi differ diff --git a/sound/ambience/antag/revolutionary_tide.ogg b/sound/ambience/antag/revolutionary_tide.ogg new file mode 100644 index 000000000000..be8e4a749855 Binary files /dev/null and b/sound/ambience/antag/revolutionary_tide.ogg differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 0729d506d6fc..4bdcd008aa17 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -108,3 +108,17 @@ https://freesound.org/people/reelworldstudio/sounds/161122/ arcade_jump.ogg is adapted from se2001's "8-Bit Jump 3", which is public domain (CC 0): hhttps://freesound.org/people/se2001/sounds/528568/ + + + + +revolutionary_tide.ogg is adapted from several audio samples: + +Marching.wav, which is licensed under CC Attribution 4.0 +https://freesound.org/people/WebbFilmsUK/sounds/200321/ + +TribalDrums.wav, which is licensed under Noncommercial 4.0 License +https://freesound.org/people/vmgraw/sounds/235610/ + +vmgraw's "Distant Whistle" (CC 0) +https://freesound.org/people/giddster/sounds/414480/ diff --git a/sound/items/hypospray.ogg b/sound/items/hypospray.ogg new file mode 100644 index 000000000000..e5c7bd8f92b9 Binary files /dev/null and b/sound/items/hypospray.ogg differ diff --git a/strings/mother.json b/strings/mother.json new file mode 100644 index 000000000000..ed122a86c1a3 --- /dev/null +++ b/strings/mother.json @@ -0,0 +1,49 @@ +{ + "do_something": [ + "CLEAN YOUR ROOM THIS INSTANT!", + "DON'T SIT THAT CLOSE TO THE TV!", + "FOR GOD'S SAKE, GO TAKE A SHOWER!!", + "IT'S TIME TO WAKE UP FOR SCHOOL!!", + "PAUSE THAT ONLINE GAME! NOW!", + "PUT SOME CLOTHES ON! YOU'LL CATCH A COLD!", + "STOP ASKING FOR MONEY, I'M NOT AN ATM!", + "WATCH YOUR MOUTH, CHILD!!", + "WHY DON'T YOU ANSWER MY PHONE CALLS?!", + "YOU SHOULD @pick(verb) YOUR @pick(relative) ONCE IN A WHILE!" + ], + + "be_upset": [ + "BECAUSE I SAID SO!", + "I DON'T CARE WHAT YOU SAY!", + "I'M NOT ASKING; I'M TELLING!!", + "I WASN'T BORN YESTERDAY!", + "MONEY DOESN'T GROW ON TREES!", + "WHAT DID I DO TO DESERVE A KID LIKE THIS...", + "USELESS!", + "YOU INSULT YOUR GRANDPARENTS!" + ], + + "get_reprimanded": [ + "I BROUGHT YOU INTO THIS WORLD, I CAN TAKE YOU OUT!!!", + "I'M GOING TO THROW A FLIP-FLOP AT YOU!!", + "NO VIDEOGAMES FOR THE REST OF THE DAY!", + "WAIT UNTIL YOUR FATHER GETS HOME!", + "YOU'LL THANK ME ONE DAY!", + "YOU'RE DISOWNED!!!", + "YOU'RE GROUNDED!!" + ], + + "verb": [ + "CALL", + "HELP", + "VISIT" + ], + + "relative": [ + "AUNT AND UNCLE", + "DAD", + "GRANDPARENTS", + "MOM" + ] + +} diff --git a/strings/names/operative_alias.txt b/strings/names/operative_alias.txt new file mode 100644 index 000000000000..582851fc07ce --- /dev/null +++ b/strings/names/operative_alias.txt @@ -0,0 +1,126 @@ +Agent +Agony +Alias +Alpha +Argo +Barker +Batter +Beef +Beetle +Bomber +Bonsai +Boss +Boston +Bovine +Bravo +Caboose +Callsign +Carmack +Carolina +Carp +Chains +Charlie +Church +Collar +Comedian +Crash +Creeper +Cretin +Criminal +Cyborg +Dallas +Delta +Doc +Donk +Drowning +Dude +Dwarf +Echo +Emo +Eva +Finger +Fish +Fitzgerald +Flash +Flyboy +Foxtrot +Freak +Freeman +Fugitive +Gaffer +Giant +Goalie +Golf +Gorbino +Green +Grime +Guy +Hologram +Hotel +Houston +Indica +Ion +Jacket +Jeremy +Jones +Kars +Legion +Librarian +Lightbringer +Lighter +Lightning +Looper +Lover +Marksman +Maurauder +Misty +Musketeer +Mycus +Neutron +Nightmare +Peacekeeper +Peddler +Point +Pooh +Private +Psycho +Pyro +Red +Revenant +Rocker +Ronin +Sack +Samson +Sarge +Scorch +Scout +Scream +Scum +Serenity +Shade +Shadow +Shark +Shocker +Shooter +Shrieker +Shrike +Silas +Silence +Simmons +Slider +Smoke +Snake +Stalker +Superfly +Suspect +Swiper +Tank +Telecrystal +Tex +Thirteen +Twister +Unusual +Vixen +White +Wilson +Winters diff --git a/strings/tips.txt b/strings/tips.txt index 146515ebd012..d9846b14f2fa 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -13,9 +13,9 @@ As a Botanist, you should look into increasing the potency of your plants. This As a Cargo Technician, you can earn more cargo points by shipping back crates from maintenance, liquid containers, plasma sheets, rare seeds from hydroponics, and more! As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them! As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it. +As a Changeling, taking on someone else's appearance will also give you all of their scars. You can use Fleshmend to get rid of all scars. As a Changeling, the Extract DNA sting counts for your genome absorb objective, but does not let you respec your powers. As a Changeling, you can absorb someone by strangling them and using the Absorb verb; this gives you the ability to rechoose your powers, the DNA of whoever you absorbed, the memory of the absorbed, and some samples of things the absorbed said. -As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Chemist, some chemicals can only be synthesized by heating up the contents with a chemical heater or manually with lighters and similar tools. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. Experiment! As a Chemist, Water and Potassium mixed together will create an explosion, with power scaling by amount used. Don't do it. diff --git a/tgstation.dme b/tgstation.dme index fad30e4ad474..93d56ed3c1b5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -62,7 +62,6 @@ #include "code\__DEFINES\cameranets.dm" #include "code\__DEFINES\cargo.dm" #include "code\__DEFINES\challengs.dm" -#include "code\__DEFINES\changeling.dm" #include "code\__DEFINES\chat.dm" #include "code\__DEFINES\chat_filter.dm" #include "code\__DEFINES\chicken.dm" @@ -297,6 +296,7 @@ #include "code\__DEFINES\dcs\signals\signals_bitrunning.dm" #include "code\__DEFINES\dcs\signals\signals_blob.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" +#include "code\__DEFINES\dcs\signals\signals_camera.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" #include "code\__DEFINES\dcs\signals\signals_client.dm" @@ -439,6 +439,7 @@ #include "code\__HELPERS\auxtools.dm" #include "code\__HELPERS\bitflag_lists.dm" #include "code\__HELPERS\bodyparts.dm" +#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\chat_filter.dm" #include "code\__HELPERS\clients.dm" @@ -537,6 +538,7 @@ #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" +#include "code\__HELPERS\~monkestation-helpers\announcements.dm" #include "code\__HELPERS\~monkestation-helpers\icon_smoothing.dm" #include "code\__HELPERS\~monkestation-helpers\time.dm" #include "code\__HELPERS\~monkestation-helpers\virology.dm" @@ -1142,6 +1144,7 @@ #include "code\datums\components\reagent_refiller.dm" #include "code\datums\components\recharging_attacks.dm" #include "code\datums\components\redirect_attack_hand_from_turf.dm" +#include "code\datums\components\reflection.dm" #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" #include "code\datums\components\remote_materials.dm" @@ -1554,6 +1557,7 @@ #include "code\datums\ruins\space.dm" #include "code\datums\screentips\atom_context.dm" #include "code\datums\screentips\item_context.dm" +#include "code\datums\screentips\screentips.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\cleaning.dm" #include "code\datums\skills\fishing.dm" @@ -1764,7 +1768,7 @@ #include "code\game\machinery\camera\camera_assembly.dm" #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\camera\trackable.dm" #include "code\game\machinery\computer\_computer.dm" #include "code\game\machinery\computer\accounting.dm" #include "code\game\machinery\computer\aifixer.dm" @@ -2082,7 +2086,6 @@ #include "code\game\objects\items\devices\anomaly_neutralizer.dm" #include "code\game\objects\items\devices\anomaly_releaser.dm" #include "code\game\objects\items\devices\beacon.dm" -#include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\destabilizing_crystal.dm" #include "code\game\objects\items\devices\desynchronizer.dm" @@ -2688,6 +2691,7 @@ #include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" #include "code\modules\antagonists\changeling\powers\biodegrade.dm" #include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" +#include "code\modules\antagonists\changeling\powers\defib_grasp.dm" #include "code\modules\antagonists\changeling\powers\digitalcamo.dm" #include "code\modules\antagonists\changeling\powers\fakedeath.dm" #include "code\modules\antagonists\changeling\powers\fleshmend.dm" @@ -2703,6 +2707,7 @@ #include "code\modules\antagonists\changeling\powers\strained_muscles.dm" #include "code\modules\antagonists\changeling\powers\tiny_prick.dm" #include "code\modules\antagonists\changeling\powers\transform.dm" +#include "code\modules\antagonists\changeling\powers\void_adaption.dm" #include "code\modules\antagonists\clown_ops\bananium_bomb.dm" #include "code\modules\antagonists\clown_ops\clown_weapons.dm" #include "code\modules\antagonists\clown_ops\clownop.dm" @@ -3728,6 +3733,7 @@ #include "code\modules\hallucination\hud_screw.dm" #include "code\modules\hallucination\ice_cube.dm" #include "code\modules\hallucination\inhand_fake_item.dm" +#include "code\modules\hallucination\mother.dm" #include "code\modules\hallucination\nearby_fake_item.dm" #include "code\modules\hallucination\on_fire.dm" #include "code\modules\hallucination\screwy_health_doll.dm" @@ -4686,10 +4692,10 @@ #include "code\modules\modular_computers\computers\item\disks\computer_disk.dm" #include "code\modules\modular_computers\computers\item\disks\maintenance_disks.dm" #include "code\modules\modular_computers\computers\item\disks\role_disks.dm" +#include "code\modules\modular_computers\computers\item\disks\unique_disks.dm" #include "code\modules\modular_computers\computers\item\disks\virus_disk.dm" #include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" #include "code\modules\modular_computers\file_system\data.dm" #include "code\modules\modular_computers\file_system\program.dm" @@ -5007,11 +5013,9 @@ #include "code\modules\reagents\chemistry\machinery\pandemic.dm" #include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" #include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" -#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" #include "code\modules\reagents\chemistry\reagents\atmos_gas_reagents.dm" #include "code\modules\reagents\chemistry\reagents\cat2_medicine_reagents.dm" #include "code\modules\reagents\chemistry\reagents\catalyst_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" #include "code\modules\reagents\chemistry\reagents\food_reagents.dm" #include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" @@ -5020,6 +5024,16 @@ #include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" #include "code\modules\reagents\chemistry\reagents\reaction_agents_reagents.dm" #include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\alcohol_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\drink_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\coffee_tea.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\dairy.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\juices.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\mixed_alcohol.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\mixed_drinks.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\smoothies_shakes.dm" +#include "code\modules\reagents\chemistry\reagents\drinks\glass_styles\sodas.dm" #include "code\modules\reagents\chemistry\reagents\impure_reagents\impure_medicine_reagents.dm" #include "code\modules\reagents\chemistry\reagents\impure_reagents\impure_toxin_reagents.dm" #include "code\modules\reagents\chemistry\reagents\unique\eigenstasium.dm" @@ -5760,6 +5774,7 @@ #include "monkestation\code\game\objects\items\storage\crate.dm" #include "monkestation\code\game\objects\items\storage\uplink_kits.dm" #include "monkestation\code\game\turfs\open\water.dm" +#include "monkestation\code\game\turfs\open\floor\misc_floor.dm" #include "monkestation\code\modules\_paperwork\paper_premade.dm" #include "monkestation\code\modules\admin\antag_tokens.dm" #include "monkestation\code\modules\admin\camera_view.dm" @@ -5778,6 +5793,7 @@ #include "monkestation\code\modules\aesthetics\subsystem\coloring.dm" #include "monkestation\code\modules\aesthetics\walls\iron.dm" #include "monkestation\code\modules\antagonists\_common\antag_datum.dm" +#include "monkestation\code\modules\antagonists\_common\antag_hud.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_alert.dm" #include "monkestation\code\modules\antagonists\brainwashing\brainwashing_helpers.dm" @@ -6361,6 +6377,14 @@ #include "monkestation\code\modules\microfusion\code\microfusion_techweb.dm" #include "monkestation\code\modules\microfusion\code\phase_emitter.dm" #include "monkestation\code\modules\microfusion\code\projectiles.dm" +#include "monkestation\code\modules\mining\accelerators\_wastes_pin.dm" +#include "monkestation\code\modules\mining\accelerators\admin.dm" +#include "monkestation\code\modules\mining\accelerators\grenade.dm" +#include "monkestation\code\modules\mining\accelerators\pistol.dm" +#include "monkestation\code\modules\mining\accelerators\railgun.dm" +#include "monkestation\code\modules\mining\accelerators\repeater.dm" +#include "monkestation\code\modules\mining\accelerators\shockwave.dm" +#include "monkestation\code\modules\mining\accelerators\shotgun.dm" #include "monkestation\code\modules\mob\mob.dm" #include "monkestation\code\modules\mob\mob_defines.dm" #include "monkestation\code\modules\mob\dead\new_player\new_player.dm" diff --git a/tgui/packages/tgui-panel/game/constants.js b/tgui/packages/tgui-panel/game/constants.js index f40a529a101a..d692e26c213f 100644 --- a/tgui/packages/tgui-panel/game/constants.js +++ b/tgui/packages/tgui-panel/game/constants.js @@ -4,4 +4,4 @@ * @license MIT */ -export const CONNECTION_LOST_AFTER = 20000; +export const CONNECTION_LOST_AFTER = 45000; diff --git a/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx b/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx index e8efba04ac52..e8471a6a5acf 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoBlob.tsx @@ -1,6 +1,6 @@ -import { BooleanLike } from 'common/react'; import { useBackend } from '../backend'; import { Box, Collapsible, Divider, LabeledList, Section, Stack } from '../components'; +import { Objective } from './common/Objectives'; import { Window } from '../layouts'; @@ -9,16 +9,7 @@ type Data = { description: string; effects: string; name: string; - objectives: Objectives[]; -}; - -type Objectives = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; + objectives: Objective[]; }; const BLOB_COLOR = '#556b2f'; diff --git a/tgui/packages/tgui/interfaces/AntagInfoBrainwashed.tsx b/tgui/packages/tgui/interfaces/AntagInfoBrainwashed.tsx index b24a3c2aa2c1..bc7be4968279 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoBrainwashed.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoBrainwashed.tsx @@ -1,22 +1,15 @@ import { useBackend } from '../backend'; -import { Icon, Section, Stack } from '../components'; -import { BooleanLike } from 'common/react'; +import { Box, Icon, Section, Stack } from '../components'; import { Window } from '../layouts'; +import { ObjectivePrintout, Objective } from './common/Objectives'; -type Objective = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; -}; - -type Info = { +type Data = { objectives: Objective[]; }; -export const AntagInfoBrainwashed = () => { +export const AntagInfoBrainwashed = (porps, context) => { + const { data } = useBackend(context); + return ( @@ -40,7 +33,15 @@ export const AntagInfoBrainwashed = () => { It is focusing on a single purpose... - + + This Directive must be followed. + + } + /> Follow the directives at any cost! @@ -54,28 +55,3 @@ export const AntagInfoBrainwashed = () => { ); }; - -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - - Your current objectives: - - - {(!objectives && 'None!') || - objectives.map((objective) => ( - <> - - {objective.count}. {objective.explanation} - - - This Directive must be followed. - - - ))} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoBrother.tsx b/tgui/packages/tgui/interfaces/AntagInfoBrother.tsx index 2a2305a67db9..327c46c8df91 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoBrother.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoBrother.tsx @@ -1,16 +1,7 @@ import { useBackend } from '../backend'; import { Section, Stack } from '../components'; -import { BooleanLike } from 'common/react'; import { Window } from '../layouts'; - -type Objective = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; -}; +import { ObjectivePrintout, Objective } from './common/Objectives'; type Info = { antag_name: string; @@ -20,7 +11,7 @@ type Info = { export const AntagInfoBrother = (props, context) => { const { data } = useBackend(context); - const { antag_name, brothers } = data; + const { antag_name, brothers, objectives } = data; return ( @@ -30,7 +21,7 @@ export const AntagInfoBrother = (props, context) => { You are the {antag_name} of {brothers}! - + @@ -38,21 +29,3 @@ export const AntagInfoBrother = (props, context) => { ); }; - -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - Your objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx b/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx index 497942fe1424..f3eda78c6615 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx @@ -1,7 +1,9 @@ +import { BooleanLike } from 'common/react'; import { multiline } from 'common/string'; import { useBackend, useSharedState } from '../backend'; import { Button, Dimmer, Dropdown, Section, Stack, NoticeBox } from '../components'; import { Window } from '../layouts'; +import { ObjectivePrintout, Objective, ReplaceObjectivesButton } from './common/Objectives'; const hivestyle = { fontWeight: 'bold', @@ -38,12 +40,6 @@ const fallenstyle = { fontWeight: 'bold', }; -type Objective = { - count: number; - name: string; - explanation: string; -}; - type Memory = { name: string; story: string; @@ -55,17 +51,18 @@ type Info = { stolen_antag_info: string; memories: Memory[]; objectives: Objective[]; + can_change_objective: BooleanLike; }; export const AntagInfoChangeling = (props, context) => { return ( - + - + @@ -90,24 +87,6 @@ export const AntagInfoChangeling = (props, context) => { ); }; -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - Your current objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; - const HivemindSection = (props, context) => { const { act, data } = useBackend(context); const { true_name } = data; @@ -138,7 +117,7 @@ const HivemindSection = (props, context) => { const IntroductionSection = (props, context) => { const { act, data } = useBackend(context); - const { true_name, hive_name, objectives } = data; + const { true_name, hive_name, objectives, can_change_objective } = data; return (
{ {hive_name}. - + + } + />
@@ -167,7 +155,7 @@ const AbilitiesSection = (props, context) => { Your  Absorb DNA ability allows - you to steal the DNA and memories of a victim. Your + you to steal the DNA and memories of a victim. The  Extract DNA Sting ability also steals the DNA of a victim, and is undetectable, but does not grant you their memories or speech patterns. diff --git a/tgui/packages/tgui/interfaces/AntagInfoDemon.tsx b/tgui/packages/tgui/interfaces/AntagInfoDemon.tsx index 2759fa5e9cb9..c780beedf631 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoDemon.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoDemon.tsx @@ -2,6 +2,7 @@ import { useBackend } from '../backend'; import { Box, Section, Stack } from '../components'; import { BooleanLike } from 'common/react'; import { Window } from '../layouts'; +import { ObjectivePrintout, Objective } from './common/Objectives'; const jauntstyle = { color: 'lightblue', @@ -11,15 +12,6 @@ const injurestyle = { color: 'yellow', }; -type Objective = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; -}; - type Info = { fluff: string; explain_attack: BooleanLike; @@ -48,7 +40,11 @@ export const AntagInfoDemon = (props, context) => { {fluff} - +
@@ -88,26 +84,6 @@ export const AntagInfoDemon = (props, context) => { ); }; -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - - It is in your nature to accomplish these goals: - - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; - const DemonRunes = (props, context) => { return (
diff --git a/tgui/packages/tgui/interfaces/AntagInfoGangmember.tsx b/tgui/packages/tgui/interfaces/AntagInfoGangmember.tsx deleted file mode 100644 index cc0abefb13f6..000000000000 --- a/tgui/packages/tgui/interfaces/AntagInfoGangmember.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { useBackend } from '../backend'; -import { BlockQuote, Icon, Section, Stack } from '../components'; -import { Window } from '../layouts'; - -type Info = { - antag_name: string; - gang_name: string; - gang_objective: string; - gang_clothes: string[]; -}; - -export const AntagInfoGangmember = (props, context) => { - const { data } = useBackend(context); - const { gang_name, antag_name } = data; - return ( - - -
- - - {gang_name} for life! You are a {antag_name}! - - - As a gang member, support your family above all! Tag turf with a - spraycan, wear your family's clothes, induct new members with - induction packages, and accomplish your family objective. - - - - - - - - - - - - - - - - - -
-
-
- ); -}; - -const GangClothesPrintout = (props, context) => { - const { data } = useBackend(context); - const { gang_name, gang_clothes } = data; - return ( - - - - - - - - Wear the following to represent the {gang_name}: - - - -
- {gang_clothes && gang_clothes.length - ? gang_clothes.map((clothes_item) => ( - - {clothes_item} - )) - : '- Anything!'} -
-
- ); -}; - -const GangPhonePrintout = () => { - return ( - - - - - - - - You were given a cell phone with your induction package! - - - - -
- Use it in hand to activate it, then speak into it to talk with your - other family members. -
-
-
- ); -}; - -const GangObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { gang_objective } = data; - return ( - - - Your family's goal: - - - {gang_objective || 'No objective set! This is a problem!'} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoGeneric.tsx b/tgui/packages/tgui/interfaces/AntagInfoGeneric.tsx index a4941f8aa04a..33b7623c44f6 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoGeneric.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoGeneric.tsx @@ -1,16 +1,7 @@ import { useBackend } from '../backend'; import { Section, Stack } from '../components'; -import { BooleanLike } from 'common/react'; import { Window } from '../layouts'; - -type Objective = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; -}; +import { ObjectivePrintout, Objective } from './common/Objectives'; type Info = { antag_name: string; @@ -19,7 +10,7 @@ type Info = { export const AntagInfoGeneric = (props, context) => { const { data } = useBackend(context); - const { antag_name } = data; + const { antag_name, objectives } = data; return ( @@ -29,7 +20,7 @@ export const AntagInfoGeneric = (props, context) => { You are the {antag_name}! - +
@@ -37,21 +28,3 @@ export const AntagInfoGeneric = (props, context) => {
); }; - -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - Your objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx index 41b4461ac236..51f4dfef48b7 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx @@ -2,6 +2,7 @@ import { useBackend, useLocalState } from '../backend'; import { Section, Stack, Box, Tabs, Button, BlockQuote } from '../components'; import { Window } from '../layouts'; import { BooleanLike } from 'common/react'; +import { ObjectivePrintout, Objective, ReplaceObjectivesButton } from './common/Objectives'; const hereticRed = { color: '#e03c3c', @@ -43,21 +44,19 @@ type KnowledgeInfo = { learnedKnowledge: Knowledge[]; }; -type Objective = { - count: number; - name: string; - explanation: string; -}; - type Info = { charges: number; side_charges: number; total_sacrifices: number; ascended: BooleanLike; objectives: Objective[]; + can_change_objective: BooleanLike; }; -const IntroductionSection = () => { +const IntroductionSection = (props, context) => { + const { data, act } = useBackend(context); + const { objectives, ascended, can_change_objective } = data; + return ( @@ -65,14 +64,33 @@ const IntroductionSection = () => { - - - - + {!ascended && ( + + + } + /> + + )} @@ -202,28 +220,6 @@ const InformationSection = (props, context) => { ); }; -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - - - In order to ascend, you have these tasks to fulfill: - - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - {objective.count}: {objective.explanation} - - ))} - - - - ); -}; - const ResearchedKnowledge = (props, context) => { const { data } = useBackend(context); const { learnedKnowledge } = data; @@ -325,11 +321,9 @@ export const AntagInfoHeretic = (props, context) => { const [currentTab, setTab] = useLocalState(context, 'currentTab', 0); return ( - + { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - Your prime objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - ≥-{objective.count}: {objective.explanation} - - ))} - - - ); + can_change_objective: BooleanLike; }; const IntroductionSection = (props, context) => { const { act, data } = useBackend(context); - const { intro } = data; + const { intro, objectives, can_change_objective } = data; return (
{intro} - + + } + />
diff --git a/tgui/packages/tgui/interfaces/AntagInfoNinja.tsx b/tgui/packages/tgui/interfaces/AntagInfoNinja.tsx new file mode 100644 index 000000000000..a537888af750 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AntagInfoNinja.tsx @@ -0,0 +1,68 @@ +import { BooleanLike } from 'common/react'; +import { useBackend } from '../backend'; +import { Icon, Section, Stack } from '../components'; +import { Window } from '../layouts'; +import { ObjectivePrintout, Objective, ReplaceObjectivesButton } from './common/Objectives'; + +const ninja_emphasis = { + color: 'red', +}; + +type NinjaInfo = { + objectives: Objective[]; + can_change_objective: BooleanLike; +}; + +export const AntagInfoNinja = (props, context) => { + const { data } = useBackend(context); + const { objectives, can_change_objective } = data; + return ( + + + +
+ + + I am an elite mercenary of the Spider Clan. +
A SPACE NINJA! +
+ + Surprise is my weapon. Shadows are my armor. Without them, I am + nothing. + + +
+ Your advanced ninja suit contains many powerful modules. +
It can be recharged by right clicking on station APCs or + other power sources, in order to drain their battery. +
+ Right clicking on some kinds of machines or items wearing your + suit will hack them, to varying effect. Experiment and find out + what you can do! +
+
+ + + } + /> + +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoSeparatist.tsx b/tgui/packages/tgui/interfaces/AntagInfoSeparatist.tsx index d7f3843c318f..4475adba4e50 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoSeparatist.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoSeparatist.tsx @@ -1,12 +1,7 @@ import { useBackend } from '../backend'; import { Icon, Section, Stack } from '../components'; import { Window } from '../layouts'; - -type Objective = { - count: number; - name: string; - explanation: string; -}; +import { ObjectivePrintout, Objective } from './common/Objectives'; type Info = { objectives: Objective[]; @@ -35,7 +30,7 @@ export const AntagInfoSeparatist = (props, context) => { const IntroductionObjectives = (props, context) => { const { data } = useBackend(context); - const { nation } = data; + const { nation, objectives } = data; return (
@@ -43,7 +38,10 @@ const IntroductionObjectives = (props, context) => { You are the Separatist for a free {nation}! - +
@@ -88,21 +86,3 @@ const FrequentlyAskedQuestions = (props, context) => { ); }; - -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { nation, objectives } = data; - return ( - - {nation}'s objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index e083857062d0..cc62986c085d 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -3,6 +3,7 @@ import { multiline } from 'common/string'; import { BlockQuote, Button, Dimmer, Section, Stack } from '../components'; import { BooleanLike } from 'common/react'; import { Window } from '../layouts'; +import { ObjectivePrintout, Objective } from './common/Objectives'; const allystyle = { fontWeight: 'bold', @@ -19,12 +20,6 @@ const goalstyle = { fontWeight: 'bold', }; -type Objective = { - count: number; - name: string; - explanation: string; -}; - type Info = { has_codewords: BooleanLike; phrases: string; @@ -43,33 +38,15 @@ type Info = { objectives: Objective[]; }; -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives } = data; - return ( - - Your current objectives: - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - ); -}; - const IntroductionSection = (props, context) => { const { act, data } = useBackend(context); - const { intro } = data; + const { intro, objectives } = data; return (
{intro} - +
diff --git a/tgui/packages/tgui/interfaces/AntagInfoWizard.tsx b/tgui/packages/tgui/interfaces/AntagInfoWizard.tsx index b7adc2f78c95..e5de257851a8 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoWizard.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoWizard.tsx @@ -1,7 +1,8 @@ -import { useBackend } from '../backend'; -import { Section, Stack } from '../components'; import { BooleanLike } from 'common/react'; +import { useBackend } from '../backend'; +import { Box, Section, Stack } from '../components'; import { Window } from '../layouts'; +import { ObjectivePrintout, Objective, ReplaceObjectivesButton } from './common/Objectives'; const teleportstyle = { color: 'yellow', @@ -36,15 +37,6 @@ const grandritualstyle = { color: '#bd54e0', }; -type Objective = { - count: number; - name: string; - explanation: string; - complete: BooleanLike; - was_uncompleted: BooleanLike; - reward: number; -}; - type GrandRitual = { remaining: number; next_area: string; @@ -53,11 +45,15 @@ type GrandRitual = { type Info = { objectives: Objective[]; ritual: GrandRitual; + can_change_objective: BooleanLike; }; export const AntagInfoWizard = (props, context) => { + const { data, act } = useBackend(context); + const { ritual, objectives, can_change_objective } = data; + return ( - + @@ -67,7 +63,20 @@ export const AntagInfoWizard = (props, context) => { You are the Space Wizard! - + + } + /> + + + @@ -143,35 +152,13 @@ export const AntagInfoWizard = (props, context) => { ); }; -const ObjectivePrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives, ritual } = data; - return ( - - - The Space Wizards Federation has given you the following tasks: - - - {(!objectives && 'None!') || - objectives.map((objective) => ( - - #{objective.count}: {objective.explanation} - - ))} - - - - ); -}; - -const RitualPrintout = (props, context) => { - const { data } = useBackend(context); - const { objectives, ritual } = data; +const RitualPrintout = (props: { ritual: GrandRitual }, context) => { + const { ritual } = props; if (!ritual.next_area) { - return ; + return null; } return ( - + Alternately, complete the{' '} Grand Ritual by invoking a ritual circle at several nexuses of power. @@ -181,6 +168,6 @@ const RitualPrintout = (props, context) => {
Your next ritual location is the {ritual.next_area}. -
+ ); }; diff --git a/tgui/packages/tgui/interfaces/AsteroidMagnet.js b/tgui/packages/tgui/interfaces/AsteroidMagnet.js new file mode 100644 index 000000000000..fef1d192c6f1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AsteroidMagnet.js @@ -0,0 +1,157 @@ +// THIS IS A MONKESTATION UI FILE + +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, Section } from '../components'; +import { Window } from '../layouts'; + +export const AsteroidMagnet = (props, context) => { + return ( + + + + + + + + + ); +}; + +const InputX = (props, context) => { + const { act, data } = useBackend(context); + const { coords_x } = data; + + return ( +
+ + {coords_x} + + +
+ ); +}; + +const InputY = (props, context) => { + const { act, data } = useBackend(context); + const { coords_y } = data; + + return ( +
+ + {coords_y} + + +
+ ); +}; + +const PingButton = (props, context) => { + const { act, data } = useBackend(context); + const { ping_result, Auto_pinging } = data; + + return ( +
+ + {ping_result} + + +
+ ); +}; + +const AsteroidSelector = (props, context) => { + const { act, data } = useBackend(context); + const { asteroids } = data; + + return ( +
+ {asteroids.length > 0 && ( + + {asteroids.map((asteroids) => ( + + act('select', { asteroid_reference: asteroids.ref }) + } + /> + } + /> + ))} + + )} +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.js deleted file mode 100644 index 57cc34e77e18..000000000000 --- a/tgui/packages/tgui/interfaces/CameraConsole.js +++ /dev/null @@ -1,137 +0,0 @@ -import { filter, sortBy } from 'common/collections'; -import { flow } from 'common/fp'; -import { classes } from 'common/react'; -import { createSearch } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { Button, ByondUi, Flex, Input, Section } from '../components'; -import { Window } from '../layouts'; - -/** - * Returns previous and next camera names relative to the currently - * active camera. - */ -export const prevNextCamera = (cameras, activeCamera) => { - if (!activeCamera) { - return []; - } - const index = cameras.findIndex( - (camera) => camera.name === activeCamera.name - ); - return [cameras[index - 1]?.name, cameras[index + 1]?.name]; -}; - -/** - * Camera selector. - * - * Filters cameras, applies search terms and sorts the alphabetically. - */ -export const selectCameras = (cameras, searchText = '') => { - const testSearch = createSearch(searchText, (camera) => camera.name); - return flow([ - // Null camera filter - filter((camera) => camera?.name), - // Optional search term - searchText && filter(testSearch), - // Slightly expensive, but way better than sorting in BYOND - sortBy((camera) => camera.name), - ])(cameras); -}; - -export const CameraConsole = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [prevCameraName, nextCameraName] = prevNextCamera( - cameras, - activeCamera - ); - return ( - -
- - - -
-
-
- Camera: - {(activeCamera && activeCamera.name) || '—'} -
-
-
- -
-
- ); -}; - -export const CameraConsoleContent = (props, context) => { - const { act, data } = useBackend(context); - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - const { activeCamera } = data; - const cameras = selectCameras(data.cameras, searchText); - return ( - - - setSearchText(value)} - /> - - -
- {cameras.map((camera) => ( - // We're not using the component here because performance - // would be absolutely abysmal (50+ ms for each re-render). -
- act('switch_camera', { - name: camera.name, - }) - }> - {camera.name} -
- ))} -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/CameraConsole.tsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx new file mode 100644 index 000000000000..e94df880d6dd --- /dev/null +++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx @@ -0,0 +1,214 @@ +import { filter, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { BooleanLike, classes } from 'common/react'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ByondUi, Input, NoticeBox, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +type Data = { + activeCamera: Camera & { status: BooleanLike }; + cameras: Camera[]; + can_spy: BooleanLike; + mapRef: string; + network: string[]; +}; + +type Camera = { + name: string; + ref: string; +}; + +/** + * Returns previous and next camera names relative to the currently + * active camera. + */ +const prevNextCamera = ( + cameras: Camera[], + activeCamera: Camera & { status: BooleanLike } +) => { + if (!activeCamera || cameras.length < 2) { + return []; + } + + const index = cameras.findIndex((camera) => camera.ref === activeCamera.ref); + + switch (index) { + case -1: // Current camera is not in the list + return [cameras[cameras.length - 1].ref, cameras[0].ref]; + + case 0: // First camera + if (cameras.length === 2) return [cameras[1].ref, cameras[1].ref]; // Only two + + return [cameras[cameras.length - 1].ref, cameras[index + 1].ref]; + + case cameras.length - 1: // Last camera + if (cameras.length === 2) return [cameras[0].ref, cameras[0].ref]; + + return [cameras[index - 1].ref, cameras[0].ref]; + + default: + // Middle camera + return [cameras[index - 1].ref, cameras[index + 1].ref]; + } +}; + +/** + * Camera selector. + * + * Filters cameras, applies search terms and sorts the alphabetically. + */ +const selectCameras = (cameras: Camera[], searchText = ''): Camera[] => { + const testSearch = createSearch(searchText, (camera: Camera) => camera.name); + + return flow([ + filter((camera: Camera) => !!camera.name), + // Optional search term + searchText && filter(testSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy((camera: Camera) => camera), + ])(cameras); +}; + +export const CameraConsole = (props, context) => { + return ( + + + + + + ); +}; + +export const CameraContent = (props, context) => { + return ( + + + + + + + + + ); +}; + +const CameraSelector = (props, context) => { + const { act, data } = useBackend(context); + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const { activeCamera } = data; + const cameras = selectCameras(data.cameras, searchText); + + return ( + + + setSearchText(value)} + /> + + +
+ {cameras.map((camera) => ( + // We're not using the component here because performance + // would be absolutely abysmal (50+ ms for each re-render). +
+ act('switch_camera', { + camera: camera.ref, + }) + }> + {camera.name} +
+ ))} +
+
+
+ ); +}; + +const CameraControls = (props, context) => { + const { act, data } = useBackend(context); + const { activeCamera, can_spy, mapRef } = data; + const [searchText] = useLocalState(context, 'searchText', ''); + + const cameras = selectCameras(data.cameras, searchText); + + const [prevCamera, nextCamera] = prevNextCamera(cameras, activeCamera); + + return ( +
+ + + + + {activeCamera?.status ? ( + {activeCamera.name} + ) : ( + No input signal + )} + + + + {!!can_spy && ( +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/CellularEmporium.tsx b/tgui/packages/tgui/interfaces/CellularEmporium.tsx index 505339d78ef1..3bf67319181c 100644 --- a/tgui/packages/tgui/interfaces/CellularEmporium.tsx +++ b/tgui/packages/tgui/interfaces/CellularEmporium.tsx @@ -1,26 +1,38 @@ -import { useBackend } from '../backend'; -import { Button, Section, Icon, Stack, LabeledList, Box, NoticeBox } from '../components'; +import { BooleanLike } from '../../common/react'; +import { useBackend, useLocalState } from '../backend'; +import { Button, Section, Icon, Input, Stack, LabeledList, Box, NoticeBox } from '../components'; import { Window } from '../layouts'; +type typePath = string; + type CellularEmporiumContext = { abilities: Ability[]; - can_readapt: boolean; - genetic_points_remaining: number; + can_readapt: BooleanLike; + genetic_points_count: number; + owned_abilities: typePath[]; + absorb_count: number; + dna_count: number; }; type Ability = { name: string; desc: string; - path: string; - dna_cost: number; helptext: string; - owned: boolean; - can_purchase: boolean; + path: typePath; + genetic_point_required: number; // Checks against genetic_points_count + absorbs_required: number; // Checks against absorb_count + dna_required: number; // Checks against dna_count }; export const CellularEmporium = (props, context) => { const { act, data } = useBackend(context); - const { can_readapt, genetic_points_remaining } = data; + const [searchAbilities, setSearchAbilities] = useLocalState( + context, + 'searchAbilities', + '' + ); + + const { can_readapt, genetic_points_count } = data; return ( @@ -31,17 +43,32 @@ export const CellularEmporium = (props, context) => { buttons={ - {genetic_points_remaining && genetic_points_remaining}{' '} + {genetic_points_count && genetic_points_count}{' '}