diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm
index 37a89ba2ff..274c814cf5 100644
--- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm
+++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm
@@ -18,7 +18,7 @@
/obj/item/mining_scanner,
/obj/item/flashlight/lantern,
/obj/item/card/id/mining,
-/obj/item/gps/mining,
+/obj/item/gps/mining/off,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
"d" = (
@@ -32,7 +32,7 @@
/obj/item/mining_scanner,
/obj/item/flashlight/lantern,
/obj/item/card/id/mining,
-/obj/item/gps/mining,
+/obj/item/gps/mining/off,
/turf/open/floor/plating,
/area/ruin/powered/golem_ship)
"e" = (
@@ -71,8 +71,8 @@
/area/ruin/powered/golem_ship)
"k" = (
/obj/machinery/computer/arcade/battle{
- icon_state = "arcade";
- dir = 4
+ dir = 4;
+ icon_state = "arcade"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
@@ -112,8 +112,8 @@
/area/ruin/powered/golem_ship)
"s" = (
/obj/machinery/computer/arcade/orion_trail{
- icon_state = "arcade";
- dir = 4
+ dir = 4;
+ icon_state = "arcade"
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 997272432a..888b7b7ed6 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -12995,22 +12995,35 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/hydroponics/soil,
+/turf/open/floor/grass,
/area/chapel/main)
"aCP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/table/wood,
+/obj/item/reagent_containers/food/snacks/grown/poppy{
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/food/snacks/grown/harebell{
+ pixel_y = 5
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aCQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/light/small{
- dir = 1
+/obj/machinery/hydroponics/soil,
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 3
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/grass,
/area/chapel/main)
"aCR" = (
/turf/closed/wall,
@@ -13536,7 +13549,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aEi" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -13556,35 +13569,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aEl" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aEm" = (
-/obj/machinery/door/window{
- dir = 8;
- name = "Mass Driver";
- req_access_txt = "22"
+/obj/structure/bookcase,
+/obj/machinery/camera{
+ c_tag = "Chapel North"
},
-/obj/machinery/mass_driver{
- dir = 4;
- id = "chapelgun";
- name = "Holy Driver"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aEn" = (
-/obj/machinery/door/poddoor{
- id = "chapelgun";
- name = "Chapel Launcher Door"
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = 32
},
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aEz" = (
/obj/machinery/power/apc{
@@ -13978,16 +13980,10 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aFA" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/computer/pod/old{
- density = 0;
- icon = 'icons/obj/airlock_machines.dmi';
- icon_state = "airlock_control_standby";
- id = "chapelgun";
- name = "Mass Driver Controller";
- pixel_x = 24
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aFB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -14617,7 +14613,7 @@
departmentType = 2;
pixel_y = 30
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aGV" = (
/obj/structure/disposalpipe/segment{
@@ -14652,7 +14648,7 @@
/obj/machinery/airalarm{
pixel_y = 25
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aGZ" = (
/obj/machinery/door/airlock/security{
@@ -14703,7 +14699,7 @@
pixel_y = 25
},
/obj/machinery/vending/wardrobe/chap_wardrobe,
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aHg" = (
/obj/machinery/light_switch{
@@ -14712,7 +14708,7 @@
/obj/machinery/camera{
c_tag = "Chapel Office"
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aHh" = (
/obj/structure/cable{
@@ -14724,9 +14720,9 @@
/turf/open/floor/plasteel,
/area/gateway)
"aHi" = (
-/obj/structure/closet/crate/coffin,
-/obj/structure/window/reinforced{
- dir = 8
+/obj/machinery/door/morgue{
+ name = "Confession Booth (Chaplain)";
+ req_access_txt = "22"
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
@@ -14743,42 +14739,47 @@
/turf/open/floor/plasteel,
/area/gateway)
"aHk" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/table/wood,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/obj/item/clothing/under/misc/burial,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aHl" = (
-/obj/structure/closet/crate/coffin,
-/obj/machinery/door/window/eastleft{
- name = "Coffin Storage";
- req_access_txt = "22"
+/obj/structure/chair/comfy/plywood,
+/obj/machinery/light/floor,
+/obj/item/radio/intercom{
+ broadcasting = 1;
+ frequency = 1480;
+ name = "Confessional Intercom";
+ pixel_x = 25
},
+/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"aHm" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/dark,
+/obj/structure/lattice,
+/turf/closed/wall,
/area/chapel/main)
"aHn" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/mass_driver{
+ dir = 4;
+ id = "chapelgun";
+ name = "Holy Driver"
},
-/turf/open/floor/plasteel/dark,
-/area/chapel/main)
-"aHo" = (
-/obj/structure/table/glass,
-/obj/item/reagent_containers/food/snacks/grown/poppy,
-/obj/item/reagent_containers/food/snacks/grown/harebell,
-/turf/open/floor/plasteel/chapel{
- dir = 4
+/obj/machinery/door/window{
+ dir = 8;
+ name = "Mass Driver";
+ req_access_txt = "22"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/area/chapel/main)
-"aHq" = (
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/chapel/main)
"aHu" = (
@@ -15278,9 +15279,14 @@
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"aIz" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/plasteel/grimy,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/structure/table/wood,
+/obj/item/storage/crayons{
+ pixel_y = 8
+ },
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aIB" = (
/obj/structure/bodycontainer/crematorium{
@@ -15293,20 +15299,16 @@
/area/chapel/office)
"aIC" = (
/obj/effect/landmark/start/chaplain,
-/obj/structure/chair,
-/turf/open/floor/plasteel/grimy,
-/area/chapel/office)
-"aID" = (
-/obj/structure/closet/crate/coffin,
-/obj/structure/window/reinforced{
+/obj/structure/chair/comfy/plywood,
+/obj/structure/disposalpipe/segment{
dir = 4
},
+/turf/open/floor/carpet,
+/area/chapel/office)
+"aID" = (
+/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
-"aIE" = (
-/obj/structure/table/glass,
-/turf/open/floor/plasteel/chapel,
-/area/chapel/main)
"aIH" = (
/obj/structure/table,
/obj/item/storage/box/lights/mixed,
@@ -15328,7 +15330,7 @@
/area/construction/mining/aux_base)
"aII" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aIJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -15783,15 +15785,14 @@
/area/hydroponics)
"aJM" = (
/obj/structure/table/wood,
-/obj/item/flashlight/lamp{
- pixel_y = 10
- },
/obj/structure/disposalpipe/segment,
-/obj/item/nullrod,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/grimy,
+/obj/item/flashlight/lamp{
+ pixel_y = 15
+ },
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aJO" = (
/obj/structure/table,
@@ -15825,39 +15826,44 @@
/area/library)
"aJT" = (
/obj/structure/table/wood,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 5
- },
-/obj/item/storage/crayons,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/grimy,
+/obj/item/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/pen/fountain{
+ pixel_y = 4
+ },
+/turf/open/floor/carpet,
/area/chapel/office)
"aJU" = (
/obj/structure/table/wood,
-/obj/item/pen,
-/obj/item/reagent_containers/food/drinks/bottle/holywater,
+/obj/item/reagent_containers/food/drinks/bottle/holywater{
+ pixel_x = 9;
+ pixel_y = 4
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/grimy,
+/obj/item/nullrod{
+ pixel_x = -15;
+ pixel_y = 3
+ },
+/turf/open/floor/carpet,
/area/chapel/office)
"aJV" = (
-/obj/structure/closet/crate/coffin,
-/obj/machinery/door/window/eastleft{
- dir = 8;
- name = "Coffin Storage";
- req_access_txt = "22"
+/obj/effect/landmark/event_spawn,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/chapel/office)
+/turf/open/floor/plating,
+/area/chapel/main)
"aJW" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aJX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -15916,10 +15922,10 @@
/turf/open/floor/plasteel,
/area/gateway)
"aKe" = (
-/obj/structure/table/glass,
-/turf/open/floor/plasteel/chapel{
+/obj/structure/chair/wood/normal{
dir = 4
},
+/turf/open/floor/carpet,
/area/chapel/main)
"aKf" = (
/obj/structure/cable{
@@ -16248,7 +16254,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aLb" = (
/obj/structure/disposalpipe/segment{
@@ -16267,7 +16273,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aLd" = (
/obj/structure/table,
@@ -16286,13 +16292,13 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"aLe" = (
-/obj/structure/chair{
- dir = 1
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel/grimy,
+/obj/structure/chair/wood/normal{
+ dir = 1
+ },
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aLf" = (
/obj/machinery/airalarm{
@@ -16816,13 +16822,14 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
+/obj/structure/chair/wood/wings{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aMM" = (
-/obj/machinery/camera{
- c_tag = "Chapel North"
- },
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aMN" = (
/obj/machinery/chem_master/condimaster,
@@ -16887,7 +16894,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aMX" = (
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/wood/wood_large,
/area/chapel/office)
"aMY" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
@@ -17177,28 +17184,24 @@
/turf/open/floor/wood,
/area/library)
"aNW" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Chapel Office";
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
+"aNX" = (
+/obj/structure/closet/crate/coffin,
+/obj/machinery/door/window/eastright{
+ dir = 8;
+ name = "Coffin Storage";
req_access_txt = "22"
},
/turf/open/floor/plasteel/dark,
-/area/chapel/office)
-"aNX" = (
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1480;
- name = "Confessional Intercom";
- pixel_x = 25
- },
-/obj/structure/chair,
-/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aNY" = (
-/obj/machinery/door/morgue{
- name = "Confession Booth (Chaplain)";
- req_access_txt = "22"
+/obj/machinery/door/poddoor{
+ id = "chapelgun";
+ name = "Chapel Launcher Door"
},
-/turf/open/floor/plasteel/dark,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
/area/chapel/main)
"aNZ" = (
/obj/structure/chair,
@@ -17679,7 +17682,12 @@
},
/area/chapel/main)
"aPo" = (
-/obj/effect/spawner/structure/window/reinforced/tinted,
+/obj/structure/closet/crate/coffin,
+/obj/machinery/door/window/eastleft{
+ dir = 8;
+ name = "Coffin Storage";
+ req_access_txt = "22"
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aPp" = (
@@ -18085,7 +18093,11 @@
/area/chapel/main)
"aQw" = (
/obj/structure/table/wood,
-/turf/open/floor/plasteel/dark,
+/obj/item/trash/candle{
+ pixel_x = -5;
+ pixel_y = 2
+ },
+/turf/open/floor/carpet,
/area/chapel/main)
"aQx" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -18098,22 +18110,17 @@
},
/area/chapel/main)
"aQz" = (
-/obj/item/radio/intercom{
- broadcasting = 1;
- frequency = 1480;
- name = "Confessional Intercom";
- pixel_x = 25
- },
-/obj/structure/chair{
- dir = 1
+/obj/structure/closet/crate/coffin,
+/obj/structure/window/reinforced{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aQA" = (
-/obj/machinery/door/morgue{
- name = "Confession Booth"
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"aQB" = (
/obj/effect/turf_decal/tile/red{
@@ -19111,24 +19118,32 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aTf" = (
-/obj/structure/chair/stool,
+/obj/structure/chair/pew/right{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel,
/area/chapel/main)
"aTg" = (
-/obj/structure/chair/stool,
+/obj/structure/chair/pew/left{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 8
},
/area/chapel/main)
"aTh" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair/pew/right{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel,
/area/chapel/main)
"aTi" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/landmark/start/assistant,
+/obj/structure/chair/pew/left{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 8
},
@@ -19659,28 +19674,36 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"aUH" = (
-/obj/structure/chair/stool,
/obj/effect/landmark/start/assistant,
+/obj/structure/chair/pew/right{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 4
},
/area/chapel/main)
"aUI" = (
-/obj/structure/chair/stool,
+/obj/structure/chair/pew/left{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 1
},
/area/chapel/main)
"aUJ" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair/pew/right{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 4
},
/area/chapel/main)
"aUK" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/chair/pew/left{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 1
},
@@ -20207,8 +20230,10 @@
/turf/open/floor/wood,
/area/library)
"aVU" = (
-/obj/structure/chair/stool,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/chair/pew/left{
+ dir = 1
+ },
/turf/open/floor/plasteel/chapel{
dir = 8
},
@@ -21999,13 +22024,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
-"bag" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/wood,
-/area/crew_quarters/bar)
"bah" = (
/obj/structure/extinguisher_cabinet{
pixel_y = -30
@@ -23874,14 +23892,15 @@
/turf/closed/wall,
/area/maintenance/disposal)
"bfb" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
+/obj/machinery/computer/pod/old{
+ density = 0;
+ icon = 'icons/obj/airlock_machines.dmi';
+ icon_state = "airlock_control_standby";
+ id = "chapelgun";
+ name = "Mass Driver Controller";
+ pixel_x = 24
},
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating,
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"bfc" = (
/obj/machinery/power/apc{
@@ -34004,9 +34023,6 @@
/area/medical/surgery)
"bCJ" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/machinery/light_switch{
- pixel_y = 26
- },
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"bCK" = (
@@ -46267,7 +46283,7 @@
"chY" = (
/obj/machinery/shieldgen,
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"cia" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -46617,7 +46633,7 @@
"ciW" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"ciX" = (
/obj/structure/closet/crate,
/obj/item/stack/sheet/metal/fifty,
@@ -46632,14 +46648,14 @@
/obj/item/lightreplacer,
/obj/item/lightreplacer,
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"ciY" = (
/obj/machinery/door/poddoor{
id = "Secure Storage";
name = "secure storage"
},
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"ciZ" = (
/turf/open/floor/plating,
/area/engine/engineering)
@@ -46947,7 +46963,7 @@
dir = 4
},
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"cjN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -47234,11 +47250,11 @@
"ckB" = (
/obj/machinery/field/generator,
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"ckC" = (
/obj/machinery/power/emitter,
/turf/open/floor/plating,
-/area/engine/storage)
+/area/engine/engineering)
"ckD" = (
/obj/effect/turf_decal/bot{
dir = 1
@@ -49323,9 +49339,12 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat_interior)
"csT" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/xmastree,
-/turf/open/floor/plasteel/dark,
+/obj/structure/table/glass,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/item/storage/book/bible{
+ pixel_y = -1
+ },
+/turf/open/floor/wood/wood_large,
/area/chapel/main)
"csU" = (
/obj/structure/transit_tube/station/reverse,
@@ -51957,14 +51976,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cBZ" = (
-/obj/structure/table/wood,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/obj/item/clothing/under/misc/burial,
-/turf/open/floor/plasteel/grimy,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/disposal/bin,
+/turf/open/floor/carpet,
/area/chapel/office)
"cCb" = (
/obj/structure/table,
@@ -53407,10 +53423,6 @@
dir = 4
},
/obj/machinery/suit_storage_unit/atmos,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
/obj/effect/turf_decal/stripes/line{
dir = 9
},
@@ -53432,6 +53444,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"dmX" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/chapel/main)
"dnW" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -53462,6 +53478,14 @@
icon_state = "carpetsymbol"
},
/area/crew_quarters/theatre)
+"dsJ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/table/glass,
+/obj/item/toy/figure/chaplain{
+ pixel_y = -9
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"dtx" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -54381,8 +54405,9 @@
/turf/open/floor/plasteel,
/area/security/range)
"fsQ" = (
-/turf/open/floor/plating,
-/area/engine/storage)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"fty" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/orange/visible,
@@ -56336,6 +56361,17 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/space/basic,
/area/space/nearstation)
+"kdF" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/closet/crate/coffin,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plasteel/dark,
+/area/chapel/main)
"kdO" = (
/obj/machinery/pool/controller,
/turf/open/floor/plasteel/yellowsiding,
@@ -56734,6 +56770,10 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"kOL" = (
+/obj/structure/table/glass,
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"kPd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/structure/cable{
@@ -57074,6 +57114,15 @@
},
/turf/open/floor/plasteel,
/area/science/circuit)
+"lNB" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/xmastree{
+ pixel_x = 14
+ },
+/turf/open/floor/carpet,
+/area/chapel/main)
"lNH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable{
@@ -57332,6 +57381,10 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/wood,
/area/maintenance/bar)
+"mtU" = (
+/obj/structure/sign/departments/holy,
+/turf/closed/wall,
+/area/chapel/main)
"mug" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
@@ -57366,6 +57419,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"mzv" = (
+/obj/machinery/door/morgue{
+ name = "Confession Booth"
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"mzB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/window,
@@ -57575,6 +57634,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
+"mZx" = (
+/obj/structure/table/glass,
+/obj/item/storage/box/matches{
+ pixel_x = 4;
+ pixel_y = -8
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"naI" = (
/turf/open/space,
/area/space/station_ruins)
@@ -58844,6 +58911,14 @@
icon_state = "wood-broken2"
},
/area/maintenance/port/fore)
+"pXG" = (
+/obj/structure/table/wood,
+/obj/item/candle{
+ pixel_x = 5;
+ pixel_y = 2
+ },
+/turf/open/floor/carpet,
+/area/chapel/main)
"pYQ" = (
/obj/structure/reagent_dispensers/watertank,
/obj/item/reagent_containers/glass/bucket,
@@ -58938,6 +59013,13 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"qkn" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"qkC" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -59027,6 +59109,11 @@
/obj/structure/lattice,
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/captain)
+"qCR" = (
+/obj/structure/musician/piano,
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plasteel/dark,
+/area/chapel/main)
"qEB" = (
/obj/machinery/hydroponics/soil{
pixel_y = 8
@@ -59160,6 +59247,13 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/lobby)
+"qUh" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Chapel Office";
+ req_access_txt = "22"
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"qVP" = (
/obj/effect/spawner/structure/window,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -59442,6 +59536,14 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"rxF" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/table/glass,
+/obj/item/storage/book/bible{
+ pixel_y = 17
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"ryr" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -60469,6 +60571,12 @@
},
/turf/open/floor/wood,
/area/maintenance/bar)
+"tSm" = (
+/obj/item/kirbyplants{
+ icon_state = "plant-18"
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main)
"tSo" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/dark/visible{
@@ -61202,6 +61310,19 @@
/obj/item/clothing/under/misc/pj/blue,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"vqE" = (
+/obj/structure/chair/wood/normal{
+ dir = 1
+ },
+/obj/machinery/light/floor,
+/obj/item/radio/intercom{
+ broadcasting = 1;
+ frequency = 1480;
+ name = "Confessional Intercom";
+ pixel_x = -25
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main)
"vqP" = (
/obj/structure/bed/dogbed{
desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off.";
@@ -62236,8 +62357,17 @@
/turf/open/floor/carpet,
/area/library)
"xES" = (
-/turf/closed/wall/r_wall,
-/area/engine/storage)
+/obj/structure/table/glass,
+/obj/item/storage/fancy/candle_box{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/storage/fancy/candle_box{
+ pixel_x = 1;
+ pixel_y = 4
+ },
+/turf/open/floor/wood/wood_large,
+/area/chapel/main)
"xFM" = (
/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/head/soft/rainbow,
@@ -62327,6 +62457,12 @@
/obj/item/instrument/trombone,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
+"xRa" = (
+/obj/item/kirbyplants{
+ icon_state = "plant-20"
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main)
"xSW" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -87889,14 +88025,14 @@ cdc
cdZ
bVI
cay
-xES
-xES
-xES
-xES
-xES
-xES
-xES
-xES
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
+ccw
cfL
coH
cBO
@@ -88146,14 +88282,14 @@ bWB
cec
bVI
kNv
-xES
+ccw
chY
ciX
cjM
ckB
ckB
ckB
-xES
+ccw
cnY
coH
cgR
@@ -88403,14 +88539,14 @@ cde
ceb
bVI
cay
-xES
+ccw
chY
-fsQ
+ciZ
ciW
ckB
ckB
ckC
-xES
+ccw
cnX
coH
cps
@@ -88660,14 +88796,14 @@ cdf
ced
bVI
cay
-xES
-fsQ
-fsQ
-fsQ
+ccw
+ciZ
+ciZ
+ciZ
ckC
ckC
ckC
-xES
+ccw
coa
coJ
clJ
@@ -88917,14 +89053,14 @@ bWB
bWB
bVI
cay
-xES
-xES
+ccw
+ccw
ciY
ciY
-xES
-xES
-xES
-xES
+ccw
+ccw
+ccw
+ccw
cnZ
coH
cgI
@@ -99147,7 +99283,7 @@ aSZ
aQc
qaY
acN
-bag
+aKR
aJC
aYV
aYV
@@ -108390,7 +108526,7 @@ cBZ
aJT
aLc
aFw
-aFz
+tSm
aFz
aFz
aRR
@@ -108400,7 +108536,7 @@ aFz
aRS
aXW
baz
-aCR
+mtU
bcx
aXq
aYV
@@ -108646,7 +108782,7 @@ aGY
aII
aJW
aMX
-aNW
+qUh
aFz
aPl
aQv
@@ -108656,7 +108792,7 @@ aUI
aTg
aRS
aZf
-aFz
+xRa
bbF
aYV
aXq
@@ -108900,8 +109036,8 @@ aCM
aEg
aFw
aHi
-aHi
-aJV
+aFw
+aFw
aFw
aFw
aFz
@@ -109158,18 +109294,18 @@ aEi
aFw
aHl
aID
-aID
-aFw
-aMM
-aFz
+vqE
+aCR
+qCR
aFz
+aRS
aQw
aRS
aRS
aRS
aRS
aRS
-aZf
+lNB
aRS
bbF
aYV
@@ -109412,15 +109548,15 @@ aAz
asB
aCO
aEh
-aFz
-aHk
-aFz
-aFz
-aTe
+aCR
+aCR
+aCR
+mzv
+aCR
aML
aFz
-aFz
-aQw
+aRS
+pXG
cdl
aRS
aRS
@@ -109669,11 +109805,11 @@ aAA
asB
aCQ
aEk
-aFB
-aHn
-aFB
-csT
-aFB
+fsQ
+dsJ
+rxF
+fsQ
+qkn
aLr
aFB
aPn
@@ -109925,12 +110061,12 @@ awO
awO
asB
aCP
-aEj
+aMM
aFA
-aHm
-aEj
-aEj
-aEj
+aMM
+aMM
+aMM
+aMM
aEj
aEj
aPm
@@ -109941,7 +110077,7 @@ aUJ
aTh
aXz
aZg
-aFz
+xRa
bbF
aYV
bdv
@@ -110181,18 +110317,18 @@ ayj
azx
aAB
asB
-aCR
aEm
-aCR
-aPl
-aQv
-aPl
-aQv
-aCR
-aNY
-aCR
+aNW
aQA
-aCR
+aNW
+aNW
+aNW
+aNW
+aFz
+aFz
+aFz
+aFz
+aFz
aTj
aFz
aVV
@@ -110438,14 +110574,14 @@ asB
asB
asB
asB
-aCR
+aHk
+aNW
bfb
-aCR
-aHo
-aIE
aKe
-aIE
-aCR
+aKe
+aKe
+aNW
+kdF
aNX
aPo
aQz
@@ -110694,14 +110830,14 @@ atS
aaf
aaf
aaf
-atS
+asB
aCR
aEn
aCR
-aHq
-aHq
-aHq
-aHq
+aKe
+aKe
+aKe
+aNW
aCR
aCR
aCR
@@ -110951,14 +111087,14 @@ atS
aoV
aoV
aaf
-atS
-aaf
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
+gXs
+aHm
+aHn
+dmX
+aNW
+aNW
+aNW
+aNW
aMZ
aNZ
aPp
@@ -111208,14 +111344,14 @@ aaH
aoV
aoV
aaf
-atS
-aaf
-aaa
-aaf
-aaa
-aaa
-aaa
-aaf
+gXs
+aHm
+aJV
+dmX
+csT
+kOL
+mZx
+xES
aMZ
aOb
aPr
@@ -111465,14 +111601,14 @@ aaH
aoV
aoV
aoV
-atS
-aaf
-aaa
-aaf
-aaa
-aaa
-aaa
-aaf
+gXs
+aHm
+aNY
+aCR
+dmX
+dmX
+dmX
+dmX
aMZ
aOa
aVX
@@ -111722,7 +111858,7 @@ atS
aoV
aoV
aoV
-atS
+gXs
aaf
aaa
aaf
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 6f5bab0498..e41f6c7d89 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -6004,12 +6004,12 @@
c_tag = "Security Checkpoint";
pixel_x = 22
},
-/obj/machinery/newscaster/security_unit{
- pixel_y = 32
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel,
/area/security/checkpoint)
"aoz" = (
@@ -32290,10 +32290,6 @@
dir = 8;
light_color = "#e8eaff"
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
/turf/open/floor/plasteel,
/area/hydroponics)
"bsl" = (
@@ -71184,6 +71180,13 @@
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"pMW" = (
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
"pZq" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 8;
@@ -121382,7 +121385,7 @@ amV
aqI
aqB
aGO
-auy
+pMW
aqB
aqI
amV
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 10b10424b9..79193b3186 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -49530,7 +49530,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/line{
- dir = 10
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
@@ -113323,10 +113323,6 @@
/obj/item/clothing/gloves/color/black,
/obj/item/storage/box/evidence,
/obj/item/taperecorder,
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 408efad32f..1b37eea20c 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -30529,9 +30529,6 @@
dir = 8
},
/obj/structure/closet/bombcloset,
-/obj/machinery/airalarm{
- pixel_y = 24
- },
/turf/open/floor/plasteel/dark,
/area/science/mixing)
"aXC" = (
@@ -43701,10 +43698,6 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
/mob/living/simple_animal/chicken{
desc = "The arch-nemesis of Kentucky.";
name = "Popeye";
@@ -46363,9 +46356,6 @@
"bwK" = (
/obj/structure/flora/grass/jungle/b,
/obj/structure/flora/ausbushes/sparsegrass,
-/obj/machinery/airalarm{
- pixel_y = 22
- },
/turf/open/floor/grass,
/area/chapel/main)
"bwL" = (
@@ -48132,16 +48122,6 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/brig)
-"bzx" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/turf/closed/wall,
-/area/crew_quarters/locker)
"bzy" = (
/obj/machinery/light/small{
dir = 8
@@ -58156,10 +58136,6 @@
icon_state = "plant-02";
pixel_y = 3
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -22
- },
/obj/machinery/camera{
c_tag = "Prison Wing Cells";
dir = 4;
@@ -61358,7 +61334,7 @@
dir = 10
},
/turf/open/floor/plasteel,
-/area/space)
+/area/security/warden)
"bUs" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command/glass{
@@ -67210,10 +67186,6 @@
/obj/structure/cable{
icon_state = "1-4"
},
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
/turf/open/floor/plasteel,
/area/security/main)
"cdU" = (
@@ -71327,9 +71299,9 @@
icon_gib = "magicarp_gib";
icon_living = "magicarp";
icon_state = "magicarp";
+ maxHealth = 200;
max_co2 = 5;
max_tox = 2;
- maxHealth = 200;
melee_damage_lower = 15;
melee_damage_upper = 20;
min_oxy = 5;
@@ -83281,10 +83253,6 @@
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 5
},
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
/obj/machinery/camera{
c_tag = "Atmospherics Port Tanks";
dir = 4;
@@ -108992,7 +108960,7 @@ bss
btV
aEu
bxW
-bzx
+bIV
bKq
bKq
bKq
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 34fea2180d..c2a0e5c353 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -1111,10 +1111,6 @@
/turf/open/floor/plasteel,
/area/security/prison)
"acx" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
/obj/machinery/cryopod{
dir = 8
},
@@ -40497,10 +40493,9 @@
/area/maintenance/port)
"bBr" = (
/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
+ dir = 1;
+ pixel_y = -22
},
-/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"bBs" = (
@@ -45866,10 +45861,6 @@
/area/library)
"bML" = (
/obj/machinery/light/small,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
/turf/open/floor/wood,
/area/library)
"bMM" = (
@@ -59581,6 +59572,10 @@
/obj/structure/chair{
dir = 1
},
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
/turf/open/floor/plasteel/dark,
/area/medical/surgery)
"coz" = (
@@ -61596,10 +61591,6 @@
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"csl" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
/obj/structure/window/reinforced{
dir = 8
},
@@ -102698,7 +102689,7 @@ bue
bwa
bxU
bzD
-bBr
+dmD
bSx
bEw
bzE
@@ -103733,7 +103724,7 @@ bGs
bHS
bzE
bLk
-bzE
+bBr
bue
bPS
bPR
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index f4d798511f..6f7f211b3e 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -4924,11 +4924,11 @@
/obj/effect/turf_decal/stripes/end{
dir = 1
},
-/obj/item/gun/energy/e_gun/hos,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
+/obj/item/gun/energy/e_gun/hos,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain/private)
"ahI" = (
@@ -40544,6 +40544,9 @@
name = "Starboard Quater Maintenance APC";
pixel_y = -26
},
+/obj/structure/cable/white{
+ icon_state = "0-8"
+ },
/turf/open/floor/plating{
icon_state = "panelscorched"
},
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 12ae0092f0..12c507c2bf 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -16530,6 +16530,9 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"aMr" = (
@@ -47631,6 +47634,9 @@
pixel_x = -25;
specialfunctions = 4
},
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
/turf/open/floor/plasteel/grimy,
/area/chapel/main/monastery)
"cgM" = (
@@ -47979,6 +47985,9 @@
pixel_x = -25;
specialfunctions = 4
},
+/obj/machinery/airalarm{
+ pixel_y = 22
+ },
/turf/open/floor/plasteel/grimy,
/area/chapel/main/monastery)
"cip" = (
@@ -51466,6 +51475,10 @@
name = "Coffin Storage";
req_one_access_txt = "22"
},
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvu" = (
@@ -59434,6 +59447,10 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
+ },
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"qXq" = (
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 68515426c3..e71243994d 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -69,6 +69,9 @@
#define LINGBLOOD_EXPLOSION_THRESHOLD (LINGBLOOD_DETECTION_THRESHOLD * LINGBLOOD_EXPLOSION_MULT) //Hey, important to note here: the explosion threshold is explicitly more than, rather than more than or equal to. This stops a single loud ability from triggering the explosion threshold.
///Heretics --
+GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance, for us to iterate through.
+
+
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index a084f2ae34..a1bb4122a8 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -541,6 +541,9 @@
#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob)
+// /datum/element/ventcrawling signals
+#define COMSIG_HANDLE_VENTCRAWL "handle_ventcrawl" //when atom with ventcrawling element attempts to ventcrawl
+#define COMSIG_CHECK_VENTCRAWL "check_ventcrawl" //to check an atom's ventcrawling element tier (if applicable)
// twitch plays
/// Returns direction: (wipe_votes)
#define COMSIG_TWITCH_PLAYS_MOVEMENT_DATA "twitch_plays_movement_data"
diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm
index ecd043a66a..973457692e 100644
--- a/code/__DEFINES/loadout.dm
+++ b/code/__DEFINES/loadout.dm
@@ -72,9 +72,11 @@
#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though
//loadout saving/loading specific defines
-#define MAXIMUM_LOADOUT_SAVES 5
-#define LOADOUT_ITEM "loadout_item"
-#define LOADOUT_COLOR "loadout_color"
+#define MAXIMUM_LOADOUT_SAVES 5
+#define LOADOUT_ITEM "loadout_item"
+#define LOADOUT_COLOR "loadout_color"
+#define LOADOUT_CUSTOM_NAME "loadout_custom_name"
+#define LOADOUT_CUSTOM_DESCRIPTION "loadout_custom_description"
//loadout item flags
#define LOADOUT_CAN_NAME (1<<0) //renaming items
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 2275c4b90b..b7750556d5 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -253,6 +253,7 @@
// item traits
#define TRAIT_NODROP "nodrop"
+#define TRAIT_SPOOKY_THROW "spooky_throw"
// common trait sources
#define TRAIT_GENERIC "generic"
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 8d25fb8e03..a59ee9fcb0 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -67,24 +67,25 @@
//Returns a list in plain english as a string
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
- var/total = input.len
- if (!total)
- return nothing_text
- else if (total == 1)
- return "[input[1]]"
- else if (total == 2)
- return "[input[1]][and_text][input[2]]"
- else
- var/output = ""
- var/index = 1
- while (index < total)
- if (index == total - 1)
- comma_text = final_comma_text
+ var/total = length(input)
+ switch(total)
+ if (0)
+ return "[nothing_text]"
+ if (1)
+ return "[input[1]]"
+ if (2)
+ return "[input[1]][and_text][input[2]]"
+ else
+ var/output = ""
+ var/index = 1
+ while (index < total)
+ if (index == total - 1)
+ comma_text = final_comma_text
- output += "[input[index]][comma_text]"
- index++
+ output += "[input[index]][comma_text]"
+ index++
- return "[output][and_text][input[index]]"
+ return "[output][and_text][input[index]]"
//Returns list element or null. Should prevent "index out of bounds" error.
/proc/listgetindex(list/L, index)
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index a61e3a6492..8ff610e68c 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -19,22 +19,6 @@
/proc/arachnid_name()
return "[pick(GLOB.arachnid_first)] [pick(GLOB.arachnid_last)]"
-/proc/church_name()
- var/static/church_name
- if (church_name)
- return church_name
-
- var/name = ""
-
- name += pick("Holy", "United", "First", "Second", "Last")
-
- if (prob(20))
- name += " Space"
-
- name += " " + pick("Church", "Cathedral", "Body", "Worshippers", "Movement", "Witnesses")
- name += " of [religion_name()]"
-
- return name
GLOBAL_VAR(command_name)
/proc/command_name()
@@ -52,17 +36,6 @@ GLOBAL_VAR(command_name)
return name
-/proc/religion_name()
- var/static/religion_name
- if (religion_name)
- return religion_name
-
- var/name = ""
-
- name += pick("bee", "science", "edu", "captain", "assistant", "monkey", "alien", "space", "unit", "sprocket", "gadget", "bomb", "revolution", "beyond", "station", "goon", "robot", "ivor", "hobnob")
- name += pick("ism", "ia", "ology", "istism", "ites", "ick", "ian", "ity")
-
- return capitalize(name)
/proc/station_name()
if(!GLOB.station_name)
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 0987e95dc9..87187a4c3d 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -78,21 +78,21 @@
//Turns a direction into text
/proc/dir2text(direction)
switch(direction)
- if(1)
+ if(NORTH)
return "north"
- if(2)
+ if(SOUTH)
return "south"
- if(4)
+ if(EAST)
return "east"
- if(8)
+ if(WEST)
return "west"
- if(5)
+ if(NORTHEAST)
return "northeast"
- if(6)
+ if(SOUTHEAST)
return "southeast"
- if(9)
+ if(NORTHWEST)
return "northwest"
- if(10)
+ if(SOUTHWEST)
return "southwest"
else
return
@@ -101,21 +101,21 @@
/proc/text2dir(direction)
switch(uppertext(direction))
if("NORTH")
- return 1
+ return NORTH
if("SOUTH")
- return 2
+ return SOUTH
if("EAST")
- return 4
+ return EAST
if("WEST")
- return 8
+ return WEST
if("NORTHEAST")
- return 5
+ return NORTHEAST
if("NORTHWEST")
- return 9
+ return NORTHWEST
if("SOUTHEAST")
- return 6
+ return SOUTHEAST
if("SOUTHWEST")
- return 10
+ return SOUTHWEST
else
return
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 7fad1690e6..41068048a1 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -274,7 +274,7 @@ GLOBAL_LIST_INIT(redacted_strings, list("\[REDACTED\]", "\[CLASSIFIED\]", "\[ARC
GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt"))
//LANGUAGE CHARACTER CUSTOMIZATION
-GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles"))
+GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles", "caws", "gekkers", "clucks"))
GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien))
//SPECIES BODYPART LISTS
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 4e593ba904..f376ba50d7 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -130,7 +130,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
),
/obj/item = list(
"TRAIT_NODROP" = TRAIT_NODROP,
- "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT
+ "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT,
+ "TRAIT_SPOOKY_THROW" = TRAIT_SPOOKY_THROW
)
))
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 5bd9632355..81d8593d4e 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -220,7 +220,7 @@
/obj/screen/alert/shiver
name = "Shivering"
- desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit."
+ desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit."
/obj/screen/alert/lowpressure
name = "Low Pressure"
@@ -306,6 +306,39 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
if(CHECK_MOBILITY(L, MOBILITY_MOVE))
return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt.
+/obj/screen/alert/give // information set when the give alert is made
+ icon_state = "default"
+ var/mob/living/carbon/giver
+ var/obj/item/receiving
+
+/**
+ * Handles assigning most of the variables for the alert that pops up when an item is offered
+ *
+ * Handles setting the name, description and icon of the alert and tracking the person giving
+ * and the item being offered, also registers a signal that removes the alert from anyone who moves away from the giver
+ * Arguments:
+ * * taker - The person receiving the alert
+ * * giver - The person giving the alert and item
+ * * receiving - The item being given by the giver
+ */
+/obj/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving)
+ name = "[giver] is offering [receiving]"
+ desc = "[giver] is offering [receiving]. Click this alert to take it."
+ icon_state = "template"
+ cut_overlays()
+ add_overlay(receiving)
+ src.receiving = receiving
+ src.giver = giver
+ RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/removeAlert)
+
+/obj/screen/alert/give/proc/removeAlert()
+ to_chat(usr, "You moved out of range of [giver]!")
+ usr.clear_alert("[giver]")
+
+/obj/screen/alert/give/Click(location, control, params)
+ . = ..()
+ var/mob/living/carbon/C = usr
+ C.take(giver, receiving)
//ALIENS
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 779ee2fbac..165f6e9d81 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -691,21 +691,29 @@ SUBSYSTEM_DEF(job)
if(!permitted)
continue
var/obj/item/I = new G.path
- if(I && length(i[LOADOUT_COLOR])) //handle loadout colors
- //handle polychromic items
- if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
- var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this
- if(polychromic && istype(polychromic))
- var/list/polychromic_entry = polychromic.colors_by_atom[I]
- if(polychromic_entry)
- if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things?
- polychromic.connect_helmet(I,i[LOADOUT_COLOR])
- polychromic.colors_by_atom[I] = i[LOADOUT_COLOR]
- I.update_icon()
- else
- //handle non-polychromic items (they only have one color)
- I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY)
- I.update_icon()
+ if(I)
+ if(length(i[LOADOUT_COLOR])) //handle loadout colors
+ //handle polychromic items
+ if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors))
+ var/datum/element/polychromic/polychromic = I.comp_lookup["item_worn_overlays"] //stupid way to do it but GetElement does not work for this
+ if(polychromic && istype(polychromic))
+ var/list/polychromic_entry = polychromic.colors_by_atom[I]
+ if(polychromic_entry)
+ if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things?
+ polychromic.connect_helmet(I,i[LOADOUT_COLOR])
+ polychromic.colors_by_atom[I] = i[LOADOUT_COLOR]
+ I.update_icon()
+ else
+ //handle non-polychromic items (they only have one color)
+ I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY)
+ I.update_icon()
+ //when inputting the data it's already sanitized
+ if(i[LOADOUT_CUSTOM_NAME])
+ var/custom_name = i[LOADOUT_CUSTOM_NAME]
+ I.name = custom_name
+ if(i[LOADOUT_CUSTOM_DESCRIPTION])
+ var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION]
+ I.desc = custom_description
if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
if(iscarbon(M))
var/mob/living/carbon/C = M
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index e5d6b0bbd0..0fa8035d72 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -84,6 +84,8 @@ SUBSYSTEM_DEF(throwing)
/datum/thrownthing/Destroy()
+ if(HAS_TRAIT_FROM(thrownthing, TRAIT_SPOOKY_THROW, "revenant"))
+ REMOVE_TRAIT(thrownthing, TRAIT_SPOOKY_THROW, "revenant")
SSthrowing.processing -= thrownthing
thrownthing.throwing = null
thrownthing = null
diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm
index c2b3ad1f30..61098c8b66 100644
--- a/code/datums/components/gps.dm
+++ b/code/datums/components/gps.dm
@@ -21,7 +21,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
-/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE)
+/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, starton = TRUE)
. = ..()
if(. == COMPONENT_INCOMPATIBLE || !isitem(parent))
return COMPONENT_INCOMPATIBLE
@@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_AltClick)
+ if(!starton)
+ tracking = FALSE
///Called on COMSIG_ITEM_ATTACK_SELF
/datum/component/gps/item/proc/interact(datum/source, mob/user)
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index f93d40bb04..2fa5a20d7a 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -449,6 +449,10 @@
// this must come before the screen objects only block, dunno why it wasn't before
if(over_object == M)
user_show_to_mob(M)
+ return
+ if(isrevenant(M))
+ RevenantThrow(over_object, M, source)
+ return
if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
dump_content_at(over_object, M)
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 44775ed031..8dca59ea94 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -121,7 +121,7 @@
add_monkey(affected_mob.mind)
if(ishuman(affected_mob))
var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
- M.ventcrawler = VENTCRAWLER_ALWAYS
+ M.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/datum/disease/transformation/jungle_fever/stage_act()
diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm
index d770e0f30d..619f674969 100644
--- a/code/datums/elements/mob_holder.dm
+++ b/code/datums/elements/mob_holder.dm
@@ -141,7 +141,7 @@
/obj/item/clothing/head/mob_holder/dropped(mob/user)
. = ..()
- if(held_mob && isturf(loc))//don't release on soft-drops
+ if(held_mob && !ismob(loc))//don't release on soft-drops
release()
/obj/item/clothing/head/mob_holder/proc/release()
diff --git a/code/datums/elements/ventcrawling.dm b/code/datums/elements/ventcrawling.dm
new file mode 100644
index 0000000000..254345a97f
--- /dev/null
+++ b/code/datums/elements/ventcrawling.dm
@@ -0,0 +1,36 @@
+/datum/element/ventcrawling
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ var/tier
+
+/datum/element/ventcrawling/Attach(datum/target, duration = 0, given_tier = VENTCRAWLER_NUDE)
+ . = ..()
+
+ var/mob/living/person = target
+ if(!istype(person))
+ return FALSE
+
+ src.tier = given_tier
+
+ RegisterSignal(target, COMSIG_HANDLE_VENTCRAWL, .proc/handle_ventcrawl)
+ RegisterSignal(target, COMSIG_CHECK_VENTCRAWL, .proc/check_ventcrawl)
+ to_chat(target, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.")
+
+ if(duration!=0)
+ addtimer(CALLBACK(src, .proc/Detach, target), duration)
+
+/datum/element/ventcrawling/Detach(datum/target)
+ UnregisterSignal(target, list(COMSIG_HANDLE_VENTCRAWL, COMSIG_CHECK_VENTCRAWL))
+ to_chat(target, "You can no longer ventcrawl.")
+
+ return ..()
+
+/datum/element/ventcrawling/proc/handle_ventcrawl(datum/target,atom/A)
+ var/mob/living/person = target
+ if(!istype(person))
+ return FALSE
+
+ person.handle_ventcrawl(A,tier)
+
+/datum/element/ventcrawling/proc/check_ventcrawl()
+ return tier
diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm
index 36ca035be9..9a29158b33 100644
--- a/code/datums/explosion.dm
+++ b/code/datums/explosion.dm
@@ -239,8 +239,13 @@ GLOBAL_LIST_EMPTY(explosions)
atoms += A
for(var/i in atoms)
var/atom/A = i
- if(!QDELETED(A))
- A.ex_act(dist)
+ if(QDELETED(A))
+ continue
+ A.ex_act(dist, null, src)
+ if(QDELETED(A) || !ismovable(A))
+ continue
+ var/atom/movable/AM = A
+ LAZYADD(AM.acted_explosions, explosion_id)
if(flame_dist && prob(40) && !isspaceturf(T) && !T.density)
new /obj/effect/hotspot(T) //Mostly for ambience!
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 4a24416e3c..189640a1c6 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -548,7 +548,7 @@
/atom/proc/contents_explosion(severity, target)
return //For handling the effects of explosions on contents that would not normally be effected
-/atom/proc/ex_act(severity, target)
+/atom/proc/ex_act(severity, target, datum/explosion/E)
set waitfor = FALSE
contents_explosion(severity, target)
SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index bbbce9b8fd..a582fa03e4 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -574,8 +574,8 @@
return TRUE
//TODO: Better floating
-/atom/movable/proc/float(on)
- if(throwing)
+/atom/movable/proc/float(on, throw_override)
+ if(throwing || !throw_override)
return
if(on && !(movement_type & FLOATING))
animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index d8617e0b48..0ee07951a9 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -455,7 +455,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
var/target_missing_id
-/datum/objective/escape/escape_with_identity/find_target()
+/datum/objective/escape/escape_with_identity/find_target(dupe_search_range, blacklist)
target = ..()
update_explanation_text()
@@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(possible_items)
for(var/I in subtypesof(/datum/objective_item/steal))
new I
-/datum/objective/steal/find_target()
+/datum/objective/steal/find_target(dupe_search_range, blacklist)
var/list/datum/mind/owners = get_owners()
var/approved_targets = list()
check_items:
@@ -631,7 +631,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack))
new I
-/datum/objective/steal/special/find_target()
+/datum/objective/steal/special/find_target(dupe_search_range, blacklist)
return set_target(pick(GLOB.possible_items_special))
/datum/objective/steal/exchange
@@ -844,7 +844,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
name = "destroy AI"
martyr_compatible = 1
-/datum/objective/destroy/find_target()
+/datum/objective/destroy/find_target(dupe_search_range, blacklist)
var/list/possible_targets = active_ais(1)
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
target = target_ai.mind
@@ -1124,7 +1124,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/hoard/heirloom
name = "steal heirloom"
-/datum/objective/hoard/heirloom/find_target()
+/datum/objective/hoard/heirloom/find_target(dupe_search_range, blacklist)
set_target(pick(GLOB.family_heirlooms))
GLOBAL_LIST_EMPTY(traitor_contraband)
@@ -1141,7 +1141,7 @@ GLOBAL_LIST_EMPTY(cult_contraband)
if(!GLOB.cult_contraband.len)
GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift)
-/datum/objective/hoard/collector/find_target()
+/datum/objective/hoard/collector/find_target(dupe_search_range, blacklist)
var/obj/item/I
var/I_type
if(prob(50))
@@ -1172,7 +1172,7 @@ GLOBAL_LIST_EMPTY(possible_sabotages)
for(var/I in subtypesof(/datum/sabotage_objective))
new I
-/datum/objective/sabotage/find_target()
+/datum/objective/sabotage/find_target(dupe_search_range, blacklist)
var/list/datum/mind/owners = get_owners()
var/approved_targets = list()
check_sabotages:
diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm
index b4306d49a4..1f1c16248c 100644
--- a/code/game/machinery/colormate.dm
+++ b/code/game/machinery/colormate.dm
@@ -6,10 +6,12 @@
density = TRUE
anchored = TRUE
circuit = /obj/item/circuitboard/machine/colormate
- var/obj/item/inserted
+ var/atom/movable/inserted
var/activecolor = "#FFFFFF"
var/list/color_matrix_last
var/matrix_mode = FALSE
+ /// Allow holder'd mobs
+ var/allow_mobs = TRUE
/// Minimum lightness for normal mode
var/minimum_normal_lightness = 50
/// Minimum lightness for matrix mode, tested using 4 test colors of full red, green, blue, white.
@@ -57,11 +59,22 @@
return
if(user.a_intent == INTENT_HARM)
return ..()
+ if(allow_mobs && istype(I, /obj/item/clothing/head/mob_holder))
+ var/obj/item/clothing/head/mob_holder/H = I
+ var/mob/victim = H.held_mob
+ if(!user.transferItemToLoc(I, src))
+ to_chat(user, "[I] is stuck to your hand!")
+ return
+ if(!QDELETED(H))
+ H.release()
+ insert_mob(victim, user)
if(is_type_in_list(I, allowed_types) && is_operational())
if(!user.transferItemToLoc(I, src))
to_chat(user, "[I] is stuck to your hand!")
return
+ if(QDELETED(I))
+ return
user.visible_message("[user] inserts [I] into [src]'s receptable.")
inserted = I
@@ -69,9 +82,22 @@
else
return ..()
+/obj/machinery/gear_painter/proc/insert_mob(mob/victim, mob/user)
+ if(inserted)
+ return
+ if(user)
+ visible_message("[user] stuffs [victim] into [src]!")
+ inserted = victim
+ inserted.forceMove(src)
+
/obj/machinery/gear_painter/AllowDrop()
return FALSE
+/obj/machinery/gear_painter/handle_atom_del(atom/movable/AM)
+ if(AM == inserted)
+ inserted = null
+ return ..()
+
/obj/machinery/gear_painter/AltClick(mob/user)
. = ..()
if(!user.CanReach(src))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 251e2fe327..608768a0c7 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -468,6 +468,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
melee_attack_chain(usr, over)
usr.FlushCurrentAction()
return TRUE //returning TRUE as a "is this overridden?" flag
+ if(isrevenant(usr))
+ if(RevenantThrow(over, usr, src))
+ return
+
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
@@ -939,6 +943,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/get_part_rating()
return 0
+//Can this item be given to people?
+/obj/item/proc/can_give()
+ return TRUE
+
/obj/item/doMove(atom/destination)
if (ismob(loc))
var/mob/M = loc
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index a3366e714e..960e3ce499 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -82,4 +82,8 @@
/obj/item/candle/infinite/hugbox
heats_space = FALSE
+/obj/item/candle/DoRevenantThrowEffects(atom/target)
+ if(!infinite)
+ put_out_candle()
+
#undef CANDLE_LUMINOSITY
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 5b1b86b9e4..7d2b0ed832 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -779,16 +779,40 @@
/obj/item/card/id/departmental_budget/update_label()
return
+/obj/item/card/id/departmental_budget/civ
+ department_ID = ACCOUNT_CIV
+ department_name = ACCOUNT_CIV_NAME
+
+/obj/item/card/id/departmental_budget/eng
+ department_ID = ACCOUNT_ENG
+ department_name = ACCOUNT_ENG_NAME
+
+/obj/item/card/id/departmental_budget/sci
+ department_ID = ACCOUNT_SCI
+ department_name = ACCOUNT_SCI_NAME
+
+/obj/item/card/id/departmental_budget/med
+ department_ID = ACCOUNT_MED
+ department_name = ACCOUNT_MED_NAME
+
+/obj/item/card/id/departmental_budget/srv
+ department_ID = ACCOUNT_SRV
+ department_name = ACCOUNT_SRV_NAME
+
/obj/item/card/id/departmental_budget/car
department_ID = ACCOUNT_CAR
department_name = ACCOUNT_CAR_NAME
+/obj/item/card/id/departmental_budget/sec
+ department_ID = ACCOUNT_SEC
+ department_name = ACCOUNT_SEC_NAME
+
//Polychromatic Knight Badge
/obj/item/card/id/knight
name = "knight badge"
icon_state = "knight"
- desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID"
+ desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID."
var/id_color = "#00FF00" //defaults to green
var/mutable_appearance/id_overlay
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index de32375642..4280e7105f 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -136,6 +136,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
STOP_PROCESSING(SSobj, src)
. = ..()
+/obj/item/clothing/mask/cigarette/DoRevenantThrowEffects(atom/target)
+ if(lit)
+ attackby()
+ else
+ light()
+
/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
if(!lit && smoketime > 0)
var/lighting_text = W.ignition_effect(src, user)
@@ -517,6 +523,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
overlay_state = pick(overlay_list)
update_icon()
+/obj/item/lighter/DoRevenantThrowEffects(atom/target)
+ set_lit()
+
/obj/item/lighter/suicide_act(mob/living/carbon/user)
if (lit)
user.visible_message("[user] begins holding \the [src]'s flame up to [user.p_their()] face! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index a2459bce9f..e29519406a 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -37,11 +37,14 @@
/obj/item/flashlight/attack_self(mob/user)
on = !on
update_brightness(user)
- playsound(user, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, 1)
+ playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
- return 1
+ return TRUE
+
+/obj/item/flashlight/DoRevenantThrowEffects(atom/target)
+ attack_self()
/obj/item/flashlight/suicide_act(mob/living/carbon/human/user)
if (user.eye_blind)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index bb46577702..a0b695e29f 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -8,10 +8,11 @@
slot_flags = ITEM_SLOT_BELT
obj_flags = UNIQUE_RENAME
var/gpstag = "COM0"
+ var/starton = TRUE
/obj/item/gps/Initialize()
. = ..()
- AddComponent(/datum/component/gps/item, gpstag)
+ AddComponent(/datum/component/gps/item, gpstag, starton)
/obj/item/gps/science
icon_state = "gps-s"
@@ -26,6 +27,9 @@
gpstag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
+/obj/item/gps/mining/off
+ starton = FALSE
+
/obj/item/gps/cyborg
icon_state = "gps-b"
gpstag = "BORG0"
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 6ac2d310a1..939d77a1f0 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -283,14 +283,12 @@ GLOBAL_LIST_INIT(channel_tokens, list(
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = null
- var/turf/T = user.drop_location()
- if(T)
- if(keyslot)
- keyslot.forceMove(T)
- keyslot = null
- if(keyslot2)
- keyslot2.forceMove(T)
- keyslot2 = null
+ if(keyslot)
+ user.put_in_hands(keyslot)
+ keyslot = null
+ if(keyslot2)
+ user.put_in_hands(keyslot2)
+ keyslot2 = null
recalculateChannels()
to_chat(user, "You pop out the encryption keys in the headset.")
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index 0d5c9a22aa..39c8143ee9 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -46,6 +46,9 @@
if(.)
new /obj/item/toy/eightball/haunted(loc)
+/obj/item/toy/eightball/DoRevenantThrowEffects(atom/target)
+ MakeHaunted()
+
/obj/item/toy/eightball/attack_self(mob/user)
if(shaking)
return
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index b1f51f608d..301b8d4155 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -63,7 +63,7 @@
name = "advanced fire extinguisher"
desc = "Used to stop thermonuclear fires from spreading inside your engine."
icon_state = "foam_extinguisher0"
- //item_state = "foam_extinguisher" needs sprite
+ item_state = "foam_extinguisher"
dog_fashion = null
chem = /datum/reagent/firefighting_foam
tanktype = /obj/structure/reagent_dispensers/foamtank
@@ -235,16 +235,23 @@
return
EmptyExtinguisher(user)
-/obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user)
- if(loc == user && reagents.total_volume)
+/obj/item/extinguisher/DoRevenantThrowEffects(atom/target)
+ EmptyExtinguisher()
+
+/obj/item/extinguisher/proc/EmptyExtinguisher(mob/user)
+ if(!reagents.total_volume)
+ return
+ if(loc == user || !user)
reagents.clear_reagents()
var/turf/T = get_turf(loc)
if(isopenturf(T))
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
-
- user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.")
+ if(user)
+ user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] by using its release valve.")
+ else
+ user.visible_message("The release valve of \the [src] suddenly opens and sprays it's contents on the floor!")
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index abd9cec950..e47b2bb0d8 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -19,6 +19,8 @@
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
var/ignore_suit_sensor_level = FALSE // Do we find people even if their suit sensors are turned off
var/alert = FALSE // TRUE to display things more seriously
+ /// resets target on toggle
+ var/resets_target = TRUE
/obj/item/pinpointer/Initialize()
. = ..()
@@ -27,17 +29,22 @@
/obj/item/pinpointer/Destroy()
STOP_PROCESSING(SSfastprocess, src)
GLOB.pinpointer_list -= src
- target = null
+ unset_target()
return ..()
+/obj/item/pinpointer/DoRevenantThrowEffects(atom/target)
+ attack_self()
+
/obj/item/pinpointer/attack_self(mob/living/user)
active = !active
- user.visible_message("[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.", "You [active ? "" : "de"]activate your pinpointer.")
+ if(user)
+ user.visible_message("[user] [active ? "" : "de"]activates [user.p_their()] pinpointer.", "You [active ? "" : "de"]activate your pinpointer.")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
if(active)
START_PROCESSING(SSfastprocess, src)
else
- target = null
+ if(resets_target)
+ unset_target()
STOP_PROCESSING(SSfastprocess, src)
update_icon()
@@ -50,6 +57,18 @@
/obj/item/pinpointer/proc/scan_for_target()
return
+/obj/item/pinpointer/proc/set_target(atom/movable/newtarget)
+ if(target)
+ unset_target()
+ target = newtarget
+ RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/unset_target)
+
+/obj/item/pinpointer/proc/unset_target()
+ if(!target)
+ return
+ UnregisterSignal(target, COMSIG_PARENT_QDELETING)
+ target = null
+
/obj/item/pinpointer/update_overlays()
. = ..()
if(!active)
@@ -101,7 +120,8 @@
active = FALSE
user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
- target = null //Restarting the pinpointer forces a target reset
+ if(resets_target)
+ unset_target() //Restarting the pinpointer forces a target reset
STOP_PROCESSING(SSfastprocess, src)
update_icon()
return
@@ -137,7 +157,7 @@
if(!A || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated())
return
- target = names[A]
+ set_target(names[A])
active = TRUE
user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.")
playsound(src, 'sound/items/screwdriver2.ogg', 50, 1)
@@ -149,7 +169,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(!trackable(H))
- target = null
+ unset_target()
if(!target) //target can be set to null from above code, or elsewhere
active = FALSE
@@ -163,7 +183,7 @@
. = ..()
/obj/item/pinpointer/pair/scan_for_target()
- target = other_pair
+ set_target(other_pair)
/obj/item/pinpointer/pair/examine(mob/user)
. = ..()
@@ -195,7 +215,7 @@
shuttleport = SSshuttle.getShuttle("huntership")
/obj/item/pinpointer/shuttle/scan_for_target()
- target = shuttleport
+ set_target(shuttleport)
/obj/item/pinpointer/shuttle/Destroy()
shuttleport = null
@@ -207,4 +227,8 @@
icon_state = "pinpointer_ian"
/obj/item/pinpointer/ian/scan_for_target()
- target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
+ set_target(locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list)
+
+/obj/item/pinpointer/custom
+ resets_target = FALSE
+
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index c5193d8b19..c213fa34df 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -45,6 +45,10 @@
return
set_snowflake_from_config(id)
+/obj/item/toy/plush/DoRevenantThrowEffects(atom/target)
+ var/datum/component/squeak/squeaker = GetComponent(/datum/component/squeak)
+ squeaker.do_play_squeak(TRUE)
+
/obj/item/toy/plush/Initialize(mapload, set_snowflake_id)
. = ..()
AddComponent(/datum/component/squeak, squeak_override)
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 23be8cbb9a..1db5cdd526 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -43,6 +43,13 @@
/obj/item/pneumatic_cannon/proc/init_charge() //wrapper so it can be vv'd easier
START_PROCESSING(SSobj, src)
+/obj/item/pneumatic_cannon/DoRevenantThrowEffects(atom/target)
+ var/picked_target
+ var/list/possible_targets = range(3,src)
+ picked_target = pick(possible_targets)
+ if(target)
+ Fire(null, picked_target)
+
/obj/item/pneumatic_cannon/process()
if(++charge_tick >= charge_ticks && charge_type)
fill_with_type(charge_type, charge_amount)
@@ -134,21 +141,29 @@
Fire(user, target)
/obj/item/pneumatic_cannon/proc/Fire(mob/living/user, var/atom/target)
- if(!istype(user) && !target)
+ if(!target)
return
+ if(user)
+ if(!isliving(user))
+ return
var/discharge = 0
- if(!can_trigger_gun(user))
+ if(user && !can_trigger_gun(user))
return
if(!loadedItems || !loadedWeightClass)
- to_chat(user, "\The [src] has nothing loaded.")
+ if(user)
+ to_chat(user, "\The [src] has nothing loaded.")
return
if(!tank && checktank)
- to_chat(user, "\The [src] can't fire without a source of gas.")
+ if(user)
+ to_chat(user, "\The [src] can't fire without a source of gas.")
return
if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting))
- to_chat(user, "\The [src] lets out a weak hiss and doesn't react!")
+ if(user)
+ to_chat(user, "\The [src] lets out a weak hiss and doesn't react!")
+ else
+ visible_message(src, "\The [src] lets out a weak hiss and doesn't react!")
return
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
+ if(user && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(75) && clumsyCheck && iscarbon(user))
var/mob/living/carbon/C = user
C.visible_message("[C] loses [C.p_their()] grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!")
C.dropItemToGround(src, TRUE)
@@ -157,15 +172,18 @@
else
var/list/possible_targets = range(3,src)
target = pick(possible_targets)
- discharge = 1
- if(!discharge)
+ discharge = TRUE
+ if(!discharge && user)
user.visible_message("[user] fires \the [src]!", \
"You fire \the [src]!")
- log_combat(user, target, "fired at", src)
var/turf/T = get_target(target, get_turf(src))
- playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1)
- fire_items(T, user)
- if(pressureSetting >= 3 && iscarbon(user))
+ playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
+ if(user)
+ log_combat(user, target, "fired at", src)
+ fire_items(T, user)
+ else
+ fire_items(T)
+ if(user && pressureSetting >= 3 && iscarbon(user))
var/mob/living/carbon/C = user
C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!")
C.DefaultCombatKnockdown(60)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index d7db5ce908..1de77bd8b9 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -47,6 +47,9 @@
cell = new preload_cell_type(src)
update_icon()
+/obj/item/melee/baton/DoRevenantThrowEffects(atom/target)
+ switch_status()
+
/obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
..()
//Only mob/living types have stun handling
@@ -236,6 +239,12 @@
if(!iscyborg(loc))
deductcharge(severity*10, TRUE, FALSE)
+/obj/item/melee/baton/can_give()
+ if(turned_on)
+ return FALSE
+ else
+ ..()
+
/obj/item/melee/baton/stunsword
name = "stunsword"
desc = "Not actually sharp, this sword is functionally identical to its baton counterpart."
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 08b91332ef..d57f0cc51f 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -73,6 +73,15 @@
/obj/item/tank/proc/populate_gas()
return
+/obj/item/tank/DoRevenantThrowEffects(atom/target)
+ if(air_contents)
+ var/turf/open/location = get_turf(src)
+ if(istype(location))
+ location.assume_air(air_contents)
+ air_contents.clear()
+ SSair.add_to_active(location)
+ visible_message("[src] can't be turned on while unsecured!")
+ if(user)
+ to_chat(user, "[src] can't be turned on while unsecured!")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
- to_chat(user, "You switch [src] on.")
+ if(user)
+ to_chat(user, "You switch [src] on.")
playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index a07e9a26d5..ff8287d77b 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -62,7 +62,7 @@
return 1
var/mob/living/M = caller
- if(!M.ventcrawler && M.mob_size != MOB_SIZE_TINY)
+ if(!(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY)
return 0
var/atom/movable/M = caller
if(M && M.pulling)
@@ -91,7 +91,7 @@
return 1
if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass.
return 1
- if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
+ if(!M.lying && !(SEND_SIGNAL(M, COMSIG_CHECK_VENTCRAWL)) && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass.
return 0
return ..()
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 4348ae7661..45d05c70b9 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -174,7 +174,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//is_bwoink is TRUE if this ticket was started by an admin PM
/datum/admin_help/New(msg, client/C, is_bwoink)
//clean the input msg
- msg = sanitize(copytext_char(msg,1,MAX_MESSAGE_LEN))
+ msg = copytext_char(msg,1,MAX_MESSAGE_LEN)
if(!msg || !C || !C.mob)
qdel(src)
return
@@ -263,7 +263,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//message from the initiator without a target, all admins will see this
//won't bug irc
/datum/admin_help/proc/MessageNoRecipient(msg)
- msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
+ msg = copytext_char(msg, 1, MAX_MESSAGE_LEN)
var/ref_src = "[REF(src)]"
//Message to be sent to all admins
var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]"
@@ -523,7 +523,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(handle_spam_prevention(msg,MUTE_ADMINHELP))
return
- msg = trim(msg)
+ msg = sanitize(trim(msg))
if(!msg)
return
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 2931c52a5c..ab0b0d933a 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -113,7 +113,6 @@
to_chat(src, "Error: Use the admin IRC/Discord channel, nerd.", confidential = TRUE)
return
-
else
//get message text, limit it's length.and clean/escape html
if(!msg)
@@ -128,11 +127,16 @@
else
if(holder)
to_chat(src, "Error: Admin-PM: Client not found.", confidential = TRUE)
- to_chat(src, "Message not sent:
[msg]", confidential = TRUE)
+ to_chat(src, "Message not sent:
[sanitize(msg)]", confidential = TRUE)
if(recipient_ticket)
recipient_ticket.AddInteraction("No client found, message not sent:
[msg]")
return
else
+ //clean the message if it's not sent by a high-rank admin
+ if(!check_rights(R_SERVER|R_DEBUG,0)||external)//no sending html to the poor bots
+ msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
+ if(!msg)
+ return
current_ticket.MessageNoRecipient(msg)
return
@@ -141,7 +145,7 @@
to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).", confidential = TRUE)
return
- if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
+ if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the message if it's not sent by a high-rank admin
diff --git a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
index 8ac083f68b..c35016cf2e 100644
--- a/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/ventcrawl.dm
@@ -9,4 +9,4 @@
/obj/item/organ/heart/gland/ventcrawling/activate()
to_chat(owner, "You feel very stretchy.")
- owner.ventcrawler = VENTCRAWLER_ALWAYS
+ owner.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm
index 02be432045..18f6817ec9 100644
--- a/code/modules/antagonists/blob/blob/overmind.dm
+++ b/code/modules/antagonists/blob/blob/overmind.dm
@@ -277,3 +277,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob)
if(!B)
mind.add_antag_datum(/datum/antagonist/blob)
+
+//the same but it's forced to be allowed by default as cameras usually don't allow emoting
+/mob/camera/blob/emote(act, m_type=1, message = null, intentional = FALSE, forced = TRUE)
+ . = ..()
diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm
index 59a86ffa34..58ee73ef5b 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm
@@ -165,14 +165,16 @@
/datum/clockwork_rite/treat_wounds/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target)
if(!target)
return FALSE
- if(!target.all_wounds.len)
+ if(!target.all_wounds || !target.all_wounds.len)
to_chat(invoker, "This one does not require mending.")
return FALSE
.= ..()
if(!.)
return FALSE
target.adjustToxLoss(10 * target.all_wounds.len)
- QDEL_LIST(target.all_wounds)
+ for(var/i in target.all_wounds)
+ var/datum/wound/mended = i
+ mended.remove_wound()
to_chat(target, "You feel your wounds heal, but are overcome with deep nausea.")
new /obj/effect/temp_visual/ratvar/sigil/vitality(T)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index 571a817024..ff6dc12ce1 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -203,10 +203,10 @@
to_chat(user, "You need to hold the slab in your active hand to recite scripture!")
return FALSE
var/initial_tier = initial(scripture.tier)
- if(initial_tier == SCRIPTURE_PERIPHERAL)
+ if(initial_tier == SCRIPTURE_PERIPHERAL && !issilicon(user)) //Silicons use peripheral scripture & cannot open the slab.
to_chat(user, "Nice try using href exploits")
return
- if(!GLOB.ratvar_awakens && !no_cost && !SSticker.scripture_states[initial_tier])
+ if(!GLOB.ratvar_awakens && !no_cost && !SSticker.scripture_states[initial_tier] &&!issilicon(user)) //silicons can't choose their spells, so lets allow them to always cast their assigned ones.
to_chat(user, "That scripture is not unlocked, and cannot be recited!")
return FALSE
var/datum/clockwork_scripture/scripture_to_recite = new scripture
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index 293b1de3dc..069080170e 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -11,7 +11,6 @@
gender = NEUTER
health = 350
maxHealth = 350
- ventcrawler = VENTCRAWLER_NONE
density = TRUE
pass_flags = 0
sight = (SEE_TURFS | SEE_OBJS)
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
index ea226a3cb6..1e43754477 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
@@ -10,6 +10,8 @@
var/give_equipment = TRUE
var/list/researched_knowledge = list()
var/total_sacrifices = 0
+ var/list/sac_targetted = list() //Which targets did living hearts give them, but they did not sac?
+ var/list/actually_sacced = list() //Which targets did they actually sac?
var/ascended = FALSE
/datum/antagonist/heretic/admin_add(datum/mind/new_owner,mob/admin)
@@ -175,6 +177,17 @@
knowledge_message += "[EK.name]"
parts += knowledge_message.Join(", ")
+ parts += "Targets assigned by living hearts, but not sacrificed:"
+ if(!sac_targetted.len)
+ parts += "None."
+ else
+ parts += sac_targetted.Join(",")
+ parts += "Sacrifices performed:"
+ if(!actually_sacced.len)
+ parts += "None!"
+ else
+ parts += actually_sacced.Join(",")
+
return parts.Join("
")
////////////////
// Knowledge //
@@ -213,6 +226,23 @@
if(ascended)
. += 20
+/datum/antagonist/heretic/antag_panel()
+ var/list/parts = list()
+ parts += ..()
+ parts += "Targets currently assigned by living hearts (Can give a false negative if they stole someone elses living heart):"
+ if(!sac_targetted.len)
+ parts += "None."
+ else
+ parts += sac_targetted.Join(",")
+ parts += "Targets actually sacrificed:"
+ if(!actually_sacced.len)
+ parts += "None."
+ else
+ parts += actually_sacced.Join(",")
+
+ return (parts.Join("
") + "
")
+
+
////////////////
// Objectives //
////////////////
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
index da2c61ad16..fbf0740e50 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
@@ -6,6 +6,17 @@
w_class = WEIGHT_CLASS_SMALL
///Target
var/mob/living/carbon/human/target
+ var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed.
+
+/obj/item/living_heart/Initialize()
+ . = ..()
+ GLOB.living_heart_cache.Add(src) //Add is better than +=.
+
+/obj/item/living_heart/Destroy()
+ GLOB.living_heart_cache.Remove(src)
+ if(sac_targetter && target)
+ sac_targetter.sac_targetted.Remove(target.real_name)
+ return ..()
/obj/item/living_heart/attack_self(mob/user)
. = ..()
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
index e0189944e5..481ac08ea5 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
@@ -1,6 +1,6 @@
/**
- * #Eldritch Knwoledge
+ * #Eldritch Knowledge
*
* Datum that makes eldritch cultist interesting.
*
@@ -252,6 +252,10 @@
LH.target = null
var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic)
+ EC.actually_sacced.Add(H.real_name)
+ if(LH.sac_targetter)
+ LH.sac_targetter.sac_targetted.Remove(H.real_name)
+ LH.sac_targetter = null
EC.total_sacrifices++
for(var/X in carbon_user.get_all_gear())
if(!istype(X,/obj/item/forbidden_book))
@@ -265,8 +269,14 @@
var/datum/objective/A = new
A.owner = user.mind
var/list/targets = list()
+ var/list/target_blacklist = list()
+ for(var/obj/item/living_heart/CLH in GLOB.living_heart_cache)
+ if(!CLH || !CLH.target || !CLH.target.mind)
+ continue
+ target_blacklist.Add(CLH.target.mind)
+
for(var/i in 0 to 3)
- var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
+ var/datum/mind/targeted = A.find_target(blacklist = target_blacklist)//easy way, i dont feel like copy pasting that entire block of code
if(!targeted)
break
targets[targeted.current.real_name] = targeted.current
@@ -274,9 +284,24 @@
if(!LH.target && targets.len)
LH.target = pick(targets) //Tsk tsk, you can and will get another target if you want it or not.
+
+ if(LH.target)
+ target_blacklist = list()
+ for(var/obj/item/living_heart/CLH in (GLOB.living_heart_cache - LH)) //Recreate blacklist, excluding ourselves.
+ if(!CLH || !CLH.target || !CLH.target.mind)
+ continue
+ target_blacklist.Add(CLH.target.mind)
+ if(LH.target.mind in target_blacklist) //Someone was faster, or you tried to cheese the system.
+ to_chat(user, "It seems you were too slow, and your target of choice has already been selected by another living heart!")
+ LH.target = null
+
qdel(A)
if(LH.target)
to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!")
+ var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic)
+ LH.sac_targetter = EC
+ EC.sac_targetted.Add(LH.target.real_name)
+
else
to_chat(user,"target could not be found for living heart.")
diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm
index 5844aad02b..077c380ef0 100644
--- a/code/modules/antagonists/morph/morph.dm
+++ b/code/modules/antagonists/morph/morph.dm
@@ -15,7 +15,6 @@
stop_automated_movement = 1
status_flags = CANPUSH
pass_flags = PASSTABLE
- ventcrawler = VENTCRAWLER_ALWAYS
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxHealth = 150
@@ -53,6 +52,10 @@
You can attack any item or dead creature to consume it - creatures will fully restore your health. \
Finally, you can restore yourself to your original form while morphed by shift-clicking yourself."
+/mob/living/simple_animal/hostile/morph/Initialize()
+ . = ..()
+ src.AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
+
/mob/living/simple_animal/hostile/morph/examine(mob/user)
if(morphed)
. = form.examine(user)
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index f5ebcffe35..ef58e5af39 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -72,6 +72,7 @@
var/list/drained_mobs = list() //Cannot harvest the same mob twice
var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?)
var/generated_objectives_and_spells = FALSE
+ var/telekinesis_cooldown
/mob/living/simple_animal/revenant/Initialize(mapload)
. = ..()
@@ -93,13 +94,16 @@
/mob/living/simple_animal/revenant/Login()
..()
- to_chat(src, "You are a revenant.")
- to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.")
- to_chat(src, "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.")
- to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.")
- to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.")
- to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.")
- to_chat(src, "Be sure to read the wiki page to learn more.")
+ var/revenant_greet
+ revenant_greet += "You are a revenant."
+ revenant_greet += "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant."
+ revenant_greet += "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds."
+ revenant_greet += "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable."
+ revenant_greet += "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities."
+ revenant_greet += "You do not remember anything of your past lives, nor will you remember anything about this one after your death."
+ revenant_greet += "Be sure to read the wiki page to learn more."
+ revenant_greet += "You are also able to telekinetically throw objects by clickdragging them."
+ to_chat(src, revenant_greet)
if(!generated_objectives_and_spells)
generated_objectives_and_spells = TRUE
mind.assigned_role = ROLE_REVENANT
@@ -317,6 +321,12 @@
to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].")
return 1
+/mob/living/simple_animal/revenant/proc/telekinesis_cooldown_end()
+ if(!telekinesis_cooldown)
+ CRASH("telekinesis_cooldown_end ran when telekinesis_cooldown on [src] was false")
+ else
+ telekinesis_cooldown = FALSE
+
/mob/living/simple_animal/revenant/proc/death_reset()
revealed = FALSE
unreveal_time = 0
@@ -431,6 +441,38 @@
qdel(revenant)
..()
+/proc/RevenantThrow(over, mob/user, obj/item/throwable)
+ var/mob/living/simple_animal/revenant/spooker = user
+ if(!istype(throwable))
+ return
+ if(!throwable.anchored && !spooker.telekinesis_cooldown && spooker.essence > 20)
+ if(7 < get_dist(throwable, spooker))
+ return
+ if(3 >= get_dist(throwable, spooker))
+ spooker.stun(10)
+ spooker.reveal(25)
+ else
+ spooker.stun(20)
+ spooker.reveal(50)
+ spooker.change_essence_amount(-20, FALSE, "telekinesis")
+ spooker.telekinesis_cooldown = TRUE
+ throwable.float(TRUE, TRUE)
+ sleep(20)
+ throwable.DoRevenantThrowEffects(over)
+ throwable.throw_at(over, 10, 2)
+ ADD_TRAIT(throwable, TRAIT_SPOOKY_THROW, "revenant")
+ log_combat(throwable, over, "spooky telekinesised at", throwable)
+ var/obj/effect/temp_visual/telekinesis/T = new(get_turf(throwable))
+ T.color = "#8715b4"
+ addtimer(CALLBACK(spooker, /mob/living/simple_animal/revenant.proc/telekinesis_cooldown_end), 50)
+ sleep(5)
+ throwable.float(FALSE, TRUE)
+
+
+//Use this for effects you want to happen when a revenant throws stuff, check the TRAIT_SPOOKY_THROW if you want to know if its still being thrown
+/obj/item/proc/DoRevenantThrowEffects(atom/target)
+ return TRUE
+
//objectives
/datum/objective/revenant
var/targetAmount = 100
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 7444905b89..d1bdac7e05 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -93,7 +93,6 @@
AIStatus = AI_OFF
pass_flags = PASSTABLE
mob_size = MOB_SIZE_TINY
- ventcrawler = VENTCRAWLER_ALWAYS
ranged = 1
projectiletype = /obj/item/projectile/beam/disabler
ranged_cooldown_time = 20
@@ -112,6 +111,7 @@
remove_verb(src, /mob/living/verb/pulled)
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
+ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
var/image/holder = hud_list[DIAG_HUD]
diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm
index 28298f4983..525f40d1f7 100644
--- a/code/modules/antagonists/traitor/equipment/contractor.dm
+++ b/code/modules/antagonists/traitor/equipment/contractor.dm
@@ -43,7 +43,7 @@
var/list/to_generate = list(
CONTRACT_PAYOUT_LARGE,
CONTRACT_PAYOUT_MEDIUM,
- CONTRACT_PAYOUT_SMALL,
+ CONTRACT_PAYOUT_MEDIUM,
CONTRACT_PAYOUT_SMALL,
CONTRACT_PAYOUT_SMALL,
CONTRACT_PAYOUT_SMALL
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 8a0645f311..07a9f499f8 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -30,6 +30,9 @@
attack(user,user)
return FIRELOSS
+/obj/item/assembly/flash/DoRevenantThrowEffects(atom/target)
+ AOE_flash()
+
/obj/item/assembly/flash/update_icon(flash = FALSE)
cut_overlays()
attached_overlays = list()
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 6865084c77..6f45599463 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -45,7 +45,7 @@
. = ..()
if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user))
var/mob/living/L = user
- if(L.ventcrawler)
+ if(SEND_SIGNAL(L, COMSIG_CHECK_VENTCRAWL))
. += "Alt-click to crawl through it."
/obj/machinery/atmospherics/New(loc, process = TRUE, setdir)
@@ -323,7 +323,7 @@
/obj/machinery/atmospherics/AltClick(mob/living/L)
if(is_type_in_typecache(src, GLOB.ventcrawl_machinery))
- return L.handle_ventcrawl(src)
+ return SEND_SIGNAL(L, COMSIG_HANDLE_VENTCRAWL, src)
return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7c6ba30b80..7cc8be800c 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -895,19 +895,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
continue
var/class_link = ""
var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]")
- var/extra_color_data = ""
+ var/extra_loadout_data = ""
if(loadout_item)
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'"
if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC)
- extra_color_data += "
Color"
+ extra_loadout_data += "
Color"
for(var/loadout_color in loadout_item[LOADOUT_COLOR])
- extra_color_data += " "
+ extra_loadout_data += " "
else
var/loadout_color_non_poly = "#FFFFFF"
if(length(loadout_item[LOADOUT_COLOR]))
loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1]
- extra_color_data += "
Color"
- extra_color_data += " "
+ extra_loadout_data += "
Color"
+ extra_loadout_data += " "
+ if(gear.loadout_flags & LOADOUT_CAN_NAME)
+ extra_loadout_data += "
Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]"
+ if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION)
+ extra_loadout_data += "
Description"
else if((gear_points - gear.cost) < 0)
class_link = "style='white-space:normal;' class='linkOff'"
else if(donoritem)
@@ -916,7 +920,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'"
else
class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'"
- dat += "[name][extra_color_data] "
+ dat += " "
+ // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description"
+ dat += "[name][extra_loadout_data] "
dat += "[gear.cost] "
if(islist(gear.restricted_roles))
if(gear.restricted_roles.len)
@@ -929,14 +933,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += gear.restricted_roles.Join(";")
dat += ""
if(!istype(gear, /datum/gear/unlockable))
- dat += " [gear.description]