diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
index 7de6e7d990082d..6ceb38619a4c56 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
@@ -278,7 +278,7 @@
dir = 4
},
/turf/open/floor/iron{
- icon = 'icons/misc/beach.dmi';
+ icon = 'icons/obj/fluff/beach.dmi';
icon_state = "sand"
},
/area/ruin/powered/beach)
@@ -479,7 +479,7 @@
},
/obj/effect/turf_decal/sand,
/turf/open/floor/iron{
- icon = 'icons/misc/beach.dmi';
+ icon = 'icons/obj/fluff/beach.dmi';
icon_state = "sand"
},
/area/ruin/powered/beach)
diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm
index 7ed902651a5269..a7096750a19754 100644
--- a/_maps/RandomZLevels/SnowCabin.dmm
+++ b/_maps/RandomZLevels/SnowCabin.dmm
@@ -1147,7 +1147,7 @@
/turf/open/indestructible/binary{
density = 1;
desc = "No, I am not going through this.";
- icon = 'icons/misc/beach.dmi';
+ icon = 'icons/obj/fluff/beach.dmi';
icon_state = "water";
name = "dirty water"
},
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 18925cfd927a05..26556306fd53ca 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -5990,6 +5990,19 @@
dir = 5
},
/area/station/maintenance/port/aft)
+"bLa" = (
+/obj/structure/bed,
+/obj/machinery/airalarm/directional/north,
+/obj/effect/spawner/random/bedsheet,
+/obj/machinery/button/door/directional/east{
+ id = "Dorm1";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/obj/item/pillow/random,
+/turf/open/floor/carpet,
+/area/station/commons/dorms)
"bLc" = (
/turf/open/floor/iron/dark/textured_edge{
dir = 1
@@ -49673,7 +49686,7 @@
/area/station/hallway/primary/central)
"oTh" = (
/obj/machinery/door/airlock{
- id_tag = "Dorm2";
+ id_tag = "Dorm1";
name = "Dorm 1"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -242567,7 +242580,7 @@ ygB
mJO
oCF
ygB
-mJO
+bLa
oCF
ygB
lBD
diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm
index 606e8de016c39f..e72b578eb3b71e 100644
--- a/_maps/map_files/NorthStar/north_star.dmm
+++ b/_maps/map_files/NorthStar/north_star.dmm
@@ -91,14 +91,6 @@
/turf/open/floor/iron/smooth,
/area/station/cargo/sorting)
"aaU" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 8
- },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"aaV" = (
@@ -360,15 +352,6 @@
},
/turf/open/floor/iron/dark/smooth_large,
/area/station/service/bar)
-"ael" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"aeu" = (
/obj/machinery/power/terminal{
dir = 1
@@ -992,7 +975,12 @@
/turf/open/floor/plating,
/area/station/construction/mining/aux_base)
"amM" = (
-/obj/machinery/light/floor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/blue,
+/obj/machinery/medical_kiosk,
+/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"anb" = (
@@ -1428,10 +1416,18 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor1/port)
"ask" = (
-/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/medical/medbay/lobby)
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay - Treatment Center";
+ name = "medbay camera";
+ network = list("ss13","medbay")
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/light/directional/north,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"asl" = (
/obj/machinery/door/window/left/directional/west{
name = "Cargo Conveyor Access";
@@ -2449,17 +2445,17 @@
/area/station/command/meeting_room)
"aGr" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/structure/railing{
- dir = 1
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/item/clothing/glasses/hud/health,
+/obj/item/clothing/glasses/hud/health{
+ pixel_y = 3
},
-/obj/structure/chair/sofa/bench/solo,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
+/obj/item/clothing/glasses/hud/health{
+ pixel_y = 6
},
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"aGw" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -2578,11 +2574,9 @@
/turf/open/floor/plating,
/area/station/security/prison/work)
"aHK" = (
-/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,
+/obj/machinery/light/directional/east,
+/obj/structure/closet/secure_closet/medical2,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"aHM" = (
/obj/effect/turf_decal/bot,
@@ -3261,11 +3255,11 @@
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai_upload_foyer)
"aRz" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
+/obj/effect/turf_decal/trimline/blue/filled/corner{
+ dir = 1
},
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -3423,18 +3417,11 @@
/turf/closed/wall/r_wall,
/area/station/science/ordnance/burnchamber)
"aTc" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
+/obj/effect/turf_decal/siding/white,
+/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
+/turf/open/floor/iron/dark/textured,
+/area/station/medical/paramedic)
"aTh" = (
/obj/structure/chair/office{
dir = 8
@@ -3947,6 +3934,7 @@
"aYB" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/machinery/light/small/directional/north,
+/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
"aYJ" = (
@@ -4068,6 +4056,9 @@
},
/turf/open/space/openspace,
/area/space/nearstation)
+"aZW" = (
+/turf/closed/wall,
+/area/station/medical/treatment_center)
"aZX" = (
/obj/machinery/light/directional/north,
/turf/open/floor/iron/dark/side{
@@ -4374,18 +4365,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/toilet)
-"bez" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"beB" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
@@ -5125,10 +5104,8 @@
/turf/open/floor/wood/tile,
/area/station/service/library)
"blH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/siding/blue,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"blI" = (
@@ -5301,12 +5278,11 @@
/turf/open/floor/iron,
/area/station/hallway/floor1/aft)
"bnC" = (
-/obj/machinery/camera/autoname/directional/east,
-/obj/effect/turf_decal/tile/blue/full,
-/obj/structure/table/glass,
-/obj/item/storage/belt/medical,
-/obj/item/clothing/glasses/hud/health,
-/turf/open/floor/iron/white/textured,
+/obj/structure/bed/medical/anchored{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"bnI" = (
/obj/structure/table/reinforced,
@@ -5934,16 +5910,12 @@
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/pumproom)
"buR" = (
-/obj/structure/railing,
-/obj/structure/chair/sofa/bench/solo{
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/chair{
dir = 1
},
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"bvc" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 8
@@ -6120,10 +6092,10 @@
/turf/open/floor/pod/dark,
/area/station/maintenance/floor4/starboard)
"bwE" = (
+/obj/structure/sign/poster/official/random/directional/east,
/obj/machinery/cryo_cell{
dir = 8
},
-/obj/structure/sign/poster/official/random/directional/east,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
"bwF" = (
@@ -6528,11 +6500,32 @@
/turf/open/floor/iron,
/area/station/cargo/miningdock)
"bCd" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/item/reagent_containers/chem_pack{
+ pixel_x = -4;
+ pixel_y = 2
},
-/turf/open/floor/iron/white,
+/obj/item/reagent_containers/chem_pack{
+ pixel_x = 3;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/chem_pack{
+ pixel_y = 3
+ },
+/obj/item/clothing/neck/stethoscope{
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/cup/bottle{
+ pixel_x = -2
+ },
+/obj/item/reagent_containers/cup/bottle{
+ pixel_x = 2
+ },
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
+ },
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"bCk" = (
/obj/structure/rack,
@@ -7252,14 +7245,6 @@
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/iron/smooth,
/area/station/construction)
-"bND" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"bNL" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -8022,11 +8007,10 @@
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"bYb" = (
-/obj/effect/turf_decal/tile/blue/full,
/obj/structure/table/glass,
-/obj/item/storage/box/hug/medical,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/white/textured,
+/obj/item/stack/medical/gauze,
+/obj/machinery/defibrillator_mount/directional/east,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"bYg" = (
/obj/effect/turf_decal/trimline/blue,
@@ -8875,7 +8859,8 @@
},
/area/station/command/teleporter)
"cix" = (
-/obj/machinery/restaurant_portal/restaurant,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"ciz" = (
@@ -9365,12 +9350,8 @@
/turf/open/floor/wood,
/area/station/command/heads_quarters/ce)
"coZ" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/defibrillator_mount/directional/south,
-/obj/structure/bed/medical{
- dir = 8
- },
-/turf/open/floor/iron/white/textured,
+/obj/item/kirbyplants/random,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"cpa" = (
/obj/structure/table/wood,
@@ -9670,12 +9651,19 @@
/turf/open/floor/wood,
/area/station/service/bar)
"csR" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
+/obj/effect/turf_decal/siding/blue{
+ dir = 4;
+ pixel_x = -15
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
+/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay - Treatment Center";
+ name = "medbay camera";
+ network = list("ss13","medbay");
+ dir = 2
},
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"csT" = (
@@ -10009,18 +9997,15 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor2/starboard/fore)
"cwz" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
/obj/structure/disposalpipe/segment{
- dir = 4
+ dir = 9
},
/obj/machinery/duct,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"cwD" = (
/obj/machinery/newscaster/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -12100,22 +12085,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/side,
/area/station/hallway/secondary/exit/escape_pod)
-"cZm" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/effect/mapping_helpers/airlock/access/any/medical/general,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 4
- },
-/obj/machinery/duct,
-/obj/machinery/door/airlock/medical/glass{
- name = "Treatment Center"
- },
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"cZA" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
@@ -12142,14 +12111,6 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/cmo)
-"cZI" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/firealarm/directional/west,
-/obj/structure/sink/directional/east,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"cZK" = (
/obj/structure/chair/sofa/bench/left{
dir = 1
@@ -12583,9 +12544,16 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor3/starboard)
"dfB" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/window/preopen{
+ dir = 1;
+ name = "Medbay Lockdown Shutters";
+ id = "med_lockdown"
+ },
+/turf/open/floor/plating,
/area/station/medical/medbay/lobby)
"dfP" = (
/obj/structure/chair{
@@ -12620,13 +12588,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/floor2/starboard/aft)
-"dgm" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"dgp" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -13802,21 +13763,13 @@
/turf/open/misc/dirt/jungle,
/area/station/science/cytology)
"dyG" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
-"dyP" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 10
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/structure/table/glass,
-/obj/item/reagent_containers/hypospray/medipen,
-/obj/item/reagent_containers/hypospray/medipen,
-/obj/item/reagent_containers/hypospray/medipen,
-/obj/item/reagent_containers/hypospray/medipen,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/structure/sign/departments/medbay/alt/directional/south,
+/turf/open/floor/iron/dark/side,
+/area/station/hallway/floor2/aft)
"dyQ" = (
/obj/structure/railing/corner{
dir = 8
@@ -13912,12 +13865,8 @@
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
"dzM" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"dzQ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -15406,11 +15355,13 @@
/obj/effect/turf_decal/siding/white{
dir = 4
},
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/disposal/bin,
/obj/machinery/button/door/directional/south{
- id = "med_doors";
- name = "Medbay Door Control";
- normaldoorcontrol = 1;
- req_access = list("medical")
+ name = "Medbay Lockdown Shutters";
+ id = "med_lockdown"
},
/turf/open/floor/iron/dark/textured,
/area/station/medical/paramedic)
@@ -15699,15 +15650,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"dWZ" = (
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"dXc" = (
/obj/machinery/air_sensor/ordnance_burn_chamber,
/turf/open/floor/engine/vacuum,
@@ -15732,10 +15674,15 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor1/port/fore)
"dXy" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/structure/closet/secure_closet/medical1,
-/obj/structure/sign/poster/official/random/directional/east,
-/turf/open/floor/iron/white/textured,
+/obj/structure/table/glass,
+/obj/machinery/defibrillator_mount/directional/east,
+/obj/item/storage/box/syringes{
+ pixel_y = 6
+ },
+/obj/item/stack/medical/mesh{
+ layer = 3.01
+ },
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"dXz" = (
/obj/effect/decal/cleanable/dirt,
@@ -15815,9 +15762,16 @@
},
/area/station/hallway/secondary/exit/escape_pod)
"dYM" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/item/storage/belt/medical,
+/obj/item/storage/belt/medical{
+ pixel_y = 6
+ },
+/obj/item/storage/belt/medical{
+ pixel_y = 12
+ },
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"dYX" = (
/obj/structure/reagent_dispensers/fueltank,
@@ -16041,14 +15995,6 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"ecK" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
-/obj/machinery/iv_drip,
-/obj/machinery/light/cold/directional/south,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"ecN" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -16452,7 +16398,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
"ehQ" = (
@@ -18066,21 +18011,17 @@
/turf/open/floor/iron/dark/corner,
/area/station/service/lawoffice)
"eEZ" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 8
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment,
-/obj/structure/disposalpipe/segment{
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
},
+/obj/machinery/button/door/directional/west{
+ id = "med_lockdown";
+ name = "Medbay Lockdown Shutters";
+ req_access = list("medical")
+ },
/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"eFc" = (
/obj/effect/turf_decal/stripes{
dir = 1
@@ -19698,6 +19639,13 @@
"ffe" = (
/turf/closed/wall/r_wall,
/area/station/security/holding_cell)
+"ffh" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/lobby)
"ffi" = (
/obj/effect/turf_decal/trimline/purple/line{
dir = 4
@@ -20573,10 +20521,15 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor1/port/fore)
"fqn" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/blue/filled/line,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
},
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"fqo" = (
@@ -20809,17 +20762,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/hallway/floor3/aft)
-"ftD" = (
-/obj/structure/table/reinforced/rglass,
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/door/firedoor,
-/obj/structure/desk_bell{
- pixel_x = 7
- },
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron/dark/textured,
-/area/station/medical/medbay/lobby)
"ftJ" = (
/obj/structure/chair{
dir = 4
@@ -21457,15 +21399,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
/area/station/security/range)
-"fDL" = (
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"fDM" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/rack,
@@ -21514,14 +21447,10 @@
/turf/open/floor/iron/white/textured,
/area/station/medical/break_room)
"fEj" = (
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 4
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
},
-/turf/open/floor/iron/white,
+/turf/closed/wall,
/area/station/medical/treatment_center)
"fEn" = (
/obj/machinery/light/small/directional/south,
@@ -23368,9 +23297,13 @@
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"gcm" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/corner,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/item/pai_card,
+/obj/item/reagent_containers/spray/cleaner{
+ layer = 3.01
+ },
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"gcs" = (
/obj/machinery/power/apc/auto_name/directional/south,
@@ -23638,15 +23571,16 @@
/turf/open/floor/iron/checker,
/area/station/service/bar/atrium)
"ggp" = (
-/obj/structure/table/reinforced,
-/obj/structure/barricade/wooden{
- name = "wooden barricade (KEEP OUT)"
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 8
},
-/obj/structure/window/reinforced/tinted/spawner/directional/south,
-/obj/structure/window/reinforced/tinted/spawner/directional/north,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plating,
-/area/station/medical/chemistry)
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8;
+ pixel_x = 15
+ },
+/obj/structure/chair,
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/lobby)
"ggD" = (
/obj/effect/turf_decal/tile/neutral/opposingcorners{
dir = 8
@@ -24408,12 +24342,6 @@
/obj/effect/landmark/start/roboticist,
/turf/open/floor/iron,
/area/station/science/robotics/lab)
-"grm" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 9
- },
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"grv" = (
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/dark/side{
@@ -24698,12 +24626,13 @@
/turf/open/floor/catwalk_floor/iron_white,
/area/station/medical/abandoned)
"gvp" = (
-/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/door/airlock/public/glass{
- name = "Medbay Lobby"
+ name = "Medbay"
},
-/turf/open/floor/iron/dark/textured,
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/white/textured,
/area/station/medical/medbay/lobby)
"gvx" = (
/obj/effect/turf_decal/trimline/blue/filled/corner,
@@ -24859,7 +24788,6 @@
/turf/open/floor/iron/dark,
/area/station/maintenance/floor2/starboard/aft)
"gxi" = (
-/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -24924,10 +24852,13 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor1/port/fore)
"gxX" = (
-/obj/structure/flora/bush/flowers_br/style_random,
-/obj/machinery/light/floor,
-/turf/open/floor/grass,
-/area/station/medical/medbay/lobby)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/chair,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"gyd" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -25210,13 +25141,18 @@
},
/area/station/hallway/floor4/fore)
"gBV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay - Treatment Center";
+ name = "medbay camera";
+ network = list("ss13","medbay");
+ dir = 2
+ },
/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 6
+ dir = 9
},
-/obj/machinery/firealarm/directional/south,
-/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"gBX" = (
/obj/effect/turf_decal/trimline/blue/corner,
/obj/structure/window/spawner/directional/east,
@@ -25228,13 +25164,6 @@
dir = 8
},
/area/station/engineering/lobby)
-"gBZ" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 10
- },
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"gCv" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -25647,9 +25576,11 @@
/turf/open/floor/iron/dark,
/area/station/hallway/floor4/aft)
"gHO" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/newscaster/directional/west,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"gHU" = (
@@ -26297,15 +26228,6 @@
/obj/effect/spawner/random/engineering/atmospherics_portable,
/turf/open/floor/pod/dark,
/area/station/maintenance/floor2/starboard)
-"gQE" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/structure/table/glass,
-/obj/item/storage/medkit/emergency,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/iron/white/textured,
-/area/station/medical/treatment_center)
"gQI" = (
/obj/effect/turf_decal/siding/white{
dir = 8
@@ -26388,12 +26310,6 @@
},
/turf/open/floor/pod/dark,
/area/station/service/kitchen/abandoned)
-"gRW" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"gSd" = (
/obj/effect/baseturf_helper/reinforced_plating/ceiling,
/turf/open/floor/engine,
@@ -26776,12 +26692,15 @@
/turf/open/floor/iron/dark,
/area/station/security/lockers)
"gYa" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line{
+/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
+/obj/effect/turf_decal/siding/blue{
+ dir = 4;
+ pixel_x = -15
+ },
+/obj/effect/landmark/start/assistant,
+/obj/structure/chair,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"gYb" = (
@@ -28698,20 +28617,10 @@
/turf/open/floor/iron/white,
/area/station/medical/virology)
"hwV" = (
-/obj/effect/mapping_helpers/airlock/unres,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "med_doors";
- name = "Medbay"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/effect/mapping_helpers/airlock/access/any/medical/general,
-/obj/structure/cable,
/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/white/textured,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"hxl" = (
/obj/structure/toilet{
dir = 4
@@ -28882,14 +28791,6 @@
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/glass/reinforced,
/area/station/service/library)
-"hzF" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/blue/filled/corner,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"hzI" = (
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat/service)
@@ -29047,9 +28948,10 @@
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/hop)
"hBe" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"hBw" = (
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/textured_large,
@@ -29477,18 +29379,22 @@
/turf/open/floor/iron,
/area/station/commons/vacant_room/commissary)
"hHe" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
/obj/structure/table/reinforced/rglass,
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/window/left/directional/east{
- name = "Paramedic's Desk";
+/obj/machinery/door/window/right/directional/east{
+ name = "First Aid Supplies";
req_access = list("medical")
},
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/item/stack/medical/suture,
-/obj/item/stack/medical/mesh,
+/obj/structure/desk_bell{
+ pixel_y = 1;
+ pixel_x = -5
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/iron/dark/textured,
/area/station/medical/medbay/lobby)
"hHi" = (
@@ -30075,11 +29981,12 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor1/port/fore)
"hOX" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8;
+ pixel_x = 15
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
@@ -30296,16 +30203,6 @@
},
/turf/open/floor/wood,
/area/station/commons/dorms/apartment2)
-"hSs" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"hSt" = (
/obj/machinery/status_display/ai/directional/north,
/obj/effect/decal/cleanable/blood/old,
@@ -30779,12 +30676,13 @@
/turf/open/floor/carpet/red,
/area/station/service/theater)
"hYk" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"hYm" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/trimline/brown/filled/line,
@@ -31448,11 +31346,17 @@
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
"ihL" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/structure/cable,
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/medical/glass{
+ name = "Medbay Hall"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/medical/general,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 1;
+ id = "med_lockdown";
+ name = "Medbay Lockdown Shutters"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"ihQ" = (
@@ -31550,12 +31454,13 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor4/port/fore)
"ijd" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/table/glass,
-/obj/machinery/cell_charger,
-/obj/item/stock_parts/cell/high,
-/turf/open/floor/iron/white/textured,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"ijs" = (
/obj/structure/closet/emcloset,
@@ -31748,12 +31653,13 @@
/turf/open/floor/carpet/black,
/area/station/hallway/secondary/service)
"ilI" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/defibrillator_mount/directional/south,
-/obj/structure/bed/medical{
- dir = 4
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay - Treatment Center";
+ name = "medbay camera";
+ network = list("ss13","medbay");
+ dir = 2
},
-/turf/open/floor/iron/white/textured,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"ilK" = (
/obj/structure/railing/corner{
@@ -31919,19 +31825,14 @@
/turf/open/floor/iron/dark,
/area/station/hallway/floor1/aft)
"iog" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/structure/railing/corner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 4
- },
/obj/structure/disposalpipe/segment,
/obj/machinery/duct,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"iom" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -32879,6 +32780,16 @@
},
/turf/closed/wall,
/area/station/maintenance/floor1/starboard/aft)
+"iAQ" = (
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
+ },
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"iAS" = (
/obj/structure/cable,
/obj/machinery/power/smes/engineering,
@@ -33132,11 +33043,12 @@
/turf/open/floor/pod/light,
/area/station/maintenance/solars/port/aft)
"iDr" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
+/obj/structure/table/glass,
+/obj/machinery/defibrillator_mount/directional/east,
+/obj/item/storage/medkit/emergency{
+ pixel_y = 4
},
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/light/small/directional/east,
+/obj/item/stack/medical/suture,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"iDw" = (
@@ -34745,16 +34657,6 @@
dir = 1
},
/area/station/hallway/secondary/exit/escape_pod)
-"iZO" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/door/airlock/medical{
- name = "Cryogenics"
- },
-/obj/effect/mapping_helpers/airlock/access/any/medical/general,
-/obj/machinery/door/firedoor,
-/obj/machinery/duct,
-/turf/open/floor/iron/white/textured,
-/area/station/medical/treatment_center)
"iZP" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
@@ -37320,20 +37222,32 @@
/turf/open/floor/iron/dark,
/area/station/hallway/floor1/aft)
"jIi" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/line{
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
+/obj/effect/turf_decal/siding/blue{
+ dir = 4;
+ pixel_x = -15
+ },
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"jIs" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/item/storage/box/rxglasses{
+ pixel_y = 5
},
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"jIy" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/structure/cable,
@@ -37893,10 +37807,9 @@
/area/station/maintenance/floor2/starboard/aft)
"jQb" = (
/obj/machinery/door/airlock/medical{
- name = "Ph-rm--y"
+ name = "Chemical Storage"
},
/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry,
-/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/iron/dark/textured_edge{
dir = 8
},
@@ -38132,11 +38045,12 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor2/port)
"jTK" = (
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 4
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 10
},
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"jTM" = (
@@ -41646,6 +41560,9 @@
"kMv" = (
/obj/machinery/plumbing/receiver,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
+/obj/structure/railing{
+ dir = 4
+ },
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
"kMC" = (
@@ -42032,12 +41949,10 @@
/turf/open/floor/iron/white,
/area/station/hallway/floor2/fore)
"kRM" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 1
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
},
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"kRN" = (
@@ -42225,12 +42140,23 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor1/port/aft)
"kUf" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/item/storage/box/syringes{
- pixel_y = 4
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/structure/table/reinforced/rglass,
+/obj/machinery/cell_charger{
+ pixel_y = 10
+ },
+/obj/machinery/cell_charger{
+ pixel_y = 1;
+ layer = 2.91
+ },
+/obj/item/stock_parts/cell/high{
+ pixel_y = 9;
+ pixel_x = -1
+ },
+/obj/item/stock_parts/cell/high{
+ pixel_x = -1;
+ layer = 3.01
},
-/obj/structure/table/glass,
/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"kUh" = (
@@ -42251,10 +42177,9 @@
/turf/open/floor/iron/white,
/area/station/science/lab)
"kUl" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"kUo" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -42798,10 +42723,13 @@
/turf/open/floor/pod/dark,
/area/station/maintenance/floor2/starboard)
"lbi" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
/obj/structure/disposalpipe/segment,
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"lbm" = (
@@ -43243,15 +43171,11 @@
/turf/open/floor/plating/airless,
/area/station/solars/starboard/aft)
"lfW" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/structure/table/glass,
-/obj/item/storage/box/masks,
-/obj/item/storage/box/bodybags{
- pixel_x = 4;
- pixel_y = 4
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
},
-/obj/structure/sign/departments/medbay/alt/directional/west,
-/turf/open/floor/iron/white/textured,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"lfZ" = (
/obj/structure/sign/poster/official/random/directional/south,
@@ -47515,7 +47439,6 @@
},
/obj/machinery/door/firedoor/border_only,
/obj/effect/turf_decal/siding/white,
-/obj/machinery/duct,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
"mjr" = (
@@ -48294,13 +48217,9 @@
/turf/open/floor/iron/dark,
/area/station/maintenance/floor1/port)
"mtI" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/machinery/airalarm/directional/south,
-/obj/machinery/iv_drip,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/medical/medbay/lobby)
"mtL" = (
/obj/effect/turf_decal/trimline/purple/warning{
dir = 4
@@ -48398,9 +48317,12 @@
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/third)
"mve" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 8
+ },
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"mvg" = (
@@ -48715,7 +48637,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/duct,
/obj/machinery/button/door/directional/west{
- id = "surg_a_privacy";
+ id = "med_lockdown";
name = "Surgery Privacy Shutters";
req_access = list("medical")
},
@@ -49172,14 +49094,15 @@
/turf/open/floor/plating,
/area/station/maintenance/floor2/port/aft)
"mFz" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/door/airlock/public/glass{
- name = "Medbay Lobby"
+ name = "Medbay"
},
-/turf/open/floor/iron/dark/textured,
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/white/textured,
/area/station/medical/medbay/lobby)
"mFB" = (
/obj/structure/window/reinforced/spawner/directional/north,
@@ -52490,9 +52413,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/floor2/port/aft)
-"nvy" = (
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"nvE" = (
/obj/machinery/autolathe,
/obj/effect/turf_decal/siding/thinplating_new{
@@ -53694,7 +53614,6 @@
dir = 1
},
/obj/effect/turf_decal/siding/white,
-/obj/machinery/duct,
/turf/open/floor/iron/white/textured,
/area/station/medical/cryo)
"nLc" = (
@@ -54433,10 +54352,6 @@
},
/turf/open/floor/iron/smooth_large,
/area/station/hallway/secondary/entry)
-"nVp" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"nVq" = (
/turf/open/openspace,
/area/station/maintenance/floor3/starboard/fore)
@@ -55370,19 +55285,6 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/station/maintenance/floor2/port/aft)
-"oio" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/structure/railing/corner{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"oiu" = (
/obj/machinery/computer/security/hos{
dir = 1
@@ -55458,14 +55360,6 @@
/obj/structure/cable,
/turf/open/floor/wood/tile,
/area/station/service/library)
-"ojg" = (
-/obj/structure/table/reinforced/rglass,
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/door/firedoor,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/item/stack/medical/gauze,
-/turf/open/floor/iron/dark/textured,
-/area/station/medical/medbay/lobby)
"ojl" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -55953,13 +55847,13 @@
/turf/open/floor/eighties,
/area/station/commons/dorms/room2)
"opE" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"opN" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -56198,11 +56092,9 @@
/turf/open/floor/plating,
/area/station/maintenance/floor4/starboard)
"osX" = (
-/obj/effect/turf_decal/siding/wood{
- dir = 1
- },
-/obj/structure/hedge,
-/turf/open/floor/carpet/green,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/restaurant_portal/bar,
+/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"ote" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -56303,6 +56195,9 @@
/obj/effect/turf_decal/siding/white{
dir = 4
},
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
/turf/open/floor/iron/dark/textured,
/area/station/medical/paramedic)
"ouF" = (
@@ -59992,11 +59887,12 @@
/turf/open/floor/iron/white,
/area/station/science/lower)
"puH" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"puI" = (
/obj/machinery/vending/cigarette,
/turf/open/floor/iron,
@@ -62464,6 +62360,7 @@
/area/station/science/auxlab)
"qaY" = (
/obj/effect/spawner/random/engineering/tracking_beacon,
+/obj/structure/cable,
/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"qbh" = (
@@ -62539,8 +62436,8 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/floor2/port/aft)
"qcr" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/machinery/firealarm/directional/north,
+/obj/structure/fake_stairs/directional/south,
+/obj/machinery/door/firedoor,
/turf/open/floor/iron/dark/textured,
/area/station/medical/cryo)
"qct" = (
@@ -63385,7 +63282,12 @@
/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"qob" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
+/obj/machinery/airalarm/directional/south,
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8;
+ pixel_x = 15
+ },
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 8
},
/turf/open/floor/iron/white,
@@ -63674,22 +63576,12 @@
/turf/open/floor/pod,
/area/station/hallway/secondary/entry)
"qsj" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/structure/table/glass,
-/obj/item/reagent_containers/cup/bottle/salglu_solution{
- pixel_x = -6
- },
-/obj/item/reagent_containers/chem_pack{
- pixel_x = 6
- },
-/obj/item/reagent_containers/chem_pack{
- pixel_x = 6
- },
-/obj/item/reagent_containers/chem_pack{
- pixel_x = 6
+/obj/structure/bed/medical/anchored{
+ dir = 1
},
-/obj/structure/sign/departments/medbay/alt/directional/north,
-/turf/open/floor/iron/white/textured,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"qsy" = (
/obj/machinery/airalarm/directional/south,
@@ -63836,8 +63728,9 @@
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/captain/private)
"qtM" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/junction{
+ dir = 1
+ },
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"qtO" = (
@@ -64687,15 +64580,6 @@
dir = 9
},
/area/station/hallway/floor4/aft)
-"qCI" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/machinery/medical_kiosk,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/duct,
-/turf/open/floor/iron/white/textured,
-/area/station/medical/treatment_center)
"qCO" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/turf_decal/tile/red/opposingcorners{
@@ -65569,10 +65453,8 @@
/turf/open/floor/iron/dark/small,
/area/station/service/chapel/office)
"qPu" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/stasis,
-/obj/machinery/defibrillator_mount/directional/north,
-/turf/open/floor/iron/white/textured,
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"qPv" = (
/obj/item/kirbyplants/random,
@@ -66223,13 +66105,12 @@
/turf/open/floor/iron/dark,
/area/station/security/brig)
"qXX" = (
-/obj/structure/railing/corner,
-/obj/effect/turf_decal/trimline/blue/filled/corner,
-/obj/structure/disposalpipe/junction{
+/obj/structure/disposalpipe/junction/flip{
dir = 1
},
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"qYb" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -67322,6 +67203,9 @@
"rmD" = (
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/obj/structure/closet/secure_closet/chemical,
+/obj/structure/railing{
+ dir = 8
+ },
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
"rmF" = (
@@ -67624,11 +67508,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/construction/mining/aux_base)
-"rqA" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/machinery/duct,
-/turf/open/floor/iron/dark/textured,
-/area/station/medical/cryo)
"rqK" = (
/obj/effect/turf_decal/stripes/full,
/obj/structure/window/reinforced/spawner/directional/west,
@@ -67956,12 +67835,9 @@
/turf/open/floor/glass/reinforced,
/area/station/service/library)
"rwv" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
/obj/structure/cable,
-/obj/effect/turf_decal/trimline/blue/filled/corner,
-/obj/machinery/duct,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"rwG" = (
@@ -68714,13 +68590,6 @@
/obj/effect/spawner/random/engineering/tracking_beacon,
/turf/open/floor/iron,
/area/station/maintenance/floor2/port/aft)
-"rHI" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 9
- },
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"rHP" = (
/obj/structure/railing/corner{
dir = 1
@@ -69155,15 +69024,6 @@
/obj/item/pen,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
-"rOb" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"rOj" = (
/obj/effect/turf_decal/tile/blue/anticorner,
/turf/open/floor/iron/dark/side{
@@ -70009,11 +69869,11 @@
/turf/open/floor/iron/kitchen,
/area/station/service/kitchen)
"sar" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/disposalpipe/segment,
/obj/machinery/duct,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"sat" = (
/obj/structure/railing/corner{
dir = 1
@@ -70149,6 +70009,11 @@
"scv" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/disposal)
+"scx" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"scD" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/suit_storage_unit/medical,
@@ -70775,8 +70640,14 @@
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"slP" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"slQ" = (
/obj/machinery/navbeacon{
@@ -70859,6 +70730,20 @@
/obj/structure/sign/poster/random/directional/north,
/turf/open/floor/iron/kitchen,
/area/station/service/kitchen)
+"sno" = (
+/obj/structure/table/reinforced/rglass,
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/item/stack/medical/suture/emergency{
+ pixel_y = 5;
+ pixel_x = -5
+ },
+/obj/item/stack/medical/ointment{
+ pixel_y = -5;
+ pixel_x = 5
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/dark/textured,
+/area/station/medical/medbay/lobby)
"snp" = (
/turf/open/floor/iron/dark/side{
dir = 8
@@ -71339,12 +71224,9 @@
/turf/open/floor/circuit,
/area/station/science/xenobiology)
"suB" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"suD" = (
@@ -71697,13 +71579,6 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/dark,
/area/station/security/brig)
-"szp" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"szt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -72062,13 +71937,12 @@
/turf/open/floor/iron/dark,
/area/station/security/brig)
"sEl" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 8
},
-/obj/effect/turf_decal/trimline/blue/filled/corner,
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
+ },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"sEt" = (
@@ -72936,10 +72810,12 @@
/turf/open/floor/wood,
/area/station/hallway/floor3/fore)
"sOT" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/machinery/camera/autoname/directional/north,
-/turf/open/floor/iron/dark/textured,
-/area/station/medical/cryo)
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/white,
+/area/station/medical/treatment_center)
"sOU" = (
/turf/open/openspace,
/area/station/maintenance/floor4/port/aft)
@@ -74455,11 +74331,8 @@
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
"thd" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/structure/sign/poster/official/random/directional/east,
-/obj/structure/table/glass,
-/obj/item/storage/box/bodybags,
-/turf/open/floor/iron/white/textured,
+/obj/machinery/stasis,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"thi" = (
/obj/structure/window/reinforced/spawner/directional/east,
@@ -74515,12 +74388,14 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor4/starboard/aft)
"tia" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
+ dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"tic" = (
/turf/open/floor/wood,
/area/station/commons/dorms/apartment2)
@@ -75659,6 +75534,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/pod/dark,
/area/station/maintenance/floor3/port)
+"twY" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/medical/treatment_center)
"twZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -75674,11 +75555,11 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor2/port/aft)
"txp" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/structure/table/glass,
-/obj/item/pai_card,
-/obj/item/reagent_containers/spray/cleaner,
-/turf/open/floor/iron/white/textured,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"txu" = (
/turf/open/floor/iron/dark,
@@ -76157,11 +76038,14 @@
/turf/open/floor/iron/dark,
/area/station/science/lab)
"tDX" = (
+/obj/structure/noticeboard/directional/north,
+/obj/item/paper{
+ name = "IMPORTANT NOTICE";
+ default_raw_text = "Nanotrasen Mark II IV Drip Stands are to be used in the correct Nanotrasen Mark II IV Drip Stand Installation Location. Failure to do so can result in a 100 credit fine. Glory to Nanotrasen."
+ },
/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
+ dir = 4
},
-/obj/machinery/iv_drip,
-/obj/machinery/light/cold/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"tEc" = (
@@ -76985,12 +76869,13 @@
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/aisat/service)
"tOW" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/stasis{
- dir = 4
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/machinery/light_switch/directional/north{
+ pixel_y = 27;
+ pixel_x = 12
},
-/obj/machinery/defibrillator_mount/directional/north,
-/turf/open/floor/iron/white/textured,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"tPj" = (
/obj/effect/turf_decal/tile/purple/opposingcorners,
@@ -77756,10 +77641,13 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor3/starboard)
"tZZ" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/holopad,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/duct,
+/obj/machinery/airalarm/directional/south,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/structure/bed/medical/anchored,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"uae" = (
@@ -78939,21 +78827,13 @@
/turf/open/floor/iron/dark,
/area/station/science/ordnance/testlab)
"usf" = (
-/obj/structure/railing{
- dir = 4
- },
-/obj/structure/chair/sofa/bench/solo{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/structure/disposalpipe/junction/flip{
+/obj/structure/disposalpipe/junction{
dir = 1
},
/obj/machinery/duct,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"usj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/airlock/hatch{
@@ -81916,9 +81796,9 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor4/port/fore)
"ved" = (
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"veA" = (
@@ -82016,15 +81896,6 @@
/obj/structure/rack,
/turf/open/floor/iron/textured_large,
/area/station/medical/chemistry)
-"vfW" = (
-/obj/machinery/medical_kiosk,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 6
- },
-/obj/machinery/camera/autoname/directional/south,
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
"vfY" = (
/obj/structure/table/reinforced,
/obj/item/plate{
@@ -84604,8 +84475,11 @@
/turf/open/floor/iron/dark/side,
/area/station/security/prison/garden)
"vNV" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"vNY" = (
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
@@ -84651,12 +84525,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"vOs" = (
@@ -84951,15 +84819,6 @@
},
/turf/open/floor/iron/checker,
/area/station/commons/vacant_room/commissary)
-"vRW" = (
-/obj/effect/turf_decal/tile/blue/full,
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/obj/machinery/duct,
-/turf/open/floor/iron/white/textured,
-/area/station/medical/treatment_center)
"vSa" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/dark/side{
@@ -84973,15 +84832,8 @@
/turf/open/floor/iron,
/area/station/cargo/lobby)
"vSA" = (
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/structure/table/glass,
-/obj/item/reagent_containers/cup/bottle/epinephrine,
-/obj/item/reagent_containers/cup/bottle/multiver{
- pixel_x = 6
- },
-/obj/item/reagent_containers/syringe,
-/obj/structure/sign/poster/official/random/directional/west,
-/turf/open/floor/iron/white/textured,
+/obj/machinery/digital_clock/directional/north,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"vSB" = (
/obj/structure/cable,
@@ -85222,6 +85074,18 @@
},
/turf/open/floor/plating,
/area/station/maintenance/floor2/port/fore)
+"vVR" = (
+/obj/structure/table/reinforced/rglass,
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/machinery/airalarm/directional/north,
+/obj/item/food/pizzaslice/mothic_five_cheese,
+/obj/item/reagent_containers/cup/glass/coffee{
+ pixel_y = 7;
+ pixel_x = 6
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/dark/textured,
+/area/station/medical/medbay/lobby)
"vVT" = (
/obj/effect/spawner/structure/window/hollow/reinforced/directional{
dir = 1
@@ -85399,6 +85263,13 @@
/obj/structure/railing/corner,
/turf/open/floor/pod/light,
/area/station/maintenance/floor3/port/aft)
+"vXx" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/obj/machinery/light/small/directional/north,
+/obj/machinery/airalarm/directional/north,
+/obj/machinery/camera/autoname/directional/north,
+/turf/open/floor/iron/dark/textured,
+/area/station/medical/cryo)
"vXH" = (
/obj/machinery/airalarm/directional/south,
/obj/effect/decal/cleanable/blood/drip,
@@ -85907,7 +85778,9 @@
/turf/open/floor/iron,
/area/station/hallway/floor3/fore)
"wdd" = (
-/turf/closed/wall,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/structure/bed/medical/anchored,
+/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"wdj" = (
/obj/effect/turf_decal/trimline/green/filled/corner{
@@ -86275,18 +86148,10 @@
/area/station/maintenance/floor4/starboard/aft)
"wis" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/effect/mapping_helpers/airlock/access/any/medical/general,
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/unres{
- dir = 4
- },
-/obj/machinery/door/airlock/medical/glass{
- name = "Treatment Center"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/iron/white,
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"wit" = (
/obj/structure/cable,
@@ -87718,18 +87583,6 @@
/obj/structure/closet/crate/trashcart/filled,
/turf/open/floor/pod/light,
/area/station/maintenance/floor1/port/aft)
-"wzI" = (
-/obj/effect/mapping_helpers/airlock/unres,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "med_doors";
- name = "Medbay"
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/effect/mapping_helpers/airlock/access/any/medical/general,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white/textured,
-/area/station/medical/medbay/lobby)
"wzJ" = (
/obj/effect/turf_decal/siding/wood,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -88724,10 +88577,12 @@
/turf/open/floor/iron,
/area/station/science/auxlab)
"wLC" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
},
-/turf/open/floor/iron/white,
+/obj/machinery/holopad,
+/turf/open/floor/iron/white/textured,
/area/station/medical/treatment_center)
"wLD" = (
/obj/item/radio/intercom/directional/south,
@@ -90519,13 +90374,6 @@
},
/turf/open/floor/engine/airless,
/area/station/engineering/supermatter/waste)
-"xkh" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
- },
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/iron/white,
-/area/station/medical/treatment_center)
"xko" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
@@ -90619,11 +90467,13 @@
/turf/open/floor/plating/airless,
/area/space)
"xlu" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 5
+ dir = 10
},
/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/area/station/medical/treatment_center)
"xlD" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -90956,14 +90806,14 @@
/turf/open/floor/iron/dark,
/area/station/security/lockers)
"xqZ" = (
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
+/obj/machinery/camera/directional/north{
+ c_tag = "Medbay - Treatment Center";
+ name = "medbay camera";
+ network = list("ss13","medbay")
},
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable,
-/obj/machinery/iv_drip,
-/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/iron/white,
+/obj/machinery/shower/directional/south,
+/obj/structure/fluff/shower_drain,
+/turf/open/floor/catwalk_floor/flat_white,
/area/station/medical/treatment_center)
"xrh" = (
/obj/effect/turf_decal/tile/blue{
@@ -91397,11 +91247,11 @@
/turf/open/floor/bamboo/tatami/black,
/area/station/commons/storage/art)
"xwZ" = (
-/obj/effect/turf_decal/trimline/blue/filled/corner{
- dir = 1
- },
/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 4
+ dir = 8
+ },
+/obj/effect/turf_decal/bot_white{
+ color = "#74b2d3"
},
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -91798,6 +91648,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
+/obj/structure/cable,
/turf/open/floor/wood,
/area/station/service/kitchen/diner)
"xCR" = (
@@ -92650,12 +92501,12 @@
/turf/open/floor/iron/dark,
/area/station/command/teleporter)
"xMH" = (
-/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
/obj/machinery/door/airlock/hatch{
name = "Maintenance Access"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/mapping_helpers/airlock/unres,
+/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/floor1/port)
"xMJ" = (
@@ -92686,6 +92537,14 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/pod/light,
/area/station/maintenance/floor1/port/aft)
+"xNd" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/siding/blue,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/lobby)
"xNf" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/start/hangover,
@@ -92727,21 +92586,16 @@
/turf/open/floor/pod/dark,
/area/station/maintenance/floor2/starboard/aft)
"xNH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/railing{
- dir = 8
- },
-/obj/structure/chair/sofa/bench/solo{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/lobby)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue/fourcorners,
+/turf/open/floor/iron/white/textured,
+/area/station/medical/treatment_center)
"xNK" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
@@ -93698,10 +93552,7 @@
/turf/open/misc/beach/sand,
/area/station/hallway/floor2/fore)
"yba" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/poster/official/random/directional/west,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"ybe" = (
@@ -127756,9 +127607,9 @@ jsP
fQQ
lkE
kzE
-xgH
-xgH
-xgH
+kzE
+kzE
+kzE
rSc
tCB
twx
@@ -128012,11 +127863,11 @@ hLX
hLX
hLX
lkE
-ggp
+wCn
opB
wCR
-xgH
-xgH
+kzE
+kzE
ulh
eVk
wVn
@@ -128273,7 +128124,7 @@ jQb
hzV
vLM
lBB
-xgH
+kzE
pLe
lJk
wVn
@@ -128530,7 +128381,7 @@ wCn
fKC
ssi
tkz
-xgH
+kzE
dxS
twx
wVn
@@ -128787,7 +128638,7 @@ kzE
wAe
mYo
kzr
-xgH
+kzE
wVn
wVn
wVn
@@ -129044,7 +128895,7 @@ xMH
trP
dpC
qHH
-xgH
+kzE
oBQ
xgH
xgH
@@ -129297,11 +129148,11 @@ dJO
tIG
vag
vag
-xgH
-xgH
-xgH
-xgH
-xgH
+kzE
+kzE
+kzE
+kzE
+kzE
dJO
nJI
xgH
@@ -195073,17 +194924,17 @@ vsx
xYM
jLQ
yka
-ilR
-grm
+mtI
+ggp
hOX
qob
-dyP
aHk
-rHI
+eEZ
+twY
tia
cwz
-ael
-gBZ
+twY
+twY
oxn
oUE
eIw
@@ -195331,11 +195182,11 @@ xYM
jLQ
tDb
gvp
-hYk
-qtM
gVI
-dyG
-wzI
+qtM
+xNd
+ihL
+hwV
hYk
qXX
usf
@@ -195845,15 +195696,15 @@ cdm
jLQ
aYU
gvp
-hYk
+ffh
lbi
blH
ihL
hwV
-hSs
-eEZ
+opE
+opE
xNH
-oio
+opE
opE
dAF
wPS
@@ -196100,17 +195951,17 @@ eUq
ttb
wQu
jLQ
-yka
-ilR
-xlu
+dyG
+mtI
+gYa
jIi
csR
-vfW
aHk
+vOo
xlu
-bez
+dzM
puH
-gYa
+dzM
gBV
oxn
fES
@@ -196359,19 +196210,19 @@ xYM
jLQ
usK
ilR
-ojg
+vVR
hHe
-ftD
+sno
aHk
wdd
-wdd
+fqn
wis
slP
-cZm
-wdd
-wdd
-wdd
-wdd
+iAQ
+tZZ
+aZW
+aZW
+aZW
iSP
iSP
iSP
@@ -196621,14 +196472,14 @@ ouD
dUj
sRR
vSA
-cZI
-bCd
+rwv
+dzM
vNV
-gRW
+hwV
gHO
yba
lfW
-wdd
+aZW
pOK
nqM
qQM
@@ -196879,13 +196730,13 @@ dhZ
sRR
tOW
rwv
-aTc
-dgm
+bCd
+dzM
gcm
-xkh
-fDL
+txp
+aaU
coZ
-wdd
+aZW
aYB
xcY
gEZ
@@ -197136,14 +196987,14 @@ loQ
sRR
tDX
kRM
-gQE
+dzM
wLC
-nVp
-txp
-aaU
-ecK
-wdd
+dzM
+sOT
+twY
+twY
qcr
+xcY
otX
gEZ
dHR
@@ -197387,20 +197238,20 @@ jEk
jLQ
aje
grN
-sRR
+aTc
gxi
woE
biz
-nvy
+dzM
kUl
-qCI
+kUf
dzM
-tZZ
-vRW
-rOb
-fqn
-iZO
-rqA
+dYM
+scx
+dzM
+dzM
+qcr
+xcY
nKY
mjg
ehO
@@ -197650,14 +197501,14 @@ gBz
sRR
xqZ
jTK
-kUf
-szp
-dYM
+dzM
+dzM
+dzM
ijd
-hzF
-mtI
-wdd
-sOT
+vOo
+vOo
+qcr
+xcY
rEp
gEZ
dHR
@@ -197909,12 +197760,12 @@ qPu
sEl
vOo
xwZ
-dWZ
+vOo
aRz
-fEj
+aaU
ilI
-wdd
-aYB
+aZW
+vXx
xcY
gEZ
wcH
@@ -198168,9 +198019,9 @@ thd
bYb
bnC
dXy
-bND
+thd
aHK
-wdd
+aZW
bwE
wat
ydn
@@ -198423,11 +198274,11 @@ qvN
qvN
qvN
qvN
-wdd
-wdd
-wdd
-wdd
-wdd
+aZW
+fEj
+aZW
+aZW
+aZW
ylR
ylR
ylR
@@ -247246,11 +247097,11 @@ fjo
mso
dFd
awt
-cix
gjf
gjf
-qoa
gjf
+qoa
+jDe
jDe
qoW
tTc
@@ -247504,7 +247355,6 @@ mso
dFd
awt
gjf
-gjf
ulB
ulB
ulB
@@ -247513,6 +247363,7 @@ bMs
kpa
jzE
gjf
+gjf
ddx
rBC
rBC
@@ -247761,7 +247612,6 @@ mso
laJ
jWT
tRT
-gjf
nXq
xEL
oAm
@@ -247770,6 +247620,7 @@ dId
jAl
jHT
gjf
+gjf
ddx
rBC
rBC
@@ -248018,7 +247869,6 @@ gWg
iOh
awt
gjf
-gjf
mQg
rBC
pzK
@@ -248027,6 +247877,7 @@ gjf
wtg
gjf
gjf
+gjf
uCW
kHc
xAq
@@ -248275,7 +248126,6 @@ qcd
ccF
awt
gjf
-xCM
mQg
rBC
pzK
@@ -248284,6 +248134,7 @@ gjf
vXY
vRj
ldV
+osX
jHJ
hVt
hVt
@@ -248532,7 +248383,6 @@ qcd
nsn
rSS
xDS
-xDS
sln
jAl
pWr
@@ -248540,6 +248390,7 @@ jDe
bMs
kpa
jzE
+gjf
vRj
vWQ
vWQ
@@ -248788,17 +248639,17 @@ fjo
qcd
ceh
dMj
-gjf
-xDS
+cix
ulB
ulB
ulB
-jDe
+xCM
dId
jAl
jHT
+gjf
+xDS
xDS
-xna
xna
xna
xna
@@ -249045,9 +248896,8 @@ fjo
qcd
fOu
awt
-gjf
-xDS
-xDS
+cix
+cix
xDS
xDS
ved
@@ -249055,7 +248905,8 @@ xDS
xDS
xDS
xDS
-osX
+xDS
+gjf
vZg
dIx
dIx
@@ -249304,10 +249155,10 @@ dFd
awt
gjf
gjf
-gjf
+vXY
xDS
qaY
-jDe
+gjf
gjf
wtg
gjf
@@ -249563,11 +249414,11 @@ rZS
nla
mQF
xDS
-gjf
jDe
bMs
kpa
jzE
+gjf
tFS
nNJ
ycW
@@ -249820,12 +249671,12 @@ ubR
mhE
rwh
xDS
-gjf
jDe
dId
jAl
jHT
gjf
+gjf
nNJ
dxv
ssj
@@ -250078,7 +249929,7 @@ ubR
nYE
xDS
jDe
-jDe
+gjf
iwU
psq
eEr
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 917b6101b931b5..1cd6326dc2d4e3 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -15862,6 +15862,18 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
+"exQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Gas";
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"exT" = (
/obj/structure/table,
/obj/item/radio{
@@ -16240,6 +16252,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/atmos/pumproom)
+"eEp" = (
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"eEx" = (
/obj/structure/cable,
/obj/structure/extinguisher_cabinet/directional/north,
@@ -19752,7 +19773,8 @@
/area/station/command/teleporter)
"fWn" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible,
-/turf/closed/wall/r_wall,
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
"fWA" = (
/turf/open/floor/plating,
@@ -20224,6 +20246,7 @@
"gfV" = (
/obj/structure/table/wood/fancy/green,
/obj/effect/spawner/round_default_module,
+/obj/machinery/camera/motion/directional/east,
/turf/open/floor/circuit/green,
/area/station/ai_monitored/turret_protected/ai_upload)
"gfX" = (
@@ -23853,6 +23876,13 @@
"hzN" = (
/turf/closed/wall/r_wall,
/area/station/ai_monitored/command/storage/eva)
+"hzQ" = (
+/obj/structure/closet/firecloset,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"hzR" = (
/obj/effect/turf_decal/trimline/neutral/line{
dir = 4
@@ -28295,6 +28325,10 @@
/obj/structure/cable,
/turf/closed/wall/r_wall,
/area/station/ai_monitored/turret_protected/aisat/hallway)
+"jfD" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"jfH" = (
/obj/effect/turf_decal/trimline/red/filled/corner{
dir = 1
@@ -29173,7 +29207,6 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
"jux" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/structure/cable/layer1,
/obj/effect/turf_decal/trimline/yellow/arrow_ccw{
dir = 6
@@ -29181,6 +29214,7 @@
/obj/effect/turf_decal/trimline/yellow/corner{
dir = 1
},
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"juT" = (
@@ -31410,6 +31444,15 @@
},
/turf/open/floor/wood/large,
/area/station/service/library)
+"kgg" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"kgr" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -32561,6 +32604,11 @@
/obj/effect/turf_decal/tile/blue/opposingcorners,
/turf/open/floor/iron/freezer,
/area/station/medical/coldroom)
+"kAF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"kAO" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 8
@@ -40535,6 +40583,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"nmN" = (
+/obj/structure/closet/radiation,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"nmP" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -44120,6 +44175,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/tram/left)
+"oDq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"oDs" = (
/obj/structure/cable,
/obj/item/radio/intercom/directional/west,
@@ -46980,6 +47040,13 @@
/obj/structure/transit_tube_pod,
/turf/open/floor/plating,
/area/station/science/lower)
+"pFO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"pFU" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -67758,7 +67825,10 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/escape)
"wPj" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Mix Bypass"
+ },
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"wPD" = (
@@ -68155,6 +68225,16 @@
},
/turf/open/floor/iron,
/area/station/engineering/break_room)
+"wYS" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Gas to Mix";
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"wYX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -69207,6 +69287,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/circuit/green,
/area/station/ai_monitored/command/nuke_storage)
+"xuk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible,
+/obj/machinery/meter,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
"xum" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -103540,11 +103625,11 @@ sHh
yeg
sHh
sHh
-sHh
-sHh
-sHh
-sHh
-sHh
+exQ
+kAF
+kAF
+kAF
+wYS
sHh
sHh
poT
@@ -103797,11 +103882,11 @@ qHs
sHj
qHs
qHs
-qHs
-qHs
-qHs
-qHs
-qHs
+pFO
+jfD
+xuk
+jfD
+oDq
qHs
qHs
fWn
@@ -104053,14 +104138,14 @@ bpl
mRs
jaW
mAx
-hZr
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+qHs
+nmN
+eEp
+kgg
+eEp
+hzQ
+qHs
+pHM
aeV
aeV
prq
@@ -104310,13 +104395,13 @@ bpl
mRs
woR
mAx
-hZr
-hZr
-hZr
-hZr
-aaa
-aaa
-aaa
+qHs
+qHs
+qHs
+qHs
+qHs
+qHs
+qHs
aaa
aac
aaa
diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm
index e2f254844d3320..56aa9fb25f5cdb 100644
--- a/_maps/shuttles/emergency_lance.dmm
+++ b/_maps/shuttles/emergency_lance.dmm
@@ -297,7 +297,8 @@
},
/obj/docking_port/mobile/emergency{
dir = 2;
- name = "Lance Emergency Shuttle"
+ name = "Lance Emergency Shuttle";
+ port_direction = 1
},
/turf/open/floor/iron/dark,
/area/shuttle/escape)
diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index e46fef9123e187..0253df0b57a4d3 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -1,7 +1,7 @@
// Keep the identifiers here below 32 characters, you can put the full display name in the actual achievement datum
/// Achievements icon set
-#define ACHIEVEMENTS_SET 'icons/ui_icons/achievements/achievements.dmi'
+#define ACHIEVEMENTS_SET 'icons/ui/achievements/achievements.dmi'
#define ACHIEVEMENT_DEFAULT "default"
#define ACHIEVEMENT_SCORE "score"
diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm
index a65b5ebd40758a..23c16bdcd0b38f 100644
--- a/code/__DEFINES/ai/ai_blackboard.dm
+++ b/code/__DEFINES/ai/ai_blackboard.dm
@@ -155,6 +155,9 @@
///Text we display when we befriend someone
#define BB_FRIENDLY_MESSAGE "friendly_message"
+///our fishing target
+#define BB_FISHING_TARGET "fishing_target"
+
// Keys used by one and only one behavior
// Used to hold state without making bigass lists
/// For /datum/ai_behavior/find_potential_targets, what if any field are we using currently
diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm
index 48d4f2d67d065a..6af24b6cdd9730 100644
--- a/code/__DEFINES/ai/pets.dm
+++ b/code/__DEFINES/ai/pets.dm
@@ -67,7 +67,7 @@
//virtual pet keys
///the last PDA message we must relay
-#define BB_LAST_RECIEVED_MESSAGE "last_recieved_message"
+#define BB_LAST_RECEIVED_MESSAGE "last_received_message"
///our current virtual pet level
#define BB_VIRTUAL_PET_LEVEL "virtual_pet_level"
///the target we will play with
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
index 8f7fa11f57b2a4..1d3c9304c3c937 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
@@ -274,5 +274,7 @@
/// From /datum/element/basic_eating/finish_eating()
#define COMSIG_MOB_ATE "mob_ate"
+///From mob/living/carbon/proc/throw_mode_on and throw_mode_off
+#define COMSIG_LIVING_THROW_MODE_TOGGLE "living_throw_mode_toggle"
///From /datum/component/happiness()
#define COMSIG_MOB_HAPPINESS_CHANGE "happiness_change"
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 f33d2f1f40d027..7fce084dc2f119 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -81,6 +81,9 @@
#define ACCESS_DISALLOWED (1<<1)
#define LOCKED_ATOM_INCOMPATIBLE (1<<2)
+///from the component /datum/component/simple_access
+#define COMSIG_MOB_RETRIEVE_SIMPLE_ACCESS "retrieve_simple_access"
+
///from base of mob/can_cast_magic(): (mob/user, magic_flags, charge_cost)
#define COMSIG_MOB_RESTRICT_MAGIC "mob_cast_magic"
///from base of mob/can_block_magic(): (mob/user, casted_magic_flags, charge_cost)
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index f628df0e964b40..d7e895221d0e03 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -366,11 +366,11 @@
// /obj/item/grenade signals
-///called in /obj/item/gun/process_fire (user, target, params, zone_override)
+///called in /obj/item/grenade/proc/detonate(): (lanced_by)
#define COMSIG_GRENADE_DETONATE "grenade_prime"
-//called from many places in grenade code (armed_by, nade, det_time, delayoverride)
+///called in /obj/item/grenade/gas_crystal/arm_grenade(): (armed_by, nade, det_time, delayoverride)
#define COMSIG_MOB_GRENADE_ARMED "grenade_mob_armed"
-///called in /obj/item/gun/process_fire (user, target, params, zone_override)
+///called in /obj/item/grenade/proc/arm_grenade() and /obj/item/grenade/gas_crystal/arm_grenade(): (det_time, delayoverride)
#define COMSIG_GRENADE_ARMED "grenade_armed"
// /obj/projectile signals (sent to the firer)
@@ -423,7 +423,7 @@
#define COMSIG_VIM_HEADLIGHTS_TOGGLED "vim_headlights_toggled"
///from /datum/computer_file/program/messenger/proc/receive_message
-#define COMSIG_COMPUTER_RECIEVED_MESSAGE "computer_recieved_message"
+#define COMSIG_COMPUTER_RECEIVED_MESSAGE "computer_received_message"
///from /datum/computer_file/program/virtual_pet/proc/handle_level_up
#define COMSIG_VIRTUAL_PET_LEVEL_UP "virtual_pet_level_up"
diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm
index 45b6ec6bfe3f24..26459ab4dad3d5 100644
--- a/code/__DEFINES/dcs/signals/signals_storage.dm
+++ b/code/__DEFINES/dcs/signals/signals_storage.dm
@@ -5,5 +5,14 @@
/// Sent after dumping into some other storage object: (atom/dest_object, mob/user)
#define COMSIG_STORAGE_DUMP_POST_TRANSFER "storage_dump_into_storage"
-/// Sent to the STORAGE when an ITEM is STORED INSIDE.
+/// Fired off the storage's PARENT when an ITEM is STORED INSIDE. (obj/item, mob, force)
+#define COMSIG_ATOM_STORED_ITEM "atom_storing_item"
+
+/// Fired off the storage's PARENT when an ITEM is REMOVED. (obj/item, atom, silent)
+#define COMSIG_ATOM_REMOVED_ITEM "atom_removing_item"
+
+/// Sent to the STORAGE when an ITEM is STORED INSIDE. (obj/item, mob, force)
#define COMSIG_STORAGE_STORED_ITEM "storage_storing_item"
+
+/// Sent to the STORAGE when an ITEM is REMOVED. (obj/item, atom, silent)
+#define COMSIG_STORAGE_REMOVED_ITEM "storage_removing_item"
diff --git a/code/__DEFINES/diseases.dm b/code/__DEFINES/diseases.dm
index 047bb79582de45..fe05a30e0fd83a 100644
--- a/code/__DEFINES/diseases.dm
+++ b/code/__DEFINES/diseases.dm
@@ -81,28 +81,28 @@ DEFINE_BITFIELD(spread_flags, list(
//// Adjust to make it faster or slower to cure once the virus has reached its peak.
#define DISEASE_PEAKED_RECOVERY_MULTIPLIER 1.2
/// Slowdown Recovery Bonus - set this to the maximum extra chance per tick you want people to get to recover from spaceacillin or other slowdown/virus resistance effects
-#define DISEASE_SLOWDOWN_RECOVERY_BONUS 1
-/// Slowdown Recovery Bonus Duration - set this to the maximum # of cycles you want things that cause slowdown/virus resistance to be able to add a bonus up to DISEASE_SLOWDOWN_RECOVERY_BONUS.______qdel_list_wrapper(list/L)
+#define DISEASE_SLOWDOWN_RECOVERY_BONUS 3
+/// Slowdown Recovery Bonus Duration - set this to the maximum # of cycles you want things that cause slowdown/virus resistance to be able to add a bonus up to DISEASE_SLOWDOWN_RECOVERY_BONUS.
//// Scales down linearly over time.
-#define DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION 100
+#define DISEASE_SLOWDOWN_RECOVERY_BONUS_DURATION 200
/// Negative Malnutrition Recovery Penalty
//// Flat penalty to recovery chance if malnourished or starving
-#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 1.5
+#define DISEASE_MALNUTRITION_RECOVERY_PENALTY 3
/// Satiety Recovery Multiplier - added chance to recover based on positive satiety
//// Multiplier of satiety/max_satiety if satiety is positive or zero. Increase to make satiety more valuable, decrease for less.
-#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 1
+#define DISEASE_SATIETY_RECOVERY_MULTIPLIER 3
/// Good Sleeping Recovery Bonus - additive benefits for various types of good sleep (blanket, bed, darkness, pillows.)
//// Raise to make each factor add this much chance to recover.
-#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.2
+#define DISEASE_GOOD_SLEEPING_RECOVERY_BONUS 0.6
/// Sleeping Recovery Multiplier - multiplies ALL recovery chance effects by this amount.
//// Set to 1 for no effect on recovery chances from sleeping.
-#define DISEASE_SLEEPING_RECOVERY_MULTIPLIER 2
+#define DISEASE_SLEEPING_RECOVERY_MULTIPLIER 6
/// Final Cure Chance Multiplier - multiplies the disease's cure chance to get the probability of moving from stage 1 to a final cure.
//// Must be greater than zero for diseases to self cure.
-#define DISEASE_FINAL_CURE_CHANCE_MULTIPLIER 3
+#define DISEASE_FINAL_CURE_CHANCE_MULTIPLIER 6
/// Symptom Offset Duration - number of cycles over which sleeping/having spaceacillin or a slowdown effect can prevent symptoms appearing
//// Set to maximum # of cycles you want to be able to offset symptoms. Scales down linearly over time.
-#define DISEASE_SYMPTOM_OFFSET_DURATION 100
+#define DISEASE_SYMPTOM_OFFSET_DURATION 200
/// Symptom Frequency Modifier
//// Raise to make symptoms fire less frequently, lower to make them fire more frequently. Keep at 0 or above.
diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm
index 0f1dbd501d0920..b643ec997ca10d 100644
--- a/code/__DEFINES/fonts.dm
+++ b/code/__DEFINES/fonts.dm
@@ -13,7 +13,7 @@
#define SIGNATURE_FONT "Segoe Script"
/// Emoji icon set
-#define EMOJI_SET 'icons/ui_icons/emoji/emoji.dmi'
+#define EMOJI_SET 'icons/ui/chat/emoji.dmi'
// Font metrics bitfield
/// Include leading A width and trailing C width in GetWidth() or in DrawText()
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 5ab16b5a5ff591..7f007e5b30ec49 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -954,6 +954,9 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
/// Types of bullets that mining mobs take full damage from
#define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE)
+/// Helper macro that determines if the mob is at the threshold to start vomitting due to high toxin levels
+#define AT_TOXIN_VOMIT_THRESHOLD(mob) (mob.getToxLoss() > 45 && mob.nutrition > 20)
+
/// The duration of the flip emote animation
#define FLIP_EMOTE_DURATION 0.7 SECONDS
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index ee7e5dfee0d125..88e64164acd4ba 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -33,7 +33,6 @@
#define ROLE_OPERATIVE_MIDROUND "Operative (Midround)"
#define ROLE_PARADOX_CLONE "Paradox Clone"
#define ROLE_REV_HEAD "Head Revolutionary"
-#define ROLE_SENTIENT_DISEASE "Sentient Disease"
#define ROLE_SLEEPER_AGENT "Syndicate Sleeper Agent"
#define ROLE_SPACE_DRAGON "Space Dragon"
#define ROLE_SPIDER "Spider"
@@ -150,7 +149,6 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_OPERATIVE_MIDROUND = 14,
ROLE_PARADOX_CLONE = 0,
ROLE_REVENANT = 0,
- ROLE_SENTIENT_DISEASE = 0,
ROLE_SLEEPER_AGENT = 0,
ROLE_SPACE_DRAGON = 0,
ROLE_SPIDER = 0,
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 4c1411d3cfdfc8..7446d150f0d2e7 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -222,6 +222,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_REVEAL_FISH "reveal_fish"
///This trait gets you a list of fishes that can be caught when examining a fishing spot.
#define TRAIT_EXAMINE_FISHING_SPOT "examine_fishing_spot"
+///Trait given to turfs or objects that can be fished from
+#define TRAIT_FISHING_SPOT "fishing_spot"
+///Trait given to mobs that can fish without a rod
+#define TRAIT_PROFOUND_FISHER "profound_fisher"
/// This trait lets you evaluate someone's fitness level against your own
#define TRAIT_EXAMINE_FITNESS "reveal_power_level"
@@ -1132,4 +1136,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process())
#define TRAIT_BOULDER_BREAKER "boulder_breaker"
+/// Does this item bypass ranged armor checks?
+#define TRAIT_BYPASS_RANGED_ARMOR "bypass_ranged_armor"
+
// END TRAIT DEFINES
diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm
index 4ce15f2e09e129..882e556a801f68 100644
--- a/code/_globalvars/lists/quirks.dm
+++ b/code/_globalvars/lists/quirks.dm
@@ -45,7 +45,7 @@ GLOBAL_LIST_INIT(possible_junkie_addictions, setup_junkie_addictions(list(
)))
///Options for the Smoker quirk to choose from
-GLOBAL_LIST_INIT(possible_smoker_addictions, setup_junkie_addictions(list(
+GLOBAL_LIST_INIT(possible_smoker_addictions, setup_smoker_addictions(list(
/obj/item/storage/fancy/cigarettes,
/obj/item/storage/fancy/cigarettes/cigpack_midori,
/obj/item/storage/fancy/cigarettes/cigpack_uplift,
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 19449c6e4637ef..f4a3be4aee5c7d 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -383,6 +383,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PRESERVE_UI_WITHOUT_CLIENT" = TRAIT_PRESERVE_UI_WITHOUT_CLIENT,
"TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION,
"TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers
+ "TRAIT_PROFOUND_FISHER" = TRAIT_PROFOUND_FISHER,
"TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA,
"TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED,
"TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE,
@@ -507,6 +508,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
"TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT,
"TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL,
+ "TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR,
"TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND,
"TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
"TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT,
@@ -616,6 +618,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_TURF_IGNORE_SLIPPERY" = TRAIT_TURF_IGNORE_SLIPPERY,
"TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN,
"TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF,
+ "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT,
),
))
diff --git a/code/_onclick/click_alt.dm b/code/_onclick/click_alt.dm
index 11419a60816929..7f762a6e920ea9 100644
--- a/code/_onclick/click_alt.dm
+++ b/code/_onclick/click_alt.dm
@@ -11,7 +11,10 @@
return
// Is it visible (and we're not wearing it (our clothes are invisible))?
- if(!(src in viewers(7, target)) && !CanReach(target))
+ if(!CAN_I_SEE(target))
+ return
+
+ if(is_blind() && !IN_GIVEN_RANGE(src, target, 1))
return
var/turf/tile = get_turf(target)
diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm
index 506226b41ead00..bcdcd0e74fed12 100644
--- a/code/_onclick/hud/parallax/parallax.dm
+++ b/code/_onclick/hud/parallax/parallax.dm
@@ -11,6 +11,10 @@
for(var/atom/movable/screen/plane_master/parallax as anything in get_true_plane_masters(PLANE_SPACE_PARALLAX))
parallax.unhide_plane(screenmob)
+ if(isnull(C.parallax_rock))
+ C.parallax_rock = new(null, src)
+ C.screen |= C.parallax_rock
+
if(!length(C.parallax_layers_cached))
C.parallax_layers_cached = list()
C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src)
@@ -25,7 +29,7 @@
if (length(C.parallax_layers) > C.parallax_layers_max)
C.parallax_layers.len = C.parallax_layers_max
- C.screen |= (C.parallax_layers)
+ C.parallax_rock.vis_contents = C.parallax_layers
// We could do not do parallax for anything except the main plane group
// This could be changed, but it would require refactoring this whole thing
// And adding non client particular hooks for all the inputs, and I do not have the time I'm sorry :(
@@ -44,7 +48,7 @@
/datum/hud/proc/remove_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
var/client/C = screenmob.client
- C.screen -= (C.parallax_layers_cached)
+ C.screen -= (C.parallax_rock)
for(var/atom/movable/screen/plane_master/plane_master as anything in screenmob.hud_used.get_true_plane_masters(PLANE_SPACE))
if(screenmob != mymob)
C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen
@@ -104,83 +108,65 @@
update_parallax(screen_mob)
// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
-/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = 0, skip_windups, mob/viewmob)
+/datum/hud/proc/set_parallax_movedir(new_parallax_movedir = NONE, skip_windups, mob/viewmob)
. = FALSE
var/mob/screenmob = viewmob || mymob
var/client/C = screenmob.client
if(new_parallax_movedir == C.parallax_movedir)
return
- var/animatedir = new_parallax_movedir
- if(new_parallax_movedir == FALSE)
- var/animate_time = 0
- for(var/thing in C.parallax_layers)
- var/atom/movable/screen/parallax_layer/L = thing
- L.icon_state = initial(L.icon_state)
- L.update_o(C.view)
- var/T = PARALLAX_LOOP_TIME / L.speed
- if (T > animate_time)
- animate_time = T
- C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME)
- animatedir = C.parallax_movedir
-
- var/matrix/newtransform
- switch(animatedir)
+
+ var/animation_dir = new_parallax_movedir || C.parallax_movedir
+ var/matrix/new_transform
+ switch(animation_dir)
if(NORTH)
- newtransform = matrix(1, 0, 0, 0, 1, 480)
+ new_transform = matrix(1, 0, 0, 0, 1, 480)
if(SOUTH)
- newtransform = matrix(1, 0, 0, 0, 1,-480)
+ new_transform = matrix(1, 0, 0, 0, 1,-480)
if(EAST)
- newtransform = matrix(1, 0, 480, 0, 1, 0)
+ new_transform = matrix(1, 0, 480, 0, 1, 0)
if(WEST)
- newtransform = matrix(1, 0,-480, 0, 1, 0)
-
- var/shortesttimer
- if(!skip_windups)
- for(var/thing in C.parallax_layers)
- var/atom/movable/screen/parallax_layer/L = thing
-
- var/T = PARALLAX_LOOP_TIME / L.speed
- if (isnull(shortesttimer))
- shortesttimer = T
- if (T < shortesttimer)
- shortesttimer = T
- L.transform = newtransform
- animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW)
- if (new_parallax_movedir)
- L.transform = newtransform
- animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter
+ new_transform = matrix(1, 0,-480, 0, 1, 0)
+
+ var/longest_timer = 0
+ for(var/key in C.parallax_animate_timers)
+ deltimer(C.parallax_animate_timers[key])
+ C.parallax_animate_timers = list()
+ for(var/atom/movable/screen/parallax_layer/layer as anything in C.parallax_layers)
+ var/scaled_time = PARALLAX_LOOP_TIME / layer.speed
+ if(new_parallax_movedir == NONE) // If we're stopping, we need to stop on the same dime, yeah?
+ scaled_time = PARALLAX_LOOP_TIME
+ longest_timer = max(longest_timer, scaled_time)
+
+ if(skip_windups)
+ update_parallax_motionblur(C, layer, new_parallax_movedir, new_transform)
+ continue
- C.parallax_movedir = new_parallax_movedir
- if (C.parallax_animate_timer)
- deltimer(C.parallax_animate_timer)
- var/datum/callback/CB = CALLBACK(src, PROC_REF(update_parallax_motionblur), C, animatedir, new_parallax_movedir, newtransform)
- if(skip_windups)
- CB.Invoke()
- else
- C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE)
+ layer.transform = new_transform
+ animate(layer, transform = matrix(), time = scaled_time, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT))
+ if (new_parallax_movedir == NONE)
+ continue
+ //queue up another animate so lag doesn't create a shutter
+ animate(transform = new_transform, time = 0)
+ animate(transform = matrix(), time = scaled_time / 2)
+ C.parallax_animate_timers[layer] = addtimer(CALLBACK(src, PROC_REF(update_parallax_motionblur), C, layer, new_parallax_movedir, new_transform), scaled_time, TIMER_CLIENT_TIME|TIMER_STOPPABLE)
+ C.dont_animate_parallax = world.time + min(longest_timer, PARALLAX_LOOP_TIME)
+ C.parallax_movedir = new_parallax_movedir
-/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform)
+/datum/hud/proc/update_parallax_motionblur(client/C, atom/movable/screen/parallax_layer/layer, new_parallax_movedir, matrix/new_transform)
if(!C)
return
- C.parallax_animate_timer = FALSE
- for(var/thing in C.parallax_layers)
- var/atom/movable/screen/parallax_layer/L = thing
- if (!new_parallax_movedir)
- animate(L)
- continue
-
- var/newstate = initial(L.icon_state)
- var/T = PARALLAX_LOOP_TIME / L.speed
-
- if (newstate in icon_states(L.icon))
- L.icon_state = newstate
- L.update_o(C.view)
-
- L.transform = newtransform
-
- animate(L, transform = L.transform, time = 0, loop = -1, flags = ANIMATION_END_NOW)
- animate(transform = matrix(), time = T)
+ C.parallax_animate_timers -= layer
+
+ // If we are moving in a direction, we used the QUAD_EASING function with EASE_IN
+ // This means our position function is x^2. This is always LESS then the linear we're using here
+ // But if we just used the same time delay, our rate of change would mismatch. f'(1) = 2x for quad easing, rather then the 1 we get for linear
+ // (This is because of how derivatives work right?)
+ // Because of this, while our actual rate of change from before was PARALLAX_LOOP_TIME, our perceived rate of change was PARALLAX_LOOP_TIME / 2 (lower == faster).
+ // Let's account for that here
+ var/scaled_time = (PARALLAX_LOOP_TIME / layer.speed) / 2
+ animate(layer, transform = new_transform, time = 0, loop = -1, flags = ANIMATION_END_NOW)
+ animate(transform = matrix(), time = scaled_time)
/datum/hud/proc/update_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
@@ -217,36 +203,41 @@
var/our_speed = parallax_layer.speed
var/change_x
var/change_y
+ var/old_x = parallax_layer.offset_x
+ var/old_y = parallax_layer.offset_y
if(parallax_layer.absolute)
// We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much
- change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x
- change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y
+ change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + old_x
+ change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + old_y
else
change_x = offset_x * our_speed
change_y = offset_y * our_speed
// This is how we tile parralax sprites
// It doesn't use change because we really don't want to animate this
- if(parallax_layer.offset_x - change_x > 240)
+ if(old_x - change_x > 240)
parallax_layer.offset_x -= 480
- else if(parallax_layer.offset_x - change_x < -240)
+ parallax_layer.pixel_w = parallax_layer.offset_x
+ else if(old_x - change_x < -240)
parallax_layer.offset_x += 480
- if(parallax_layer.offset_y - change_y > 240)
+ parallax_layer.pixel_w = parallax_layer.offset_x
+ if(old_y - change_y > 240)
parallax_layer.offset_y -= 480
- else if(parallax_layer.offset_y - change_y < -240)
+ parallax_layer.pixel_z = parallax_layer.offset_y
+ else if(old_y - change_y < -240)
parallax_layer.offset_y += 480
+ parallax_layer.pixel_z = parallax_layer.offset_y
- // Now that we have our offsets, let's do our positioning
parallax_layer.offset_x -= change_x
parallax_layer.offset_y -= change_y
-
- parallax_layer.screen_loc = "CENTER-7:[round(parallax_layer.offset_x, 1)],CENTER-7:[round(parallax_layer.offset_y, 1)]"
-
- // We're going to use a transform to "glide" that last movement out, so it looks nicer
+ // Now that we have our offsets, let's do our positioning
+ // We're going to use an animate to "glide" that last movement out, so it looks nicer
// Don't do any animates if we're not actually moving enough distance yeah? thanks lad
if(run_parralax && (largest_change * our_speed > 1))
- parallax_layer.transform = matrix(1,0,change_x, 0,1,change_y)
- animate(parallax_layer, transform=matrix(), time = glide_rate)
+ animate(parallax_layer, pixel_w = round(parallax_layer.offset_x, 1), pixel_z = round(parallax_layer.offset_y, 1), time = glide_rate)
+ else
+ parallax_layer.pixel_w = round(parallax_layer.offset_x, 1)
+ parallax_layer.pixel_z = round(parallax_layer.offset_y, 1)
/atom/movable/proc/update_parallax_contents()
for(var/mob/client_mob as anything in client_mobs_in_contents)
@@ -258,6 +249,15 @@
var/area/areaobj = get_area(client.eye)
hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE)
+// Root object for parallax, all parallax layers are drawn onto this
+INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_home)
+/atom/movable/screen/parallax_home
+ icon = null
+ blend_mode = BLEND_ADD
+ plane = PLANE_SPACE_PARALLAX
+ screen_loc = "CENTER-7,CENTER-7"
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
// We need parallax to always pass its args down into initialize, so we immediate init it
INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer)
/atom/movable/screen/parallax_layer
@@ -266,9 +266,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer)
var/offset_x = 0
var/offset_y = 0
var/absolute = FALSE
+ appearance_flags = APPEARANCE_UI | KEEP_TOGETHER
blend_mode = BLEND_ADD
plane = PLANE_SPACE_PARALLAX
- screen_loc = "CENTER-7,CENTER-7"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner, template = FALSE)
@@ -302,15 +302,17 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer)
// Turn the view size into a grid of correctly scaled overlays
var/list/viewscales = getviewsize(view)
- var/countx = CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1
- var/county = CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1
+ // This could be half the size but we need to provide space for parallax movement on mob movement, and movement on scroll from shuttles, so like this instead
+ var/countx = (CEILING((viewscales[1] / 2) * parallax_scaler, 1) + 1)
+ var/county = (CEILING((viewscales[2] / 2) * parallax_scaler, 1) + 1)
var/list/new_overlays = new
for(var/x in -countx to countx)
for(var/y in -county to county)
if(x == 0 && y == 0)
continue
var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state)
- texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480)
+ texture_overlay.pixel_w += 480 * x
+ texture_overlay.pixel_z += 480 * y
new_overlays += texture_overlay
cut_overlays()
add_overlay(new_overlays)
diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm
index dbf4e0af5310db..f3bb3713225c91 100644
--- a/code/_onclick/hud/picture_in_picture.dm
+++ b/code/_onclick/hud/picture_in_picture.dm
@@ -41,7 +41,7 @@
/atom/movable/screen/movable/pic_in_pic/proc/make_backgrounds()
standard_background = new /mutable_appearance()
- standard_background.icon = 'icons/misc/pic_in_pic.dmi'
+ standard_background.icon = 'icons/hud/pic_in_pic.dmi'
standard_background.icon_state = "background"
standard_background.layer = SPACE_LAYER
@@ -51,7 +51,7 @@
move_tab = new /mutable_appearance()
//all these properties are always the same, and since adding something to the overlay
//list makes a copy, there is no reason to make a new one each call
- move_tab.icon = 'icons/misc/pic_in_pic.dmi'
+ move_tab.icon = 'icons/hud/pic_in_pic.dmi'
move_tab.icon_state = "move"
move_tab.plane = HUD_PLANE
var/matrix/M = matrix()
@@ -63,7 +63,7 @@
button_x = new /atom/movable/screen/component_button(null, src)
var/mutable_appearance/MA = new /mutable_appearance()
MA.name = "close"
- MA.icon = 'icons/misc/pic_in_pic.dmi'
+ MA.icon = 'icons/hud/pic_in_pic.dmi'
MA.icon_state = "x"
MA.plane = HUD_PLANE
button_x.appearance = MA
@@ -76,7 +76,7 @@
button_expand = new /atom/movable/screen/component_button(null, src)
var/mutable_appearance/MA = new /mutable_appearance()
MA.name = "expand"
- MA.icon = 'icons/misc/pic_in_pic.dmi'
+ MA.icon = 'icons/hud/pic_in_pic.dmi'
MA.icon_state = "expand"
MA.plane = HUD_PLANE
button_expand.appearance = MA
@@ -89,7 +89,7 @@
button_shrink = new /atom/movable/screen/component_button(null, src)
var/mutable_appearance/MA = new /mutable_appearance()
MA.name = "shrink"
- MA.icon = 'icons/misc/pic_in_pic.dmi'
+ MA.icon = 'icons/hud/pic_in_pic.dmi'
MA.icon_state = "shrink"
MA.plane = HUD_PLANE
button_shrink.appearance = MA
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 090b8876cba441..88d5dada28154a 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -197,39 +197,7 @@
if(!R.client)
return
- if(R.shown_robot_modules && screenmob.hud_used.hud_shown)
- //Modules display is shown
- screenmob.client.screen += module_store_icon //"store" icon
-
- if(!R.model.modules)
- to_chat(usr, span_warning("Selected model has no modules to select!"))
- return
-
- if(!R.robot_modules_background)
- return
-
- var/display_rows = max(CEILING(length(R.model.get_inactive_modules()) / 8, 1),1)
- R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
- screenmob.client.screen += R.robot_modules_background
-
- var/x = -4 //Start at CENTER-4,SOUTH+1
- var/y = 1
-
- for(var/atom/movable/A in R.model.get_inactive_modules())
- //Module is not currently active
- screenmob.client.screen += A
- if(x < 0)
- A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
- else
- A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
- SET_PLANE_IMPLICIT(A, ABOVE_HUD_PLANE)
-
- x++
- if(x == 4)
- x = -4
- y++
-
- else
+ if(!R.shown_robot_modules || !screenmob.hud_used.hud_shown)
//Modules display is hidden
screenmob.client.screen -= module_store_icon //"store" icon
@@ -238,6 +206,41 @@
screenmob.client.screen -= A
R.shown_robot_modules = 0
screenmob.client.screen -= R.robot_modules_background
+ return
+
+ //Modules display is shown
+ screenmob.client.screen += module_store_icon //"store" icon
+
+ if(!R.model.modules)
+ to_chat(usr, span_warning("Selected model has no modules to select!"))
+ return
+
+ if(!R.robot_modules_background)
+ return
+
+ var/list/usable_modules = R.model.get_usable_modules()
+
+ var/display_rows = max(CEILING(length(usable_modules) / 8, 1),1)
+ R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
+ screenmob.client.screen += R.robot_modules_background
+
+ for(var/i in 1 to length(usable_modules))
+ var/atom/movable/A = usable_modules[i]
+ if(A in R.held_items)
+ //Module is currently active
+ continue
+
+ // Arrange in a grid x=-4 to 3 and y=1 to display_rows
+ var/x = (i - 1) % 8 - 4
+ var/y = floor((i - 1) / 8) + 1
+
+ screenmob.client.screen += A
+ if(x < 0)
+ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
+ else
+ A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
+ SET_PLANE_IMPLICIT(A, ABOVE_HUD_PLANE)
+
/datum/hud/robot/persistent_inventory_update(mob/viewer)
if(!mymob)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index ea22327f13592a..6f30f2a51355d1 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -793,7 +793,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash)
food_image = image(icon = food_icon, icon_state = food_icon_state, pixel_x = -5)
food_image.plane = plane
food_image.appearance_flags |= KEEP_APART // To be unaffected by filters applied to src
- food_image.add_filter("simple_outline", 2, outline_filter(1, COLOR_BLACK))
+ food_image.add_filter("simple_outline", 2, outline_filter(1, COLOR_BLACK, OUTLINE_SHARP))
underlays += food_image // To be below filters applied to src
SetInvisibility(INVISIBILITY_ABSTRACT, name) // Start invisible, update later
diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
index 539e6d234c00e0..8ac5f27c4c9b9b 100644
--- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
+++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
@@ -756,26 +756,6 @@
log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.")
return revenant
-/// Midround Sentient Disease Ruleset (From Ghosts)
-/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease
- name = "Sentient Disease"
- midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY
- antag_datum = /datum/antagonist/disease
- antag_flag = ROLE_SENTIENT_DISEASE
- required_candidates = 1
- minimum_players = 25
- weight = 4
- cost = 8
- repeatable = TRUE
-
-/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant)
- var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center())
- virus.key = applicant.key
- INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name))
- message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by the midround ruleset.")
- log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.")
- return virus
-
/// Midround Space Pirates Ruleset (From Ghosts)
/datum/dynamic_ruleset/midround/pirates
name = "Space Pirates"
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 50e437195a74a7..b117a35718196a 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -65,8 +65,13 @@ SUBSYSTEM_DEF(events)
/datum/controller/subsystem/events/proc/reschedule()
scheduled = world.time + rand(frequency_lower, max(frequency_lower,frequency_upper))
-//selects a random event based on whether it can occur and it's 'weight'(probability)
-/datum/controller/subsystem/events/proc/spawnEvent()
+/**
+ * Selects a random event based on whether it can occur and it's 'weight'(probability)
+ *
+ * Arguments:
+ * * excluded_event - The event path we will be foregoing, if present.
+ */
+/datum/controller/subsystem/events/proc/spawnEvent(datum/round_event_control/excluded_event)
set waitfor = FALSE //for the admin prompt
if(!CONFIG_GET(flag/allow_random_events))
return
@@ -77,6 +82,8 @@ SUBSYSTEM_DEF(events)
var/list/event_roster = list()
for(var/datum/round_event_control/event_to_check in control)
+ if(excluded_event && event_to_check.typepath == excluded_event.typepath) //If an event has been rerolled we won't just roll the same one again.
+ continue
if(!event_to_check.can_spawn_event(players_amt))
continue
if(event_to_check.weight < 0) //for round-start events etc.
diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm
index dc06c2bc6ae7f3..46d5b0fd57ba51 100644
--- a/code/controllers/subsystem/profiler.dm
+++ b/code/controllers/subsystem/profiler.dm
@@ -1,11 +1,8 @@
-#define PROFILER_FILENAME "profiler.json"
-#define SENDMAPS_FILENAME "sendmaps.json"
-
SUBSYSTEM_DEF(profiler)
name = "Profiler"
init_order = INIT_ORDER_PROFILER
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
- wait = 3000
+ wait = 300 SECONDS
var/fetch_cost = 0
var/write_cost = 0
@@ -56,12 +53,12 @@ SUBSYSTEM_DEF(profiler)
if(!length(current_profile_data)) //Would be nice to have explicit proc to check this
stack_trace("Warning, profiling stopped manually before dump.")
- var/prof_file = file("[GLOB.log_directory]/[PROFILER_FILENAME]")
+ var/prof_file = file("[GLOB.log_directory]/profiler/profiler-[round(world.time * 0.1, 10)].json")
if(fexists(prof_file))
fdel(prof_file)
if(!length(current_sendmaps_data)) //Would be nice to have explicit proc to check this
stack_trace("Warning, sendmaps profiling stopped manually before dump.")
- var/sendmaps_file = file("[GLOB.log_directory]/[SENDMAPS_FILENAME]")
+ var/sendmaps_file = file("[GLOB.log_directory]/profiler/sendmaps-[round(world.time * 0.1, 10)].json")
if(fexists(sendmaps_file))
fdel(sendmaps_file)
@@ -70,5 +67,3 @@ SUBSYSTEM_DEF(profiler)
WRITE_FILE(sendmaps_file, current_sendmaps_data)
write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
-#undef PROFILER_FILENAME
-#undef SENDMAPS_FILENAME
diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm
index 18fe9f22e80245..1c290c5f224c1b 100644
--- a/code/datums/actions/cooldown_action.dm
+++ b/code/datums/actions/cooldown_action.dm
@@ -171,6 +171,9 @@
next_use_time = world.time + override_cooldown_time
else
next_use_time = world.time + cooldown_time
+ // Don't start a cooldown if we have a cooldown time of 0 seconds
+ if(next_use_time == world.time)
+ return
build_all_button_icons(UPDATE_BUTTON_STATUS)
START_PROCESSING(SSfastprocess, src)
diff --git a/code/datums/actions/mobs/ground_slam.dm b/code/datums/actions/mobs/ground_slam.dm
new file mode 100644
index 00000000000000..e00799196b5898
--- /dev/null
+++ b/code/datums/actions/mobs/ground_slam.dm
@@ -0,0 +1,32 @@
+/datum/action/cooldown/mob_cooldown/ground_slam
+ name = "Ground Slam"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Slams the ground sending out a shockwave around you."
+ cooldown_time = 10 SECONDS
+ /// The range of the slam
+ var/range = 5
+ /// The delay before the shockwave expands it's range
+ var/delay = 3
+ /// How far hit targets are thrown
+ var/throw_range = 8
+ /// Whether the target can move or not while the slam is occurring
+ var/can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/ground_slam/Activate(atom/target_atom)
+ disable_cooldown_actions()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE)
+ do_slam(target_atom)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
+ StartCooldown()
+ enable_cooldown_actions()
+ return TRUE
+
+/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase
+/datum/action/cooldown/mob_cooldown/ground_slam/proc/do_slam(atom/target)
+ wendigo_slam(owner, range, delay, throw_range)
+
+/datum/action/cooldown/mob_cooldown/ground_slam/proc/on_move(atom/source, atom/new_loc)
+ SIGNAL_HANDLER
+ if(!can_move)
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm
index be7eff8963363f..d8f8e6bdf64276 100644
--- a/code/datums/actions/mobs/projectileattack.dm
+++ b/code/datums/actions/mobs/projectileattack.dm
@@ -16,14 +16,23 @@
var/default_projectile_spread = 0
/// The multiplier to the projectiles speed (a value of 2 makes it twice as slow, 0.5 makes it twice as fast)
var/projectile_speed_multiplier = 1
+ /// Whether the target can move or not while the attack is occurring
+ var/can_move = TRUE
/datum/action/cooldown/mob_cooldown/projectile_attack/Activate(atom/target_atom)
disable_cooldown_actions()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE)
attack_sequence(owner, target_atom)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
StartCooldown()
enable_cooldown_actions()
return TRUE
+/datum/action/cooldown/mob_cooldown/projectile_attack/proc/on_move(atom/source, atom/new_loc)
+ SIGNAL_HANDLER
+ if(!can_move)
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
+
/datum/action/cooldown/mob_cooldown/projectile_attack/proc/attack_sequence(mob/living/firer, atom/target)
shoot_projectile(firer, target, null, firer, rand(-default_projectile_spread, default_projectile_spread), null)
@@ -151,6 +160,25 @@
SLEEP_CHECK_DEATH(1.5 SECONDS, owner)
return ..()
+/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/spiral
+ can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo/create_spiral_attack(mob/living/firer, atom/target, negative = pick(TRUE, FALSE))
+ wendigo_scream(firer)
+ var/shots_spiral = 40
+ var/angle_to_target = get_angle(firer, target)
+ var/spiral_direction = pick(-1, 1)
+ for(var/shot in 1 to shots_spiral)
+ var/shots_per_tick = 5 - enraged * 3
+ var/angle_change = (5 + enraged * shot / 6) * spiral_direction
+ for(var/count in 1 to shots_per_tick)
+ var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(1, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
+
/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe
name = "All Directions"
button_icon = 'icons/effects/effects.dmi'
@@ -192,6 +220,13 @@
shoot_projectile(firer, target, null, firer, spread, null)
+/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/wendigo
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave
+ shot_angles = list(-20, -10, 0, 10, 20)
+ projectile_speed_multiplier = 4
+
+
/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus
cooldown_time = 0.5 SECONDS
@@ -327,3 +362,54 @@
colossus.telegraph()
colossus.dir_shots.attack_sequence(firer, target)
SLEEP_CHECK_DEATH(1 SECONDS, firer)
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle
+ name = "Alternating Shots"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Fires projectiles around you in an alternating fashion."
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave
+ can_move = FALSE
+ var/enraged = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle/attack_sequence(mob/living/firer, atom/target)
+ wendigo_scream(firer)
+ if(enraged)
+ projectile_speed_multiplier = 1
+ else
+ projectile_speed_multiplier = 1.5
+ var/shots_per = 24
+ for(var/shoot_times in 1 to 8)
+ var/offset = shoot_times % 2
+ for(var/shot in 1 to shots_per)
+ var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(6 - enraged * 2, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/wave
+ name = "Wave Shots"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Fires projectiles around you in a circular wave."
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave
+ can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/wave/attack_sequence(mob/living/firer, atom/target)
+ wendigo_scream(firer)
+ var/shots_per = 7
+ var/difference = 360 / shots_per
+ var/wave_direction = pick(-1, 1)
+ switch(wave_direction)
+ if(-1)
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave/alternate
+ if(1)
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave
+ for(var/shoot_times in 1 to 32)
+ for(var/shot in 1 to shots_per)
+ var/angle = shot * difference + shoot_times * 5 * wave_direction * -1
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(2, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
diff --git a/code/datums/actions/mobs/teleport.dm b/code/datums/actions/mobs/teleport.dm
new file mode 100644
index 00000000000000..7b7ffddf30b3d6
--- /dev/null
+++ b/code/datums/actions/mobs/teleport.dm
@@ -0,0 +1,25 @@
+/datum/action/cooldown/mob_cooldown/teleport
+ name = "Teleport"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Allows you to teleport a certain distance away from a position in a random direction."
+ cooldown_time = 10 SECONDS
+ /// The distance from the target
+ var/radius = 6
+
+/datum/action/cooldown/mob_cooldown/teleport/Activate(atom/target_atom)
+ disable_cooldown_actions()
+ teleport_to(target_atom)
+ StartCooldown()
+ enable_cooldown_actions()
+ return TRUE
+
+/// Handles randomly teleporting the owner around the target in view
+/datum/action/cooldown/mob_cooldown/teleport/proc/teleport_to(atom/teleport_target)
+ var/list/possible_ends = view(radius, teleport_target.loc) - view(radius - 1, teleport_target.loc)
+ for(var/turf/closed/cant_teleport_turf in possible_ends)
+ possible_ends -= cant_teleport_turf
+ if(!possible_ends.len)
+ return
+ var/turf/end = pick(possible_ends)
+ do_teleport(owner, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm
index 1a981f90aedbd8..3753b077a512f1 100644
--- a/code/datums/ai/_ai_controller.dm
+++ b/code/datums/ai/_ai_controller.dm
@@ -473,7 +473,10 @@ multiple modular subtrees with behaviors
/// Use this proc to define how your controller defines what access the pawn has for the sake of pathfinding. Return the access list you want to use
/datum/ai_controller/proc/get_access()
- return
+ if(!isliving(pawn))
+ return
+ var/mob/living/living_pawn = pawn
+ return living_pawn.get_access()
///Returns the minimum required distance to preform one of our current behaviors. Honestly this should just be cached or something but fuck you
/datum/ai_controller/proc/get_minimum_distance()
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm b/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm
index 74ec9d98191a0c..6cae6132d36887 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/express_happiness.dm
@@ -7,7 +7,7 @@
var/happiness_key = BB_BASIC_HAPPINESS
///list of emotions we relay when happy
var/static/list/happy_emotions = list(
- "celebrate happily!",
+ "celebrates happily!",
"dances around in excitement!",
)
///our moderate emotions
diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm
index 4884ed8f4332a6..d300fcc371349b 100644
--- a/code/datums/chatmessage.dm
+++ b/code/datums/chatmessage.dm
@@ -144,10 +144,10 @@
// Append radio icon if from a virtual speaker
if (extra_classes.Find("virtual-speaker"))
- var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "radio")
+ var/image/r_icon = image('icons/ui/chat/chat_icons.dmi', icon_state = "radio")
LAZYADD(prefixes, "\icon[r_icon]")
else if (extra_classes.Find("emote"))
- var/image/r_icon = image('icons/ui_icons/chat/chat_icons.dmi', icon_state = "emote")
+ var/image/r_icon = image('icons/ui/chat/chat_icons.dmi', icon_state = "emote")
LAZYADD(prefixes, "\icon[r_icon]")
chat_color_name_to_use = target.get_visible_name(add_id_name = FALSE) // use face name for nonverbal messages
diff --git a/code/datums/components/bloody_spreader.dm b/code/datums/components/bloody_spreader.dm
index b30000a115c6a4..823bc5e9507ff3 100644
--- a/code/datums/components/bloody_spreader.dm
+++ b/code/datums/components/bloody_spreader.dm
@@ -17,7 +17,7 @@
signals_to_add += list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)
var/atom/atom_parent = parent
if(atom_parent.atom_storage)
- signals_to_add += list(COMSIG_STORAGE_STORED_ITEM)
+ signals_to_add += list(COMSIG_ATOM_STORED_ITEM)
else if(isstructure(parent))
signals_to_add += list(COMSIG_ATOM_ATTACK_HAND)
diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm
index 13169e4d0cdd06..eec7b4112aa693 100644
--- a/code/datums/components/boomerang.dm
+++ b/code/datums/components/boomerang.dm
@@ -11,8 +11,10 @@
var/thrower_easy_catch_enabled = FALSE
///This cooldown prevents our 2 throwing signals from firing too often based on how we implement those signals within thrown impacts.
COOLDOWN_DECLARE(last_boomerang_throw)
+ ///Adds an extra big of flavor text on examine.
+ var/examine_message
-/datum/component/boomerang/Initialize(boomerang_throw_range, thrower_easy_catch_enabled)
+/datum/component/boomerang/Initialize(boomerang_throw_range, thrower_easy_catch_enabled, examine_message)
. = ..()
if(!isitem(parent)) //Only items support being thrown around like a boomerang, feel free to make this apply to humans later on.
return COMPONENT_INCOMPATIBLE
@@ -22,14 +24,18 @@
src.boomerang_throw_range = boomerang_throw_range
if(thrower_easy_catch_enabled)
src.thrower_easy_catch_enabled = thrower_easy_catch_enabled
+ if(examine_message)
+ src.examine_message = examine_message
/datum/component/boomerang/RegisterWithParent()
RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, PROC_REF(prepare_throw)) //Collect data on current thrower and the throwing datum
RegisterSignal(parent, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(return_missed_throw))
RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(return_hit_throw))
+ if(examine_message)
+ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
/datum/component/boomerang/UnregisterFromParent()
- UnregisterSignal(parent, list(COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_THROW_LANDED, COMSIG_MOVABLE_IMPACT))
+ UnregisterSignal(parent, list(COMSIG_MOVABLE_POST_THROW, COMSIG_MOVABLE_THROW_LANDED, COMSIG_MOVABLE_IMPACT, COMSIG_ATOM_EXAMINE))
/**
* Proc'd before the first thrown is performed in order to gather information regarding each throw as well as handle throw_mode as necessary.
@@ -40,11 +46,13 @@
/datum/component/boomerang/proc/prepare_throw(datum/source, datum/thrownthing/throwingdatum, spin)
SIGNAL_HANDLER
var/mob/thrower = throwingdatum?.get_thrower()
- if(thrower_easy_catch_enabled && thrower)
- if(iscarbon(thrower))
- var/mob/living/carbon/carbon_mob = thrower
- carbon_mob.throw_mode_on(THROW_MODE_TOGGLE)
- return
+ if(thrower_easy_catch_enabled && iscarbon(thrower))
+ var/mob/living/carbon/carbon_mob = thrower
+ carbon_mob.throw_mode_on(THROW_MODE_TOGGLE)
+
+/datum/component/boomerang/proc/on_examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ examine_list += examine_message
/**
* Proc that triggers when the thrown boomerang hits an object.
diff --git a/code/datums/components/clickbox.dm b/code/datums/components/clickbox.dm
index 5d840b16a8ed26..b38a5f1c09b453 100644
--- a/code/datums/components/clickbox.dm
+++ b/code/datums/components/clickbox.dm
@@ -74,7 +74,7 @@
else if(abs_height && abs_height < min_scale)
clickbox_height = min_scale/height
- clickbox_underlay = mutable_appearance('icons/misc/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA)
+ clickbox_underlay = mutable_appearance('icons/ui/clickbox.dmi', clickbox_icon_state, CLICKBOX_LAYER, alpha = 1, appearance_flags = RESET_COLOR|RESET_ALPHA)
clickbox_underlay.transform = clickbox_underlay.transform.Scale(clickbox_width, clickbox_height)
//Keeps the underlay more or less centered.
clickbox_underlay.pixel_x = x_offset * 1/clickbox_width
diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm
index be536bb792d971..d1ff1b792e17a3 100644
--- a/code/datums/components/creamed.dm
+++ b/code/datums/components/creamed.dm
@@ -50,9 +50,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list(
carbon_parent.add_mood_event("creampie", /datum/mood_event/creampie)
carbon_parent.update_body_parts()
else if(iscorgi(parent))
- normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_corgi")
+ normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_corgi")
else if(isAI(parent))
- normal_overlay = mutable_appearance('icons/effects/creampie.dmi', "creampie_ai")
+ normal_overlay = mutable_appearance('icons/mob/effects/creampie.dmi', "creampie_ai")
RegisterSignals(parent, list(
COMSIG_COMPONENT_CLEAN_ACT,
diff --git a/code/datums/components/echolocation.dm b/code/datums/components/echolocation.dm
index 60a6d0fa8aa3c0..020c47ad875e1b 100644
--- a/code/datums/components/echolocation.dm
+++ b/code/datums/components/echolocation.dm
@@ -4,11 +4,11 @@
/// Time between echolocations. IMPORTANT!! The effective time in local and the effective time in live are very different. The second is noticeably slower,
var/cooldown_time = 1 SECONDS
/// Time for the image to start fading out.
- var/image_expiry_time = 1.4 SECONDS
+ var/image_expiry_time = 0.7 SECONDS
/// Time for the image to fade in.
- var/fade_in_time = 0.4 SECONDS
+ var/fade_in_time = 0.2 SECONDS
/// Time for the image to fade out and delete itself.
- var/fade_out_time = 0.4 SECONDS
+ var/fade_out_time = 0.3 SECONDS
/// Are images static? If yes, spawns them on the turf and makes them not change location. Otherwise they change location and pixel shift with the original.
var/images_are_static = TRUE
/// With mobs that have this echo group in their echolocation receiver trait, we share echo images.
@@ -105,7 +105,7 @@
for(var/mob/living/viewer in filtered)
if(blocking_trait && HAS_TRAIT(viewer, blocking_trait))
continue
- if(HAS_TRAIT_FROM(viewer, TRAIT_ECHOLOCATION_RECEIVER, echo_group))
+ if(HAS_TRAIT_FROM(viewer, TRAIT_ECHOLOCATION_RECEIVER, echo_group) && isnull(receivers[viewer]))
receivers[viewer] = list()
for(var/atom/filtered_atom as anything in filtered)
show_image(saved_appearances["[filtered_atom.icon]-[filtered_atom.icon_state]"] || generate_appearance(filtered_atom), filtered_atom, current_time)
@@ -175,6 +175,7 @@
for(var/atom/rendered_atom as anything in receivers[echolocate_receiver])
if(receivers[echolocate_receiver][rendered_atom]["time"] <= from_when && echolocate_receiver.client)
echolocate_receiver.client.images -= receivers[echolocate_receiver][rendered_atom]["image"]
+ receivers[echolocate_receiver] -= rendered_atom
if(!length(receivers[echolocate_receiver]))
receivers -= echolocate_receiver
diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm
index 2763d583f819c9..fb20588f8c5a1b 100644
--- a/code/datums/components/fishing_spot.dm
+++ b/code/datums/components/fishing_spot.dm
@@ -17,6 +17,7 @@
RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examined_more))
+ ADD_TRAIT(parent, TRAIT_FISHING_SPOT, REF(src))
/datum/component/fishing_spot/Destroy()
fish_source = null
diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm
index fc2081481d937c..0e5341eabbfe5f 100644
--- a/code/datums/components/infective.dm
+++ b/code/datums/components/infective.dm
@@ -45,8 +45,6 @@
RegisterSignal(parent, COMSIG_GLASS_DRANK, PROC_REF(try_infect_drink))
if(isorgan(parent))
RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_insertion))
- else if(istype(parent, /obj/effect/decal/cleanable/blood/gibs))
- RegisterSignal(parent, COMSIG_GIBS_STREAK, PROC_REF(try_infect_streak))
/datum/component/infective/proc/on_organ_insertion(obj/item/organ/target, mob/living/carbon/receiver)
SIGNAL_HANDLER
@@ -180,6 +178,5 @@
COMSIG_ITEM_EQUIPPED,
COMSIG_GLASS_DRANK,
COMSIG_ORGAN_IMPLANTED,
- COMSIG_GIBS_STREAK,
))
qdel(GetComponent(/datum/component/connect_loc_behalf))
diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm
new file mode 100644
index 00000000000000..73c12198777ae0
--- /dev/null
+++ b/code/datums/components/profound_fisher.dm
@@ -0,0 +1,64 @@
+///component that allows player mobs to play the fishing minigame, non-player mobs will "pretend" fish
+/datum/component/profound_fisher
+ ///the fishing rod this mob will use
+ var/obj/item/fishing_rod/mob_fisher/our_rod
+ ///if controlled by an AI, the things this mob can "pretend" fish
+ var/list/npc_fishing_preset
+
+/datum/component/profound_fisher/Initialize(list/npc_fishing_preset = list())
+ if(!isliving(parent))
+ return
+ our_rod = new(parent)
+ src.npc_fishing_preset = npc_fishing_preset
+ ADD_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src))
+
+/datum/component/profound_fisher/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack))
+
+/datum/component/profound_fisher/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)
+ REMOVE_TRAIT(parent, TRAIT_PROFOUND_FISHER, REF(src))
+
+/datum/component/profound_fisher/Destroy()
+ QDEL_NULL(our_rod)
+ return ..()
+
+/datum/component/profound_fisher/proc/pre_attack(datum/source, atom/target)
+ SIGNAL_HANDLER
+
+ if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT))
+ return NONE
+ var/mob/living/living_parent = parent
+ if(!living_parent.CanReach(target))
+ return NONE
+ if(living_parent.client)
+ INVOKE_ASYNC(our_rod, TYPE_PROC_REF(/obj/item, melee_attack_chain), parent, target)
+ else
+ INVOKE_ASYNC(src, PROC_REF(pretend_fish), target)
+ return COMPONENT_HOSTILE_NO_ATTACK
+
+/datum/component/profound_fisher/proc/pretend_fish(atom/target)
+ var/fishing_type
+ for(var/type in npc_fishing_preset)
+ if(!istype(target, type))
+ continue
+ fishing_type = npc_fishing_preset[type]
+ break
+ var/datum/fish_source/fish_spot = GLOB.preset_fish_sources[fishing_type]
+ if(isnull(fish_spot))
+ return null
+ var/obj/effect/fishing_lure/lure = new(get_turf(target), target)
+ var/mob/living/living_parent = parent
+ if(!do_after(living_parent, 10 SECONDS, target = target))
+ qdel(lure)
+ return
+ var/reward_loot = pick_weight(fish_spot.fish_table)
+ if(ispath(reward_loot))
+ new reward_loot(get_turf(living_parent))
+ qdel(lure)
+
+/obj/item/fishing_rod/mob_fisher
+ display_fishing_line = FALSE
+ line = /obj/item/fishing_line/reinforced
+
+
diff --git a/code/datums/components/simple_access.dm b/code/datums/components/simple_access.dm
index a42d784f0c0543..3038b3532906d5 100644
--- a/code/datums/components/simple_access.dm
+++ b/code/datums/components/simple_access.dm
@@ -10,6 +10,7 @@
return COMPONENT_INCOMPATIBLE
access = new_access
RegisterSignal(parent, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access))
+ RegisterSignal(parent, COMSIG_MOB_RETRIEVE_SIMPLE_ACCESS, PROC_REF(retrieve_access))
if(!donor_atom)
return
if(isorgan(donor_atom))
@@ -28,6 +29,10 @@
else
return ACCESS_DISALLOWED
+/datum/component/simple_access/proc/retrieve_access(datum/source, list/access_list)
+ SIGNAL_HANDLER
+ access_list += access
+
/datum/component/simple_access/proc/on_donor_removed(datum/source)
SIGNAL_HANDLER
qdel(src)
diff --git a/code/datums/components/sound_player.dm b/code/datums/components/sound_player.dm
index 9bad9718a05370..fc1ff34041c778 100644
--- a/code/datums/components/sound_player.dm
+++ b/code/datums/components/sound_player.dm
@@ -1,7 +1,7 @@
/**
* Sound Player component
*
- * Component that will play a sound upon recieving some signal
+ * Component that will play a sound upon receiving some signal
*/
/datum/component/sound_player
///Volume of the sound when played
diff --git a/code/datums/components/throwbonus_on_windup.dm b/code/datums/components/throwbonus_on_windup.dm
new file mode 100644
index 00000000000000..ed505d69697dea
--- /dev/null
+++ b/code/datums/components/throwbonus_on_windup.dm
@@ -0,0 +1,172 @@
+/datum/component/throwbonus_on_windup
+ ///the maximum windup bonus
+ var/maximum_bonus = 20
+ ///additional behavior if we exceed the maximum bonus
+ var/datum/callback/pass_maximum_callback
+ ///the player currently winding up their throw
+ var/datum/weakref/holder
+ ///the current bonus we are at
+ var/throwforce_bonus = 0
+ ///the bar relaying feedback to the player
+ var/obj/effect/overlay/windup_bar/our_bar
+ ///any additional behavior we should look for before applying the bonus
+ var/datum/callback/apply_bonus_callback
+ ///sound we play after successfully damaging the enemy with a bonus
+ var/sound_on_success
+ ///effect we play after successfully damaging the enemy with a bonus
+ var/effect_on_success
+ ///how fast we increase the wind up counter on process
+ var/windup_increment_speed
+ ///text we display when we start winding up
+ var/throw_text
+
+/datum/component/throwbonus_on_windup/Initialize(maximum_bonus = 20, windup_increment_speed = 1, pass_maximum_callback, apply_bonus_callback, sound_on_success, effect_on_success, throw_text)
+ . = ..()
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.maximum_bonus = maximum_bonus
+ src.pass_maximum_callback = pass_maximum_callback
+ src.apply_bonus_callback = apply_bonus_callback
+ src.sound_on_success = sound_on_success
+ src.effect_on_success = effect_on_success
+ src.windup_increment_speed = windup_increment_speed
+ src.throw_text = throw_text
+
+/datum/component/throwbonus_on_windup/proc/on_equip(datum/source, mob/living/equipper, slot)
+ SIGNAL_HANDLER
+
+ if(!(slot & ITEM_SLOT_HANDS) || holder?.resolve())
+ return
+ holder = WEAKREF(equipper)
+ RegisterSignal(equipper, COMSIG_LIVING_THROW_MODE_TOGGLE, PROC_REF(throw_change))
+ RegisterSignal(equipper, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_hands_swap))
+ if(equipper.throw_mode)
+ start_windup()
+
+/datum/component/throwbonus_on_windup/proc/start_windup()
+
+ throwforce_bonus = initial(throwforce_bonus)
+ var/mob/living/our_holder = holder?.resolve()
+ if(isnull(holder))
+ return
+ if(throw_text)
+ to_chat(our_holder, span_warning(throw_text))
+ var/list/offset_to_add = get_icon_dimensions(our_holder.icon)
+ var/x_position = CEILING(offset_to_add["width"] * 0.5, 1)
+ our_bar = new()
+ our_bar.maximum_count = maximum_bonus
+ our_bar.pixel_x = x_position
+ our_holder.vis_contents += our_bar
+ START_PROCESSING(SSfastprocess, src)
+
+/datum/component/throwbonus_on_windup/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
+ RegisterSignal(parent, COMSIG_MOVABLE_PRE_IMPACT, PROC_REF(on_thrown))
+
+/datum/component/throwbonus_on_windup/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_PRE_IMPACT))
+ var/atom/our_holder = holder?.resolve()
+ if(!isnull(our_holder))
+ UnregisterSignal(our_holder, list(COMSIG_LIVING_THROW_MODE_TOGGLE, COMSIG_MOB_SWAP_HANDS))
+
+/datum/component/throwbonus_on_windup/Destroy()
+ STOP_PROCESSING(SSfastprocess, src)
+ QDEL_NULL(our_bar)
+ holder = null
+ return ..()
+
+/datum/component/throwbonus_on_windup/proc/throw_change(datum/source, throw_mode)
+ SIGNAL_HANDLER
+
+ if(throw_mode)
+ start_windup()
+ else
+ end_windup()
+
+/datum/component/throwbonus_on_windup/proc/on_hands_swap(mob/living/source)
+ SIGNAL_HANDLER
+
+ if(source.get_active_held_item() != parent)
+ end_windup()
+ return
+
+ if(source.throw_mode)
+ start_windup()
+
+/datum/component/throwbonus_on_windup/process(seconds_per_tick)
+ if(throwforce_bonus > maximum_bonus)
+ var/mob/living/our_holder = holder?.resolve()
+ pass_maximum_callback?.Invoke(our_holder)
+ end_windup()
+ return PROCESS_KILL
+
+ our_bar.recalculate_position(min(throwforce_bonus, maximum_bonus))
+ throwforce_bonus += windup_increment_speed
+
+/datum/component/throwbonus_on_windup/proc/on_move(obj/item/source, atom/entering_loc)
+ SIGNAL_HANDLER
+ end_windup()
+ var/mob/living/our_holder = holder?.resolve()
+ if(isnull(our_holder))
+ return
+ holder = null
+ UnregisterSignal(our_holder, list(COMSIG_LIVING_THROW_MODE_TOGGLE, COMSIG_MOB_SWAP_HANDS))
+
+/datum/component/throwbonus_on_windup/proc/end_windup()
+ QDEL_NULL(our_bar)
+ STOP_PROCESSING(SSfastprocess, src)
+
+/datum/component/throwbonus_on_windup/proc/on_thrown(datum/source, atom/hit_atom, datum/thrownthing/throwingdatum)
+ SIGNAL_HANDLER
+
+ var/damage_to_apply = throwforce_bonus
+ throwforce_bonus = initial(throwforce_bonus)
+ if(!isliving(hit_atom))
+ return
+
+ if(apply_bonus_callback && !apply_bonus_callback.Invoke(hit_atom, damage_to_apply))
+ return
+
+ if(effect_on_success)
+ new effect_on_success(get_turf(hit_atom))
+ if(sound_on_success)
+ playsound(hit_atom, sound_on_success, 50, TRUE)
+
+ var/mob/living/living_target = hit_atom
+ living_target.apply_damage(damage_to_apply)
+
+/obj/effect/overlay/windup_bar
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ anchored = TRUE
+ vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "windup_bar"
+ layer = ABOVE_ALL_MOB_LAYER
+ ///the maximum windup bonus
+ var/maximum_count = INFINITY
+ ///the current count we are at
+ var/current_count = 0
+
+/obj/effect/overlay/windup_bar/proc/recalculate_position(input_count)
+ current_count = input_count
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/effect/overlay/windup_bar/update_overlays()
+ . = ..()
+ var/static/list/bar_positions = list(0, 2, 4, 6, 8)
+ var/current_percentage = current_count / maximum_count
+ var/bars_to_add = CEILING(length(bar_positions) * current_percentage, 1)
+ for(var/curr_number in 1 to bars_to_add)
+ var/bar_color
+ switch(curr_number)
+ if(1 to 2)
+ bar_color = "windup_red"
+ if(2 to 4)
+ bar_color = "windup_green"
+ if(4 to 5)
+ bar_color = "windup_purple"
+ var/mutable_appearance/bar_overlay = mutable_appearance(icon = icon, icon_state = bar_color, layer = ABOVE_HUD_PLANE)
+ bar_overlay.pixel_y = bar_positions[curr_number]
+ . += bar_overlay
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index bc60049e73ea69..da0a849989ec10 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -140,9 +140,9 @@
if(affected_mob.mob_mood) // this and most other modifiers below a shameless rip from sleeping healing buffs, but feeling good helps make it go away quicker
switch(affected_mob.mob_mood.sanity_level)
if(SANITY_LEVEL_GREAT)
- recovery_prob += 0.2
+ recovery_prob += 0.4
if(SANITY_LEVEL_NEUTRAL)
- recovery_prob += 0.1
+ recovery_prob += 0.2
if(SANITY_LEVEL_DISTURBED)
recovery_prob += 0
if(SANITY_LEVEL_UNSTABLE)
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 93edea10b41c60..3d8bfdf8837dd8 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -266,12 +266,13 @@
properties["severity"] = round((properties["severity"] / 2), 1)
properties["severity"] *= (symptoms.len / VIRUS_SYMPTOM_LIMIT) //fewer symptoms, less severity
properties["severity"] = clamp(properties["severity"], 1, 7)
+ properties["capacity"] = get_symptom_weights()
// Assign the properties that are in the list.
/datum/disease/advance/proc/assign_properties()
if(properties?.len)
- if(properties["stealth"] >= 2)
+ if(properties["stealth"] >= properties["severity"])
visibility_flags |= HIDDEN_SCANNER
else
visibility_flags &= ~HIDDEN_SCANNER
@@ -287,7 +288,7 @@
spreading_modifier = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 1, 10) // can be between 1 and 10
- stage_prob = max(0.5 * properties["stage_rate"], 1)
+ stage_prob = max(0.3 * properties["stage_rate"], 1)
set_severity(round(properties["severity"]), 1)
generate_cure(properties)
else
@@ -341,7 +342,7 @@
// Will generate a random cure, the more resistance the symptoms have, the harder the cure.
/datum/disease/advance/proc/generate_cure()
if(properties?.len)
- var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len)
+ var/res = clamp(properties["resistance"] - (symptoms.len * 0.5), 1, advance_cures.len)
if(res == oldres)
return
cures = list(pick(advance_cures[res]))
@@ -402,11 +403,9 @@
// Add a symptom, if it is over the limit we take a random symptom away and add the new one.
/datum/disease/advance/proc/AddSymptom(datum/symptom/S)
-
if(HasSymptom(S))
return
-
- if(symptoms.len >= VIRUS_SYMPTOM_LIMIT)
+ while(get_symptom_weights() > VIRUS_SYMPTOM_LIMIT + S.weight)
RemoveSymptom(pick(symptoms))
symptoms += S
S.OnAdd(src)
@@ -423,6 +422,12 @@
S.name += " (neutered)"
S.OnRemove(src)
+/// How much of the symptom capacity is currently being used?
+/datum/disease/advance/proc/get_symptom_weights()
+ . = 0
+ for(var/datum/symptom/symptom as anything in symptoms)
+ . += symptom.weight
+
/*
Static Procs
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index 7368e99acc8142..0a29a633a30aec 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -10,6 +10,7 @@
name = "Cough"
desc = "The virus irritates the throat of the host, causing occasional coughing. Each cough will try to infect bystanders who are within 1 tile of the host with the virus."
illness = "Jest Infection"
+ weight = 2
stealth = -1
resistance = 3
stage_speed = 1
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 14a087da1238f4..6771d57f20bca2 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -10,6 +10,7 @@
name = "Sneezing"
desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally. Sneezes from this symptom will spread the virus in a 4 meter cone in front of the host."
illness = "Bard Flu"
+ weight = 2
stealth = -2
resistance = 3
stage_speed = 0
diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm
index 28ba45f8de4e0f..5a4331b3c61839 100644
--- a/code/datums/diseases/advance/symptoms/symptoms.dm
+++ b/code/datums/diseases/advance/symptoms/symptoms.dm
@@ -39,6 +39,8 @@
var/naturally_occuring = TRUE
///If the symptom requires an organ for the effects to function, robotic organs are immune to disease unless inorganic biology symptom is present
var/required_organ
+ /// How much space does this symptom use?
+ var/weight = 1
/datum/symptom/New()
var/list/S = SSdisease.list_symptoms
@@ -106,6 +108,7 @@
var/list/data = list()
data["name"] = name
data["desc"] = desc
+ data["weight"] = weight
data["stealth"] = stealth
data["resistance"] = resistance
data["stage_speed"] = stage_speed
diff --git a/code/datums/elements/cult_halo.dm b/code/datums/elements/cult_halo.dm
index d6da6d8145ad91..684144ca0ab032 100644
--- a/code/datums/elements/cult_halo.dm
+++ b/code/datums/elements/cult_halo.dm
@@ -27,7 +27,7 @@
return
ADD_TRAIT(target, TRAIT_CULT_HALO, CULT_TRAIT)
- var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/effects/cult/halo.dmi', "halo[rand(1, 6)]", -HALO_LAYER)
+ var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/mob/effects/halo.dmi', "halo[rand(1, 6)]", -HALO_LAYER)
if (ishuman(target))
var/mob/living/carbon/human/human_parent = target
new /obj/effect/temp_visual/cult/sparks(get_turf(human_parent), human_parent.dir)
diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm
index 82323372e6a025..901b163af1538b 100644
--- a/code/datums/elements/lazy_fishing_spot.dm
+++ b/code/datums/elements/lazy_fishing_spot.dm
@@ -14,11 +14,12 @@
if(!ispath(configuration, /datum/fish_source) || configuration == /datum/fish_source)
CRASH("Lazy fishing spot has incorrect configuration passed in: [configuration].")
src.configuration = configuration
-
+ ADD_TRAIT(target, TRAIT_FISHING_SPOT, REF(src))
RegisterSignal(target, COMSIG_PRE_FISHING, PROC_REF(create_fishing_spot))
/datum/element/lazy_fishing_spot/Detach(datum/target)
UnregisterSignal(target, COMSIG_PRE_FISHING)
+ REMOVE_TRAIT(target, TRAIT_FISHING_SPOT, REF(src))
return ..()
/datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source)
diff --git a/code/datums/elements/ranged_armour.dm b/code/datums/elements/ranged_armour.dm
index 61a3bc647d628c..6d1322c687b1ac 100644
--- a/code/datums/elements/ranged_armour.dm
+++ b/code/datums/elements/ranged_armour.dm
@@ -53,7 +53,7 @@
/// Ignore thrown damage based on projectile properties. There's no elegant way to multiply the damage because throwforce is persistent.
/datum/element/ranged_armour/proc/pre_thrown_impact(atom/parent, obj/item/hit_atom, datum/thrownthing/throwingdatum)
SIGNAL_HANDLER
- if (!isitem(hit_atom))
+ if (!isitem(hit_atom) || HAS_TRAIT(hit_atom, TRAIT_BYPASS_RANGED_ARMOR))
return
if (hit_atom.throwforce >= minimum_thrown_force)
return
diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm
index 51532031b0ee8e..dd3bff91fc46ec 100644
--- a/code/datums/elements/rust.dm
+++ b/code/datums/elements/rust.dm
@@ -98,6 +98,8 @@
UnregisterSignal(source, COMSIG_ATOM_EXITED)
for(var/obj/effect/glowing_rune/rune_to_remove in source)
qdel(rune_to_remove)
+ for(var/mob/living/victim in source)
+ victim.remove_status_effect(/datum/status_effect/rust_corruption)
/datum/element/rust/heretic/proc/on_entered(turf/source, atom/movable/entered, ...)
SIGNAL_HANDLER
diff --git a/code/datums/greyscale/README.md b/code/datums/greyscale/README.md
index 65f5c488790bf5..9ff6bbca1d1899 100644
--- a/code/datums/greyscale/README.md
+++ b/code/datums/greyscale/README.md
@@ -63,7 +63,7 @@ In this example, we start off by creating a sprite specified by a different conf
The first of the two in the inner group is an "icon_state", this means that the icon will be retrieved from the associated dmi file using the "icon_state" key.
-Note that you don't need to give colors to every layer if the layer does not need any colors applied to it, such as if it's a pre-colored component.
+Note that you don't need to give colors to every layer if the layer does not need any colors applied to it, such as if it's a pre-colored component.
In this example, the last layer is one such example, referencing a separately colored config.
"blend_mode" and "color_ids" are special, all layer types have them. The blend mode is what controls how that layer's finished product gets merged together with the rest of the sprite. The color ids control what colors are passed in to the layer.
@@ -128,7 +128,7 @@ While creating a greyscale config, be sure to take subtypes into account! Rather
```c
/datum/greyscale_config/tablet
name = "PDA"
- icon_file = 'icons/obj/modular_pda.dmi'
+ icon_file = 'icons/obj/devices/modular_pda.dmi'
json_config = 'code/datums/greyscale/json_configs/pda.json'
/datum/greyscale_config/tablet/chaplain
diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm
index 6b9465bf46af07..69e78ec74b31e0 100644
--- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm
+++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_items.dm
@@ -122,7 +122,7 @@
/datum/greyscale_config/tablet
name = "PDA"
- icon_file = 'icons/obj/modular_pda.dmi'
+ icon_file = 'icons/obj/devices/modular_pda.dmi'
json_config = 'code/datums/greyscale/json_configs/pda.json'
/datum/greyscale_config/tablet/chaplain
diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm
index 3aaeb093b92516..f7597da54cc489 100644
--- a/code/datums/mind/_mind.dm
+++ b/code/datums/mind/_mind.dm
@@ -553,7 +553,7 @@
/// Sets us to the passed job datum, then greets them to their new job.
/// Use this one for when you're assigning this mind to a new job for the first time,
-/// or for when someone's recieving a job they'd really want to be greeted to.
+/// or for when someone's receiving a job they'd really want to be greeted to.
/datum/mind/proc/set_assigned_role_with_greeting(datum/job/new_role, client/incoming_client)
. = set_assigned_role(new_role)
if(assigned_role != new_role)
diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm
index 64b4c560bde969..8588b95e6e33ca 100644
--- a/code/datums/quirks/negative_quirks/allergic.dm
+++ b/code/datums/quirks/negative_quirks/allergic.dm
@@ -55,14 +55,19 @@
return
var/mob/living/carbon/carbon_quirk_holder = quirk_holder
+ //Just halts the progression, I'd suggest you run to medbay asap to get it fixed
+ if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine))
+ for(var/allergy in allergies)
+ var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy)
+ if(!instantiated_med)
+ continue
+ instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP
+ return //block damage so long as epinephrine exists
+
for(var/allergy in allergies)
var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy)
if(!instantiated_med)
continue
- //Just halts the progression, I'd suggest you run to medbay asap to get it fixed
- if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine))
- instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP
- return //intentionally stops the entire proc so we avoid the organ damage after the loop
instantiated_med.reagent_removal_skip_list -= ALLERGIC_REMOVAL_SKIP
carbon_quirk_holder.adjustToxLoss(3 * seconds_per_tick)
carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick)
diff --git a/code/datums/screentips/screentips.dm b/code/datums/screentips/screentips.dm
index d72e41960e5050..20a7f334974005 100644
--- a/code/datums/screentips/screentips.dm
+++ b/code/datums/screentips/screentips.dm
@@ -1,4 +1,4 @@
-#define HINT_ICON_FILE 'icons/ui_icons/screentips/cursor_hints.dmi'
+#define HINT_ICON_FILE 'icons/ui/screentips/cursor_hints.dmi'
/// Stores the cursor hint icons for screentip context.
GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons())
diff --git a/code/datums/status_effects/debuffs/tox_vomit.dm b/code/datums/status_effects/debuffs/tox_vomit.dm
new file mode 100644
index 00000000000000..c1f5aa651efb46
--- /dev/null
+++ b/code/datums/status_effects/debuffs/tox_vomit.dm
@@ -0,0 +1,23 @@
+/// Simple status effect applied when a mob has high toxins and starts to vomit regularly
+/datum/status_effect/tox_vomit
+ id = "vomitting_from_toxins"
+ tick_interval = 2 SECONDS
+ alert_type = null
+ /// Has a chance to count up every tick, until it reaches a threshold, which causes the mob to vomit and resets
+ VAR_PRIVATE/puke_counter = 0
+
+/datum/status_effect/tox_vomit/tick(seconds_between_ticks)
+ if(!AT_TOXIN_VOMIT_THRESHOLD(owner))
+ qdel(src)
+ return
+
+ if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_STASIS))
+ return
+
+ puke_counter += SPT_PROB(30, seconds_between_ticks)
+ if(puke_counter < 50) // This is like 150 seconds apparently according to old comments
+ return
+
+ var/mob/living/carbon/human/sick_guy = owner
+ sick_guy.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 20)
+ puke_counter = 0
diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm
index 90e5a00334abfd..023cc066747c90 100644
--- a/code/datums/storage/storage.dm
+++ b/code/datums/storage/storage.dm
@@ -455,6 +455,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
return FALSE
SEND_SIGNAL(parent, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force)
+ SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force)
to_insert.forceMove(real_location)
item_insertion_feedback(user, to_insert, override)
parent.update_appearance()
@@ -549,6 +550,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
refresh_views()
parent.update_appearance()
+
+ SEND_SIGNAL(parent, COMSIG_ATOM_REMOVED_ITEM, thing, remove_to_loc, silent)
+ SEND_SIGNAL(src, COMSIG_STORAGE_REMOVED_ITEM, thing, remove_to_loc, silent)
return TRUE
/**
diff --git a/code/datums/storage/subtypes/cards.dm b/code/datums/storage/subtypes/cards.dm
index 8e6a2bfb369ac7..bf9cc6d0d5b585 100644
--- a/code/datums/storage/subtypes/cards.dm
+++ b/code/datums/storage/subtypes/cards.dm
@@ -15,19 +15,6 @@
. = ..()
set_holdable(/obj/item/tcgcard)
-/datum/storage/tcg/attempt_remove(obj/item/thing, atom/remove_to_loc, silent = FALSE)
- . = ..()
- if(!.)
- return
-
- var/obj/item/tcgcard_deck/deck = parent
- var/obj/item/tcgcard/card = thing
- card.flipped = deck.flipped
- card.update_appearance(UPDATE_ICON_STATE)
-
- if(length(real_location.contents) == 0)
- qdel(parent)
-
/datum/storage/tcg/show_contents(mob/to_show)
// sometimes, show contents is called when the mob is already seeing the contents of the deck, to refresh the view.
// to avoid spam, we only show the message if they weren't already seeing the contents.
diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm
index dac47d4ea88ad7..394486fef9a241 100644
--- a/code/datums/wounds/burns.dm
+++ b/code/datums/wounds/burns.dm
@@ -290,7 +290,7 @@
flesh_damage = 5
scar_keyword = "burnmoderate"
- simple_desc = "Patient's skin is burned, weakening the limb and multiplying percieved damage!"
+ simple_desc = "Patient's skin is burned, weakening the limb and multiplying perceived damage!"
simple_treat_text = "Ointment will speed up recovery, as will regenerative mesh. Risk of infection is negligible."
homemade_treat_text = "Healthy tea will speed up recovery. Salt, or preferably a salt-water mixture, will sanitize the wound, but the former will cause skin irritation, increasing the risk of infection."
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b1720c45c51c67..9ada7e70a91e06 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -286,7 +286,7 @@
// We're gonna build a light, and mask it with the base turf's appearance
// grab a 32x32 square of it
// I would like to use GLOB.starbright_overlays here
- // But that breaks down for... some? reason. I think recieving a render relay breaks keep_together or something
+ // But that breaks down for... some? reason. I think receiving a render relay breaks keep_together or something
// So we're just gonna accept that this'll break with starlight color changing. hardly matters since this is really only for offset stuff, but I'd love to fix it someday
var/mutable_appearance/light = new(GLOB.starlight_objects[GET_TURF_PLANE_OFFSET(generate_for) + 1])
light.render_target = ""
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 296a9031ae27e1..9b33a901d9ebe3 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -353,6 +353,7 @@
created.pixel_x = created.base_pixel_x + rand(-6, 6)
created.pixel_y = created.base_pixel_y + rand(-6, 6)
created.forceMove(target)
+ SSblackbox.record_feedback("nested tally", "lathe_printed_items", 1, list("[type]", "[created.type]"))
if(is_stack)
items_remaining = 0
diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm
index 718fa2bc21819b..770897a2fe4fbf 100644
--- a/code/game/machinery/computer/orders/order_computer/order_computer.dm
+++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm
@@ -208,7 +208,7 @@ GLOBAL_LIST_EMPTY(order_console_products)
return TRUE
/**
- * Checks if an ID card is able to afford the total cost of the current console's grocieries
+ * Checks if an ID card is able to afford the total cost of the current console's groceries
* and deducts the cost if they can.
* Args:
* card - The ID card we check for balance
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index e32b78d9f776c4..ae37691f1c1a11 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1528,10 +1528,12 @@
var/obj/item/electronics/airlock/ae
if(!electronics)
ae = new/obj/item/electronics/airlock(loc)
+ if(closeOtherId)
+ ae.passed_cycle_id = closeOtherId
if(length(req_one_access))
ae.one_access = 1
ae.accesses = req_one_access
- else
+ else if(length(req_access))
ae.accesses = req_access
else
ae = electronics
diff --git a/code/game/machinery/mining_weather_monitor.dm b/code/game/machinery/mining_weather_monitor.dm
index 65cc4b9347c1ab..32c41871b60dfd 100644
--- a/code/game/machinery/mining_weather_monitor.dm
+++ b/code/game/machinery/mining_weather_monitor.dm
@@ -2,7 +2,7 @@
/obj/machinery/mining_weather_monitor
name = "barometric monitor"
desc = "A machine monitoring atmospheric data from mining environments. Provides warnings about incoming weather fronts."
- icon = 'icons/obj/miningradio.dmi'
+ icon = 'icons/obj/devices/miningradio.dmi'
icon_state = "wallmount"
light_power = 1
light_range = 1.6
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 064f3d0f5d0b07..c95bffdc626761 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -111,8 +111,6 @@
drydesc = "They look bloody and gruesome while some terrible smell fills the air."
decal_reagent = /datum/reagent/consumable/liquidgibs
reagent_amount = 5
- ///Information about the diseases our streaking spawns
- var/list/streak_diseases
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -120,7 +118,6 @@
RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
/obj/effect/decal/cleanable/blood/gibs/Destroy()
- LAZYNULL(streak_diseases)
return ..()
/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
@@ -147,8 +144,7 @@
streak(dirs)
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions, mapload=FALSE)
- LAZYINITLIST(streak_diseases)
- SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions, streak_diseases)
+ SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions)
var/direction = pick(directions)
var/delay = 2
var/range = pick(0, 200; 1, 150; 2, 50; 3, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs.
@@ -170,7 +166,7 @@
SIGNAL_HANDLER
if(NeverShouldHaveComeHere(loc))
return
- new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases)
+ new /obj/effect/decal/cleanable/blood/splatter(loc)
/obj/effect/decal/cleanable/blood/gibs/up
icon_state = "gibup1"
diff --git a/code/game/objects/effects/decals/turfdecal/weather.dm b/code/game/objects/effects/decals/turfdecal/weather.dm
index 37b4f335e45747..af05e997197278 100644
--- a/code/game/objects/effects/decals/turfdecal/weather.dm
+++ b/code/game/objects/effects/decals/turfdecal/weather.dm
@@ -19,7 +19,7 @@
/obj/effect/turf_decal/weather/sand
name = "sand siding"
- icon = 'icons/misc/beach.dmi'
+ icon = 'icons/obj/fluff/beach.dmi'
icon_state = "sand_side"
/obj/effect/turf_decal/weather/sand/light
diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm
index cf1257308d944b..4445815a422be6 100644
--- a/code/game/objects/effects/forcefields.dm
+++ b/code/game/objects/effects/forcefields.dm
@@ -44,7 +44,7 @@
/obj/effect/forcefield/cult
name = "glowing wall"
desc = "An unholy shield that blocks all attacks."
- icon = 'icons/effects/cult/effects.dmi'
+ icon = 'icons/effects/cult.dmi'
icon_state = "cultshield"
can_atmos_pass = ATMOS_PASS_NO
initial_duration = 20 SECONDS
diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm
index b0957ed84e9457..4c6cf035324592 100644
--- a/code/game/objects/effects/spawners/random/lavaland_mobs.dm
+++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm
@@ -56,10 +56,10 @@
icon = 'icons/mob/simple/lavaland/raptor_big.dmi'
icon_state = "raptor_red"
loot = list(
- /mob/living/basic/mining/raptor/red = 20,
- /mob/living/basic/mining/raptor/white = 20,
- /mob/living/basic/mining/raptor/purple = 20,
- /mob/living/basic/mining/raptor/green = 20,
- /mob/living/basic/mining/raptor/yellow = 20,
- /mob/living/basic/mining/raptor/black = 1,
+ /mob/living/basic/raptor/red = 20,
+ /mob/living/basic/raptor/white = 20,
+ /mob/living/basic/raptor/purple = 20,
+ /mob/living/basic/raptor/green = 20,
+ /mob/living/basic/raptor/yellow = 20,
+ /mob/living/basic/raptor/black = 1,
)
diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm
index f000aa4c0395fb..a53d4df9b925aa 100644
--- a/code/game/objects/effects/temporary_visuals/cult.dm
+++ b/code/game/objects/effects/temporary_visuals/cult.dm
@@ -1,6 +1,6 @@
//temporary visual effects(/obj/effect/temp_visual) used by cult stuff
/obj/effect/temp_visual/cult
- icon = 'icons/effects/cult/effects.dmi'
+ icon = 'icons/effects/cult.dmi'
randomdir = FALSE
duration = 10
@@ -18,13 +18,13 @@
icon_state = "bloodout"
/obj/effect/temp_visual/dir_setting/cult/phase // The veil shifter teleport
- icon = 'icons/effects/cult/effects.dmi'
+ icon = 'icons/effects/cult.dmi'
name = "phase glow"
duration = 7
icon_state = "cultin"
/obj/effect/temp_visual/dir_setting/cult/phase/out
- icon = 'icons/effects/cult/effects.dmi'
+ icon = 'icons/effects/cult.dmi'
icon_state = "cultout"
/obj/effect/temp_visual/cult/sac
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 4c8ce41debfeec..d132dd53da8c4f 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -492,7 +492,7 @@
duration = 2 SECONDS
/obj/effect/constructing_effect
- icon = 'icons/effects/effects_rcd.dmi'
+ icon = 'icons/effects/rcd.dmi'
icon_state = ""
layer = ABOVE_ALL_MOB_LAYER
plane = ABOVE_GAME_PLANE
diff --git a/code/game/objects/effects/wanted_poster.dm b/code/game/objects/effects/wanted_poster.dm
index 001f0119b9d628..ab3661139fbd8c 100644
--- a/code/game/objects/effects/wanted_poster.dm
+++ b/code/game/objects/effects/wanted_poster.dm
@@ -86,7 +86,7 @@
var/i
for(i=1; i <= textLen, i++)
var/letter = uppertext(text[i])
- var/icon/letter_icon = icon("icon" = 'icons/misc/Font_Minimal.dmi', "icon_state" = letter)
+ var/icon/letter_icon = icon("icon" = 'icons/testing/Font_Minimal.dmi', "icon_state" = letter)
letter_icon.Shift(EAST, startX) //16 - (2*n)
letter_icon.Shift(SOUTH, 2)
letter_icon.SwapColor(rgb(255,255,255), color)
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index c3621cd3329580..fe03aaaf01e0de 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -454,7 +454,7 @@
if(!COOLDOWN_FINISHED(src, last_holopay_projection))
balloon_alert(user, "still recharging")
return
- if(can_be_used_in_payment(user))
+ if(!can_be_used_in_payment(user))
balloon_alert(user, "no account!")
to_chat(user, span_warning("You need a valid bank account to do this."))
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 5ba5e6937ca105..504f547b5cb782 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -11,7 +11,7 @@
item_flags = NO_BLOOD_ON_ITEM
overlay_speaker_idle = "intercom_s"
- overlay_speaker_active = "intercom_recieve"
+ overlay_speaker_active = "intercom_receive"
overlay_mic_idle = "intercom_m"
overlay_mic_active = null
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index ffb4f486cb89db..ced454c3d3261c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -76,7 +76,7 @@
/// overlay when speaker is on
var/overlay_speaker_idle = "s_idle"
- /// overlay when recieving a message
+ /// overlay when receiving a message
var/overlay_speaker_active = "s_active"
/// overlay when mic is on
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 192842e6447b9c..4ab568fdd4f96a 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -11,7 +11,7 @@
/obj/item/restraints
breakouttime = 1 MINUTES
dye_color = DYE_PRISONER
- icon = 'icons/obj/restraints.dmi'
+ icon = 'icons/obj/weapons/restraints.dmi'
/obj/item/restraints/suicide_act(mob/living/carbon/user)
user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index ae01c9e70181db..2aaf4024fb83c0 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -433,6 +433,8 @@
for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
H.bypass_protection = TRUE
found_hypo = TRUE
+ for(var/obj/item/reagent_containers/borghypo/H in R.model.emag_modules)
+ H.bypass_protection = TRUE
if(!found_hypo)
to_chat(user, span_warning("This unit is already equipped with a piercing hypospray upgrade!")) //check to see if we already have this module
@@ -443,6 +445,8 @@
if (.)
for(var/obj/item/reagent_containers/borghypo/H in R.model.modules)
H.bypass_protection = initial(H.bypass_protection)
+ for(var/obj/item/reagent_containers/borghypo/H in R.model.emag_modules)
+ H.bypass_protection = initial(H.bypass_protection)
/obj/item/borg/upgrade/surgery_omnitool
name = "cyborg surgical omni-tool upgrade"
diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm
index 028366481d45a5..e156bf8a0a8625 100644
--- a/code/game/objects/items/surgery_tray.dm
+++ b/code/game/objects/items/surgery_tray.dm
@@ -6,7 +6,7 @@
/obj/item/surgery_tray
name = "surgery tray"
desc = "A Deforest brand medical cart. It is a folding model, meaning the wheels on the bottom can be retracted and the body used as a tray."
- icon = 'icons/obj/medicart.dmi'
+ icon = 'icons/obj/medical/medicart.dmi'
icon_state = "tray"
w_class = WEIGHT_CLASS_BULKY
slowdown = 1
diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm
index 61d0dbe071d9cd..fc2eeba82ff727 100644
--- a/code/game/objects/items/tcg/tcg.dm
+++ b/code/game/objects/items/tcg/tcg.dm
@@ -196,6 +196,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices)
/obj/item/tcgcard_deck/Initialize(mapload)
. = ..()
create_storage(storage_type = /datum/storage/tcg)
+ RegisterSignal(atom_storage, COMSIG_STORAGE_REMOVED_ITEM, PROC_REF(on_item_removed))
/obj/item/tcgcard_deck/update_icon_state()
if(!flipped)
@@ -314,6 +315,21 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices)
nu_card.update_icon_state()
update_icon_state()
+/**
+ * Signal handler for COMSIG_STORAGE_REMOVED_ITEM. Qdels src if contents are empty, flips the removed card if needed.
+ */
+/obj/item/tcgcard_deck/proc/on_item_removed(datum/storage/storage_datum, obj/item/thing, atom/remove_to_loc, silent = FALSE)
+ SIGNAL_HANDLER
+
+ if (!istype(thing, /obj/item/tcgcard))
+ return
+ var/obj/item/tcgcard/card = thing
+ card.flipped = flipped
+ card.update_appearance(UPDATE_ICON_STATE)
+
+ if(length(contents) == 0)
+ qdel(src)
+
/obj/item/cardpack
name = "Trading Card Pack: Coder"
desc = "Contains six complete fuckups by the coders. Report this on github please!"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 7f0e28c95e670b..faf8862e1169d4 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1071,7 +1071,7 @@
*/
/obj/item/toy/beach_ball
name = "beach ball"
- icon = 'icons/misc/beach.dmi'
+ icon = 'icons/obj/fluff/beach.dmi'
icon_state = "ball"
inhand_icon_state = "beachball"
w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets
@@ -1426,7 +1426,7 @@
/obj/item/toy/seashell
name = "seashell"
desc = "May you always have a shell in your pocket and sand in your shoes. Whatever that's supposed to mean."
- icon = 'icons/misc/beach.dmi'
+ icon = 'icons/obj/fluff/beach.dmi'
icon_state = "shell1"
var/static/list/possible_colors = list("" = 2, COLOR_PURPLE_GRAY = 1, COLOR_OLIVE = 1, COLOR_PALE_BLUE_GRAY = 1, COLOR_RED_GRAY = 1)
diff --git a/code/game/objects/items/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm
index b0446abadbdfde..46264dc2814582 100644
--- a/code/game/objects/items/virgin_mary.dm
+++ b/code/game/objects/items/virgin_mary.dm
@@ -1,7 +1,7 @@
/obj/item/virgin_mary
name = "\proper a picture of the virgin mary"
desc = "A small, cheap icon depicting the virgin mother."
- icon = 'icons/obj/blackmarket.dmi'
+ icon = 'icons/obj/devices/blackmarket.dmi'
icon_state = "madonna"
resistance_flags = FLAMMABLE
///Has this item been used already.
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index f7717da19e7959..54f77ff1b70fae 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -636,7 +636,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/skateboard
name = "skateboard"
desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon."
- icon = 'icons/obj/vehicles.dmi'
+ icon = 'icons/mob/rideables/vehicles.dmi'
icon_state = "skateboard_held"
inhand_icon_state = "skateboard"
force = 12
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 6d8e8ca701e3a6..f0c855e7c74d94 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -276,6 +276,10 @@
//we are the parent node
parent_node = src
+ return INITIALIZE_HINT_LATELOAD
+
+// we do this in LateInitialize() because weeds on the same loc may not be done initializing yet (as in create_and_destroy)
+/obj/structure/alien/weeds/node/LateInitialize()
//destroy any non-node weeds on turf
var/obj/structure/alien/weeds/check_weed = locate(/obj/structure/alien/weeds) in loc
if(check_weed && check_weed != src)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index f75a8b9ce726c7..5daf96a01b8846 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -61,9 +61,6 @@
/obj/structure/door_assembly/examine(mob/user)
. = ..()
- var/doorname = ""
- if(created_name)
- doorname = ", written on it is '[created_name]'"
switch(state)
if(AIRLOCK_ASSEMBLY_NEEDS_WIRES)
if(anchored)
@@ -80,8 +77,8 @@
. += span_notice("There are empty slots for mineral covers.")
else if(!glass && !noglass)
. += span_notice("There are empty slots for glass windows.")
- if(doorname)
- . += span_notice("There is a small paper placard on the assembly labelled \"[doorname]\".")
+ if(created_name)
+ . += span_notice("There is a small paper placard on the assembly, written on it is '[created_name]'.")
/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, params)
if(istype(W, /obj/item/pen) && !user.combat_mode)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 2cfd490203c065..49a230d6bdc482 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -499,13 +499,13 @@
/obj/structure/flora/coconuts
gender = PLURAL
name = "coconuts"
- icon = 'icons/misc/beach.dmi'
+ icon = 'icons/obj/fluff/beach.dmi'
icon_state = "coconuts"
/obj/structure/flora/tree/palm
name = "palm tree"
desc = "A tree straight from the tropics."
- icon = 'icons/misc/beach2.dmi'
+ icon = 'icons/obj/fluff/beach2.dmi'
icon_state = "palm1"
pixel_x = 0
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index baeb8209447fb2..2158a88a6b656b 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -64,13 +64,13 @@
/obj/structure/showcase/mecha/marauder
name = "combat mech exhibit"
desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees."
- icon = 'icons/mob/mecha.dmi'
+ icon = 'icons/mob/rideables/mecha.dmi'
icon_state = "marauder"
/obj/structure/showcase/mecha/ripley
name = "construction mech exhibit"
desc = "A stand with a retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart."
- icon = 'icons/mob/mecha.dmi'
+ icon = 'icons/mob/rideables/mecha.dmi'
icon_state = "firefighter"
/obj/structure/showcase/machinery/implanter
diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm
index 37015a59cb0871..e663ef2411e629 100644
--- a/code/game/objects/structures/signs/signs_departments.dm
+++ b/code/game/objects/structures/signs/signs_departments.dm
@@ -8,7 +8,7 @@
/obj/structure/sign/departments/med
name = "\improper Medbay sign"
sign_change_name = "Department - Medbay"
- desc = "A sign labeling an area of medical department."
+ desc = "A sign labelling an area of the medical department."
icon_state = "med"
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med, 32)
@@ -23,7 +23,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/med_alt, 32)
/obj/structure/sign/departments/medbay
name = "\improper Medbay sign"
sign_change_name = "Generic Medical"
- desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
+ desc = "The intergalactic symbol of medical institutions. You'll probably get help here."
icon_state = "bluecross"
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/medbay, 32)
@@ -84,7 +84,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/virology, 32)
/obj/structure/sign/departments/morgue
name = "\improper Morgue sign"
sign_change_name = "Department - Medbay: Morgue"
- desc = "A sign labelling an area where station stores its ever-piling bodies."
+ desc = "A sign labelling an area where the station stores its ever-piling bodies."
icon_state = "morgue"
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/morgue, 32)
diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm
index b33d05a163a79c..db44c75669d8a4 100644
--- a/code/game/objects/structures/signs/signs_warning.dm
+++ b/code/game/objects/structures/signs/signs_warning.dm
@@ -199,7 +199,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/gas_mask, 32)
/obj/structure/sign/warning/chem_diamond
name = "\improper REACTIVE CHEMICALS sign"
sign_change_name = "Warning - Hazardous Chemicals sign"
- desc = "A sign that warns of potentially reactive chemicals nearby, be they explosive, flamable, or acidic."
+ desc = "A sign that warns of potentially reactive chemicals nearby, be they explosive, flammable, or acidic."
icon_state = "chemdiamond"
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/warning/chem_diamond, 32)
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index d4bab223d45705..0cf5ddf7c91300 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -102,7 +102,7 @@
/obj/structure/trap/stun/hunter
name = "bounty trap"
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it."
- icon = 'icons/obj/restraints.dmi'
+ icon = 'icons/obj/weapons/restraints.dmi'
icon_state = "bounty_trap_on"
stun_time = 20 SECONDS
sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy())
@@ -143,7 +143,7 @@
/obj/item/bountytrap
name = "bounty trap"
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive."
- icon = 'icons/obj/restraints.dmi'
+ icon = 'icons/obj/weapons/restraints.dmi'
icon_state = "bounty_trap_off"
var/obj/structure/trap/stun/hunter/stored_trap
var/obj/item/radio/radio
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 10b9a58b870075..5f40de037f4aee 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -286,14 +286,17 @@ ADMIN_VERB(create_or_modify_area, R_DEBUG, "Create Or Modify Area", "Create of m
return TRUE
-/client/proc/adminGreet(logout)
- if(SSticker.HasRoundStarted())
- var/string
- if(logout && CONFIG_GET(flag/announce_admin_logout))
- string = pick(
- "Admin logout: [key_name(src)]")
- else if(!logout && CONFIG_GET(flag/announce_admin_login) && (prefs.toggles & ANNOUNCE_LOGIN))
- string = pick(
- "Admin login: [key_name(src)]")
- if(string)
- message_admins("[string]")
+/// Sends a message to adminchat when anyone with a holder logs in or logs out.
+/// Is dependent on admin preferences and configuration settings, which means that this proc can fire without sending a message.
+/client/proc/adminGreet(logout = FALSE)
+ if(!SSticker.HasRoundStarted())
+ return
+
+ if(logout && CONFIG_GET(flag/announce_admin_logout))
+ message_admins("Admin logout: [key_name(src)]")
+ return
+
+ if(!logout && CONFIG_GET(flag/announce_admin_login) && (prefs.toggles & ANNOUNCE_LOGIN))
+ message_admins("Admin login: [key_name(src)]")
+ return
+
diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm
index c39706795acd01..9a713588abd6d3 100644
--- a/code/modules/admin/sql_ban_system.dm
+++ b/code/modules/admin/sql_ban_system.dm
@@ -391,7 +391,6 @@
ROLE_REV,
ROLE_REVENANT,
ROLE_REV_HEAD,
- ROLE_SENTIENT_DISEASE,
ROLE_SPIDER,
ROLE_SPY,
ROLE_SYNDICATE,
diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm
index 27994d966a7cb4..bf2bcbd5a90030 100644
--- a/code/modules/admin/verbs/lua/lua_state.dm
+++ b/code/modules/admin/verbs/lua/lua_state.dm
@@ -111,8 +111,6 @@ GLOBAL_PROTECT(lua_usr)
for(var/path_element in function)
new_function_path += path_element
function = new_function_path
- var/msg = "[key_name(usr)] called the lua function \"[function]\" with arguments: [english_list(call_args)]"
- log_lua(msg)
var/tmp_usr = GLOB.lua_usr
GLOB.lua_usr = usr
diff --git a/code/modules/admin/view_variables/color_matrix_editor.dm b/code/modules/admin/view_variables/color_matrix_editor.dm
index ea1278901f3fed..6c61382ceec78b 100644
--- a/code/modules/admin/view_variables/color_matrix_editor.dm
+++ b/code/modules/admin/view_variables/color_matrix_editor.dm
@@ -14,7 +14,7 @@
else
current_color = COLOR_MATRIX_IDENTITY
- var/mutable_appearance/view = image('icons/misc/colortest.dmi', "colors")
+ var/mutable_appearance/view = image('icons/testing/colortest.dmi', "colors")
if(_target)
target = WEAKREF(_target)
if(!(_target.appearance_flags & PLANE_MASTER))
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 5a25d68c507a0c..e94e68cab0aedc 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -255,7 +255,7 @@
clicked_on.set_hallucinations_if_lower(240 SECONDS)
SEND_SOUND(caller, sound('sound/effects/ghost.ogg', FALSE, TRUE, 50))
- var/image/sparkle_image = image('icons/effects/cult/effects.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER)
+ var/image/sparkle_image = image('icons/effects/cult.dmi', clicked_on, "bloodsparkles", ABOVE_MOB_LAYER)
clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE)
addtimer(CALLBACK(clicked_on, TYPE_PROC_REF(/atom/, remove_alt_appearance), "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index a9537d26d3802a..cd77799419c6df 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -382,7 +382,7 @@ Striking a noncultist, however, will tear their flesh."}
AddComponent( \
/datum/component/shielded, \
recharge_start_delay = 0 SECONDS, \
- shield_icon_file = 'icons/effects/cult/effects.dmi', \
+ shield_icon_file = 'icons/effects/cult.dmi', \
shield_icon = "shield-cult", \
run_hit_callback = CALLBACK(src, PROC_REF(shield_damaged)), \
)
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index b75d74ee160029..185770a474b73e 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -1141,7 +1141,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
images += B
if(!IS_CULTIST(M))
if(M.client)
- var/image/C = image('icons/effects/cult/effects.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER)
+ var/image/C = image('icons/effects/cult.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER)
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE)
addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"cult_apoc",TRUE), duration)
images += C
diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm
deleted file mode 100644
index 3267944e05c62d..00000000000000
--- a/code/modules/antagonists/disease/disease_abilities.dm
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
-Abilities that can be purchased by disease mobs. Most are just passive symptoms that will be
-added to their disease, but some are active abilites that affect only the target the overmind
-is currently following.
-*/
-
-GLOBAL_LIST_INIT(disease_ability_singletons, list(
-new /datum/disease_ability/action/cough,
-new /datum/disease_ability/action/sneeze,
-new /datum/disease_ability/action/infect,
-new /datum/disease_ability/symptom/mild/cough,
-new /datum/disease_ability/symptom/mild/sneeze,
-new /datum/disease_ability/symptom/medium/shedding,
-new /datum/disease_ability/symptom/medium/beard,
-new /datum/disease_ability/symptom/medium/hallucigen,
-new /datum/disease_ability/symptom/medium/choking,
-new /datum/disease_ability/symptom/medium/confusion,
-new /datum/disease_ability/symptom/medium/vomit,
-new /datum/disease_ability/symptom/medium/voice_change,
-new /datum/disease_ability/symptom/medium/visionloss,
-new /datum/disease_ability/symptom/medium/deafness,
-new /datum/disease_ability/symptom/powerful/narcolepsy,
-new /datum/disease_ability/symptom/medium/fever,
-new /datum/disease_ability/symptom/medium/chills,
-new /datum/disease_ability/symptom/medium/headache,
-new /datum/disease_ability/symptom/medium/viraladaptation,
-new /datum/disease_ability/symptom/medium/viralevolution,
-new /datum/disease_ability/symptom/medium/disfiguration,
-new /datum/disease_ability/symptom/medium/polyvitiligo,
-new /datum/disease_ability/symptom/medium/itching,
-new /datum/disease_ability/symptom/medium/heal/weight_loss,
-new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
-new /datum/disease_ability/symptom/medium/heal/mind_restoration,
-new /datum/disease_ability/symptom/powerful/fire,
-new /datum/disease_ability/symptom/powerful/flesh_eating,
-new /datum/disease_ability/symptom/powerful/genetic_mutation,
-new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
-new /datum/disease_ability/symptom/powerful/heal/starlight,
-new /datum/disease_ability/symptom/powerful/heal/oxygen,
-new /datum/disease_ability/symptom/powerful/heal/chem,
-new /datum/disease_ability/symptom/powerful/heal/metabolism,
-new /datum/disease_ability/symptom/powerful/heal/dark,
-new /datum/disease_ability/symptom/powerful/heal/water,
-new /datum/disease_ability/symptom/powerful/heal/plasma,
-new /datum/disease_ability/symptom/powerful/heal/radiation,
-new /datum/disease_ability/symptom/powerful/heal/coma,
-new /datum/disease_ability/symptom/powerful/youth
-))
-
-/datum/disease_ability
- var/name
- var/cost = 0
- var/required_total_points = 0
- var/start_with = FALSE
- var/short_desc = ""
- var/long_desc = ""
- var/stat_block = ""
- var/threshold_block = list()
- var/category = ""
-
- var/list/symptoms
- var/list/actions
-
-/datum/disease_ability/New()
- ..()
- if(symptoms)
- var/stealth = 0
- var/resistance = 0
- var/stage_speed = 0
- var/transmittable = 0
- for(var/T in symptoms)
- var/datum/symptom/S = T
- stealth += initial(S.stealth)
- resistance += initial(S.resistance)
- stage_speed += initial(S.stage_speed)
- transmittable += initial(S.transmittable)
- threshold_block += initial(S.threshold_descs)
- stat_block = "Resistance: [resistance]
Stealth: [stealth]
Stage Speed: [stage_speed]
Transmissibility: [transmittable]
"
- if(symptoms.len == 1) //lazy boy's dream
- name = initial(S.name)
- if(short_desc == "")
- short_desc = initial(S.desc)
- if(long_desc == "")
- long_desc = initial(S.desc)
-
-/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
- if(world.time < D.next_adaptation_time)
- return FALSE
- if(!D.unpurchased_abilities[src])
- return FALSE
- return (D.points >= cost) && (D.total_points >= required_total_points)
-
-/datum/disease_ability/proc/Buy(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE)
- if(!silent)
- to_chat(D, span_notice("Purchased [name]."))
- D.points -= cost
- D.unpurchased_abilities -= src
- if(trigger_cooldown)
- D.adapt_cooldown()
- D.purchased_abilities[src] = TRUE
- for(var/V in (D.disease_instances+D.disease_template))
- var/datum/disease/advance/sentient_disease/SD = V
- if(symptoms)
- for(var/T in symptoms)
- var/datum/symptom/S = new T()
- SD.symptoms += S
- S.OnAdd(SD)
- if(SD.processing)
- if(S.Start(SD))
- S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
- SD.Refresh()
- for(var/T in actions)
- var/datum/action/A = new T()
- A.Grant(D)
-
-
-/datum/disease_ability/proc/CanRefund(mob/camera/disease/D)
- if(world.time < D.next_adaptation_time)
- return FALSE
- return D.purchased_abilities[src]
-
-/datum/disease_ability/proc/Refund(mob/camera/disease/D, silent = FALSE, trigger_cooldown = TRUE)
- if(!silent)
- to_chat(D, span_notice("Refunded [name]."))
- D.points += cost
- D.unpurchased_abilities[src] = TRUE
- if(trigger_cooldown)
- D.adapt_cooldown()
- D.purchased_abilities -= src
- for(var/V in (D.disease_instances+D.disease_template))
- var/datum/disease/advance/sentient_disease/SD = V
- if(symptoms)
- for(var/T in symptoms)
- var/datum/symptom/S = locate(T) in SD.symptoms
- if(S)
- SD.symptoms -= S
- S.OnRemove(SD)
- if(SD.processing)
- S.End(SD)
- qdel(S)
- SD.Refresh()
- for(var/T in actions)
- var/datum/action/A = locate(T) in D.actions
- qdel(A)
-
-//these sybtypes are for conveniently separating the different categories, they have no unique code.
-
-/datum/disease_ability/action
- category = "Active"
-
-/datum/disease_ability/symptom
- category = "Symptom"
-
-//active abilities and their associated actions
-
-/datum/disease_ability/action/cough
- name = "Voluntary Coughing"
- actions = list(/datum/action/cooldown/disease_cough)
- cost = 0
- required_total_points = 0
- start_with = TRUE
- short_desc = "Force the host you are following to cough, spreading your infection to those nearby."
- long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
Cooldown: 10 seconds"
-
-
-/datum/action/cooldown/disease_cough
- name = "Cough"
- button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "cough"
- desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.
Cooldown: 10 seconds"
- cooldown_time = 100
-
-/datum/action/cooldown/disease_cough/Activate(atom/target)
- StartCooldown(10 SECONDS)
- trigger_cough()
- StartCooldown()
- return TRUE
-
-/*
- * Cause a cough to happen from the host.
- */
-/datum/action/cooldown/disease_cough/proc/trigger_cough()
- var/mob/camera/disease/our_disease = owner
- var/mob/living/host = our_disease.following_host
- if(!host)
- return FALSE
- if(host.stat != CONSCIOUS)
- to_chat(our_disease, span_warning("Your host must be conscious to cough."))
- return FALSE
- to_chat(our_disease, span_notice("You force [host.real_name] to cough."))
- host.emote("cough")
- if(host.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
- var/datum/disease/advance/sentient_disease/disease_datum = our_disease.hosts[host]
- disease_datum.spread(2)
- return TRUE
-
-/datum/disease_ability/action/sneeze
- name = "Voluntary Sneezing"
- actions = list(/datum/action/cooldown/disease_sneeze)
- cost = 2
- required_total_points = 3
- short_desc = "Force the host you are following to sneeze, spreading your infection to those in front of them."
- long_desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host.
Cooldown: 20 seconds"
-
-/datum/action/cooldown/disease_sneeze
- name = "Sneeze"
- button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "sneeze"
- desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmissibility is low.
Cooldown: 20 seconds"
- cooldown_time = 200
-
-/datum/action/cooldown/disease_sneeze/Activate(atom/target)
- StartCooldown(10 SECONDS)
- trigger_sneeze()
- StartCooldown()
- return TRUE
-
-/*
- * Cause a sneeze to happen from the host.
- */
-/datum/action/cooldown/disease_sneeze/proc/trigger_sneeze()
- var/mob/camera/disease/our_disease = owner
- var/mob/living/host = our_disease.following_host
- if(!host)
- return FALSE
- if(host.stat != CONSCIOUS)
- to_chat(our_disease, span_warning("Your host must be conscious to sneeze."))
- return FALSE
- to_chat(our_disease, span_notice("You force [host.real_name] to sneeze."))
- host.emote("sneeze")
- if(host.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
- var/datum/disease/advance/sentient_disease/disease_datum = our_disease.hosts[host]
- for(var/mob/living/nearby_mob in oview(4, disease_datum.affected_mob))
- if(!is_source_facing_target(disease_datum.affected_mob, nearby_mob))
- continue
- if(!disease_air_spread_walk(get_turf(disease_datum.affected_mob), get_turf(nearby_mob)))
- continue
- nearby_mob.AirborneContractDisease(disease_datum, TRUE)
-
- return TRUE
-
-/datum/disease_ability/action/infect
- name = "Secrete Infection"
- actions = list(/datum/action/cooldown/disease_infect)
- cost = 2
- required_total_points = 3
- short_desc = "Cause all objects your host is touching to become infectious for a limited time, spreading your infection to anyone who touches them."
- long_desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds. This includes the floor, if they are not wearing shoes, and any items they are holding, if they are not wearing gloves.
Cooldown: 40 seconds"
-
-/datum/action/cooldown/disease_infect
- name = "Secrete Infection"
- button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "infect"
- desc = "Cause the host you are following to excrete an infective substance from their pores, causing all objects touching their skin to transmit your infection to anyone who touches them for the next 30 seconds.
Cooldown: 40 seconds"
- cooldown_time = 400
-
-/datum/action/cooldown/disease_infect/Activate(atom/target)
- StartCooldown(10 SECONDS)
- trigger_infection()
- StartCooldown()
- return TRUE
-
-/*
- * Trigger the infection action.
- */
-/datum/action/cooldown/disease_infect/proc/trigger_infection()
- var/mob/camera/disease/our_disease = owner
- var/mob/living/carbon/human/host = our_disease.following_host
- if(!host)
- return FALSE
- for(var/obj/thing as anything in host.get_equipped_items(include_accessories = TRUE))
- thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300)
- //no shoes? infect the floor.
- if(!host.shoes)
- var/turf/host_turf = get_turf(host)
- if(host_turf && !isspaceturf(host_turf))
- host_turf.AddComponent(/datum/component/infective, our_disease.disease_template, 300)
- //no gloves? infect whatever we are holding.
- if(!host.gloves)
- for(var/obj/held_thing as anything in host.held_items)
- if(isnull(held_thing))
- continue
- held_thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300)
- return TRUE
-
-/*******************BASE SYMPTOM TYPES*******************/
-// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
-//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
-
-/datum/disease_ability/symptom/mild
- cost = 2
- required_total_points = 4
- category = "Symptom (Weak)"
-
-/datum/disease_ability/symptom/medium
- cost = 4
- required_total_points = 8
- category = "Symptom"
-
-/datum/disease_ability/symptom/medium/heal
- cost = 5
- category = "Symptom (+)"
-
-/datum/disease_ability/symptom/powerful
- cost = 4
- required_total_points = 16
- category = "Symptom (Strong)"
-
-/datum/disease_ability/symptom/powerful/heal
- cost = 8
- category = "Symptom (Strong+)"
-
-/******MILD******/
-
-/datum/disease_ability/symptom/mild/cough
- name = "Involuntary Coughing"
- symptoms = list(/datum/symptom/cough)
- short_desc = "Cause victims to cough intermittently."
- long_desc = "Cause victims to cough intermittently, spreading your infection."
-
-/datum/disease_ability/symptom/mild/sneeze
- name = "Involuntary Sneezing"
- symptoms = list(/datum/symptom/sneeze)
- short_desc = "Cause victims to sneeze intermittently."
- long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
-
-/******MEDIUM******/
-
-/datum/disease_ability/symptom/medium/shedding
- symptoms = list(/datum/symptom/shedding)
-
-/datum/disease_ability/symptom/medium/beard
- symptoms = list(/datum/symptom/beard)
- short_desc = "Cause all victims to grow a luscious beard."
- long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
-
-/datum/disease_ability/symptom/medium/hallucigen
- symptoms = list(/datum/symptom/hallucigen)
- short_desc = "Cause victims to hallucinate."
- long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
-
-/datum/disease_ability/symptom/medium/choking
- symptoms = list(/datum/symptom/choking)
- short_desc = "Cause victims to choke."
- long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
-
-/datum/disease_ability/symptom/medium/confusion
- symptoms = list(/datum/symptom/confusion)
- short_desc = "Cause victims to become confused."
- long_desc = "Cause victims to become confused intermittently."
-
-/datum/disease_ability/symptom/medium/vomit
- symptoms = list(/datum/symptom/vomit)
- short_desc = "Cause victims to vomit."
- long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
-
-/datum/disease_ability/symptom/medium/voice_change
- symptoms = list(/datum/symptom/voice_change)
- short_desc = "Change the voice of victims."
- long_desc = "Change the voice of victims, causing confusion in communications."
-
-/datum/disease_ability/symptom/medium/visionloss
- symptoms = list(/datum/symptom/visionloss)
- short_desc = "Damage the eyes of victims, eventually causing blindness."
- long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
-
-/datum/disease_ability/symptom/medium/deafness
- symptoms = list(/datum/symptom/deafness)
-
-/datum/disease_ability/symptom/medium/fever
- symptoms = list(/datum/symptom/fever)
-
-/datum/disease_ability/symptom/medium/chills
- symptoms = list(/datum/symptom/chills)
-
-/datum/disease_ability/symptom/medium/headache
- symptoms = list(/datum/symptom/headache)
-
-/datum/disease_ability/symptom/medium/viraladaptation
- symptoms = list(/datum/symptom/viraladaptation)
- short_desc = "Cause your infection to become more resistant to detection and eradication."
- long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
-
-/datum/disease_ability/symptom/medium/viralevolution
- symptoms = list(/datum/symptom/viralevolution)
-
-/datum/disease_ability/symptom/medium/polyvitiligo
- symptoms = list(/datum/symptom/polyvitiligo)
-
-/datum/disease_ability/symptom/medium/disfiguration
- symptoms = list(/datum/symptom/disfiguration)
-
-/datum/disease_ability/symptom/medium/itching
- symptoms = list(/datum/symptom/itching)
- short_desc = "Cause victims to itch."
- long_desc = "Cause victims to itch, increasing all stats except stealth."
-
-/datum/disease_ability/symptom/medium/heal/weight_loss
- symptoms = list(/datum/symptom/weight_loss)
- short_desc = "Cause victims to lose weight."
- long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
-
-/datum/disease_ability/symptom/medium/heal/sensory_restoration
- symptoms = list(/datum/symptom/sensory_restoration)
- short_desc = "Regenerate eye and ear damage of victims."
- long_desc = "Regenerate eye and ear damage of victims."
-
-/datum/disease_ability/symptom/medium/heal/mind_restoration
- symptoms = list(/datum/symptom/mind_restoration)
-
-/******POWERFUL******/
-
-/datum/disease_ability/symptom/powerful/fire
- symptoms = list(/datum/symptom/fire)
-
-/datum/disease_ability/symptom/powerful/flesh_eating
- symptoms = list(/datum/symptom/flesh_eating)
-
-/datum/disease_ability/symptom/powerful/genetic_mutation
- symptoms = list(/datum/symptom/genetic_mutation)
- cost = 8
-
-/datum/disease_ability/symptom/powerful/inorganic_adaptation
- symptoms = list(/datum/symptom/inorganic_adaptation)
-
-/datum/disease_ability/symptom/powerful/narcolepsy
- symptoms = list(/datum/symptom/narcolepsy)
-
-/datum/disease_ability/symptom/powerful/youth
- symptoms = list(/datum/symptom/youth)
- short_desc = "Cause victims to become eternally young."
- long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
-
-/****HEALING SUBTYPE****/
-
-/datum/disease_ability/symptom/powerful/heal/starlight
- symptoms = list(/datum/symptom/heal/starlight)
-
-/datum/disease_ability/symptom/powerful/heal/oxygen
- symptoms = list(/datum/symptom/oxygen)
-
-/datum/disease_ability/symptom/powerful/heal/chem
- symptoms = list(/datum/symptom/heal/chem)
-
-/datum/disease_ability/symptom/powerful/heal/metabolism
- symptoms = list(/datum/symptom/heal/metabolism)
- short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
- long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
-
-/datum/disease_ability/symptom/powerful/heal/dark
- symptoms = list(/datum/symptom/heal/darkness)
-
-/datum/disease_ability/symptom/powerful/heal/water
- symptoms = list(/datum/symptom/heal/water)
-
-/datum/disease_ability/symptom/powerful/heal/plasma
- symptoms = list(/datum/symptom/heal/plasma)
-
-/datum/disease_ability/symptom/powerful/heal/radiation
- symptoms = list(/datum/symptom/heal/radiation)
-
-/datum/disease_ability/symptom/powerful/heal/coma
- symptoms = list(/datum/symptom/heal/coma)
- short_desc = "Cause victims to fall into a healing coma when hurt."
- long_desc = "Cause victims to fall into a healing coma when hurt."
diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm
deleted file mode 100644
index 17364feec55977..00000000000000
--- a/code/modules/antagonists/disease/disease_datum.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-/datum/antagonist/disease
- name = "Sentient Disease"
- roundend_category = "diseases"
- antagpanel_category = ANTAG_GROUP_BIOHAZARDS
- show_to_ghosts = TRUE
- var/disease_name = ""
-
-/datum/antagonist/disease/on_gain()
- owner.set_assigned_role(SSjob.GetJobType(/datum/job/sentient_disease))
- owner.special_role = ROLE_SENTIENT_DISEASE
- var/datum/objective/O = new /datum/objective/disease_infect()
- O.owner = owner
- objectives += O
-
- O = new /datum/objective/disease_infect_centcom()
- O.owner = owner
- objectives += O
-
- . = ..()
-
-/datum/antagonist/disease/greet()
- . = ..()
- to_chat(owner.current, span_notice("Infect members of the crew to gain adaptation points, and spread your infection further."))
- owner.announce_objectives()
-
-/datum/antagonist/disease/apply_innate_effects(mob/living/mob_override)
- if(!istype(owner.current, /mob/camera/disease))
- var/turf/T = get_turf(owner.current)
- T = T ? T : SSmapping.get_station_center()
- var/mob/camera/disease/D = new /mob/camera/disease(T)
- owner.transfer_to(D)
-
-/datum/antagonist/disease/admin_add(datum/mind/new_owner,mob/admin)
- ..()
- var/mob/camera/disease/D = new_owner.current
- D.pick_name()
-
-/datum/antagonist/disease/roundend_report()
- var/list/result = list()
-
- result += "Disease name: [disease_name]"
- result += printplayer(owner)
-
- var/win = TRUE
- var/objectives_text = ""
- 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.")]"
- win = FALSE
- count++
-
- result += objectives_text
-
- var/special_role_text = LOWER_TEXT(name)
-
- if(win)
- result += span_greentext("The [special_role_text] was successful!")
- else
- result += span_redtext("The [special_role_text] has failed!")
-
- if(istype(owner.current, /mob/camera/disease))
- var/mob/camera/disease/D = owner.current
- result += "[disease_name] completed the round with [D.hosts.len] infected hosts, and reached a maximum of [D.total_points] concurrent infections."
- result += "[disease_name] completed the round with the following adaptations:"
- var/list/adaptations = list()
- for(var/V in D.purchased_abilities)
- var/datum/disease_ability/A = V
- adaptations += A.name
- result += adaptations.Join(", ")
-
- return result.Join("
")
-
-/datum/antagonist/disease/get_preview_icon()
- var/icon/icon = icon('icons/mob/huds/antag_hud.dmi', "virus_infected")
- icon.Blend(COLOR_GREEN_GRAY, ICON_MULTIPLY)
- icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
- return icon
-
-/datum/objective/disease_infect
- explanation_text = "Survive and infect as many people as possible."
-
-/datum/objective/disease_infect/check_completion()
- var/mob/camera/disease/D = owner.current
- if(istype(D) && D.hosts.len) //theoretically it should not exist if it has no hosts, but better safe than sorry.
- return TRUE
- return FALSE
-
-
-/datum/objective/disease_infect_centcom
- explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod."
-
-/datum/objective/disease_infect_centcom/check_completion()
- var/mob/camera/disease/D = owner.current
- if(!istype(D))
- return FALSE
- for(var/V in D.hosts)
- var/mob/living/L = V
- if(L.onCentCom() || L.onSyndieBase())
- return TRUE
- return FALSE
diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm
deleted file mode 100644
index 8960ac27689939..00000000000000
--- a/code/modules/antagonists/disease/disease_disease.dm
+++ /dev/null
@@ -1,69 +0,0 @@
-/datum/disease/advance/sentient_disease
- form = "Virus"
- name = "Sentient Virus"
- desc = "An apparently sentient virus, extremely adaptable and resistant to outside sources of mutation."
- viable_mobtypes = list(/mob/living/carbon/human)
- mutable = FALSE
- bypasses_immunity = TRUE
- var/mob/camera/disease/overmind
- var/disease_id
-
-/datum/disease/advance/sentient_disease/New()
- ..()
- GLOB.sentient_disease_instances += src
-
-/datum/disease/advance/sentient_disease/Destroy()
- . = ..()
- overmind = null
- GLOB.sentient_disease_instances -= src
-
-/datum/disease/advance/sentient_disease/remove_disease()
- if(overmind)
- overmind.remove_infection(src)
- ..()
-
-/datum/disease/advance/sentient_disease/infect(mob/living/infectee, make_copy = TRUE)
- if(make_copy && overmind && (overmind.disease_template != src))
- overmind.disease_template.infect(infectee, TRUE) //get an updated version of the virus
- else
- ..()
-
-
-/datum/disease/advance/sentient_disease/IsSame(datum/disease/D)
- if(istype(D, /datum/disease/advance/sentient_disease))
- var/datum/disease/advance/sentient_disease/V = D
- if(V.overmind == overmind)
- return TRUE
- return FALSE
-
-
-/datum/disease/advance/sentient_disease/Copy()
- var/datum/disease/advance/sentient_disease/D = ..()
- D.overmind = overmind
- D.disease_id = disease_id
- return D
-
-/datum/disease/advance/sentient_disease/after_add()
- if(overmind)
- overmind.add_infection(src)
-
-/datum/disease/advance/sentient_disease/GenerateProperties()
- ..()
- src.properties["stealth"] += 6 //SD gets an extra bit of stealth, as a treat, to avoid getting caught out so early
-
-/datum/disease/advance/sentient_disease/GetDiseaseID()
- if (!disease_id) //if we don't set this here it can reinfect people after the disease dies, since overmind.tag won't be null when the disease is alive, but will be null afterwards, thus the disease ID changes
- disease_id = "[type]|[overmind?.tag]"
- return disease_id
-
-/datum/disease/advance/sentient_disease/generate_cure()
- if(cures.len)
- return
- var/list/not_used = advance_cures.Copy()
- not_used.Cut(1, 6) // Removes the first five tiers of cures.
- cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
-
- // Get the cure name from the cure_id
- var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]]
- var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]]
- cure_text = "[D1.name] and [D2.name]"
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
deleted file mode 100644
index acefd0e37173cf..00000000000000
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ /dev/null
@@ -1,450 +0,0 @@
-#define FREEMOVE_TIME (2 MINUTES)
-
-/*
-A mob of type /mob/camera/disease is an overmind coordinating at least one instance of /datum/disease/advance/sentient_disease
-that has infected a host. All instances in a host will be synchronized with the stats of the overmind's disease_template. Any
-samples outside of a host will retain the stats they had when they left the host, but infecting a new host will cause
-the new instance inside the host to be updated to the template's stats.
-*/
-
-/mob/camera/disease
- name = "Sentient Disease"
- real_name = "Sentient Disease"
- desc = ""
- icon = 'icons/mob/silicon/cameramob.dmi'
- icon_state = "marker"
- mouse_opacity = MOUSE_OPACITY_ICON
- move_on_shuttle = FALSE
- invisibility = INVISIBILITY_OBSERVER
- see_invisible = SEE_INVISIBLE_LIVING
- layer = BELOW_MOB_LAYER
- // Pale green, bright enough to have good vision
- lighting_cutoff_red = 5
- lighting_cutoff_green = 35
- lighting_cutoff_blue = 20
- sight = SEE_SELF|SEE_THRU
- initial_language_holder = /datum/language_holder/universal
-
- var/freemove = TRUE
- var/freemove_end = 0
- var/freemove_end_timerid
-
- var/datum/action/innate/disease_adapt/adaptation_menu_action
- var/datum/disease_ability/examining_ability
- var/datum/browser/browser
- var/browser_open = FALSE
-
- var/mob/living/following_host
- var/list/disease_instances
- var/list/hosts //this list is associative, affected_mob -> disease_instance
- var/datum/disease/advance/sentient_disease/disease_template
-
- var/total_points = 0
- var/points = 0
-
- var/last_move_tick = 0
- var/move_delay = 1
-
- var/next_adaptation_time = 0
- var/adaptation_cooldown = 600
-
- var/list/purchased_abilities
- var/list/unpurchased_abilities
-
-/mob/camera/disease/Initialize(mapload)
- .= ..()
-
- ADD_TRAIT(src, TRAIT_SIXTHSENSE, INNATE_TRAIT) //at least they'll have SOMEONE to talk to
-
- disease_instances = list()
- hosts = list()
-
- purchased_abilities = list()
- unpurchased_abilities = list()
-
- disease_template = new /datum/disease/advance/sentient_disease()
- disease_template.overmind = src
- qdel(SSdisease.archive_diseases[disease_template.GetDiseaseID()])
- SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs
-
- var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
- my_hud.show_to(src)
-
- browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src)
-
- freemove_end = world.time + FREEMOVE_TIME
- freemove_end_timerid = addtimer(CALLBACK(src, PROC_REF(infect_random_patient_zero)), FREEMOVE_TIME, TIMER_STOPPABLE)
-
-/mob/camera/disease/Destroy()
- . = ..()
- QDEL_NULL(adaptation_menu_action)
- disease_template = null
- for(var/V in GLOB.sentient_disease_instances)
- var/datum/disease/advance/sentient_disease/S = V
- if(S.overmind == src)
- S.overmind = null
- browser = null
-
-/mob/camera/disease/Login()
- . = ..()
- if(!. || !client)
- return FALSE
- if(freemove)
- to_chat(src, span_warning("You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host."))
-
-
-/mob/camera/disease/get_status_tab_items()
- . = ..()
- if(freemove)
- . += "Host Selection Time: [round((freemove_end - world.time)/10)]s"
- else
- . += "Adaptation Points: [points]/[total_points]"
- . += "Hosts: [disease_instances.len]"
- var/adapt_ready = next_adaptation_time - world.time
- if(adapt_ready > 0)
- . += "Adaptation Ready: [round(adapt_ready/10, 0.1)]s"
-
-
-/mob/camera/disease/examine(mob/user)
- . = ..()
- if(isobserver(user))
- . += {"[span_notice("[src] has [points]/[total_points] adaptation points.")]
- [span_notice("[src] has the following unlocked:")]"}
- for(var/datum/disease_ability/ability in purchased_abilities)
- . += span_notice("[ability.name]")
-
-/mob/camera/disease/say(
- message,
- bubble_type,
- list/spans = list(),
- sanitize = TRUE,
- datum/language/language,
- ignore_spam = FALSE,
- forced,
- filterproof = FALSE,
- message_range = 7,
- datum/saymode/saymode,
- list/message_mods = list(),
-)
- if(!message)
- return
- if(sanitize)
- message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
- log_talk(message, LOG_SAY)
- var/rendered = "[src] says, \"[message]\""
- for(var/mob/listener in GLOB.mob_list)
- if(issentientdisease(listener))
- to_chat(listener, rendered)
- else if(isobserver(listener))
- var/link = FOLLOW_LINK(listener, src)
- to_chat(listener, "[link] [rendered]")
- return
-
-/mob/camera/disease/Move(NewLoc, Dir = 0)
- if(freemove)
- forceMove(NewLoc)
- else
- if(world.time > (last_move_tick + move_delay))
- follow_next(Dir & NORTHWEST)
- last_move_tick = world.time
-
-/mob/camera/disease/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider)
- if(freemove)
- return ..()
- return FALSE
-
-/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)
- . = ..()
- var/atom/movable/to_follow = speaker
- if(radio_freq)
- var/atom/movable/virtualspeaker/V = speaker
- to_follow = V.source
- var/link
- if(to_follow in hosts)
- link = FOLLOW_LINK(src, to_follow)
- else
- link = ""
- // Create map text prior to modifying message for goonchat
- if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker)))
- create_chat_message(speaker, message_language, raw_message, spans)
- // Recompose the message, because it's scrambled by default
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)
- to_chat(src, "[link] [message]")
-
-
-/mob/camera/disease/mind_initialize()
- . = ..()
- if(!mind.has_antag_datum(/datum/antagonist/disease))
- mind.add_antag_datum(/datum/antagonist/disease)
- var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- medsensor.show_to(src)
-
-/mob/camera/disease/proc/pick_name()
- var/static/list/taken_names
- if(!taken_names)
- taken_names = list("Unknown" = TRUE)
- for(var/T in (subtypesof(/datum/disease) - /datum/disease/advance))
- var/datum/disease/D = T
- taken_names[initial(D.name)] = TRUE
- var/set_name
- while(!set_name)
- var/input = sanitize_name(tgui_input_text(src, "Select a name for your disease", "Select Name", max_length = MAX_NAME_LEN))
- if(!input)
- set_name = "Sentient Virus"
- break
- if(taken_names[input])
- to_chat(src, span_warning("You cannot use the name of such a well-known disease!"))
- else
- set_name = input
- real_name = "[set_name] (Sentient Disease)"
- name = "[set_name] (Sentient Disease)"
- disease_template.AssignName(set_name)
- var/datum/antagonist/disease/A = mind.has_antag_datum(/datum/antagonist/disease)
- if(A)
- A.disease_name = set_name
-
-/mob/camera/disease/proc/infect_random_patient_zero(del_on_fail = TRUE)
- if(!freemove)
- return FALSE
- var/list/possible_hosts = list()
- var/list/afk_possible_hosts = list()
- for(var/i in GLOB.human_list)
- var/mob/living/carbon/human/H = i
- var/turf/T = get_turf(H)
- if((H.stat != DEAD) && T && is_station_level(T.z) && H.CanContractDisease(disease_template))
- if(H.client && !H.client.is_afk())
- possible_hosts += H
- else
- afk_possible_hosts += H
-
- shuffle_inplace(possible_hosts)
- shuffle_inplace(afk_possible_hosts)
- possible_hosts += afk_possible_hosts //ideally we want a not-afk person, but we will settle for an afk one if there are no others (mostly for testing)
-
- while(possible_hosts.len)
- var/mob/living/carbon/human/target = possible_hosts[1]
- if(force_infect(target))
- return TRUE
- possible_hosts.Cut(1, 2)
-
- if(del_on_fail)
- to_chat(src, span_warning("No hosts were available for your disease to infect."))
- qdel(src)
- return FALSE
-
-/mob/camera/disease/proc/force_infect(mob/living/L)
- var/datum/disease/advance/sentient_disease/V = disease_template.Copy()
- var/result = L.ForceContractDisease(V, FALSE, TRUE)
- if(result && freemove)
- end_freemove()
- return result
-
-/mob/camera/disease/proc/end_freemove()
- if(!freemove)
- return
- freemove = FALSE
- move_on_shuttle = TRUE
- adaptation_menu_action = new /datum/action/innate/disease_adapt()
- adaptation_menu_action.Grant(src)
- for(var/V in GLOB.disease_ability_singletons)
- unpurchased_abilities[V] = TRUE
- var/datum/disease_ability/A = V
- if(A.start_with && A.CanBuy(src))
- A.Buy(src, TRUE, FALSE)
- if(freemove_end_timerid)
- deltimer(freemove_end_timerid)
- set_sight(SEE_SELF)
-
-/mob/camera/disease/proc/add_infection(datum/disease/advance/sentient_disease/V)
- disease_instances += V
- hosts[V.affected_mob] = V
- total_points = max(total_points, disease_instances.len)
- points += 1
-
- var/image/holder = V.affected_mob.hud_list[SENTIENT_DISEASE_HUD]
- var/mutable_appearance/MA = new /mutable_appearance(holder)
- MA.icon_state = "virus_infected"
- MA.layer = BELOW_MOB_LAYER
- MA.color = COLOR_GREEN_GRAY
- MA.alpha = 200
- holder.appearance = MA
- var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
- my_hud.add_atom_to_hud(V.affected_mob)
-
- to_chat(src, span_notice("A new host, [V.affected_mob.real_name], has been infected."))
-
- if(!following_host)
- set_following(V.affected_mob)
- refresh_adaptation_menu()
-
-/mob/camera/disease/proc/remove_infection(datum/disease/advance/sentient_disease/V)
- if(QDELETED(src))
- disease_instances -= V
- hosts -= V.affected_mob
- else
- to_chat(src, span_notice("One of your hosts, [V.affected_mob.real_name], has been purged of your infection."))
-
- var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE]
- my_hud.remove_atom_from_hud(V.affected_mob)
-
- if(following_host == V.affected_mob)
- follow_next()
-
- disease_instances -= V
- hosts -= V.affected_mob
-
- if(!disease_instances.len)
- to_chat(src, span_userdanger("The last of your infection has disappeared."))
- set_following(null)
- qdel(src)
- refresh_adaptation_menu()
-
-/mob/camera/disease/proc/set_following(mob/living/L)
- if(following_host)
- UnregisterSignal(following_host, COMSIG_MOVABLE_MOVED)
- RegisterSignal(L, COMSIG_MOVABLE_MOVED, PROC_REF(follow_mob))
- following_host = L
- follow_mob()
-
-/mob/camera/disease/proc/follow_next(reverse = FALSE)
- var/index = hosts.Find(following_host)
- if(index)
- if(reverse)
- index = index == 1 ? hosts.len : index - 1
- else
- index = index == hosts.len ? 1 : index + 1
- set_following(hosts[index])
-
-/mob/camera/disease/proc/follow_mob(datum/source, newloc, dir)
- SIGNAL_HANDLER
-
- var/turf/T = get_turf(following_host)
- if(T)
- forceMove(T)
-
-/mob/camera/disease/DblClickOn(atom/A, params)
- if(hosts[A])
- set_following(A)
- else
- ..()
-
-/mob/camera/disease/ClickOn(atom/A, params)
- if(freemove && ishuman(A))
- var/mob/living/carbon/human/H = A
- if(tgui_alert(usr, "Select [H.name] as your initial host?", "Select Host", list("Yes", "No")) != "Yes")
- return
- if(!freemove)
- return
- if(QDELETED(H) || !force_infect(H))
- to_chat(src, span_warning("[H ? H.name : "Host"] cannot be infected."))
- else
- ..()
-
-/mob/camera/disease/proc/adapt_cooldown()
- to_chat(src, span_notice("You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)]."))
- next_adaptation_time = world.time + adaptation_cooldown
- addtimer(CALLBACK(src, PROC_REF(notify_adapt_ready)), adaptation_cooldown)
-
-/mob/camera/disease/proc/notify_adapt_ready()
- to_chat(src, span_notice("You are now ready to adapt again."))
- refresh_adaptation_menu()
-
-/mob/camera/disease/proc/refresh_adaptation_menu()
- if(browser_open)
- adaptation_menu()
-
-/mob/camera/disease/proc/adaptation_menu()
- var/datum/disease/advance/sentient_disease/DT = disease_template
- if(!DT)
- return
- var/list/dat = list()
-
- if(examining_ability)
- dat += "Back
"
- dat += "
Cost | Unlock | Name | Type | Description | |
[A.cost] | [purchase_text] | [A.required_total_points] | [A.name] | [A.category] | [A.short_desc] |