diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 701d765a051..8491758f5a9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1266,13 +1266,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/iron, /area/station/maintenance/starboard) -"apK" = ( -/obj/machinery/computer/prisoner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) "apL" = ( /obj/structure/table, /obj/item/crowbar, @@ -8098,6 +8091,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"cdT" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/turf/open/floor/iron, +/area/station/security/office) "cec" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -16140,14 +16143,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical) -"eyX" = ( -/obj/item/kirbyplants/random, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) "ezd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -30431,20 +30426,6 @@ /obj/structure/table/glass, /turf/open/floor/iron, /area/station/service/hydroponics) -"iuQ" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/west{ - id = "brig1"; - name = "Cell 1"; - req_access = list("brig") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) "ivd" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40173,6 +40154,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/prison) +"kZE" = ( +/obj/machinery/computer/prisoner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) "kZP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, @@ -50274,20 +50262,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"nKk" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/west{ - id = "brig2"; - name = "Cell 2"; - req_access = list("brig") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) "nKD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54573,16 +54547,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) -"oPY" = ( -/obj/structure/closet/secure_closet/bar{ - req_access = list("bar") - }, -/obj/item/storage/photo_album/bar, -/obj/item/radio/intercom/directional/east, -/obj/item/storage/dice, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/checker, -/area/station/service/bar) "oQp" = ( /obj/structure/chair/office/light{ dir = 1 @@ -61755,6 +61719,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"qMh" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/storage/photo_album/bar, +/obj/item/radio/intercom/directional/east, +/obj/item/storage/dice, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/checker, +/area/station/service/bar) "qMm" = ( /obj/structure/table, /obj/item/storage/secure/safe/directional/north, @@ -62534,19 +62506,6 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/mixing/chamber) -"qZM" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Office Fore" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) "qZQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -72865,6 +72824,19 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"tHH" = ( +/obj/machinery/door/window/brigdoor/security/cell/right/directional/west{ + id = "brig2"; + name = "Cell 2" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/brig) "tHK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74071,6 +74043,19 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"tWJ" = ( +/obj/machinery/door/window/brigdoor/security/cell/right/directional/west{ + id = "brig1"; + name = "Cell 1" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/brig) "tWU" = ( /obj/effect/turf_decal/siding/green{ dir = 1 @@ -87692,6 +87677,20 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"xAy" = ( +/obj/machinery/light/directional/north, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Office Fore" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/security/office) "xAB" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -128940,7 +128939,7 @@ qAV qAV qAV jfn -oPY +qMh cfp qAV oAC @@ -141044,11 +141043,11 @@ qIH qIH qIH iDc -iuQ +tWJ iDc fJq iDc -nKk +tHH iDc fJq vGn @@ -143084,7 +143083,7 @@ eXG qWZ aaa cjN -qZM +xAy sHr oYP upa @@ -143341,7 +143340,7 @@ kAx omM aad cjN -eyX +cdT nsG fzl dLg @@ -146173,7 +146172,7 @@ kOA obW bVP fbW -apK +kZE vWh kOA kOA diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index cb53bb192f9..4618a3fd450 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -22667,6 +22667,15 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"hoZ" = ( +/obj/structure/table, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/item/assembly/flash/handheld, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/security/office) "hpd" = ( /turf/open/floor/plating, /area/station/engineering/engine_smes) @@ -32426,6 +32435,31 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"kss" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Security - HoS Office" + }, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -6; + pixel_y = 16 + }, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 3 + }, +/obj/item/stamp/hos{ + pixel_x = 10; + pixel_y = 6 + }, +/obj/machinery/recharger{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/hos) "ksu" = ( /mob/living/simple_animal/hostile/asteroid/gutlunch, /turf/open/misc/asteroid/snow/icemoon, @@ -49004,31 +49038,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/xenobiology) -"pNb" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Security - HoS Office" - }, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -6; - pixel_y = 16 - }, -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 3 - }, -/obj/item/stamp/hos{ - pixel_x = 10; - pixel_y = 6 - }, -/obj/machinery/recharger{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/hos) "pNj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50939,13 +50948,6 @@ }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"qsX" = ( -/obj/structure/table, -/obj/item/assembly/flash/handheld, -/turf/open/floor/iron/dark/textured_half{ - dir = 1 - }, -/area/station/security/office) "qta" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, @@ -233626,7 +233628,7 @@ nbp mhx jeF egm -qsX +hoZ wGW tJN cBJ @@ -234917,7 +234919,7 @@ nbp mgU ffJ oxJ -pNb +kss azx tDw sVW diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 605fac09b2b..4de7cca8001 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2157,6 +2157,18 @@ /obj/structure/grille, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"aZP" = ( +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "aZX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -7605,6 +7617,15 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"cGf" = ( +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/left) "cGm" = ( /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/watertank, @@ -12930,6 +12951,16 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/commons/dorms) +"esN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/left) "esQ" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -13801,14 +13832,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"eJo" = ( -/obj/structure/closet/secure_closet/bar{ - req_access = list("bar") - }, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c10, -/turf/open/floor/wood, -/area/station/service/bar) "eJI" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -15800,6 +15823,18 @@ /obj/item/clothing/mask/breath, /turf/open/floor/iron, /area/station/engineering/atmos) +"fvo" = ( +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "fvA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -16799,19 +16834,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"fOd" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "fOs" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -18092,19 +18114,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) -"glk" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "glm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/firealarm/directional/west, @@ -23980,16 +23989,6 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) -"ila" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/left) "ilh" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -24567,14 +24566,6 @@ /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/research) -"ivZ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/left) "iwh" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/sign/poster/contraband/rebels_unite{ @@ -26950,6 +26941,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"jlY" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c10, +/turf/open/floor/wood, +/area/station/service/bar) "jmA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28648,14 +28645,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"jOF" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/right) "jOM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -32200,16 +32189,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"kVw" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/toy/crayon/spraycan, -/obj/item/toy/crayon/spraycan{ - pixel_x = -4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/library/lounge) "kVy" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, @@ -50847,17 +50826,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"rjD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/left) "rkd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -54314,19 +54282,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/storage) -"srb" = ( -/obj/machinery/door/airlock/hatch{ - name = "Ladder Access Hatch"; - req_one_access = null - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/hallway/primary/tram/center) "sre" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, @@ -54593,6 +54548,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"swk" = ( +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/left) "swo" = ( /obj/machinery/requests_console/directional/west, /obj/structure/disposalpipe/segment, @@ -58862,6 +58824,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"tSV" = ( +/obj/machinery/door/airlock/hatch{ + name = "Ladder Access Hatch" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/hallway/primary/tram/center) "tTp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/grille, @@ -67026,6 +67000,12 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"wKy" = ( +/obj/structure/table, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/turf/open/floor/iron, +/area/station/security/office) "wKF" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -67997,6 +67977,16 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/radshelter/service) +"xcw" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = -4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/library/lounge) "xcC" = ( /obj/effect/decal/cleanable/dirt, /obj/item/wrench, @@ -68217,10 +68207,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"xfW" = ( -/obj/structure/table, -/turf/open/floor/iron, -/area/station/security/office) "xgb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, @@ -105047,7 +105033,7 @@ rBQ hFr dhe sDo -eJo +jlY hmZ gpr sDo @@ -152640,7 +152626,7 @@ iOi iOi iOi rAS -kVw +xcw gsT uJk mNV @@ -154665,7 +154651,7 @@ lWh jYE kXI fMN -ivZ +swk yiM ook ook @@ -154675,7 +154661,7 @@ ook ook ook yiM -rjD +esN yiM fsZ jsO @@ -158998,7 +158984,7 @@ xWk uYx oUx ljw -xfW +wKy ljw ufY wwO @@ -159291,7 +159277,7 @@ rBK eIX vPD yiM -fOd +aZP yiM yiM cFs @@ -159301,7 +159287,7 @@ vVY cFs yiM yiM -ila +cGf yiM lTj mPq @@ -166744,7 +166730,7 @@ xAu pFP dqQ dJJ -srb +fvo izU izU eSz @@ -171370,7 +171356,7 @@ vpY wHg jaz dJJ -glk +tSV izU izU eSz @@ -183449,7 +183435,7 @@ vPB vrV pUv bMb -jOF +qDK bMb vUE vUE diff --git a/code/__DEFINES/dcs/signals/signals_proxmonitor.dm b/code/__DEFINES/dcs/signals/signals_proxmonitor.dm new file mode 100644 index 00000000000..2124c80ec54 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_proxmonitor.dm @@ -0,0 +1,4 @@ +/// Called when a projectile dampener captures an object. +#define COMSIG_DAMPENER_CAPTURE "dampener_capture" +/// Called when a projectile dampener releases an object. +#define COMSIG_DAMPENER_RELEASE "dampener_release" diff --git a/code/datums/proximity_monitor/fields/peaceborg_dampener.dm b/code/datums/proximity_monitor/fields/projectile_dampener.dm similarity index 54% rename from code/datums/proximity_monitor/fields/peaceborg_dampener.dm rename to code/datums/proximity_monitor/fields/projectile_dampener.dm index 9d2549e89c2..c66c74b7795 100644 --- a/code/datums/proximity_monitor/fields/peaceborg_dampener.dm +++ b/code/datums/proximity_monitor/fields/projectile_dampener.dm @@ -1,7 +1,7 @@ //Projectile dampening field that slows projectiles and lowers their damage for an energy cost deducted every 1/5 second. //Only use square radius for this! -/datum/proximity_monitor/advanced/peaceborg_dampener +/datum/proximity_monitor/advanced/projectile_dampener var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south") var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north") var/static/image/edgeturf_west = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_west") @@ -11,43 +11,33 @@ var/static/image/northeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_northeast") var/static/image/southeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast") var/static/image/generic_edge = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_generic") - var/obj/item/borg/projectile_dampen/projector = null var/list/obj/projectile/tracked = list() var/list/obj/projectile/staging = list() // lazylist that keeps track of the overlays added to the edge of the field var/list/edgeturf_effects -/datum/proximity_monitor/advanced/peaceborg_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, obj/item/borg/projectile_dampen/projector) +/datum/proximity_monitor/advanced/projectile_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, atom/projector) ..() - src.projector = projector + RegisterSignal(projector, COMSIG_PARENT_QDELETING, .proc/on_projector_del) recalculate_field() START_PROCESSING(SSfastprocess, src) -/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() - projector = null +/datum/proximity_monitor/advanced/projectile_dampener/Destroy() STOP_PROCESSING(SSfastprocess, src) + for(var/obj/projectile/projectile in tracked) + release_projectile(projectile) return ..() -/datum/proximity_monitor/advanced/peaceborg_dampener/process() - if(!istype(projector)) - qdel(src) - return +/datum/proximity_monitor/advanced/projectile_dampener/process() var/list/ranged = list() - for(var/obj/projectile/P in range(current_range, get_turf(host))) - ranged += P - for(var/obj/projectile/P in tracked) - if(!(P in ranged) || !P.loc) - release_projectile(P) - for(var/mob/living/silicon/robot/R in range(current_range, get_turf(host))) - if(R.has_buckled_mobs()) - for(var/mob/living/L in R.buckled_mobs) - L.visible_message(span_warning("[L] is knocked off of [R] by the charge in [R]'s chassis induced by the hyperkinetic dampener field!")) //I know it's bad. - L.Paralyze(10) - R.unbuckle_mob(L) - do_sparks(5, 0, L) + for(var/obj/projectile/projectile in range(current_range, get_turf(host))) + ranged += projectile + for(var/obj/projectile/projectile in tracked) + if(!(projectile in ranged) || !projectile.loc) + release_projectile(projectile) ..() -/datum/proximity_monitor/advanced/peaceborg_dampener/setup_edge_turf(turf/target) +/datum/proximity_monitor/advanced/projectile_dampener/setup_edge_turf(turf/target) . = ..() var/image/overlay = get_edgeturf_overlay(get_edgeturf_direction(target)) var/obj/effect/abstract/effect = new(target) // Makes the field visible to players. @@ -58,14 +48,14 @@ effect.plane = ABOVE_GAME_PLANE LAZYSET(edgeturf_effects, target, effect) -/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/target) +/datum/proximity_monitor/advanced/projectile_dampener/cleanup_edge_turf(turf/target) . = ..() var/obj/effect/abstract/effect = LAZYACCESS(edgeturf_effects, target) LAZYREMOVE(edgeturf_effects, target) if(effect) qdel(effect) -/datum/proximity_monitor/advanced/peaceborg_dampener/proc/get_edgeturf_overlay(direction) +/datum/proximity_monitor/advanced/projectile_dampener/proc/get_edgeturf_overlay(direction) switch(direction) if(NORTH) return edgeturf_north @@ -86,24 +76,37 @@ else return generic_edge -/datum/proximity_monitor/advanced/peaceborg_dampener/proc/capture_projectile(obj/projectile/P, track_projectile = TRUE) - if(P in tracked) +/datum/proximity_monitor/advanced/projectile_dampener/proc/capture_projectile(obj/projectile/projectile) + if(projectile in tracked) return - projector.dampen_projectile(P, track_projectile) - if(track_projectile) - tracked += P + SEND_SIGNAL(src, COMSIG_DAMPENER_CAPTURE, projectile) + tracked += projectile -/datum/proximity_monitor/advanced/peaceborg_dampener/proc/release_projectile(obj/projectile/P) - projector.restore_projectile(P) - tracked -= P +/datum/proximity_monitor/advanced/projectile_dampener/proc/release_projectile(obj/projectile/projectile) + SEND_SIGNAL(src, COMSIG_DAMPENER_RELEASE, projectile) + tracked -= projectile -/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_uncrossed(atom/movable/movable, turf/location) +/datum/proximity_monitor/advanced/projectile_dampener/proc/on_projector_del(datum/source) + SIGNAL_HANDLER + + qdel(src) + +/datum/proximity_monitor/advanced/projectile_dampener/field_edge_uncrossed(atom/movable/movable, turf/location) if(istype(movable, /obj/projectile) && get_dist(movable, host) > current_range) if(movable in tracked) release_projectile(movable) - else - capture_projectile(movable, FALSE) -/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_crossed(atom/movable/movable, turf/location) +/datum/proximity_monitor/advanced/projectile_dampener/field_edge_crossed(atom/movable/movable, turf/location) if(istype(movable, /obj/projectile) && !(movable in tracked)) capture_projectile(movable) + +/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/process(delta_time) + for(var/mob/living/silicon/robot/borg in range(current_range, get_turf(host))) + if(!borg.has_buckled_mobs()) + continue + for(var/mob/living/buckled_mob in borg.buckled_mobs) + buckled_mob.visible_message(span_warning("[buckled_mob] is knocked off of [borg] by the charge in [borg]'s chassis induced by the hyperkinetic dampener field!")) //I know it's bad. + buckled_mob.Paralyze(1 SECONDS) + borg.unbuckle_mob(buckled_mob) + do_sparks(5, 0, buckled_mob) + ..() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index db784a5297c..f020c0c5033 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -20,11 +20,12 @@ deploy_bodybag(user, target) /obj/item/bodybag/proc/deploy_bodybag(mob/user, atom/location) - var/obj/structure/closet/body_bag/R = new unfoldedbag_path(location) - R.open(user) - R.add_fingerprint(user) - R.foldedbag_instance = src + var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location) + item_bag.open(user) + item_bag.add_fingerprint(user) + item_bag.foldedbag_instance = src moveToNullspace() + return item_bag /obj/item/bodybag/suicide_act(mob/user) if(isopenturf(user.loc)) @@ -62,15 +63,16 @@ return ..() /obj/item/bodybag/bluespace/deploy_bodybag(mob/user, atom/location) - var/obj/structure/closet/body_bag/R = new unfoldedbag_path(location) - for(var/atom/movable/A in contents) - A.forceMove(R) - if(isliving(A)) - to_chat(A, span_notice("You suddenly feel air around you! You're free!")) - R.open(user) - R.add_fingerprint(user) - R.foldedbag_instance = src + var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location) + for(var/atom/movable/inside in contents) + inside.forceMove(item_bag) + if(isliving(inside)) + to_chat(inside, span_notice("You suddenly feel air around you! You're free!")) + item_bag.open(user) + item_bag.add_fingerprint(user) + item_bag.foldedbag_instance = src moveToNullspace() + return item_bag /obj/item/bodybag/bluespace/container_resist_act(mob/living/user) if(user.incapacitated()) @@ -113,10 +115,14 @@ icon_state = "prisonerenvirobag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner +/obj/item/bodybag/environmental/prisoner/pressurized + name = "pressurized prisoner transport bag" + unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized + /obj/item/bodybag/environmental/prisoner/syndicate name = "syndicate prisoner transport bag" desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured until they are transported to a required location." icon = 'icons/obj/bodybag.dmi' icon_state = "syndieenvirobag_folded" - unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/syndicate + unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 1d68e1f5d7c..f4f436b8306 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -1,4 +1,4 @@ -#define PKBORG_DAMPEN_CYCLE_DELAY (2 SECONDS) +#define PKBORG_DAMPEN_CYCLE_DELAY 2 SECONDS /obj/item/cautery/prt //it's a subtype of cauteries so that it inherits the cautery sprites and behavior and stuff, because I'm too lazy to make sprites for this thing name = "plating repair tool" @@ -30,7 +30,7 @@ /// The owner of the dampener var/mob/living/silicon/robot/host = null /// The field - var/datum/proximity_monitor/advanced/peaceborg_dampener/dampening_field + var/datum/proximity_monitor/advanced/projectile_dampener/peaceborg/dampening_field var/projectile_damage_coefficient = 0.5 /// Energy cost per tracked projectile damage amount per second var/projectile_damage_tick_ecost_coefficient = 10 @@ -96,6 +96,8 @@ QDEL_NULL(dampening_field) var/mob/living/silicon/robot/owner = get_host() dampening_field = new(owner, field_radius, TRUE, src) + RegisterSignal(dampening_field, COMSIG_DAMPENER_CAPTURE, .proc/dampen_projectile) + RegisterSignal(dampening_field, COMSIG_DAMPENER_RELEASE, .proc/restore_projectile) owner?.model.allow_riding = FALSE active = TRUE @@ -158,11 +160,8 @@ host.cell.use(energy_recharge * delta_time * energy_recharge_cyborg_drain_coefficient) energy += energy_recharge * delta_time -/obj/item/borg/projectile_dampen/proc/dampen_projectile(obj/projectile/projectile, track_projectile = TRUE) - if(tracked[projectile]) - return - if(track_projectile) - tracked[projectile] = projectile.damage +/obj/item/borg/projectile_dampen/proc/dampen_projectile(obj/projectile/projectile) + tracked[projectile] = projectile.damage projectile.damage *= projectile_damage_coefficient projectile.speed *= projectile_speed_coefficient projectile.add_overlay(projectile_effect) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 6e0f50fbc55..76e390a75a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -166,7 +166,7 @@ mob_storage_capacity = 1 contents_pressure_protection = 0.8 contents_thermal_insulation = 0.5 - foldedbag_path = /obj/item/bodybag/environmental/ + foldedbag_path = /obj/item/bodybag/environmental var/list/weather_protection = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_RADSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE, TRAIT_VOIDSTORM_IMMUNE) // Does not protect against lava or the The Floor Is Lava spell. /obj/structure/closet/body_bag/environmental/Initialize(mapload) @@ -181,7 +181,7 @@ icon_state = "ntenvirobag" contents_pressure_protection = 1 contents_thermal_insulation = 1 - foldedbag_path = /obj/item/bodybag/environmental/nanotrasen/ + foldedbag_path = /obj/item/bodybag/environmental/nanotrasen weather_protection = list(TRAIT_WEATHER_IMMUNE) /// Securable enviro. bags @@ -191,7 +191,7 @@ desc = "Intended for transport of prisoners through hazardous environments, this environmental protection bag comes with straps to keep an occupant secure." icon = 'icons/obj/bodybag.dmi' icon_state = "prisonerenvirobag" - foldedbag_path = /obj/item/bodybag/environmental/prisoner/ + foldedbag_path = /obj/item/bodybag/environmental/prisoner breakout_time = 4 MINUTES // because it's probably about as hard to get out of this as it is to get out of a straightjacket. /// How long it takes to sinch the bag. var/sinch_time = 10 SECONDS @@ -301,7 +301,55 @@ log_game("[key_name(user)] [sinched ? "sinched":"unsinched"] secure environmental bag [src] at [AREACOORD(src)]") update_appearance() -/obj/structure/closet/body_bag/environmental/prisoner/syndicate +/obj/structure/closet/body_bag/environmental/prisoner/pressurized + name = "pressurized prisoner transport bag" + foldedbag_path = /obj/item/bodybag/environmental/prisoner/pressurized + /// The contents of the gas to be distributed to an occupant once sinched down. Set in Initialize() + var/datum/gas_mixture/air_contents = null + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/Initialize(mapload) + . = ..() + refresh_air() + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/proc/refresh_air() + air_contents = null + air_contents = new(50) //liters + air_contents.temperature = T20C + + air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen) + air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + air_contents.gases[/datum/gas/nitrogen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/Destroy() + if(air_contents) + QDEL_NULL(air_contents) + return ..() + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/return_air() + if(sinched) + refresh_air() + return air_contents + return ..() + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/remove_air(amount) + if(sinched) + refresh_air() + return air_contents.remove(amount) // The internals for this bag are bottomless. + return ..(amount) + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/return_analyzable_air() + if(sinched) + refresh_air() + return air_contents + return ..() + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/togglelock(mob/living/user, silent) + . = ..() + if(sinched) + for(var/mob/living/target in contents) + to_chat(target, span_warning("You hear a faint hiss, and a white mist fills your vision...")) + +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate name = "syndicate prisoner transport bag" desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured during transport." icon = 'icons/obj/bodybag.dmi' @@ -312,14 +360,8 @@ weather_protection = list(TRAIT_WEATHER_IMMUNE) breakout_time = 8 MINUTES sinch_time = 20 SECONDS - // The contents of the gas to be distributed to an occupant once sinched down. Set in Initialize() - var/datum/gas_mixture/air_contents = null -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/Initialize(mapload) - . = ..() - refresh_air() - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/proc/refresh_air() +/obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate/refresh_air() air_contents = null air_contents = new(50) //liters air_contents.temperature = T20C @@ -327,33 +369,3 @@ air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/Destroy() - if(air_contents) - QDEL_NULL(air_contents) - - return ..() - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/return_air() - if(sinched) - refresh_air() - return air_contents - return ..() - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/remove_air(amount) - if(sinched) - refresh_air() - return air_contents.remove(amount) // The internals for this bag are bottomless. Syndicate bluespace trickery. - return ..(amount) - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/return_analyzable_air() - if(sinched) - refresh_air() - return air_contents - return ..() - -/obj/structure/closet/body_bag/environmental/prisoner/syndicate/togglelock(mob/living/user, silent) - . = ..() - if(sinched) - for(var/mob/living/target in contents) - to_chat(target, span_warning("You hear a faint hiss, and a white mist fills your vision...")) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 3d2bc4e9429..4d6c130437e 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -76,3 +76,11 @@ /mob/living/simple_animal/hostile/illusion/escape/AttackingTarget() return FALSE + +/mob/living/simple_animal/hostile/illusion/mirage + AIStatus = AI_OFF + density = FALSE + +/mob/living/simple_animal/hostile/illusion/mirage/death(gibbed) + do_sparks(rand(3, 6), FALSE, src) + return ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index e1731f42734..7b11798ca6e 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -615,8 +615,7 @@ leading to an overall lower capacity for modules." default_skin = "security" armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 25, BIO = 100, FIRE = 75, ACID = 75, WOUND = 15) - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + complexity_max = DEFAULT_MAX_COMPLEXITY - 3 slowdown_inactive = 1 slowdown_active = 0.5 allowed_suit_storage = list( @@ -671,8 +670,6 @@ armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 40, BIO = 100, FIRE = 100, ACID = 95, WOUND = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 slowdown_inactive = 0.75 slowdown_active = 0.25 allowed_suit_storage = list( diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 45ae448429e..f3f93156d4d 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -109,6 +109,8 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/pepper_shoulders, + /obj/item/mod/module/criminalcapture, + /obj/item/mod/module/dispenser/mirage, ) /obj/item/mod/control/pre_equipped/safeguard @@ -119,6 +121,8 @@ /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, + /obj/item/mod/module/megaphone, + /obj/item/mod/module/projectile_dampener, /obj/item/mod/module/pepper_shoulders, ) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index fbcf26394e7..dbdfa805695 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -317,6 +317,7 @@ balloon_alert(mod.wearer, "[dispensed] dispensed") playsound(src, 'sound/machines/click.ogg', 100, TRUE) drain_power(use_power_cost) + return dispensed ///Longfall - Nullifies fall damage, removing charge instead. /obj/item/mod/module/longfall diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 63669bdea9b..0d832f7e990 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -219,3 +219,196 @@ /obj/item/mod/module/holster/Destroy() QDEL_NULL(holstered) return ..() + +///Megaphone - Lets you speak loud. +/obj/item/mod/module/megaphone + name = "MOD megaphone module" + desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness." + icon_state = "megaphone" + module_type = MODULE_TOGGLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/megaphone) + cooldown_time = 0.5 SECONDS + /// List of spans we add to the speaker. + var/list/voicespan = list(SPAN_COMMAND) + +/obj/item/mod/module/megaphone/on_activation() + . = ..() + if(!.) + return + RegisterSignal(mod.wearer, COMSIG_MOB_SAY, .proc/handle_speech) + +/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) + +/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + speech_args[SPEECH_SPANS] |= voicespan + drain_power(use_power_cost) + +///Criminal Capture - Lets you put people in transport bags. +/obj/item/mod/module/criminalcapture + name = "MOD criminal capture module" + desc = "The private security that had orders to take in people dead were quite \ + happy with their space-proofed suit, but for those who wanted to bring back \ + whomever their targets were still breathing needed a way to \"share\" the \ + space-proofing. And thus: criminal capture! Creates a prisoner transport bag \ + around the apprehended that has breathable atmos and even stabilizes critical \ + conditions." + icon_state = "criminalcapture" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/criminalcapture) + cooldown_time = 0.5 SECONDS + /// Max bag capacity. + var/max_capacity = 3 + /// Time to capture a prisoner. + var/capture_time = 1 SECONDS + /// Time to pack a bodybag up. + var/packup_time = 0.5 SECONDS + /// List of our capture bags. + var/list/criminal_capture_bags = list() + +/obj/item/mod/module/criminalcapture/Initialize(mapload) + . = ..() + for(var/i in 1 to max_capacity) + criminal_capture_bags += new /obj/structure/closet/body_bag/environmental/prisoner/pressurized(src) + +/obj/item/mod/module/criminalcapture/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(isliving(target)) + var/mob/living/living_target = target + var/turf/target_turf = get_turf(living_target) + playsound(src, 'sound/items/zip.ogg', 25, TRUE) + if(!do_after(mod.wearer, capture_time, target = living_target)) + balloon_alert(mod.wearer, "interrupted!") + return + var/obj/structure/closet/body_bag/environmental/prisoner/dropped_bag = pop(criminal_capture_bags) + dropped_bag.forceMove(target_turf) + dropped_bag.close() + living_target.forceMove(dropped_bag) + else if(istype(target, /obj/structure/closet/body_bag/environmental/prisoner) || istype(target, /obj/item/bodybag/environmental/prisoner)) + var/obj/item/bodybag/environmental/prisoner/bag = target + if(criminal_capture_bags.len >= max_capacity) + balloon_alert(mod.wearer, "bag limit reached!") + return + playsound(src, 'sound/items/zip.ogg', 25, TRUE) + if(!do_after(mod.wearer, packup_time, target = bag)) + balloon_alert(mod.wearer, "interrupted!") + return + if(criminal_capture_bags.len >= max_capacity) + balloon_alert(mod.wearer, "bag limit reached!") + return + if(locate(/mob/living) in bag) + balloon_alert(mod.wearer, "living creatures inside!") + return + if(istype(bag, /obj/item/bodybag/environmental/prisoner)) + bag = bag.deploy_bodybag(mod.wearer, get_turf(bag)) + var/obj/structure/closet/body_bag/environmental/prisoner/structure_bag = bag + if(!structure_bag.opened) + structure_bag.open(mod.wearer, force = TRUE) + bag.forceMove(src) + criminal_capture_bags += bag + balloon_alert(mod.wearer, "bag stored") + else + balloon_alert(mod.wearer, "invalid target!") + +///Mirage grenade dispenser - Dispenses grenades that copy the user's appearance. +/obj/item/mod/module/dispenser/mirage + name = "MOD mirage grenade dispenser module" + desc = "This module can create mirage grenades at the user's liking. These grenades create holographic copies of the user." + icon_state = "mirage_grenade" + cooldown_time = 20 SECONDS + overlay_state_inactive = "module_mirage_grenade" + dispense_type = /obj/item/grenade/mirage + +/obj/item/mod/module/dispenser/mirage/on_use() + . = ..() + if(!.) + return + var/obj/item/grenade/mirage/grenade = . + grenade.arm_grenade(mod.wearer) + +/obj/item/grenade/mirage + name = "mirage grenade" + desc = "A special device that, when activated, produces a holographic copy of the user." + icon_state = "mirage" + inhand_icon_state = "flashbang" + det_time = 3 SECONDS + /// Mob that threw the grenade. + var/mob/living/thrower + +/obj/item/grenade/mirage/arm_grenade(mob/user, delayoverride, msg, volume) + . = ..() + thrower = user + +/obj/item/grenade/mirage/detonate(mob/living/lanced_by) + . = ..() + do_sparks(rand(3, 6), FALSE, src) + if(thrower) + var/mob/living/simple_animal/hostile/illusion/mirage/mirage = new(get_turf(src)) + mirage.Copy_Parent(thrower, 15 SECONDS) + qdel(src) + +///Projectile Dampener - Weakens projectiles in range. +/obj/item/mod/module/projectile_dampener + name = "MOD projectile dampener module" + desc = "Using technology from peaceborgs, this module weakens all projectiles in nearby range." + icon_state = "projectile_dampener" + module_type = MODULE_TOGGLE + complexity = 3 + active_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/projectile_dampener) + cooldown_time = 1.5 SECONDS + /// Radius of the dampening field. + var/field_radius = 2 + /// Damage multiplier on projectiles. + var/damage_multiplier = 0.75 + /// Speed multiplier on projectiles, higher means slower. + var/speed_multiplier = 2.5 + /// List of all tracked projectiles. + var/list/tracked_projectiles = list() + /// Effect image on projectiles. + var/image/projectile_effect + /// The dampening field + var/datum/proximity_monitor/advanced/projectile_dampener/dampening_field + +/obj/item/mod/module/projectile_dampener/Initialize(mapload) + . = ..() + projectile_effect = image('icons/effects/fields.dmi', "projectile_dampen_effect") + +/obj/item/mod/module/projectile_dampener/on_activation() + . = ..() + if(!.) + return + if(istype(dampening_field)) + QDEL_NULL(dampening_field) + dampening_field = new(mod.wearer, field_radius, TRUE, src) + RegisterSignal(dampening_field, COMSIG_DAMPENER_CAPTURE, .proc/dampen_projectile) + RegisterSignal(dampening_field, COMSIG_DAMPENER_RELEASE, .proc/release_projectile) + +/obj/item/mod/module/projectile_dampener/on_deactivation(display_message, deleting = FALSE) + . = ..() + if(!.) + return + QDEL_NULL(dampening_field) + +/obj/item/mod/module/projectile_dampener/proc/dampen_projectile(datum/source, obj/projectile/projectile) + projectile.damage *= damage_multiplier + projectile.speed *= speed_multiplier + projectile.add_overlay(projectile_effect) + +/obj/item/mod/module/projectile_dampener/proc/release_projectile(datum/source, obj/projectile/projectile) + projectile.damage /= damage_multiplier + projectile.speed /= speed_multiplier + projectile.cut_overlay(projectile_effect) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 28283decb42..4e625e27cec 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1071,6 +1071,7 @@ materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENT_BITFLAG_SECURITY research_icon_state = "security-plating" + build_type = PROTOLATHE /datum/design/mod_plating/cosmohonk id = "mod_plating_cosmohonk" diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi index aaf9541d5b7..c61251221af 100644 Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and b/icons/mob/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index e41fc164a2a..5840b69721c 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 209698c7133..8c4da6d43ed 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/tgstation.dme b/tgstation.dme index ccabaedd32f..e4a919fc4eb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -234,6 +234,7 @@ #include "code\__DEFINES\dcs\signals\signals_object.dm" #include "code\__DEFINES\dcs\signals\signals_operating_computer.dm" #include "code\__DEFINES\dcs\signals\signals_painting.dm" +#include "code\__DEFINES\dcs\signals\signals_proxmonitor.dm" #include "code\__DEFINES\dcs\signals\signals_radiation.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" #include "code\__DEFINES\dcs\signals\signals_restaurant.dm" @@ -1180,7 +1181,7 @@ #include "code\datums\proximity_monitor\field.dm" #include "code\datums\proximity_monitor\proximity_monitor.dm" #include "code\datums\proximity_monitor\fields\gravity.dm" -#include "code\datums\proximity_monitor\fields\peaceborg_dampener.dm" +#include "code\datums\proximity_monitor\fields\projectile_dampener.dm" #include "code\datums\proximity_monitor\fields\timestop.dm" #include "code\datums\quirks\_quirk.dm" #include "code\datums\quirks\good.dm"