diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index 738148c948..ed5b07168f 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -508,7 +508,9 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/item/construction/rcd/loaded,
+/obj/item/construction/rcd/loaded/upgraded{
+
+ },
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bn" = (
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 980e23188a..62b426d352 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -41,6 +41,21 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
+"aad" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/plasteel,
+/area/security/prison)
"aae" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
@@ -577,6 +592,22 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/security/execution/transfer)
+"abz" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"abA" = (
/obj/machinery/light,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -1849,16 +1880,16 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"aef" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aeg" = (
@@ -2118,6 +2149,31 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"aeD" = (
+/obj/machinery/door/airlock/security{
+ name = "Firing Range";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"aeE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/prison)
+"aeF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"aeG" = (
/obj/structure/cable,
/obj/machinery/power/solar{
@@ -2193,17 +2249,13 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"aeM" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/structure/window/reinforced{
+ dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/security/prison)
"aeN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -2494,6 +2546,10 @@
},
/turf/open/floor/plasteel,
/area/security/main)
+"afn" = (
+/obj/structure/table,
+/turf/open/floor/plasteel/showroomfloor,
+/area/security/warden)
"afo" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Three"
@@ -2514,6 +2570,20 @@
},
/turf/open/space/basic,
/area/space)
+"afq" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"afr" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/security/prison)
+"afs" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"aft" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -2570,16 +2640,16 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"afz" = (
-/obj/structure/table,
-/obj/item/restraints/handcuffs,
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/machinery/door/window/westleft{
+ base_state = "right";
+ dir = 4;
+ icon_state = "right";
+ name = "Shooting Range"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/security/prison)
"afA" = (
/turf/closed/wall/r_wall,
@@ -2823,6 +2893,16 @@
/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"age" = (
+/obj/machinery/door/window/southleft{
+ name = "Target Storage"
+ },
+/obj/item/target/clown,
+/obj/item/target/clown,
+/obj/item/target,
+/obj/item/target,
+/turf/open/floor/plating,
+/area/security/prison)
"agf" = (
/obj/structure/table,
/obj/item/stack/sheet/metal,
@@ -2976,6 +3056,16 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"agv" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"agw" = (
/obj/structure/table,
/obj/machinery/syndicatebomb/training,
@@ -3100,10 +3190,13 @@
/turf/open/floor/plasteel,
/area/security/main)
"agH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/door/window/southright{
+ name = "Target Storage"
},
-/turf/open/floor/plasteel/dark,
+/obj/item/target/alien,
+/obj/item/target/alien,
+/obj/item/target/syndicate,
+/turf/open/floor/plating,
/area/security/prison)
"agI" = (
/obj/machinery/airalarm{
@@ -3474,6 +3567,15 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"ahw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"ahx" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -4497,26 +4599,18 @@
/turf/open/floor/plasteel,
/area/security/processing)
"ajt" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/storage/box/prisoner,
-/obj/machinery/camera{
- c_tag = "Labor Shuttle Dock North"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/security/prison)
"aju" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/machinery/computer/security/labor,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"ajv" = (
/obj/machinery/light{
dir = 8
@@ -4830,6 +4924,29 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"ajX" = (
+/obj/structure/table,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/recharger,
+/obj/item/gun/energy/laser/practice,
+/obj/item/gun/energy/laser/practice,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"ajY" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"ajZ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external{
@@ -4854,20 +4971,18 @@
/area/security/processing)
"akc" = (
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
},
/turf/open/floor/plasteel,
-/area/security/processing)
+/area/security/prison)
"akd" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/lattice,
+/turf/closed/wall,
+/area/security/prison)
"ake" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -5136,6 +5251,44 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"akC" = (
+/obj/machinery/door/airlock/security{
+ name = "Labor Shuttle";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/processing)
+"akD" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/security/prison)
+"akE" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
+"akF" = (
+/obj/structure/sign/warning/securearea{
+ pixel_x = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Labor Shuttle Dock North"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/processing)
"akG" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
@@ -5156,11 +5309,12 @@
/turf/open/floor/plasteel,
/area/security/processing)
"akJ" = (
-/obj/machinery/light_switch{
- pixel_x = 27
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/security/processing)
@@ -5445,12 +5599,42 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"alj" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"alk" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"all" = (
+/obj/machinery/light_switch{
+ pixel_x = 27
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/computer/security/labor,
+/turf/open/floor/plasteel,
+/area/security/processing)
+"alm" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"aln" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -5462,6 +5646,12 @@
},
/turf/open/floor/plating,
/area/security/processing)
+"alo" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table,
+/obj/item/storage/box/prisoner,
+/turf/open/floor/plasteel,
+/area/security/processing)
"alp" = (
/turf/open/floor/plating,
/area/security/processing)
@@ -5469,13 +5659,10 @@
/turf/open/floor/plasteel,
/area/security/processing)
"alr" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/target_stake,
+/obj/item/target/syndicate,
+/turf/open/floor/plating,
+/area/security/prison)
"als" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -5527,6 +5714,18 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"alx" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aly" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -5681,6 +5880,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"alM" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/security/main";
+ dir = 4;
+ name = "Firing Range APC";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"alO" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -5736,6 +5953,44 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"alY" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Firing Range";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"alZ" = (
+/obj/structure/table,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/item/clothing/glasses/sunglasses{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/glasses/sunglasses{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/ears/earmuffs{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/item/clothing/ears/earmuffs{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"ama" = (
/mob/living/simple_animal/sloth/paperwork,
/turf/open/floor/plasteel,
@@ -5755,10 +6010,6 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
-"amd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
"ame" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -6031,26 +6282,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/processing)
-"amN" = (
-/obj/structure/table,
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/warden)
"amQ" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -80535,12 +80766,12 @@ adB
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+acd
+acd
+acd
+afr
+acd
+acd
aaa
aaa
aaa
@@ -80793,11 +81024,11 @@ abc
abc
afu
abc
-aaa
-aaa
-aaa
-aaa
-aaa
+age
+aeE
+afs
+ahw
+acd
aaa
aaa
aaa
@@ -81050,11 +81281,11 @@ aea
aeH
aft
abc
-aaa
-aaa
-aaa
-aaa
-aaa
+agH
+aeF
+alr
+ajt
+afr
aaa
aaa
aiU
@@ -81308,10 +81539,10 @@ aeJ
afw
abc
abc
-aaf
-aaa
-aaf
-aaf
+aeF
+aay
+ajt
+akd
aaf
aaf
aiU
@@ -81565,9 +81796,9 @@ aeI
afv
agf
abc
-aaf
-aaa
-aaa
+aeF
+aay
+ajt
aiT
aiT
aiV
@@ -81822,9 +82053,9 @@ aeL
afy
agh
abc
-aaf
-aaa
-aaf
+aeM
+afz
+aju
aiT
ajs
akb
@@ -82079,9 +82310,9 @@ aeK
afx
agg
abc
-aaf
-aaa
-aaa
+ajX
+alx
+alY
aiU
ajr
aka
@@ -82335,13 +82566,13 @@ aeg
aeN
afA
afA
-afA
-aaf
-aaa
-aaa
-aiU
-aju
-akd
+abc
+afq
+agv
+ajY
+akC
+akE
+akJ
akK
als
ame
@@ -82588,20 +82819,20 @@ acd
acC
ada
adF
+aad
+abz
aef
-aeM
-afz
-aai
-aai
-aai
-aai
-aai
-aai
-ajt
+aeD
+aav
akc
-akJ
-alr
-amd
+alM
+alZ
+akD
+akF
+alj
+all
+alm
+alo
amL
anu
alq
@@ -82848,11 +83079,11 @@ adH
aei
aeO
afJ
-acd
-agL
-agK
-agK
-aiB
+aai
+aai
+aai
+aai
+aai
aai
ajw
akf
@@ -83106,10 +83337,10 @@ aeh
aeO
afI
agl
-agH
+agL
ags
ags
-aho
+aiB
acd
ajv
ake
@@ -87731,7 +87962,7 @@ bkA
acF
aes
avB
-amN
+afn
agt
awN
aHp
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index fd7c0a3c00..cefc0eb1a5 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -114276,11 +114276,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -114288,6 +114283,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Chapel Maintenance";
+ req_access_txt = "27"
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"dKE" = (
@@ -118987,7 +118986,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -119332,7 +119330,6 @@
/turf/closed/wall,
/area/chapel/office)
"dTx" = (
-/obj/structure/bodycontainer/morgue,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -119343,6 +119340,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dTy" = (
@@ -121768,7 +121766,6 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"dYv" = (
-/obj/structure/bodycontainer/morgue,
/obj/structure/sign/poster/official/ian{
pixel_y = -32
},
@@ -121782,6 +121779,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dYw" = (
@@ -122824,7 +122822,6 @@
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"eat" = (
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
icon_state = "1-8"
},
@@ -123561,9 +123558,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -123574,6 +123568,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"ebU" = (
@@ -123816,7 +123813,6 @@
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"ecw" = (
-/obj/structure/bodycontainer/morgue,
/obj/machinery/firealarm{
dir = 1;
pixel_y = -24
@@ -126412,6 +126408,13 @@
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior,
/turf/open/floor/engine,
/area/science/mixing)
+"fwr" = (
+/obj/machinery/door/poddoor{
+ id = "chapelgun";
+ name = "Chapel Launcher Door"
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"fFK" = (
/obj/machinery/ore_silo,
/obj/effect/turf_decal/tile/neutral{
@@ -126430,6 +126433,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"fHS" = (
+/obj/structure/sign/warning/vacuum,
+/turf/closed/wall/r_wall,
+/area/chapel/office)
"fLR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -126462,6 +126469,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"gJj" = (
+/obj/machinery/door/window/northleft{
+ name = "Mass Driver"
+ },
+/obj/machinery/mass_driver{
+ id = "chapelgun";
+ name = "Holy Driver"
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"gKr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -126479,6 +126496,22 @@
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"gNJ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"gNS" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/tile/neutral{
@@ -126543,6 +126576,10 @@
},
/turf/open/floor/plating,
/area/quartermaster/storage)
+"hei" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/closed/wall/r_wall,
+/area/chapel/office)
"hic" = (
/obj/structure/table/reinforced,
/obj/item/integrated_electronics/analyzer,
@@ -126604,6 +126641,22 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"hLO" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"hNZ" = (
/obj/structure/chair/office/light{
dir = 8
@@ -126650,6 +126703,9 @@
},
/turf/open/floor/engine/vacuum,
/area/science/mixing)
+"iyd" = (
+/turf/open/space,
+/area/space)
"iQh" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -126714,6 +126770,9 @@
},
/turf/open/floor/plasteel,
/area/science/research/abandoned)
+"jhK" = (
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"jjN" = (
/obj/structure/table/reinforced,
/obj/machinery/camera{
@@ -126811,6 +126870,28 @@
/obj/machinery/chem_master,
/turf/open/floor/plasteel/dark,
/area/medical/medbay/central)
+"jPA" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/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 = 0;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"jRy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -127095,6 +127176,33 @@
},
/turf/open/floor/engine,
/area/science/mixing)
+"mXJ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
+"nht" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"nyN" = (
/obj/machinery/vending/kink,
/turf/open/floor/plating,
@@ -127103,6 +127211,19 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"owr" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"oIl" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -127281,6 +127402,12 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"qMR" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"rhO" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -127430,6 +127557,14 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
+"uZN" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"vhA" = (
/obj/item/clothing/under/color/grey,
/turf/open/floor/plating,
@@ -127567,6 +127702,25 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/science/research)
+"xWZ" = (
+/obj/structure/bodycontainer/morgue{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"xXn" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output,
/turf/open/floor/engine/vacuum,
@@ -159675,12 +159829,12 @@ dWI
dZf
dZM
eat
-dLY
-dLY
-dLY
-dLY
-dLY
-dLY
+dZN
+dZN
+dZN
+dZN
+fHS
+dZN
dLY
dLY
aad
@@ -159930,20 +160084,20 @@ dWJ
dLW
dYu
dZg
-dYu
-dYu
-dZg
-ebR
-dLW
-ecQ
-edl
-aad
+jhK
+jhK
+dZN
+owr
+mXJ
+gJj
+qMR
+fwr
aaa
aaa
-aad
+iyd
aaa
aaa
-aad
+iyd
aaa
aaa
aaa
@@ -160187,14 +160341,14 @@ dTw
dTw
dTw
dTw
-dLX
-dLW
-dLW
-dLW
-ecv
-dNt
-edl
-aad
+hLO
+uZN
+hei
+gNJ
+jPA
+dTw
+dTw
+dTw
aad
aad
aad
@@ -160447,8 +160601,8 @@ dTw
dZN
dZN
dZN
-dZN
-dZN
+xWZ
+nht
dTw
dTw
dTw
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index e35defd485..b2f05fd5f8 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -38,5 +38,5 @@
//Gangshit
#define NOT_DOMINATING -1
-#define MAX_LEADERS_GANG 3
+#define MAX_LEADERS_GANG 4
#define INITIAL_DOM_ATTEMPTS 3
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index ee51fb6909..c394d003d8 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -109,3 +109,5 @@
#define RCD_AIRLOCK 2
#define RCD_DECONSTRUCT 3
#define RCD_WINDOWGRILLE 4
+#define RCD_MACHINE 8
+#define RCD_COMPUTER 16
\ No newline at end of file
diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm
new file mode 100644
index 0000000000..4b210609f2
--- /dev/null
+++ b/code/__DEFINES/donator_groupings.dm
@@ -0,0 +1,18 @@
+#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators
+
+#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators
+
+#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH)
+#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH)
+#define TIER_3_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_3_CONFIG_SUBPATH)
+
+//flags
+#define DONATOR_GROUP_TIER_1 "T1"
+#define DONATOR_GROUP_TIER_2 "T2"
+#define DONATOR_GROUP_TIER_3 "T3"
+
+#define IS_CKEY_DONATOR_GROUP(ckey, groupid) is_donator_group(ckey, groupid)
diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm
index 1c36120a0c..7cebc37d94 100644
--- a/code/__DEFINES/reactions.dm
+++ b/code/__DEFINES/reactions.dm
@@ -25,7 +25,8 @@
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
//Research point amounts
#define NOBLIUM_RESEARCH_AMOUNT 1000
-#define BZ_RESEARCH_AMOUNT 150
+#define BZ_RESEARCH_SCALE 4
+#define BZ_RESEARCH_MAX_AMOUNT 400
#define MIASMA_RESEARCH_AMOUNT 160
#define STIMULUM_RESEARCH_AMOUNT 50
//Plasma fusion properties
diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm
new file mode 100644
index 0000000000..bdff20553a
--- /dev/null
+++ b/code/__HELPERS/donator_groupings.dm
@@ -0,0 +1,25 @@
+/*
+Current specifications:
+
+Donator groups in __DEFINES/donator_groupings.dm, config entries in controllers/configuration/entries/donator.dm
+
+3 groups, Tier 1/2/3
+Each tier includes the one before it (ascending)
+For fast lookups, this is generated using regenerate_donator_grouping_list()
+
+*/
+
+/proc/is_donator_group(ckey, group)
+ ckey = ckey(ckey) //make sure it's ckey'd.
+ var/list/L = GLOB.donators_by_group[group]
+ return L && L.Find(ckey)
+
+/proc/regenerate_donator_grouping_list()
+ GLOB.donators_by_group = list() //reinit everything
+ var/list/donator_list = GLOB.donators_by_group //cache
+ var/list/tier_1 = TIER_1_DONATORS
+ donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
+ var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
+ donator_list[DONATOR_GROUP_TIER_2] = tier_2
+ var/list/tier_3 = tier_2 + TIER_3_DONATORS
+ donator_list[DONATOR_GROUP_TIER_3] = tier_3
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 7e078184b7..3c8d62ce3a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1487,6 +1487,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/grown/nettle, // base type
/obj/item/reagent_containers/food/snacks/deepfryholder,
/obj/item/reagent_containers/food/snacks/grown/shell,
+ /obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/store/bread
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
new file mode 100644
index 0000000000..1dcde53a72
--- /dev/null
+++ b/code/_globalvars/lists/misc.dm
@@ -0,0 +1 @@
+GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 22210bfd08..5f0e7c9b22 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -67,7 +67,7 @@
/mob/proc/ClickOn( atom/A, params )
if(world.time <= next_click)
return
- next_click = world.time + 1
+ next_click = world.time + world.tick_lag
if(check_click_intercept(params,A))
return
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 49ff1c8d49..3ac103affc 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -19,6 +19,7 @@
var/abstract_type = /datum/config_entry //do not instantiate if type matches this
var/vv_VAS = TRUE //Force validate and set on VV. VAS proccall guard will run regardless.
+ var/postload_required = FALSE //requires running OnPostload()
var/dupes_allowed = FALSE
@@ -72,6 +73,9 @@
/datum/config_entry/proc/DeprecationUpdate(value)
return
+/datum/config_entry/proc/OnPostload()
+ return
+
/datum/config_entry/string
config_entry_value = ""
abstract_type = /datum/config_entry/string
@@ -80,7 +84,7 @@
/datum/config_entry/string/vv_edit_var(var_name, var_value)
return var_name != "auto_trim" && ..()
-/datum/config_entry/string/ValidateAndSet(str_val)
+/datum/config_entry/string/ValidateAndSet(str_val, during_load)
if(!VASProcCallGuard(str_val))
return FALSE
config_entry_value = auto_trim ? trim(str_val) : str_val
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 0232081c1a..ea2919f342 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -101,6 +101,7 @@
log_config("Loading config file [filename]...")
var/list/lines = world.file2list("[directory]/[filename]")
var/list/_entries = entries
+ var/list/postload_required = list()
for(var/L in lines)
L = trim(L)
if(!L)
@@ -157,18 +158,24 @@
else
warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
- var/validated = E.ValidateAndSet(value)
+ var/validated = E.ValidateAndSet(value, TRUE)
if(!validated)
log_config("Failed to validate setting \"[value]\" for [entry]")
else
if(E.modified && !E.dupes_allowed)
log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
+ if(E.postload_required)
+ postload_required[E] = TRUE
E.resident_file = filename
if(validated)
E.modified = TRUE
+ for(var/i in postload_required)
+ var/datum/config_entry/E = i
+ E.OnPostload()
+
++.
/datum/controller/configuration/can_vv_get(var_name)
diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm
new file mode 100644
index 0000000000..b74d5f5839
--- /dev/null
+++ b/code/controllers/configuration/entries/donator.dm
@@ -0,0 +1,22 @@
+/datum/config_entry/keyed_list/donator_group
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_FLAG
+ abstract_type = /datum/config_entry/keyed_list/donator_group
+
+//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations.
+/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load)
+ . = ..()
+ if(. && during_load)
+ regenerate_donator_grouping_list()
+
+/datum/config_entry/keyed_list/donator_group/OnPostload()
+ . = ..()
+ regenerate_donator_grouping_list()
+
+//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm
+
+/datum/config_entry/keyed_list/donator_group/tier_1_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_2_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_3_donators
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 221d04dad5..cc09ca816e 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(input)
// This is for when macro sets are eventualy datumized
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
var/list/static/default_macro_sets
-
+
if(default_macro_sets)
macro_sets = default_macro_sets
return
@@ -49,6 +49,7 @@ SUBSYSTEM_DEF(input)
"old_hotkeys" = list(
"Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
"O" = "ooc",
+ "L" = "looc",
"T" = "say",
"M" = "me",
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
diff --git a/code/datums/components/storage/concrete/emergency.dm b/code/datums/components/storage/concrete/emergency.dm
index 48880ff605..348821a913 100644
--- a/code/datums/components/storage/concrete/emergency.dm
+++ b/code/datums/components/storage/concrete/emergency.dm
@@ -36,3 +36,4 @@
/datum/component/storage/concrete/emergency/proc/unlock_me(datum/source)
if(locked)
set_locked(source, FALSE)
+ return TRUE
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index e0a23b0209..84be4fdca4 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -52,7 +52,7 @@
. = ..()
cant_hold = typecacheof(list(/obj/item/screwdriver/power))
can_hold = typecacheof(list(
- /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
+ /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/melee/cultblade/dagger,
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
@@ -63,7 +63,7 @@
. = ..()
cant_hold = typecacheof(list(/obj/item/screwdriver/power))
can_hold = typecacheof(list(
- /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen,
+ /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/melee/cultblade/dagger,
/obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector,
/obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper,
/obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini,
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index 8fc0a9155b..4976891543 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -21,8 +21,8 @@
/datum/ert/amber
code = "Amber"
- leader_role = /datum/antagonist/ert/commander/red
- roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red)
+ leader_role = /datum/antagonist/ert/commander/amber
+ roles = list(/datum/antagonist/ert/security/amber, /datum/antagonist/ert/medic/amber, /datum/antagonist/ert/engineer/amber)
/datum/ert/red
leader_role = /datum/antagonist/ert/commander/red
diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm
index 99b84a1b35..dcc16f1ba5 100644
--- a/code/datums/map_config.dm
+++ b/code/datums/map_config.dm
@@ -18,7 +18,7 @@
var/map_file = "BoxStation.dmm"
var/traits = null
- var/space_ruin_levels = 1 //Citadel edit - reduces the default space ruin z-level count to 1
+ var/space_ruin_levels = 2
var/space_empty_levels = 1
var/minetype = "lavaland"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 0512977d1a..336945f622 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -170,7 +170,7 @@
tick_interval = 4
alert_type = /obj/screen/alert/status_effect/his_grace
var/bloodlust = 0
-
+
/obj/screen/alert/status_effect/his_grace
name = "His Grace"
desc = "His Grace hungers, and you must feed Him."
@@ -208,6 +208,7 @@
owner.adjustToxLoss(-grace_heal, TRUE, TRUE)
owner.adjustOxyLoss(-(grace_heal * 2))
owner.adjustCloneLoss(-grace_heal)
+ owner.adjustStaminaLoss(-(grace_heal * 25))
/datum/status_effect/his_grace/on_remove()
owner.log_message("lost His Grace's stun immunity", LOG_ATTACK)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 88fe2c8d13..6665e4d59b 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -379,7 +379,7 @@
SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
/atom/proc/emag_act()
- SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/atom/proc/rad_act(strength)
SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index aa363428fb..76ea855c77 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -193,8 +193,10 @@
to_chat(usr, "Chem System Re-route detected, results may not be as expected!")
/obj/machinery/sleeper/emag_act(mob/user)
+ . = ..()
scramble_chem_buttons()
to_chat(user, "You scramble the sleeper's user interface!")
+ return TRUE
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user)
if((chem in available_chems) && chem_allowed(chem))
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 884b818f32..56227cdd53 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -177,7 +177,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
act_up()
/obj/machinery/announcement_system/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
act_up()
+ return TRUE
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 879be046c9..968cbe7254 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -101,12 +101,14 @@
return ..()
/obj/machinery/button/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
req_access = list()
req_one_access = list()
playsound(src, "sparks", 100, 1)
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/button/attack_ai(mob/user)
if(!panel_open)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 4f04335852..a175558f74 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -320,10 +320,12 @@
return ..()
/obj/machinery/clonepod/emag_act(mob/user)
+ . = ..()
if(!occupant)
return
to_chat(user, "You corrupt the genetic compiler.")
malfunction()
+ return TRUE
//Put messages in the connected computer's temp var for display.
/obj/machinery/clonepod/proc/connected_message(message)
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index e51d623c2f..1c517d6e8f 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -185,15 +185,19 @@
ui_interact(usr) //Refresh the UI after a filter changes
/obj/machinery/computer/apc_control/emag_act(mob/user)
+ . = ..()
if(!authenticated)
to_chat(user, "You bypass [src]'s access requirements using your emag.")
authenticated = TRUE
log_activity("logged in")
- else if(!(obj_flags & EMAGGED))
+ else
+ if(obj_flags & EMAGGED)
+ return
user.visible_message("You emag [src], disabling precise logging and allowing you to clear logs.")
log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], disabling operator tracking.")
obj_flags |= EMAGGED
- playsound(src, "sparks", 50, 1)
+ playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/computer/apc_control/proc/log_activity(log_text)
var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]"
diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm
index ded9cf95f6..b906b1afb5 100644
--- a/code/game/machinery/computer/arcade/battle.dm
+++ b/code/game/machinery/computer/arcade/battle.dm
@@ -186,6 +186,7 @@
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!")
@@ -202,5 +203,5 @@
enemy_name = "Cuban Pete"
name = "Outbomb Cuban Pete"
-
updateUsrDialog()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm
index e90e05966c..641ef1c9cd 100644
--- a/code/game/machinery/computer/arcade/minesweeper.dm
+++ b/code/game/machinery/computer/arcade/minesweeper.dm
@@ -284,6 +284,7 @@
return
/obj/machinery/computer/arcade/minesweeper/emag_act(mob/user)
+ . = ..()
if(CHECK_BITFIELD(obj_flags, EMAGGED))
return
desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!"
@@ -298,6 +299,7 @@
to_chat(user, "The machine buzzes and sparks... the game has been reset!")
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz
game_status = MINESWEEPER_GAME_MAIN_MENU
+ return TRUE
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm
index 12941dea35..023b1048ce 100644
--- a/code/game/machinery/computer/arcade/orion_trail.dm
+++ b/code/game/machinery/computer/arcade/orion_trail.dm
@@ -736,6 +736,7 @@
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")
@@ -743,6 +744,7 @@
desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
newgame()
obj_flags |= EMAGGED
+ return TRUE
/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
name = "spaceport security"
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 1654768de0..26f0d06ecb 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -64,9 +64,6 @@
if(!(scanner && LAZYLEN(pods) && autoprocess))
return
- if(scanner.occupant && scanner.scan_level > 2)
- scan_occupant(scanner.occupant)
-
for(var/datum/data/record/R in records)
var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mind"])
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 752765baa1..eceaefd2b2 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -432,6 +432,7 @@
return ..()
/obj/machinery/computer/communications/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -440,6 +441,7 @@
authenticated = 2
to_chat(user, "You scramble the communication routing circuits!")
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ return TRUE
/obj/machinery/computer/communications/ui_interact(mob/user)
. = ..()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 1081cb5fa7..365d19b826 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1280,20 +1280,23 @@
return !density || (check_access(ID) && !locked && hasPower())
/obj/machinery/door/airlock/emag_act(mob/user)
- if(!operating && density && hasPower() && !(obj_flags & EMAGGED))
- operating = TRUE
- update_icon(AIRLOCK_EMAG, 1)
- sleep(6)
- if(QDELETED(src))
- return
- operating = FALSE
- if(!open())
- update_icon(AIRLOCK_CLOSED, 1)
- obj_flags |= EMAGGED
- lights = FALSE
- locked = TRUE
- loseMainPower()
- loseBackupPower()
+ . = ..()
+ if(operating || !density || !hasPower() || obj_flags & EMAGGED)
+ return
+ operating = TRUE
+ update_icon(AIRLOCK_EMAG, 1)
+ addtimer(CALLBACK(src, .proc/open_sesame), 6)
+ return TRUE
+
+/obj/machinery/door/airlock/proc/open_sesame()
+ operating = FALSE
+ if(!open())
+ update_icon(AIRLOCK_CLOSED, 1)
+ obj_flags |= EMAGGED
+ lights = FALSE
+ locked = TRUE
+ loseMainPower()
+ loseBackupPower()
/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user)
add_fingerprint(user)
diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm
index 2e7e7d5cba..702f700617 100644
--- a/code/game/machinery/doors/unpowered.dm
+++ b/code/game/machinery/doors/unpowered.dm
@@ -13,9 +13,6 @@
else
return ..()
-/obj/machinery/door/unpowered/emag_act()
- return
-
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
name = "door"
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 97ab664b85..933bb4f42a 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -206,15 +206,20 @@
..()
/obj/machinery/door/window/emag_act(mob/user)
- if(!operating && density && !(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
- operating = TRUE
- flick("[src.base_state]spark", src)
- playsound(src, "sparks", 75, 1)
- sleep(6)
- operating = FALSE
- desc += "
Its access panel is smoking slightly."
- open(2)
+ . = ..()
+ if(operating || !density || obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ operating = TRUE
+ flick("[src.base_state]spark", src)
+ playsound(src, "sparks", 75, 1)
+ addtimer(CALLBACK(src, .proc/open_windows_me), 6)
+ return TRUE
+
+/obj/machinery/door/window/proc/open_windows_me()
+ operating = FALSE
+ desc += "
Its access panel is smoking slightly."
+ open(2)
/obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params)
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index 70ce3d36ae..3b9322d207 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -26,6 +26,7 @@
findObjsByTag()
/obj/machinery/doorButtons/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -33,6 +34,7 @@
req_one_access = list()
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
/obj/machinery/doorButtons/proc/removeMe()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 8f0d56a49e..5c2676c2b9 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -97,6 +97,7 @@
alarm()
/obj/machinery/firealarm/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -104,6 +105,7 @@
user.visible_message("Sparks fly out of [src]!",
"You emag [src], disabling its thermal sensors.")
playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !stat)
diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm
index f6cb58bbbc..320430be39 100644
--- a/code/game/machinery/gulag_item_reclaimer.dm
+++ b/code/game/machinery/gulag_item_reclaimer.dm
@@ -24,10 +24,12 @@
return ..()
/obj/machinery/gulag_item_reclaimer/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED) // emagging lets anyone reclaim all the items
return
req_access = list()
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/card/id))
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 8be7becfdd..1fccadda21 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -158,11 +158,13 @@
open_machine()
/obj/machinery/harvester/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
allow_living = TRUE
to_chat(user, "You overload [src]'s lifesign scanners.")
+ return TRUE
/obj/machinery/harvester/container_resist(mob/living/user)
if(!harvesting)
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index a3250fe1b0..59806e97a4 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -215,6 +215,7 @@
return dat
/obj/machinery/limbgrower/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
for(var/id in SSresearch.techweb_designs)
@@ -223,3 +224,4 @@
stored_research.add_design(D)
to_chat(user, "A warning flashes onto the screen, stating that safety overrides have been deactivated!")
obj_flags |= EMAGGED
+ return TRUE
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index b0204ddeb8..b0a75c99dc 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -290,6 +290,7 @@
return ..()
/obj/machinery/porta_turret/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You short out [src]'s threat assessment circuits.")
@@ -300,6 +301,7 @@
update_icon()
sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
on = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
+ return TRUE
/obj/machinery/porta_turret/emp_act(severity)
@@ -837,6 +839,7 @@
to_chat(user, "Access denied.")
/obj/machinery/turretid/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You short out the turret controls' access analysis module.")
@@ -844,6 +847,7 @@
locked = FALSE
if(user && user.machine == src)
attack_hand(user)
+ return TRUE
/obj/machinery/turretid/attack_ai(mob/user)
if(!ailock || IsAdminGhost(user))
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index 6ff795c1cc..afb00d4ee2 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -86,10 +86,13 @@
. = 0
/obj/machinery/porta_turret_cover/emag_act(mob/user)
- if(!(parent_turret.obj_flags & EMAGGED))
- to_chat(user, "You short out [parent_turret]'s threat assessment circuits.")
- visible_message("[parent_turret] hums oddly...")
- parent_turret.obj_flags |= EMAGGED
- parent_turret.on = 0
- spawn(40)
- parent_turret.on = 1
+ . = ..()
+ if(parent_turret.obj_flags & EMAGGED)
+ return
+ to_chat(user, "You short out [parent_turret]'s threat assessment circuits.")
+ visible_message("[parent_turret] hums oddly...")
+ parent_turret.obj_flags |= EMAGGED
+ parent_turret.on = 0
+ spawn(40)
+ parent_turret.on = 1
+ return TRUE
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index ff40a8539a..9d431487e0 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -65,6 +65,7 @@
return ..()
/obj/machinery/recycler/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -73,6 +74,7 @@
update_icon()
playsound(src, "sparks", 75, 1, -1)
to_chat(user, "You use the cryptographic sequencer on [src].")
+ return TRUE
/obj/machinery/recycler/update_icon()
..()
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index e2aebd2370..fc6577a4f1 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -195,6 +195,7 @@
return ..()
/obj/machinery/shieldgen/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "The access controller is damaged!")
return
@@ -202,6 +203,7 @@
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
/obj/machinery/shieldgen/update_icon()
if(active)
@@ -387,6 +389,7 @@
add_fingerprint(user)
/obj/machinery/shieldwallgen/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "The access controller is damaged!")
return
@@ -394,6 +397,7 @@
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
//////////////Containment Field START
/obj/machinery/shieldwall
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 298587cdea..4b73032a8a 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -99,6 +99,7 @@
return ..()
/obj/machinery/computer/slot_machine/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -106,6 +107,7 @@
spark_system.set_up(4, 0, src.loc)
spark_system.start()
playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/computer/slot_machine/ui_interact(mob/living/user)
. = ..()
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index b11c6c102d..ebb40148d8 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -42,21 +42,23 @@
return ..()
/obj/machinery/computer/message_monitor/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
- if(!isnull(linkedServer))
- obj_flags |= EMAGGED
- screen = 2
- spark_system.set_up(5, 0, src)
- spark_system.start()
- var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
- // Will help make emagging the console not so easy to get away with.
- MK.info += "
�%@%(*$%&(�&?*(%&�/{}"
- var/time = 100 * length(linkedServer.decryptkey)
- addtimer(CALLBACK(src, .proc/UnmagConsole), time)
- message = rebootmsg
- else
+ if(isnull(linkedServer))
to_chat(user, "A no server error appears on the screen.")
+ return
+ obj_flags |= EMAGGED
+ screen = 2
+ spark_system.set_up(5, 0, src)
+ spark_system.start()
+ var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
+ // Will help make emagging the console not so easy to get away with.
+ MK.info += "
�%@%(*$%&(�&?*(%&�/{}"
+ var/time = 100 * length(linkedServer.decryptkey)
+ addtimer(CALLBACK(src, .proc/UnmagConsole), time)
+ message = rebootmsg
+ return TRUE
/obj/machinery/computer/message_monitor/New()
. = ..()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 01e304872f..e1dc80911f 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -64,10 +64,15 @@
/obj/machinery/mecha_part_fabricator/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
req_access = list()
+ INVOKE_ASYNC(src, .proc/error_action_sucessful)
+ return TRUE
+
+/obj/machinery/mecha_part_fabricator/proc/error_action_sucessful()
say("DB error \[Code 0x00F1\]")
sleep(10)
say("Attempting auto-repair...")
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index cc69b88cc4..9f072c48b6 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -42,6 +42,9 @@
/obj/effect/decal/cleanable/glass/ex_act()
qdel(src)
+/obj/effect/decal/cleanable/glass/plasma
+ icon_state = "plasmatiny"
+
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 566a64577d..c98cef2b87 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -68,6 +68,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/strip_delay = 40 //In deciseconds, how long an item takes to remove from another person
var/breakouttime = 0
var/list/materials
+ var/reskinned = FALSE
var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/species_exception = null // list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 1ff3c7df9f..cf706359f7 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -37,6 +37,7 @@ RLD
var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays
var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states
var/custom_range = 7
+ var/upgrade = FALSE
/obj/item/construction/Initialize()
. = ..()
@@ -82,6 +83,11 @@ RLD
loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 metal
if(loaded)
to_chat(user, "[src] now holds [matter]/[max_matter] matter-units.")
+ else if(istype(W, /obj/item/rcd_upgrade))
+ to_chat(user, "You upgrade the RCD with the [W]!")
+ upgrade = TRUE
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ qdel(W)
else
return ..()
update_icon() //ensures that ammo counters (if present) get updated
@@ -148,6 +154,7 @@ RLD
has_ammobar = TRUE
var/mode = 1
var/ranged = FALSE
+ var/computer_dir = 1
var/airlock_type = /obj/machinery/door/airlock
var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use
var/window_type = /obj/structure/window/fulltile
@@ -270,6 +277,28 @@ RLD
return FALSE
return TRUE
+/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
+ if(!user)
+ return
+ var/list/computer_dirs = list(
+ "NORTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "cnorth"),
+ "EAST" = image(icon = 'icons/mob/radial.dmi', icon_state = "ceast"),
+ "SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
+ "WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
+ )
+ var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ if(!check_menu(user))
+ return
+ switch(computerdirs)
+ if("NORTH")
+ computer_dir = 1
+ if("EAST")
+ computer_dir = 4
+ if("SOUTH")
+ computer_dir = 2
+ if("WEST")
+ computer_dir = 8
+
/obj/item/construction/rcd/proc/change_airlock_setting(mob/user)
if(!user)
return
@@ -434,10 +463,15 @@ RLD
..()
var/list/choices = list(
"Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"),
- "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
"Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"),
"Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor")
)
+ if(upgrade)
+ choices += list(
+ "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
+ "Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"),
+ "Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"),
+ )
if(mode == RCD_AIRLOCK)
choices += list(
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
@@ -459,6 +493,12 @@ RLD
mode = RCD_DECONSTRUCT
if("Grilles & Windows")
mode = RCD_WINDOWGRILLE
+ if("Machine Frames")
+ mode = RCD_MACHINE
+ if("Computer Frames")
+ mode = RCD_COMPUTER
+ change_computer_dir(user)
+ return
if("Change Access")
change_airlock_access(user)
return
@@ -511,6 +551,7 @@ RLD
no_ammo_message = "Insufficient charge."
desc = "A device used to rapidly build walls and floors."
canRturf = TRUE
+ upgrade = TRUE
/obj/item/construction/rcd/borg/useResource(amount, mob/user)
@@ -542,6 +583,9 @@ RLD
/obj/item/construction/rcd/loaded
matter = 160
+/obj/item/construction/rcd/loaded/upgraded
+ upgrade = TRUE
+
/obj/item/construction/rcd/combat
name = "Combat RCD"
desc = "A device used to rapidly build and deconstruct. Reload with metal, plasteel, glass or compressed matter cartridges. This RCD has been upgraded to be able to remove Rwalls!"
@@ -582,7 +626,7 @@ RLD
name = "admin RCD"
max_matter = INFINITY
matter = INFINITY
-
+ upgrade = TRUE
// Ranged RCD
@@ -776,6 +820,12 @@ RLD
return TRUE
return FALSE
+/obj/item/rcd_upgrade
+ name = "RCD advanced design disk"
+ desc = "It contains the design for machine frames, computer frames, and deconstruction."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "datadisk3"
+
#undef GLOW_MODE
#undef LIGHT_MODE
#undef REMOVE_MODE
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index f0d15cc3a2..01205ee889 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -134,12 +134,14 @@ RSF
return
/obj/item/cookiesynth/emag_act(mob/user)
+ . = ..()
obj_flags ^= EMAGGED
if(obj_flags & EMAGGED)
to_chat(user, "You short out [src]'s reagent safety checker!")
else
to_chat(user, "You reset [src]'s reagent safety checker!")
- toxin = 0
+ toxin = FALSE
+ return TRUE
/obj/item/cookiesynth/attack_self(mob/user)
var/mob/living/silicon/robot/P = null
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 96bbe759ca..05ffcbf2fd 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -93,34 +93,22 @@
/obj/item/card/emag/afterattack(atom/target, mob/user, proximity)
. = ..()
var/atom/A = target
- if(!proximity && prox_check)
+ if(!proximity && prox_check || !(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
+ return
+ if(istype(A, /obj/item/storage) && !(istype(A, /obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod)))
return
- //Citadel changes: modular code misfiring, so we're bypassing into main code.
if(!uses)
user.visible_message("[src] emits a weak spark. It's burnt out!")
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
return
else if(uses <= 3)
playsound(src, 'sound/effects/light_flicker.ogg', 30, 1) //Tiiiiiiny warning sound to let ya know your emag's almost dead
-
- if(isturf(A))
+ if(!A.emag_act(user))
return
- if(istype(A,/obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod))
- A.emag_act(user)
- uses = max(uses - 1, 0)
- if(!uses)
- user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
- playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
- if(istype(A,/obj/item/storage))
- return
- if(!(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
- return
- else
- A.emag_act(user)
- uses = max(uses - 1, 0)
- if(!uses)
- user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
- playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
+ uses = max(uses - 1, 0)
+ if(!uses)
+ user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
+ playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
/obj/item/card/emagfake
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 000c52ae43..09a128c558 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -764,20 +764,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
- if(screw)
- if(!(obj_flags & EMAGGED))
- cut_overlays()
- obj_flags |= EMAGGED
- super = FALSE
- to_chat(user, "You maximize the voltage of [src].")
- add_overlay("vapeopen_high")
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
- sp.set_up(5, 1, src)
- sp.start()
- else
- to_chat(user, "[src] is already emagged!")
- else
+ . = ..()
+ if(!screw)
to_chat(user, "You need to open the cap to do that.")
+ return
+ if(obj_flags & EMAGGED)
+ to_chat(user, "[src] is already emagged!")
+ return
+ cut_overlays()
+ obj_flags |= EMAGGED
+ super = FALSE
+ to_chat(user, "You maximize the voltage of [src].")
+ add_overlay("vapeopen_high")
+ var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
+ sp.set_up(5, 1, src)
+ sp.start()
+ return TRUE
/obj/item/clothing/mask/vape/attack_self(mob/user)
if(reagents.total_volume > 0)
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 7d2ffe0a02..bb45f80f2d 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -217,10 +217,13 @@
to_chat(user, "The spectrum chip is unresponsive.")
/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user)
- if(!(obj_flags & EMAGGED))
- contraband = TRUE
- obj_flags |= EMAGGED
- to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ contraband = TRUE
+ obj_flags |= EMAGGED
+ to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+ return TRUE
/obj/item/circuitboard/computer/cargo/express
name = "Express Supply Console (Computer Board)"
@@ -234,8 +237,12 @@
obj_flags &= ~EMAGGED
/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user)
- to_chat(user, "You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")
- obj_flags |= EMAGGED
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(obj_flags & EMAGGED)
+ return
+ to_chat(user, "You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")
+ obj_flags |= EMAGGED
+ return TRUE
/obj/item/circuitboard/computer/cargo/request
name = "Supply Request Console (Computer Board)"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 55e75b3992..5bef86c6d2 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -140,12 +140,10 @@
return ..()
/obj/item/defibrillator/emag_act(mob/user)
- if(safety)
- safety = FALSE
- to_chat(user, "You silently disable [src]'s safety protocols with the cryptographic sequencer.")
- else
- safety = TRUE
- to_chat(user, "You silently enable [src]'s safety protocols with the cryptographic sequencer.")
+ . = ..()
+ safety = !safety
+ to_chat(user, "You silently [safety ? "enable" : "disable"] [src]'s safety protocols with the cryptographic sequencer.")
+ return TRUE
/obj/item/defibrillator/emp_act(severity)
. = ..()
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 7823e570e0..38133e37bc 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -192,13 +192,15 @@
update_icon()
/obj/item/geiger_counter/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
if(scanning)
to_chat(user, "Turn off [src] before you perform this action!")
- return 0
+ return
to_chat(user, "You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.")
obj_flags |= EMAGGED
+ return TRUE
/obj/item/geiger_counter/cyborg
var/datum/component/mobhook
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 6615ebe8a8..1e31f14cfd 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -149,9 +149,11 @@
to_chat(user, "You fill \the [src] with lights from \the [S]. " + status_string() + "")
/obj/item/lightreplacer/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
Emag()
+ return TRUE
/obj/item/lightreplacer/attack_self(mob/user)
to_chat(user, status_string())
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 347bb6894d..915fcac504 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -38,11 +38,13 @@
speech_args[SPEECH_SPANS] |= voicespan
/obj/item/megaphone/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You overload \the [src]'s voice synthesizer.")
obj_flags |= EMAGGED
voicespan = list(SPAN_REALLYBIG, "userdanger")
+ return TRUE
/obj/item/megaphone/sec
name = "security megaphone"
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index a3ab9153ce..207497922e 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -32,6 +32,24 @@
var/datum/integrated_io/selected_io = null //functional for integrated circuits.
var/mode = 0
+/obj/item/multitool/chaplain
+ name = "\improper hypertool"
+ desc = "Used for pulsing wires to test which to cut. Also emits microwaves to fry some brains!"
+ damtype = BRAIN
+ force = 18
+ armour_penetration = 35
+ hitsound = 'sound/effects/sparks4.ogg'
+ var/chaplain_spawnable = TRUE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ throw_speed = 3
+ throw_range = 4
+ throwforce = 10
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/multitool/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+
/obj/item/multitool/examine(mob/user)
..()
if(selected_io)
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index f4405d578e..3be57d23f1 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -12,7 +12,7 @@
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
- w_class = WEIGHT_CLASS_GIGANTIC
+ w_class = WEIGHT_CLASS_BULKY
force = 12
total_mass = TOTAL_MASS_NORMAL_ITEM // average toolbox
attack_verb = list("robusted")
@@ -93,7 +93,6 @@
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
master.Knockdown(60)
- master.adjustStaminaLoss(-5)
master.adjustBruteLoss(master.maxHealth)
playsound(master, 'sound/effects/splat.ogg', 100, 0)
else
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index ad4384f9f5..185875a93f 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -229,8 +229,8 @@
throwforce = 10
w_class = WEIGHT_CLASS_TINY
obj_flags = UNIQUE_RENAME
- var/reskinned = FALSE
var/chaplain_spawnable = TRUE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/Initialize()
. = ..()
@@ -247,9 +247,12 @@
/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
if(GLOB.holy_weapon_type)
return
- var/obj/item/nullrod/holy_weapon
+ var/obj/item/holy_weapon
var/list/holy_weapons_list = typesof(/obj/item/nullrod) + list(
- /obj/item/melee/transforming/energy/sword/cx/chaplain
+ /obj/item/twohanded/dualsaber/hypereutactic/chaplain,
+ /obj/item/gun/energy/laser/redtag/hitscan/chaplain,
+ /obj/item/multitool/chaplain,
+ /obj/item/melee/baseball_bat/chaplain
)
var/list/display_names = list()
for(var/V in holy_weapons_list)
@@ -273,6 +276,13 @@
qdel(src)
M.put_in_active_hand(holy_weapon)
+/obj/item/nullrod/proc/jedi_spin(mob/living/user)
+ for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
+ user.setDir(i)
+ if(i == WEST)
+ user.emote("flip")
+ sleep(1)
+
/obj/item/nullrod/godhand
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -328,7 +338,6 @@
sharpness = IS_SHARP
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
@@ -522,7 +531,6 @@
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
- total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/chainsaw
name = "chainsaw hand"
@@ -585,6 +593,7 @@
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
+ force = 12
reach = 2
attack_verb = list("whipped", "lashed")
hitsound = 'sound/weapons/chainhit.ogg'
@@ -661,6 +670,44 @@
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
+/obj/item/nullrod/claymore/bostaff/attack(mob/target, mob/living/user)
+ add_fingerprint(user)
+ if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
+ to_chat(user, "You club yourself over the head with [src].")
+ user.Knockdown(60)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
+ else
+ user.take_bodypart_damage(2*force)
+ return
+ if(iscyborg(target))
+ return ..()
+ if(!isliving(target))
+ return ..()
+ var/mob/living/carbon/C = target
+ if(C.stat || C.health < 0 || C.staminaloss > 130 )
+ to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.")
+ return
+ if(user.a_intent == INTENT_DISARM)
+ if(!ishuman(target))
+ return ..()
+ var/mob/living/carbon/human/H = target
+ var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
+ "[user] smacks [H] with the butt of [src]!", \
+ "[user] broadsides [H] with [src]!", \
+ "[user] smashes [H]'s head with [src]!", \
+ "[user] beats [H] with front of [src]!", \
+ "[user] twirls and slams [H] with [src]!")
+ H.visible_message("[pick(fluffmessages)]", \
+ "[pick(fluffmessages)]")
+ playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
+ H.adjustStaminaLoss(rand(12,18))
+ if(prob(25))
+ (INVOKE_ASYNC(src, .proc/jedi_spin, user))
+ else
+ return ..()
+
/obj/item/nullrod/tribal_knife
icon_state = "crysknife"
item_state = "crysknife"
@@ -674,7 +721,6 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
item_flags = SLOWS_WHILE_IN_HAND
- total_mass = TOTAL_MASS_NORMAL_ITEM
/obj/item/nullrod/tribal_knife/Initialize(mapload)
. = ..()
@@ -704,8 +750,8 @@
name = "egyptian staff"
desc = "A tutorial in mummification is carved into the staff. You could probably craft the wraps if you had some cloth."
icon = 'icons/obj/guns/magic.dmi'
- icon_state = "pharoah_sceptre"
- item_state = "pharoah_sceptre"
+ icon_state = "pharaoh_sceptre"
+ item_state = "pharaoh_sceptre"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index cdb9c146e2..f9affc230d 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -229,7 +229,7 @@
target.LAssailant = null
else
target.LAssailant = user
- cooldown = world.time + 40
+ cooldown = world.time
user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
/obj/item/melee/classic_baton/telescopic
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 6d7c3036f9..5454b0fdb8 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -282,11 +282,13 @@
var/cooldown = 0
/obj/item/harmalarm/emag_act(mob/user)
+ . = ..()
obj_flags ^= EMAGGED
if(obj_flags & EMAGGED)
to_chat(user, "You short out the safeties on [src]!")
else
to_chat(user, "You reset the safeties on [src]!")
+ return TRUE
/obj/item/harmalarm/attack_self(mob/user)
var/safety = !(obj_flags & EMAGGED)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index cf967e25ba..47c881bbdf 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass
- grind_results = list("silicon" = 20)
+ grind_results = list(/datum/reagent/silicon = 20)
point_value = 1
/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
@@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass
- grind_results = list("silicon" = 20, "plasma" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
/obj/item/stack/sheet/plasmaglass/fifty
amount = 50
@@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
- grind_results = list("silicon" = 20, "iron" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
point_value = 4
/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
@@ -177,11 +177,11 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
singular_name = "reinforced plasma glass sheet"
icon_state = "sheet-prglass"
item_state = "sheet-prglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,)
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5,)
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmarglass
- grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10)
point_value = 23
/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
@@ -243,8 +243,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
resistance_flags = ACID_PROOF
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
max_integrity = 40
- var/cooldown = 0
sharpness = IS_SHARP
+ var/icon_prefix
+
/obj/item/shard/suicide_act(mob/user)
user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")
@@ -266,9 +267,19 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if("large")
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
- var/matrix/M = matrix(transform)
- M.Turn(rand(-170, 170))
- transform = M
+ if (icon_prefix)
+ icon_state = "[icon_prefix][icon_state]"
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
+
+/obj/item/shard/Destroy()
+ . = ..()
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
. = ..()
@@ -298,6 +309,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
return ..()
/obj/item/shard/welder_act(mob/living/user, obj/item/I)
+ ..()
if(I.use_tool(src, user, 0, volume=50))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for(var/obj/item/stack/sheet/glass/G in user.loc)
@@ -316,4 +328,13 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
playsound(loc, 'sound/effects/glass_step.ogg', 30, 1)
else
playsound(loc, 'sound/effects/glass_step.ogg', 50, 1)
- . = ..()
+ return ..()
+
+/obj/item/shard/plasma
+ name = "purple shard"
+ desc = "A nasty looking shard of plasma glass."
+ force = 6
+ throwforce = 11
+ icon_state = "plasmalarge"
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ icon_prefix = "plasma"
\ No newline at end of file
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 887b6f5a2e..b5d7282b07 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -356,6 +356,7 @@
new /obj/item/cautery(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/reagent_containers/medspray/sterilizine(src)
new /obj/item/razor(src)
/obj/item/storage/backpack/duffelbag/sec
@@ -377,6 +378,7 @@
new /obj/item/cautery(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/reagent_containers/medspray/sterilizine(src)
/obj/item/storage/backpack/duffelbag/engineering
name = "industrial duffel bag"
@@ -470,6 +472,7 @@
new /obj/item/mmi/syndie(src)
new /obj/item/implantcase(src)
new /obj/item/implanter(src)
+ new /obj/item/reagent_containers/medspray/sterilizine(src)
/obj/item/storage/backpack/duffelbag/syndie/surgery_adv
name = "advanced surgery duffel bag"
@@ -489,6 +492,7 @@
new /obj/item/mmi/syndie(src)
new /obj/item/implantcase(src)
new /obj/item/implanter(src)
+ new /obj/item/reagent_containers/medspray/sterilizine(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo
name = "ammunition duffel bag"
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 4924051855..eeebc6f4c5 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -48,14 +48,16 @@
to_chat(user, "It's locked!")
/obj/item/storage/lockbox/emag_act(mob/user)
- if(!broken)
- broken = TRUE
- SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
- desc += "It appears to be broken."
- icon_state = src.icon_broken
- if(user)
- visible_message("\The [src] has been broken by [user] with an electromagnetic card!")
- return
+ . = ..()
+ if(broken)
+ return
+ broken = TRUE
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
+ desc += "It appears to be broken."
+ icon_state = src.icon_broken
+ if(user)
+ visible_message("\The [src] has been broken by [user] with an electromagnetic card!")
+ return TRUE
/obj/item/storage/lockbox/Entered()
. = ..()
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index c263c2669d..cb5790e45f 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -36,7 +36,8 @@
/obj/item/reagent_containers/syringe,
/obj/item/screwdriver,
/obj/item/valentine,
- /obj/item/stamp))
+ /obj/item/stamp,
+ /obj/item/key))
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
@@ -60,7 +61,7 @@
/obj/item/storage/wallet/update_icon()
var/new_state = "wallet"
if(front_id)
- new_state = "wallet_[front_id.icon_state]"
+ new_state = "wallet_id"
if(new_state != icon_state) //avoid so many icon state changes.
icon_state = new_state
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 781a82513e..82bf2c6b5f 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -487,6 +487,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/obj/item/grenade/explosive = null
var/war_cry = "AAAAARGH!!!"
+ var/icon_prefix = "spearglass"
/obj/item/twohanded/spear/Initialize()
. = ..()
@@ -529,7 +530,7 @@
if(explosive)
icon_state = "spearbomb[wielded]"
else
- icon_state = "spearglass[wielded]"
+ icon_state = "[icon_prefix][wielded]"
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
. = ..()
@@ -556,6 +557,13 @@
src.war_cry = input
/obj/item/twohanded/spear/CheckParts(list/parts_list)
+ var/obj/item/shard/tip = locate() in parts_list
+ if (istype(tip, /obj/item/shard/plasma))
+ force_wielded = 19
+ force_unwielded = 11
+ throwforce = 21
+ icon_prefix = "spearplasma"
+ qdel(tip)
var/obj/item/twohanded/spear/S = locate() in parts_list
if(S)
if(S.explosive)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 560731edfd..c6384e7438 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -229,7 +229,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed
slot_flags = null
-/obj/item/katana/Initialize()
+/obj/item/katana/cursed/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
@@ -255,7 +255,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
remove_item_from_storage(user)
- qdel(I)
+ if (!user.transferItemToLoc(I, S))
+ return
+ S.CheckParts(list(I))
qdel(src)
user.put_in_hands(S)
@@ -513,6 +515,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/homerun_able = 0
total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google
+/obj/item/melee/baseball_bat/chaplain
+ name = "blessed baseball bat"
+ desc = "There ain't a cult in the league that can withstand a swatter."
+ force = 14
+ throwforce = 14
+ obj_flags = UNIQUE_RENAME
+ var/chaplain_spawnable = TRUE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+
+/obj/item/melee/baseball_bat/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+
/obj/item/melee/baseball_bat/homerun
name = "home run bat"
desc = "This thing looks dangerous... Dangerously good at baseball, that is."
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 1ab28a33de..2093ae5660 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -112,12 +112,16 @@
/obj/structure/sign/barsign/emag_act(mob/user)
+ . = ..()
if(broken || (obj_flags & EMAGGED))
to_chat(user, "Nothing interesting happens!")
return
obj_flags |= EMAGGED
to_chat(user, "You emag the barsign. Takeover in progress...")
- sleep(10 SECONDS)
+ addtimer(CALLBACK(src, .proc/syndie_bar_good), 10 SECONDS)
+ return TRUE
+
+/obj/structure/sign/barsign/proc/syndie_bar_good()
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
req_access = list(ACCESS_SYNDICATE)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index f097d2903a..edcb4a6181 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -1,616 +1,617 @@
-/obj/structure/closet
- name = "closet"
- desc = "It's a basic storage unit."
- icon = 'icons/obj/closet.dmi'
- icon_state = "generic"
- density = TRUE
- layer = BELOW_OBJ_LAYER
- var/icon_door = null
- var/icon_door_override = FALSE //override to have open overlay use icon different to its base's
- var/secure = FALSE //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights
- var/opened = FALSE
- var/welded = FALSE
- var/locked = FALSE
- var/large = TRUE
- var/wall_mounted = 0 //never solid (You can always pass over it)
- max_integrity = 200
- integrity_failure = 50
- armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
- var/breakout_time = 1200
- var/message_cooldown
- var/can_weld_shut = TRUE
- var/horizontal = FALSE
- var/allow_objects = FALSE
- var/allow_dense = FALSE
- var/dense_when_open = FALSE //if it's dense when open or not
- var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container
- var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet.
- var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
- var/cutting_tool = /obj/item/weldingtool
- var/open_sound = 'sound/machines/click.ogg'
- var/close_sound = 'sound/machines/click.ogg'
- var/material_drop = /obj/item/stack/sheet/metal
- var/material_drop_amount = 2
- var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable.
- var/anchorable = TRUE
- var/icon_welded = "welded"
- var/obj/item/electronics/airlock/lockerelectronics //Installed electronics
- var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
- var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
- var/obj/structure/closet/eigen_target //Where you go to.
-
-
-/obj/structure/closet/Initialize(mapload)
- . = ..()
- update_icon()
- PopulateContents()
- if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
- take_contents()
- if(secure)
- lockerelectronics = new(src)
- lockerelectronics.accesses = req_access
-
-//USE THIS TO FILL IT, NOT INITIALIZE OR NEW
-/obj/structure/closet/proc/PopulateContents()
- return
-
-/obj/structure/closet/Destroy()
- dump_contents(override = FALSE)
- return ..()
-
-/obj/structure/closet/update_icon()
- cut_overlays()
- if(opened & icon_door_override)
- add_overlay("[icon_door]_open")
- layer = OBJ_LAYER
- return
- else if(opened)
- add_overlay("[icon_state]_open")
- return
- if(icon_door)
- add_overlay("[icon_door]_door")
- else
- layer = BELOW_OBJ_LAYER
- add_overlay("[icon_state]_door")
- if(welded)
- add_overlay("welded")
- if(!secure)
- return
- if(broken)
- add_overlay("off")
- add_overlay("sparking")
- else if(locked)
- add_overlay("locked")
- else
- add_overlay("unlocked")
-
-/obj/structure/closet/examine(mob/user)
- ..()
- if(welded)
- to_chat(user, "It's welded shut.")
- if(anchored)
- to_chat(user, "It is bolted to the ground.")
- if(opened)
- to_chat(user, "The parts are welded together.")
- else if(secure && !opened)
- else if(broken)
- to_chat(user, "The lock is screwed in.")
- else if(secure)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"].")
- if(isliving(user))
- var/mob/living/L = user
- if(HAS_TRAIT(L, TRAIT_SKITTISH))
- to_chat(user, "Ctrl-Shift-click [src] to jump inside.")
-
-/obj/structure/closet/CanPass(atom/movable/mover, turf/target)
- if(wall_mounted)
- return TRUE
- return !density
-
-/obj/structure/closet/proc/can_open(mob/living/user)
- if(welded || locked)
- return FALSE
- var/turf/T = get_turf(src)
- for(var/mob/living/L in T)
- if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
- if(user)
- to_chat(user, "There's something large on top of [src], preventing it from opening." )
- return FALSE
- return TRUE
-
-/obj/structure/closet/proc/can_close(mob/living/user)
- var/turf/T = get_turf(src)
- for(var/obj/structure/closet/closet in T)
- if(closet != src && !closet.wall_mounted)
- return FALSE
- for(var/mob/living/L in T)
- if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
- if(user)
- to_chat(user, "There's something too large in [src], preventing it from closing.")
- return FALSE
- return TRUE
-
-/obj/structure/closet/proc/can_lock(mob/living/user, var/check_access = TRUE) //set check_access to FALSE if you only need to check if a locker has a functional lock rather than access
- if(!secure)
- return FALSE
- if(broken)
- to_chat(user, "[src] is broken!")
- return FALSE
- if(QDELETED(lockerelectronics) && !locked) //We want to be able to unlock it regardless of electronics, but only lockable with electronics
- to_chat(user, "[src] is missing locker electronics!")
- return FALSE
- if(!check_access)
- return TRUE
- if(allowed(user))
- return TRUE
- to_chat(user, "Access denied.")
-
-/obj/structure/closet/proc/togglelock(mob/living/user)
- add_fingerprint(user)
- if(eigen_target)
- return
- if(opened)
- return
- if(!can_lock(user))
- return
- locked = !locked
- user.visible_message("[user] [locked ? null : "un"]locks [src].",
- "You [locked ? null : "un"]lock [src].")
- update_icon()
-
-/obj/structure/closet/proc/dump_contents(var/override = TRUE) //Override is for not revealing the locker electronics when you open the locker, for example
- var/atom/L = drop_location()
- for(var/atom/movable/AM in src)
- if(AM == lockerelectronics && override)
- continue
- AM.forceMove(L)
- if(throwing) // you keep some momentum when getting out of a thrown closet
- step(AM, dir)
- if(throwing)
- throwing.finalize(FALSE)
-
-/obj/structure/closet/proc/take_contents()
- var/atom/L = drop_location()
- for(var/atom/movable/AM in L)
- if(AM != src && insert(AM) == -1) // limit reached
- break
-
-/obj/structure/closet/proc/open(mob/living/user)
- if(opened || !can_open(user))
- return
- playsound(loc, open_sound, 15, 1, -3)
- opened = TRUE
- if(!dense_when_open)
- density = FALSE
- climb_time *= 0.5 //it's faster to climb onto an open thing
- dump_contents()
- update_icon()
- return 1
-
-/obj/structure/closet/proc/insert(atom/movable/AM)
- if(contents.len >= storage_capacity)
- return -1
- if(insertion_allowed(AM))
- if(eigen_teleport) // For teleporting people with linked lockers.
- do_teleport(AM, get_turf(eigen_target), 0)
- if(eigen_target.opened == FALSE)
- eigen_target.bust_open()
- else
- AM.forceMove(src)
- return TRUE
- else
- return FALSE
-
-
-/obj/structure/closet/proc/insertion_allowed(atom/movable/AM)
- if(ismob(AM))
- if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
- return FALSE
- var/mob/living/L = AM
- if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs())
- return FALSE
- if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
- if(horizontal && L.density)
- return FALSE
- if(L.mob_size > max_mob_size)
- return FALSE
- var/mobs_stored = 0
- for(var/mob/living/M in contents)
- if(++mobs_stored >= mob_storage_capacity)
- return FALSE
- L.stop_pulling()
-
- else if(istype(AM, /obj/structure/closet))
- return FALSE
-
- else if(istype(AM, /obj/effect))
- return FALSE
-
- else if(isobj(AM))
- if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
- return FALSE
- if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
- return TRUE
- else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon))
- return FALSE
- else
- return FALSE
-
- return TRUE
-
-/obj/structure/closet/proc/close(mob/living/user)
- if(!opened || !can_close(user))
- return FALSE
- take_contents()
- playsound(loc, close_sound, 15, 1, -3)
- climb_time = initial(climb_time)
- opened = FALSE
- density = TRUE
- update_icon()
- return TRUE
-
-/obj/structure/closet/proc/toggle(mob/living/user)
- if(opened)
- return close(user)
- else
- return open(user)
-
-/obj/structure/closet/proc/bust_open()
- welded = FALSE //applies to all lockers
- locked = FALSE //applies to critter crates and secure lockers only
- broken = TRUE //applies to secure lockers only
- open()
-
-/obj/structure/closet/proc/handle_lock_addition(mob/user, obj/item/electronics/airlock/E)
- add_fingerprint(user)
- if(lock_in_use)
- to_chat(user, "Wait for work on [src] to be done first!")
- return
- if(secure)
- to_chat(user, "This locker already has a lock!")
- return
- if(broken)
- to_chat(user, "Unscrew the broken lock first!")
- return
- if(!istype(E))
- return
- user.visible_message("[user] begins installing a lock on [src]...","You begin installing a lock on [src]...")
- lock_in_use = TRUE
- playsound(loc, 'sound/items/screwdriver.ogg', 50, 1)
- if(!do_after(user, 60, target = src))
- lock_in_use = FALSE
- return
- lock_in_use = FALSE
- to_chat(user, "You finish the lock on [src]!")
- E.forceMove(src)
- lockerelectronics = E
- req_access = E.accesses
- secure = TRUE
- update_icon()
- return TRUE
-
-/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/screwdriver/S)
- if(lock_in_use)
- to_chat(user, "Wait for work on [src] to be done first!")
- return
- if(locked)
- to_chat(user, "Unlock it first!")
- return
- if(!secure)
- to_chat(user, "[src] doesn't have a lock that you can remove!")
- return
- if(!istype(S))
- return
- var/brokenword = broken ? "broken " : null
- user.visible_message("[user] begins removing the [brokenword]lock on [src]...","You begin removing the [brokenword]lock on [src]...")
- playsound(loc, S.usesound, 50, 1)
- lock_in_use = TRUE
- if(!do_after(user, 100 * S.toolspeed, target = src))
- lock_in_use = FALSE
- return
- to_chat(user, "You remove the [brokenword]lock from [src]!")
- if(!QDELETED(lockerelectronics))
- lockerelectronics.add_fingerprint(user)
- lockerelectronics.forceMove(user.loc)
- lockerelectronics = null
- req_access = null
- secure = FALSE
- broken = FALSE
- locked = FALSE
- lock_in_use = FALSE
- update_icon()
- return TRUE
-
-
-/obj/structure/closet/deconstruct(disassembled = TRUE)
- if(ispath(material_drop) && material_drop_amount && !(flags_1 & NODECONSTRUCT_1))
- new material_drop(loc, material_drop_amount)
- qdel(src)
-
-/obj/structure/closet/obj_break(damage_flag)
- if(!broken && !(flags_1 & NODECONSTRUCT_1))
- bust_open()
-
-/obj/structure/closet/attackby(obj/item/W, mob/user, params)
- if(user in src)
- return
- if(src.tool_interact(W,user))
- return 1 // No afterattack
- else
- return ..()
-
-/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldnt be continued (because tool was used/closet was of wrong type), FALSE if otherwise
- . = TRUE
- if(opened)
- if(istype(W, cutting_tool))
- if(istype(W, /obj/item/weldingtool))
- if(!W.tool_start_check(user, amount=0))
- return
-
- to_chat(user, "You begin cutting \the [src] apart...")
- if(W.use_tool(src, user, 40, volume=50))
- if(eigen_teleport)
- to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!")
- return
- if(!opened)
- return
- user.visible_message("[user] slices apart \the [src].",
- "You cut \the [src] apart with \the [W].",
- "You hear welding.")
- deconstruct(TRUE)
- return
- else // for example cardboard box is cut with wirecutters
- user.visible_message("[user] cut apart \the [src].", \
- "You cut \the [src] apart with \the [W].")
- deconstruct(TRUE)
- return
- if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
- return TRUE
- else if(istype(W, /obj/item/electronics/airlock))
- handle_lock_addition(user, W)
- else if(istype(W, /obj/item/screwdriver))
- handle_lock_removal(user, W)
- else if(istype(W, /obj/item/weldingtool) && can_weld_shut)
- if(!W.tool_start_check(user, amount=0))
- return
-
- to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...")
- if(W.use_tool(src, user, 40, volume=50))
- if(eigen_teleport)
- to_chat(user, "The unstable nature of \the [src] makes it impossible to weld!")
- return
- if(opened)
- return
- welded = !welded
- after_weld(welded)
- user.visible_message("[user] [welded ? "welds shut" : "unwelds"] \the [src].",
- "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].",
- "You hear welding.")
- update_icon()
- else if(istype(W, /obj/item/wrench) && anchorable)
- if(isinspace() && !anchored)
- return
- setAnchored(!anchored)
- W.play_tool_sound(src, 75)
- user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \
- "You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \
- "You hear a ratchet.")
- else if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
- if(W.GetID() || !toggle(user))
- togglelock(user)
- else
- return FALSE
-
-/obj/structure/closet/proc/after_weld(weld_state)
- return
-
-/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user)
- if(!istype(O) || O.anchored || istype(O, /obj/screen))
- return
- if(!istype(user) || user.incapacitated() || user.lying)
- return
- if(!Adjacent(user) || !user.Adjacent(O))
- return
- if(user == O) //try to climb onto it
- return ..()
- if(!opened)
- return
- if(!isturf(O.loc))
- return
-
- var/actuallyismob = 0
- if(isliving(O))
- actuallyismob = 1
- else if(!isitem(O))
- return
- var/turf/T = get_turf(src)
- var/list/targets = list(O, src)
- add_fingerprint(user)
- user.visible_message("[user] [actuallyismob ? "tries to ":""]stuff [O] into [src].", \
- "You [actuallyismob ? "try to ":""]stuff [O] into [src].", \
- "You hear clanging.")
- if(actuallyismob)
- if(do_after_mob(user, targets, 40))
- user.visible_message("[user] stuffs [O] into [src].", \
- "You stuff [O] into [src].", \
- "You hear a loud metal bang.")
- var/mob/living/L = O
- if(!issilicon(L))
- L.Knockdown(40)
- O.forceMove(T)
- close()
- else
- O.forceMove(T)
- return 1
-
-/obj/structure/closet/relaymove(mob/user)
- if(user.stat || !isturf(loc) || !isliving(user))
- return
- if(locked)
- if(message_cooldown <= world.time)
- message_cooldown = world.time + 50
- to_chat(user, "[src]'s door won't budge!")
- return
- container_resist(user)
-
-/obj/structure/closet/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(user.lying && get_dist(src, user) > 0)
- return
-
- if(!toggle(user))
- togglelock(user)
-
-/obj/structure/closet/attack_paw(mob/user)
- return attack_hand(user)
-
-/obj/structure/closet/attack_robot(mob/user)
- if(user.Adjacent(src))
- return attack_hand(user)
-
-// tk grab then use on self
-/obj/structure/closet/attack_self_tk(mob/user)
- return attack_hand(user)
-
-/obj/structure/closet/verb/verb_toggleopen()
- set src in oview(1)
- set category = "Object"
- set name = "Toggle Open"
-
- if(!usr.canmove || usr.stat || usr.restrained())
- return
-
- if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
- return attack_hand(usr)
- else
- to_chat(usr, "This mob type can't use this verb.")
-
-// Objects that try to exit a locker by stepping were doing so successfully,
-// and due to an oversight in turf/Enter() were going through walls. That
-// should be independently resolved, but this is also an interesting twist.
-/obj/structure/closet/Exit(atom/movable/AM)
- open()
- if(AM.loc == src)
- return 0
- return 1
-
-/obj/structure/closet/container_resist(mob/living/user)
- if(opened)
- return
- if(ismovableatom(loc))
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
- var/atom/movable/AM = loc
- AM.relay_container_resist(user, src)
- return
- if(!welded && !locked)
- open()
- return
-
- //okay, so the closet is either welded or locked... resist!!!
- user.changeNext_move(CLICK_CD_BREAKOUT)
- user.last_special = world.time + CLICK_CD_BREAKOUT
- user.visible_message("[src] begins to shake violently!", \
- "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
- "You hear banging from [src].")
- if(do_after(user,(breakout_time), target = src))
- if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
- return
- //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
- user.visible_message("[user] successfully broke out of [src]!",
- "You successfully break out of [src]!")
- bust_open()
- else
- if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
- to_chat(user, "You fail to break out of [src]!")
-
-/obj/structure/closet/AltClick(mob/user)
- ..()
- if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))
- to_chat(user, "You can't do that right now!")
- return
- togglelock(user)
-
-/obj/structure/closet/CtrlShiftClick(mob/living/user)
- if(!HAS_TRAIT(user, TRAIT_SKITTISH))
- return ..()
- if(!user.canUseTopic(src) || !isturf(user.loc))
- return
- dive_into(user)
-
-/obj/structure/closet/emag_act(mob/user)
- if(secure && !broken)
- user.visible_message("Sparks fly from [src]!",
- "You scramble [src]'s lock, breaking it open!",
- "You hear a faint electrical spark.")
- playsound(src, "sparks", 50, 1)
- broken = TRUE
- locked = FALSE
- if(!QDELETED(lockerelectronics))
- qdel(lockerelectronics)
- lockerelectronics = null
- update_icon()
-
-/obj/structure/closet/get_remote_view_fullscreens(mob/user)
- if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
- user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
-
-/obj/structure/closet/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if (!(. & EMP_PROTECT_CONTENTS))
- for(var/obj/O in src)
- O.emp_act(severity)
- if(!secure || broken)
- return ..()
- if(prob(50 / severity))
- locked = !locked
- update_icon()
- if(prob(20 / severity) && !opened)
- if(!locked)
- open()
- else
- req_access = list()
- req_access += pick(get_all_accesses())
- if(!QDELETED(lockerelectronics))
- lockerelectronics.accesses = req_access
-
-/obj/structure/closet/contents_explosion(severity, target)
- for(var/atom/A in contents)
- A.ex_act(severity, target)
- CHECK_TICK
-
-/obj/structure/closet/singularity_act()
- dump_contents()
- ..()
-
-/obj/structure/closet/AllowDrop()
- return TRUE
-
-
-/obj/structure/closet/return_temperature()
- return
-
-/obj/structure/closet/proc/dive_into(mob/living/user)
- var/turf/T1 = get_turf(user)
- var/turf/T2 = get_turf(src)
- if(!opened)
- if(locked)
- togglelock(user, TRUE)
- if(!open(user))
- to_chat(user, "It won't budge!")
- return
- step_towards(user, T2)
- T1 = get_turf(user)
- if(T1 == T2)
- user.resting = TRUE //so people can jump into crates without slamming the lid on their head
- if(!close(user))
- to_chat(user, "You can't get [src] to close!")
- user.resting = FALSE
- return
- user.resting = FALSE
- togglelock(user)
- T1.visible_message("[user] dives into [src]!")
+/obj/structure/closet
+ name = "closet"
+ desc = "It's a basic storage unit."
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "generic"
+ density = TRUE
+ layer = BELOW_OBJ_LAYER
+ var/icon_door = null
+ var/icon_door_override = FALSE //override to have open overlay use icon different to its base's
+ var/secure = FALSE //secure locker or not, also used if overriding a non-secure locker with a secure door overlay to add fancy lights
+ var/opened = FALSE
+ var/welded = FALSE
+ var/locked = FALSE
+ var/large = TRUE
+ var/wall_mounted = 0 //never solid (You can always pass over it)
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list("melee" = 20, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
+ var/breakout_time = 1200
+ var/message_cooldown
+ var/can_weld_shut = TRUE
+ var/horizontal = FALSE
+ var/allow_objects = FALSE
+ var/allow_dense = FALSE
+ var/dense_when_open = FALSE //if it's dense when open or not
+ var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container
+ var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet.
+ var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
+ var/cutting_tool = /obj/item/weldingtool
+ var/open_sound = 'sound/machines/click.ogg'
+ var/close_sound = 'sound/machines/click.ogg'
+ var/material_drop = /obj/item/stack/sheet/metal
+ var/material_drop_amount = 2
+ var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable.
+ var/anchorable = TRUE
+ var/icon_welded = "welded"
+ var/obj/item/electronics/airlock/lockerelectronics //Installed electronics
+ var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
+ var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
+ var/obj/structure/closet/eigen_target //Where you go to.
+
+
+/obj/structure/closet/Initialize(mapload)
+ . = ..()
+ update_icon()
+ PopulateContents()
+ if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
+ take_contents()
+ if(secure)
+ lockerelectronics = new(src)
+ lockerelectronics.accesses = req_access
+
+//USE THIS TO FILL IT, NOT INITIALIZE OR NEW
+/obj/structure/closet/proc/PopulateContents()
+ return
+
+/obj/structure/closet/Destroy()
+ dump_contents(override = FALSE)
+ return ..()
+
+/obj/structure/closet/update_icon()
+ cut_overlays()
+ if(opened & icon_door_override)
+ add_overlay("[icon_door]_open")
+ layer = OBJ_LAYER
+ return
+ else if(opened)
+ add_overlay("[icon_state]_open")
+ return
+ if(icon_door)
+ add_overlay("[icon_door]_door")
+ else
+ layer = BELOW_OBJ_LAYER
+ add_overlay("[icon_state]_door")
+ if(welded)
+ add_overlay("welded")
+ if(!secure)
+ return
+ if(broken)
+ add_overlay("off")
+ add_overlay("sparking")
+ else if(locked)
+ add_overlay("locked")
+ else
+ add_overlay("unlocked")
+
+/obj/structure/closet/examine(mob/user)
+ ..()
+ if(welded)
+ to_chat(user, "It's welded shut.")
+ if(anchored)
+ to_chat(user, "It is bolted to the ground.")
+ if(opened)
+ to_chat(user, "The parts are welded together.")
+ else if(secure && !opened)
+ else if(broken)
+ to_chat(user, "The lock is screwed in.")
+ else if(secure)
+ to_chat(user, "Alt-click to [locked ? "unlock" : "lock"].")
+ if(isliving(user))
+ var/mob/living/L = user
+ if(HAS_TRAIT(L, TRAIT_SKITTISH))
+ to_chat(user, "Ctrl-Shift-click [src] to jump inside.")
+
+/obj/structure/closet/CanPass(atom/movable/mover, turf/target)
+ if(wall_mounted)
+ return TRUE
+ return !density
+
+/obj/structure/closet/proc/can_open(mob/living/user)
+ if(welded || locked)
+ return FALSE
+ var/turf/T = get_turf(src)
+ for(var/mob/living/L in T)
+ if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
+ if(user)
+ to_chat(user, "There's something large on top of [src], preventing it from opening." )
+ return FALSE
+ return TRUE
+
+/obj/structure/closet/proc/can_close(mob/living/user)
+ var/turf/T = get_turf(src)
+ for(var/obj/structure/closet/closet in T)
+ if(closet != src && !closet.wall_mounted)
+ return FALSE
+ for(var/mob/living/L in T)
+ if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density)
+ if(user)
+ to_chat(user, "There's something too large in [src], preventing it from closing.")
+ return FALSE
+ return TRUE
+
+/obj/structure/closet/proc/can_lock(mob/living/user, var/check_access = TRUE) //set check_access to FALSE if you only need to check if a locker has a functional lock rather than access
+ if(!secure)
+ return FALSE
+ if(broken)
+ to_chat(user, "[src] is broken!")
+ return FALSE
+ if(QDELETED(lockerelectronics) && !locked) //We want to be able to unlock it regardless of electronics, but only lockable with electronics
+ to_chat(user, "[src] is missing locker electronics!")
+ return FALSE
+ if(!check_access)
+ return TRUE
+ if(allowed(user))
+ return TRUE
+ to_chat(user, "Access denied.")
+
+/obj/structure/closet/proc/togglelock(mob/living/user)
+ add_fingerprint(user)
+ if(eigen_target)
+ return
+ if(opened)
+ return
+ if(!can_lock(user))
+ return
+ locked = !locked
+ user.visible_message("[user] [locked ? null : "un"]locks [src].",
+ "You [locked ? null : "un"]lock [src].")
+ update_icon()
+
+/obj/structure/closet/proc/dump_contents(var/override = TRUE) //Override is for not revealing the locker electronics when you open the locker, for example
+ var/atom/L = drop_location()
+ for(var/atom/movable/AM in src)
+ if(AM == lockerelectronics && override)
+ continue
+ AM.forceMove(L)
+ if(throwing) // you keep some momentum when getting out of a thrown closet
+ step(AM, dir)
+ if(throwing)
+ throwing.finalize(FALSE)
+
+/obj/structure/closet/proc/take_contents()
+ var/atom/L = drop_location()
+ for(var/atom/movable/AM in L)
+ if(AM != src && insert(AM) == -1) // limit reached
+ break
+
+/obj/structure/closet/proc/open(mob/living/user)
+ if(opened || !can_open(user))
+ return
+ playsound(loc, open_sound, 15, 1, -3)
+ opened = TRUE
+ if(!dense_when_open)
+ density = FALSE
+ climb_time *= 0.5 //it's faster to climb onto an open thing
+ dump_contents()
+ update_icon()
+ return 1
+
+/obj/structure/closet/proc/insert(atom/movable/AM)
+ if(contents.len >= storage_capacity)
+ return -1
+ if(insertion_allowed(AM))
+ if(eigen_teleport) // For teleporting people with linked lockers.
+ do_teleport(AM, get_turf(eigen_target), 0)
+ if(eigen_target.opened == FALSE)
+ eigen_target.bust_open()
+ else
+ AM.forceMove(src)
+ return TRUE
+ else
+ return FALSE
+
+
+/obj/structure/closet/proc/insertion_allowed(atom/movable/AM)
+ if(ismob(AM))
+ if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
+ return FALSE
+ var/mob/living/L = AM
+ if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs())
+ return FALSE
+ if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
+ if(horizontal && L.density)
+ return FALSE
+ if(L.mob_size > max_mob_size)
+ return FALSE
+ var/mobs_stored = 0
+ for(var/mob/living/M in contents)
+ if(++mobs_stored >= mob_storage_capacity)
+ return FALSE
+ L.stop_pulling()
+
+ else if(istype(AM, /obj/structure/closet))
+ return FALSE
+
+ else if(istype(AM, /obj/effect))
+ return FALSE
+
+ else if(isobj(AM))
+ if((!allow_dense && AM.density) || AM.anchored || AM.has_buckled_mobs())
+ return FALSE
+ if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP))
+ return TRUE
+ else if(!allow_objects && !istype(AM, /obj/effect/dummy/chameleon))
+ return FALSE
+ else
+ return FALSE
+
+ return TRUE
+
+/obj/structure/closet/proc/close(mob/living/user)
+ if(!opened || !can_close(user))
+ return FALSE
+ take_contents()
+ playsound(loc, close_sound, 15, 1, -3)
+ climb_time = initial(climb_time)
+ opened = FALSE
+ density = TRUE
+ update_icon()
+ return TRUE
+
+/obj/structure/closet/proc/toggle(mob/living/user)
+ if(opened)
+ return close(user)
+ else
+ return open(user)
+
+/obj/structure/closet/proc/bust_open()
+ welded = FALSE //applies to all lockers
+ locked = FALSE //applies to critter crates and secure lockers only
+ broken = TRUE //applies to secure lockers only
+ open()
+
+/obj/structure/closet/proc/handle_lock_addition(mob/user, obj/item/electronics/airlock/E)
+ add_fingerprint(user)
+ if(lock_in_use)
+ to_chat(user, "Wait for work on [src] to be done first!")
+ return
+ if(secure)
+ to_chat(user, "This locker already has a lock!")
+ return
+ if(broken)
+ to_chat(user, "Unscrew the broken lock first!")
+ return
+ if(!istype(E))
+ return
+ user.visible_message("[user] begins installing a lock on [src]...","You begin installing a lock on [src]...")
+ lock_in_use = TRUE
+ playsound(loc, 'sound/items/screwdriver.ogg', 50, 1)
+ if(!do_after(user, 60, target = src))
+ lock_in_use = FALSE
+ return
+ lock_in_use = FALSE
+ to_chat(user, "You finish the lock on [src]!")
+ E.forceMove(src)
+ lockerelectronics = E
+ req_access = E.accesses
+ secure = TRUE
+ update_icon()
+ return TRUE
+
+/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/screwdriver/S)
+ if(lock_in_use)
+ to_chat(user, "Wait for work on [src] to be done first!")
+ return
+ if(locked)
+ to_chat(user, "Unlock it first!")
+ return
+ if(!secure)
+ to_chat(user, "[src] doesn't have a lock that you can remove!")
+ return
+ if(!istype(S))
+ return
+ var/brokenword = broken ? "broken " : null
+ user.visible_message("[user] begins removing the [brokenword]lock on [src]...","You begin removing the [brokenword]lock on [src]...")
+ playsound(loc, S.usesound, 50, 1)
+ lock_in_use = TRUE
+ if(!do_after(user, 100 * S.toolspeed, target = src))
+ lock_in_use = FALSE
+ return
+ to_chat(user, "You remove the [brokenword]lock from [src]!")
+ if(!QDELETED(lockerelectronics))
+ lockerelectronics.add_fingerprint(user)
+ lockerelectronics.forceMove(user.loc)
+ lockerelectronics = null
+ req_access = null
+ secure = FALSE
+ broken = FALSE
+ locked = FALSE
+ lock_in_use = FALSE
+ update_icon()
+ return TRUE
+
+
+/obj/structure/closet/deconstruct(disassembled = TRUE)
+ if(ispath(material_drop) && material_drop_amount && !(flags_1 & NODECONSTRUCT_1))
+ new material_drop(loc, material_drop_amount)
+ qdel(src)
+
+/obj/structure/closet/obj_break(damage_flag)
+ if(!broken && !(flags_1 & NODECONSTRUCT_1))
+ bust_open()
+
+/obj/structure/closet/attackby(obj/item/W, mob/user, params)
+ if(user in src)
+ return
+ if(src.tool_interact(W,user))
+ return 1 // No afterattack
+ else
+ return ..()
+
+/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldnt be continued (because tool was used/closet was of wrong type), FALSE if otherwise
+ . = TRUE
+ if(opened)
+ if(istype(W, cutting_tool))
+ if(istype(W, /obj/item/weldingtool))
+ if(!W.tool_start_check(user, amount=0))
+ return
+
+ to_chat(user, "You begin cutting \the [src] apart...")
+ if(W.use_tool(src, user, 40, volume=50))
+ if(eigen_teleport)
+ to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!")
+ return
+ if(!opened)
+ return
+ user.visible_message("[user] slices apart \the [src].",
+ "You cut \the [src] apart with \the [W].",
+ "You hear welding.")
+ deconstruct(TRUE)
+ return
+ else // for example cardboard box is cut with wirecutters
+ user.visible_message("[user] cut apart \the [src].", \
+ "You cut \the [src] apart with \the [W].")
+ deconstruct(TRUE)
+ return
+ if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
+ return TRUE
+ else if(istype(W, /obj/item/electronics/airlock))
+ handle_lock_addition(user, W)
+ else if(istype(W, /obj/item/screwdriver))
+ handle_lock_removal(user, W)
+ else if(istype(W, /obj/item/weldingtool) && can_weld_shut)
+ if(!W.tool_start_check(user, amount=0))
+ return
+
+ to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...")
+ if(W.use_tool(src, user, 40, volume=50))
+ if(eigen_teleport)
+ to_chat(user, "The unstable nature of \the [src] makes it impossible to weld!")
+ return
+ if(opened)
+ return
+ welded = !welded
+ after_weld(welded)
+ user.visible_message("[user] [welded ? "welds shut" : "unwelds"] \the [src].",
+ "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].",
+ "You hear welding.")
+ update_icon()
+ else if(istype(W, /obj/item/wrench) && anchorable)
+ if(isinspace() && !anchored)
+ return
+ setAnchored(!anchored)
+ W.play_tool_sound(src, 75)
+ user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \
+ "You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \
+ "You hear a ratchet.")
+ else if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
+ if(W.GetID() || !toggle(user))
+ togglelock(user)
+ else
+ return FALSE
+
+/obj/structure/closet/proc/after_weld(weld_state)
+ return
+
+/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user)
+ if(!istype(O) || O.anchored || istype(O, /obj/screen))
+ return
+ if(!istype(user) || user.incapacitated() || user.lying)
+ return
+ if(!Adjacent(user) || !user.Adjacent(O))
+ return
+ if(user == O) //try to climb onto it
+ return ..()
+ if(!opened)
+ return
+ if(!isturf(O.loc))
+ return
+
+ var/actuallyismob = 0
+ if(isliving(O))
+ actuallyismob = 1
+ else if(!isitem(O))
+ return
+ var/turf/T = get_turf(src)
+ var/list/targets = list(O, src)
+ add_fingerprint(user)
+ user.visible_message("[user] [actuallyismob ? "tries to ":""]stuff [O] into [src].", \
+ "You [actuallyismob ? "try to ":""]stuff [O] into [src].", \
+ "You hear clanging.")
+ if(actuallyismob)
+ if(do_after_mob(user, targets, 40))
+ user.visible_message("[user] stuffs [O] into [src].", \
+ "You stuff [O] into [src].", \
+ "You hear a loud metal bang.")
+ var/mob/living/L = O
+ if(!issilicon(L))
+ L.Knockdown(40)
+ O.forceMove(T)
+ close()
+ else
+ O.forceMove(T)
+ return 1
+
+/obj/structure/closet/relaymove(mob/user)
+ if(user.stat || !isturf(loc) || !isliving(user))
+ return
+ if(locked)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
+ return
+ container_resist(user)
+
+/obj/structure/closet/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(user.lying && get_dist(src, user) > 0)
+ return
+
+ if(!toggle(user))
+ togglelock(user)
+
+/obj/structure/closet/attack_paw(mob/user)
+ return attack_hand(user)
+
+/obj/structure/closet/attack_robot(mob/user)
+ if(user.Adjacent(src))
+ return attack_hand(user)
+
+// tk grab then use on self
+/obj/structure/closet/attack_self_tk(mob/user)
+ return attack_hand(user)
+
+/obj/structure/closet/verb/verb_toggleopen()
+ set src in oview(1)
+ set category = "Object"
+ set name = "Toggle Open"
+
+ if(!usr.canmove || usr.stat || usr.restrained())
+ return
+
+ if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
+ return attack_hand(usr)
+ else
+ to_chat(usr, "This mob type can't use this verb.")
+
+// Objects that try to exit a locker by stepping were doing so successfully,
+// and due to an oversight in turf/Enter() were going through walls. That
+// should be independently resolved, but this is also an interesting twist.
+/obj/structure/closet/Exit(atom/movable/AM)
+ open()
+ if(AM.loc == src)
+ return 0
+ return 1
+
+/obj/structure/closet/container_resist(mob/living/user)
+ if(opened)
+ return
+ if(ismovableatom(loc))
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ var/atom/movable/AM = loc
+ AM.relay_container_resist(user, src)
+ return
+ if(!welded && !locked)
+ open()
+ return
+
+ //okay, so the closet is either welded or locked... resist!!!
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.visible_message("[src] begins to shake violently!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
+ "You hear banging from [src].")
+ if(do_after(user,(breakout_time), target = src))
+ if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
+ return
+ //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
+ user.visible_message("[user] successfully broke out of [src]!",
+ "You successfully break out of [src]!")
+ bust_open()
+ else
+ if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
+ to_chat(user, "You fail to break out of [src]!")
+
+/obj/structure/closet/AltClick(mob/user)
+ ..()
+ if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))
+ to_chat(user, "You can't do that right now!")
+ return
+ togglelock(user)
+
+/obj/structure/closet/CtrlShiftClick(mob/living/user)
+ if(!HAS_TRAIT(user, TRAIT_SKITTISH))
+ return ..()
+ if(!user.canUseTopic(src) || !isturf(user.loc))
+ return
+ dive_into(user)
+
+/obj/structure/closet/emag_act(mob/user)
+ . = ..()
+ if(!secure || broken)
+ return
+ user.visible_message("Sparks fly from [src]!",
+ "You scramble [src]'s lock, breaking it open!",
+ "You hear a faint electrical spark.")
+ playsound(src, "sparks", 50, 1)
+ broken = TRUE
+ locked = FALSE
+ if(!QDELETED(lockerelectronics))
+ QDEL_NULL(lockerelectronics)
+ update_icon()
+
+/obj/structure/closet/get_remote_view_fullscreens(mob/user)
+ if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
+ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
+
+/obj/structure/closet/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ if (!(. & EMP_PROTECT_CONTENTS))
+ for(var/obj/O in src)
+ O.emp_act(severity)
+ if(!secure || broken)
+ return ..()
+ if(prob(50 / severity))
+ locked = !locked
+ update_icon()
+ if(prob(20 / severity) && !opened)
+ if(!locked)
+ open()
+ else
+ req_access = list()
+ req_access += pick(get_all_accesses())
+ if(!QDELETED(lockerelectronics))
+ lockerelectronics.accesses = req_access
+
+/obj/structure/closet/contents_explosion(severity, target)
+ for(var/atom/A in contents)
+ A.ex_act(severity, target)
+ CHECK_TICK
+
+/obj/structure/closet/singularity_act()
+ dump_contents()
+ ..()
+
+/obj/structure/closet/AllowDrop()
+ return TRUE
+
+
+/obj/structure/closet/return_temperature()
+ return
+
+/obj/structure/closet/proc/dive_into(mob/living/user)
+ var/turf/T1 = get_turf(user)
+ var/turf/T2 = get_turf(src)
+ if(!opened)
+ if(locked)
+ togglelock(user, TRUE)
+ if(!open(user))
+ to_chat(user, "It won't budge!")
+ return
+ step_towards(user, T2)
+ T1 = get_turf(user)
+ if(T1 == T2)
+ user.resting = TRUE //so people can jump into crates without slamming the lid on their head
+ if(!close(user))
+ to_chat(user, "You can't get [src] to close!")
+ user.resting = FALSE
+ return
+ user.resting = FALSE
+ togglelock(user)
+ T1.visible_message("[user] dives into [src]!")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 167823b9be..a7adafdad4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -33,6 +33,7 @@
new /obj/item/extinguisher/advanced(src)
new /obj/item/storage/photo_album/CE(src)
new /obj/item/storage/lockbox/medal/engineering(src)
+ new /obj/item/construction/rcd/loaded/upgraded(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index e979d4f18e..226d279288 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -100,6 +100,14 @@
to_chat(user, "You start adding [B] to [src]...")
if(do_after(user, 20, target = src) && B.use(1))
make_new_table(/obj/structure/table/bronze)
+ else if(istype(I, /obj/item/stack/sheet/plasmaglass))
+ var/obj/item/stack/sheet/plasmaglass/G = I
+ if(G.get_amount() < 1)
+ to_chat(user, "You need one plasmaglass sheet to do this!")
+ return
+ to_chat(user, "You start adding [G] to [src]...")
+ if(do_after(user, 20, target = src) && G.use(1))
+ make_new_table(/obj/structure/table/plasmaglass)
else
return ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 8c29c1b2c5..fcffafb262 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -258,6 +258,53 @@
for(var/obj/item/shard/S in debris)
S.color = NARSIE_WINDOW_COLOUR
+/*
+ * Plasmaglass tables
+ */
+/obj/structure/table/plasmaglass
+ name = "plasmaglass table"
+ desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?"
+ icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi'
+ icon_state = "plasmaglass_table"
+ climbable = TRUE
+ buildstack = /obj/item/stack/sheet/plasmaglass
+ canSmoothWith = null
+ max_integrity = 270
+ resistance_flags = ACID_PROOF
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ var/list/debris = list()
+
+/obj/structure/table/plasmaglass/New()
+ . = ..()
+ debris += new frame
+ debris += new /obj/item/shard/plasma
+
+/obj/structure/table/plasmaglass/Destroy()
+ QDEL_LIST(debris)
+ . = ..()
+
+/obj/structure/table/plasmaglass/proc/check_break(mob/living/M)
+ return
+
+/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ ..()
+ return
+ else
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/X in debris)
+ var/atom/movable/AM = X
+ AM.forceMove(T)
+ debris -= AM
+ qdel(src)
+
+/obj/structure/table/plasmaglass/narsie_act()
+ color = NARSIE_WINDOW_COLOUR
+ for(var/obj/item/shard/S in debris)
+ S.color = NARSIE_WINDOW_COLOUR
+
/*
* Wooden tables
*/
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index a26d57e3e1..9fc055c2ba 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -281,6 +281,8 @@
. += new /obj/effect/decal/cleanable/glass(location)
if (reinf)
. += new /obj/item/stack/rods(location, (fulltile ? 2 : 1))
+ if (fulltile)
+ . += new /obj/item/shard(location)
/obj/structure/window/proc/can_be_rotated(mob/user,rotation_type)
if(anchored)
@@ -409,6 +411,15 @@
glass_type = /obj/item/stack/sheet/plasmaglass
rad_insulation = RAD_NO_INSULATION
+/obj/structure/window/plasma/spawnDebris(location)
+ . = list()
+ . += new /obj/item/shard/plasma(location)
+ . += new /obj/effect/decal/cleanable/glass/plasma(location)
+ if (reinf)
+ . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1))
+ if (fulltile)
+ . += new /obj/item/shard/plasma(location)
+
/obj/structure/window/plasma/spawner/east
dir = EAST
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index b00efc7ed6..194014b61a 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -236,6 +236,10 @@
return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33)
if(RCD_WINDOWGRILLE)
return list("mode" = RCD_WINDOWGRILLE, "delay" = 10, "cost" = 4)
+ if(RCD_MACHINE)
+ return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25)
+ if(RCD_COMPUTER)
+ return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25)
return FALSE
/turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
@@ -274,4 +278,20 @@
var/obj/structure/grille/G = new(src)
G.anchored = TRUE
return TRUE
+ if(RCD_MACHINE)
+ if(locate(/obj/structure/frame/machine) in src)
+ return FALSE
+ var/obj/structure/frame/machine/M = new(src)
+ M.state = 2
+ M.icon_state = "box_1"
+ M.anchored = TRUE
+ return TRUE
+ if(RCD_COMPUTER)
+ if(locate(/obj/structure/frame/computer) in src)
+ return FALSE
+ var/obj/structure/frame/computer/C = new(src)
+ C.anchored = TRUE
+ C.setDir(the_rcd.computer_dir)
+ return TRUE
+
return FALSE
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index dfc6972578..8b63d60939 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -7,6 +7,7 @@
smooth = SMOOTH_MORE
sheet_type = /obj/item/stack/sheet/runed_metal
sheet_amount = 1
+ explosion_block = 10
girder_type = /obj/structure/girder/cult
/turf/closed/wall/mineral/cult/Initialize()
@@ -49,7 +50,7 @@
/turf/closed/wall/clockwork
name = "clockwork wall"
desc = "A huge chunk of warm metal. The clanging of machinery emanates from within."
- explosion_block = 2
+ explosion_block = 5
hardness = 10
slicing_duration = 80
sheet_type = /obj/item/stack/tile/brass
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index bfbf6b5b79..89e9c33ecc 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -54,12 +54,16 @@
only_current_user_can_interact = TRUE
/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user)
- return
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/obj/machinery/vr_sleeper/emag_act(mob/user)
+ . = ..()
+ if(you_die_in_the_game_you_die_for_real)
+ return
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
addtimer(CALLBACK(src, .proc/emagNotify), 150)
+ return TRUE
/obj/machinery/vr_sleeper/update_icon()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm
index 8e29b38fe1..0fca957ffe 100644
--- a/code/modules/antagonists/abductor/abductor.dm
+++ b/code/modules/antagonists/abductor/abductor.dm
@@ -56,6 +56,7 @@
/datum/antagonist/abductor/greet()
to_chat(owner.current, "You are the [owner.special_role]!")
to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!")
+ to_chat(owner.current, "Try not to disturb the habitat, it could lead to dead specimens.")
to_chat(owner.current, "[greet_text]")
owner.announce_objectives()
diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
index 56b36d13e6..f735d6bb29 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -132,9 +132,9 @@
continue
if(isliving(M.current) && M.current.stat != DEAD)
var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
- do_teleport(M, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
- M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
- M.current.clear_fullscreen("flash", 5)
+ do_teleport(M.current, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
+ M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
+ M.current.clear_fullscreen("flash", 5)
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE)
recalls_remaining--
recalling = FALSE
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index a69694ced9..29b4e4539c 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -61,8 +61,8 @@ Runes can either be invoked by one's self or with many different cultists. Each
if(do_after(user, 15, target = src))
to_chat(user, "You carefully erase the [lowertext(cultist_name)] rune.")
qdel(src)
- else if(istype(I, /obj/item/nullrod))
- user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
+ else if(istype(I, /obj/item/storage/book/bible) || istype(I, /obj/item/nullrod))
+ user.say("BEGONE FOUL MAGICKS!!", forced = "bible")
to_chat(user, "You disrupt the magic of [src] with [I].")
qdel(src)
@@ -286,14 +286,14 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/convert/proc/optinalert(mob/living/convertee)
var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise")
- if(alert == "Join the Blood Cult")
+ if(src && alert == "Join the Blood Cult")
signmeup(convertee)
/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
- if(currentconversionman == usr)
+ if(currentconversionman == convertee)
conversionresult = TRUE
else
- to_chat(usr, "Your fate has already been set in stone.")
+ to_chat(convertee, "Your fate has already been set in stone.")
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
var/mob/living/first_invoker = invokers[1]
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index 53f8aa2da1..bb24af4f7a 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -36,30 +36,42 @@
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
-/datum/antagonist/ert/security/red
+/datum/antagonist/ert/security/amber
outfit = /datum/outfit/ert/security/alert
+/datum/antagonist/ert/security/red
+ outfit = /datum/outfit/ert/security/alert/red
+
/datum/antagonist/ert/engineer
role = "Engineer"
outfit = /datum/outfit/ert/engineer
-/datum/antagonist/ert/engineer/red
+/datum/antagonist/ert/engineer/amber
outfit = /datum/outfit/ert/engineer/alert
+/datum/antagonist/ert/engineer/red
+ outfit = /datum/outfit/ert/engineer/alert/red
+
/datum/antagonist/ert/medic
role = "Medical Officer"
outfit = /datum/outfit/ert/medic
-/datum/antagonist/ert/medic/red
+/datum/antagonist/ert/medic/amber
outfit = /datum/outfit/ert/medic/alert
+/datum/antagonist/ert/medic/red
+ outfit = /datum/outfit/ert/medic/alert/red
+
/datum/antagonist/ert/commander
role = "Commander"
outfit = /datum/outfit/ert/commander
-/datum/antagonist/ert/commander/red
+/datum/antagonist/ert/commander/amber
outfit = /datum/outfit/ert/commander/alert
+/datum/antagonist/ert/commander/red
+ outfit = /datum/outfit/ert/commander/alert/red
+
/datum/antagonist/ert/deathsquad
name = "Deathsquad Trooper"
outfit = /datum/outfit/death_commando
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 5ad97fb7c8..8e320b2f3e 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -364,15 +364,10 @@
var/list/cached_gases = air.gases
var/temperature = air.temperature
var/pressure = air.return_pressure()
-
var/old_heat_capacity = air.heat_capacity()
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
- if(cached_gases[/datum/gas/miasma] && cached_gases[/datum/gas/miasma] > 0)
- energy_released /= cached_gases[/datum/gas/miasma]*0.1
- if(cached_gases[/datum/gas/bz] && cached_gases[/datum/gas/bz] > 0)
- energy_released *= cached_gases[/datum/gas/bz]*0.1
- if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
+ if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
return NO_REACTION
cached_gases[/datum/gas/bz] += reaction_efficency
if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
@@ -381,7 +376,7 @@
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (reaction_efficency**0.5)*BZ_RESEARCH_AMOUNT)
+ SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
@@ -477,4 +472,4 @@
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
air.temperature += cleaned_air * 0.002
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
\ No newline at end of file
+ SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 3bf54a1178..6ca25c0d80 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -1,880 +1,882 @@
-/datum/tlv
- var/min2
- var/min1
- var/max1
- var/max2
-
-/datum/tlv/New(min2 as num, min1 as num, max1 as num, max2 as num)
- if(min2) src.min2 = min2
- if(min1) src.min1 = min1
- if(max1) src.max1 = max1
- if(max2) src.max2 = max2
-
-/datum/tlv/proc/get_danger_level(val as num)
- if(max2 != -1 && val >= max2)
- return 2
- if(min2 != -1 && val <= min2)
- return 2
- if(max1 != -1 && val >= max1)
- return 1
- if(min1 != -1 && val <= min1)
- return 1
- return 0
-
-/datum/tlv/no_checks
- min2 = -1
- min1 = -1
- max1 = -1
- max2 = -1
-
-/datum/tlv/dangerous
- min2 = -1
- min1 = -1
- max1 = 0.2
- max2 = 0.5
-
-/obj/item/electronics/airalarm
- name = "air alarm electronics"
- icon_state = "airalarm_electronics"
-
-/obj/item/wallframe/airalarm
- name = "air alarm frame"
- desc = "Used for building Air Alarms."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "alarm_bitem"
- result_path = /obj/machinery/airalarm
-
-#define AALARM_MODE_SCRUBBING 1
-#define AALARM_MODE_VENTING 2 //makes draught
-#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables widenet)
-#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing
-#define AALARM_MODE_OFF 5
-#define AALARM_MODE_FLOOD 6 //Emagged mode; turns off scrubbers and pressure checks on vents
-#define AALARM_MODE_SIPHON 7 //Scrubbers suck air
-#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing.
-#define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output
-
-#define AALARM_REPORT_TIMEOUT 100
-
-#define AALARM_OVERLAY_OFF "alarm_off"
-#define AALARM_OVERLAY_GREEN "alarm_green"
-#define AALARM_OVERLAY_WARN "alarm_amber"
-#define AALARM_OVERLAY_DANGER "alarm_red"
-
-/obj/machinery/airalarm
- name = "air alarm"
- desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "alarm0"
- use_power = IDLE_POWER_USE
- idle_power_usage = 4
- active_power_usage = 8
- power_channel = ENVIRON
- req_access = list(ACCESS_ATMOSPHERICS)
- max_integrity = 250
- integrity_failure = 80
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
- resistance_flags = FIRE_PROOF
-
- var/danger_level = 0
- var/mode = AALARM_MODE_SCRUBBING
-
- var/locked = TRUE
- var/aidisabled = 0
- var/shorted = 0
- var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/brightness_on = 1
-
- var/frequency = FREQ_ATMOS_CONTROL
- var/alarm_frequency = FREQ_ATMOS_ALARMS
- var/datum/radio_frequency/radio_connection
-
- var/list/TLV = list( // Breathable air.
- "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
- "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66),
- /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
- /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
- /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
- /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
- /datum/gas/plasma = new/datum/tlv/dangerous,
- /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
- /datum/gas/bz = new/datum/tlv/dangerous,
- /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
- /datum/gas/water_vapor = new/datum/tlv/dangerous,
- /datum/gas/tritium = new/datum/tlv/dangerous,
- /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
- /datum/gas/nitryl = new/datum/tlv/dangerous,
- /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- )
-
-/obj/machinery/airalarm/server // No checks here.
- TLV = list(
- "pressure" = new/datum/tlv/no_checks,
- "temperature" = new/datum/tlv/no_checks,
- /datum/gas/oxygen = new/datum/tlv/no_checks,
- /datum/gas/nitrogen = new/datum/tlv/no_checks,
- /datum/gas/carbon_dioxide = new/datum/tlv/no_checks,
- /datum/gas/miasma = new/datum/tlv/no_checks,
- /datum/gas/plasma = new/datum/tlv/no_checks,
- /datum/gas/nitrous_oxide = new/datum/tlv/no_checks,
- /datum/gas/bz = new/datum/tlv/no_checks,
- /datum/gas/hypernoblium = new/datum/tlv/no_checks,
- /datum/gas/water_vapor = new/datum/tlv/no_checks,
- /datum/gas/tritium = new/datum/tlv/no_checks,
- /datum/gas/stimulum = new/datum/tlv/no_checks,
- /datum/gas/nitryl = new/datum/tlv/no_checks,
- /datum/gas/pluoxium = new/datum/tlv/no_checks
- )
-
-/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
- TLV = list(
- "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
- "temperature" = new/datum/tlv(T0C-73.15, T0C-63.15, T0C, T0C+10),
- /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
- /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
- /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
- /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
- /datum/gas/plasma = new/datum/tlv/dangerous,
- /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
- /datum/gas/bz = new/datum/tlv/dangerous,
- /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
- /datum/gas/water_vapor = new/datum/tlv/dangerous,
- /datum/gas/tritium = new/datum/tlv/dangerous,
- /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
- /datum/gas/nitryl = new/datum/tlv/dangerous,
- /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- )
-
-/obj/machinery/airalarm/unlocked
- locked = FALSE
-
-/obj/machinery/airalarm/engine
- name = "engine air alarm"
- locked = FALSE
- req_access = null
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_ENGINE)
-
-/obj/machinery/airalarm/mixingchamber
- name = "chamber air alarm"
- locked = FALSE
- req_access = null
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_TOX, ACCESS_TOX_STORAGE)
-
-/obj/machinery/airalarm/all_access
- name = "all-access air alarm"
- desc = "This particular atmos control unit appears to have no access restrictions."
- locked = FALSE
- req_access = null
- req_one_access = null
-
-/obj/machinery/airalarm/syndicate //general syndicate access
- req_access = list(ACCESS_SYNDICATE)
-
-/obj/machinery/airalarm/directional/north //Pixel offsets get overwritten on New()
- dir = SOUTH
- pixel_y = 24
-
-/obj/machinery/airalarm/directional/south
- dir = NORTH
- pixel_y = -24
-
-/obj/machinery/airalarm/directional/east
- dir = WEST
- pixel_x = 24
-
-/obj/machinery/airalarm/directional/west
- dir = EAST
- pixel_x = -24
-
-//all air alarms in area are connected via magic
-/area
- var/list/air_vent_names = list()
- var/list/air_scrub_names = list()
- var/list/air_vent_info = list()
- var/list/air_scrub_info = list()
-
-/obj/machinery/airalarm/Initialize(mapload, ndir, nbuild)
- . = ..()
- wires = new /datum/wires/airalarm(src)
-
- if(ndir)
- setDir(ndir)
-
- if(nbuild)
- buildstage = 0
- panel_open = TRUE
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
-
- if(name == initial(name))
- name = "[get_area_name(src)] Air Alarm"
-
- power_change()
- set_frequency(frequency)
-
-/obj/machinery/airalarm/Destroy()
- SSradio.remove_object(src, frequency)
- qdel(wires)
- wires = null
- return ..()
-
-/obj/machinery/airalarm/examine(mob/user)
- . = ..()
- switch(buildstage)
- if(0)
- to_chat(user, "It is missing air alarm electronics.")
- if(1)
- to_chat(user, "It is missing wiring.")
- if(2)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface.")
-
-/obj/machinery/airalarm/ui_status(mob/user)
- if(user.has_unlimited_silicon_privilege && aidisabled)
- to_chat(user, "AI control has been disabled.")
- else if(!shorted)
- return ..()
- return UI_CLOSE
-
-/obj/machinery/airalarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "airalarm", name, 440, 650, master_ui, state)
- ui.open()
-
-/obj/machinery/airalarm/ui_data(mob/user)
- var/data = list(
- "locked" = locked,
- "siliconUser" = user.has_unlimited_silicon_privilege,
- "emagged" = (obj_flags & EMAGGED ? 1 : 0),
- "danger_level" = danger_level,
- )
-
- var/area/A = get_area(src)
- data["atmos_alarm"] = A.atmosalm
- data["fire_alarm"] = A.fire
-
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/environment = T.return_air()
- var/datum/tlv/cur_tlv
-
- data["environment_data"] = list()
- var/pressure = environment.return_pressure()
- cur_tlv = TLV["pressure"]
- data["environment_data"] += list(list(
- "name" = "Pressure",
- "value" = pressure,
- "unit" = "kPa",
- "danger_level" = cur_tlv.get_danger_level(pressure)
- ))
- var/temperature = environment.temperature
- cur_tlv = TLV["temperature"]
- data["environment_data"] += list(list(
- "name" = "Temperature",
- "value" = temperature,
- "unit" = "K ([round(temperature - T0C, 0.1)]C)",
- "danger_level" = cur_tlv.get_danger_level(temperature)
- ))
- var/total_moles = environment.total_moles()
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
- for(var/gas_id in environment.gases)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- cur_tlv = TLV[gas_id]
- data["environment_data"] += list(list(
- "name" = GLOB.meta_gas_names[gas_id],
- "value" = environment.gases[gas_id] / total_moles * 100,
- "unit" = "%",
- "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
- ))
-
- if(!locked || user.has_unlimited_silicon_privilege)
- data["vents"] = list()
- for(var/id_tag in A.air_vent_names)
- var/long_name = A.air_vent_names[id_tag]
- var/list/info = A.air_vent_info[id_tag]
- if(!info || info["frequency"] != frequency)
- continue
- data["vents"] += list(list(
- "id_tag" = id_tag,
- "long_name" = sanitize(long_name),
- "power" = info["power"],
- "checks" = info["checks"],
- "excheck" = info["checks"]&1,
- "incheck" = info["checks"]&2,
- "direction" = info["direction"],
- "external" = info["external"],
- "internal" = info["internal"],
- "extdefault"= (info["external"] == ONE_ATMOSPHERE),
- "intdefault"= (info["internal"] == 0)
- ))
- data["scrubbers"] = list()
- for(var/id_tag in A.air_scrub_names)
- var/long_name = A.air_scrub_names[id_tag]
- var/list/info = A.air_scrub_info[id_tag]
- if(!info || info["frequency"] != frequency)
- continue
- data["scrubbers"] += list(list(
- "id_tag" = id_tag,
- "long_name" = sanitize(long_name),
- "power" = info["power"],
- "scrubbing" = info["scrubbing"],
- "widenet" = info["widenet"],
- "filter_types" = info["filter_types"]
- ))
- data["mode"] = mode
- data["modes"] = list()
- data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0))
- data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0))
- data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0))
- data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 1))
- data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1))
- data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1))
- data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1))
- data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0))
- if(obj_flags & EMAGGED)
- data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1))
-
- var/datum/tlv/selected
- var/list/thresholds = list()
-
- selected = TLV["pressure"]
- thresholds += list(list("name" = "Pressure", "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2))
-
- selected = TLV["temperature"]
- thresholds += list(list("name" = "Temperature", "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2))
-
- for(var/gas_id in GLOB.meta_gas_names)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- selected = TLV[gas_id]
- thresholds += list(list("name" = GLOB.meta_gas_names[gas_id], "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2))
-
- data["thresholds"] = thresholds
- return data
-
-/obj/machinery/airalarm/ui_act(action, params)
- if(..() || buildstage != 2)
- return
- if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled))
- return
- var/device_id = params["id_tag"]
- switch(action)
- if("lock")
- if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN))
- locked = !locked
- . = TRUE
- if("power", "toggle_filter", "widenet", "scrubbing")
- send_signal(device_id, list("[action]" = params["val"]), usr)
- . = TRUE
- if("excheck")
- send_signal(device_id, list("checks" = text2num(params["val"])^1), usr)
- . = TRUE
- if("incheck")
- send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
- . = TRUE
- if("set_external_pressure", "set_internal_pressure")
- var/area/A = get_area(src)
- var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
- if(!isnull(target) && !..())
- send_signal(device_id, list("[action]" = target), usr)
- . = TRUE
- if("reset_external_pressure")
- send_signal(device_id, list("reset_external_pressure"), usr)
- . = TRUE
- if("reset_internal_pressure")
- send_signal(device_id, list("reset_internal_pressure"), usr)
- . = TRUE
- if("threshold")
- var/env = params["env"]
- if(text2path(env))
- env = text2path(env)
-
- var/name = params["var"]
- var/datum/tlv/tlv = TLV[env]
- if(isnull(tlv))
- return
- var/value = input("New [name] for [env]:", name, tlv.vars[name]) as num|null
- if(!isnull(value) && !..())
- if(value < 0)
- tlv.vars[name] = -1
- else
- tlv.vars[name] = round(value, 0.01)
- investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS)
- . = TRUE
- if("mode")
- mode = text2num(params["mode"])
- investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(usr)]",INVESTIGATE_ATMOS)
- apply_mode()
- . = TRUE
- if("alarm")
- var/area/A = get_area(src)
- if(A.atmosalert(2, src))
- post_alert(2)
- . = TRUE
- if("reset")
- var/area/A = get_area(src)
- if(A.atmosalert(0, src))
- post_alert(0)
- . = TRUE
- update_icon()
-
-/obj/machinery/airalarm/proc/reset(wire)
- switch(wire)
- if(WIRE_POWER)
- if(!wires.is_cut(WIRE_POWER))
- shorted = FALSE
- update_icon()
- if(WIRE_AI)
- if(!wires.is_cut(WIRE_AI))
- aidisabled = FALSE
-
-
-/obj/machinery/airalarm/proc/shock(mob/user, prb)
- if((stat & (NOPOWER))) // unpowered, no shock
- return 0
- if(!prob(prb))
- return 0 //you lucked out, no shock for you
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start() //sparks always.
- if (electrocute_mob(user, get_area(src), src, 1, TRUE))
- return 1
- else
- return 0
-
-/obj/machinery/airalarm/proc/refresh_all()
- var/area/A = get_area(src)
- for(var/id_tag in A.air_vent_names)
- var/list/I = A.air_vent_info[id_tag]
- if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
- continue
- send_signal(id_tag, list("status"))
- for(var/id_tag in A.air_scrub_names)
- var/list/I = A.air_scrub_info[id_tag]
- if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
- continue
- send_signal(id_tag, list("status"))
-
-/obj/machinery/airalarm/proc/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
-
-/obj/machinery/airalarm/proc/send_signal(target, list/command, mob/user)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new(command)
- signal.data["tag"] = target
- signal.data["sigtype"] = "command"
- signal.data["user"] = user
- radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
-
- return 1
-
-/obj/machinery/airalarm/proc/get_mode_name(mode_value)
- switch(mode_value)
- if(AALARM_MODE_SCRUBBING)
- return "Filtering"
- if(AALARM_MODE_CONTAMINATED)
- return "Contaminated"
- if(AALARM_MODE_VENTING)
- return "Draught"
- if(AALARM_MODE_REFILL)
- return "Refill"
- if(AALARM_MODE_PANIC)
- return "Panic Siphon"
- if(AALARM_MODE_REPLACEMENT)
- return "Cycle"
- if(AALARM_MODE_SIPHON)
- return "Siphon"
- if(AALARM_MODE_OFF)
- return "Off"
- if(AALARM_MODE_FLOOD)
- return "Flood"
-
-/obj/machinery/airalarm/proc/apply_mode()
- var/area/A = get_area(src)
- switch(mode)
- if(AALARM_MODE_SCRUBBING)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
- "scrubbing" = 1,
- "widenet" = 0,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE
- ))
- if(AALARM_MODE_CONTAMINATED)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(
- /datum/gas/carbon_dioxide,
- /datum/gas/miasma,
- /datum/gas/plasma,
- /datum/gas/water_vapor,
- /datum/gas/hypernoblium,
- /datum/gas/nitrous_oxide,
- /datum/gas/nitryl,
- /datum/gas/tritium,
- /datum/gas/bz,
- /datum/gas/stimulum,
- /datum/gas/pluoxium
- ),
- "scrubbing" = 1,
- "widenet" = 1,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE
- ))
- if(AALARM_MODE_VENTING)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 0,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE*2
- ))
- if(AALARM_MODE_REFILL)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
- "scrubbing" = 1,
- "widenet" = 0,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE * 3
- ))
- if(AALARM_MODE_PANIC,
- AALARM_MODE_REPLACEMENT)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 1,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- if(AALARM_MODE_SIPHON)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 0,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
-
- if(AALARM_MODE_OFF)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- if(AALARM_MODE_FLOOD)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 2,
- "set_internal_pressure" = 0
- ))
-
-/obj/machinery/airalarm/update_icon()
- set_light(0)
- cut_overlays()
- SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
- if(stat & NOPOWER)
- icon_state = "alarm0"
- return
-
- if(stat & BROKEN)
- icon_state = "alarmx"
- return
-
- if(panel_open)
- switch(buildstage)
- if(2)
- icon_state = "alarmx"
- if(1)
- icon_state = "alarm_b2"
- if(0)
- icon_state = "alarm_b1"
- return
-
- icon_state = "alarm1"
- var/overlay_state = AALARM_OVERLAY_OFF
- var/area/A = get_area(src)
- switch(max(danger_level, A.atmosalm))
- if(0)
- add_overlay(AALARM_OVERLAY_GREEN)
- overlay_state = AALARM_OVERLAY_GREEN
- light_color = LIGHT_COLOR_GREEN
- set_light(brightness_on)
- if(1)
- add_overlay(AALARM_OVERLAY_WARN)
- overlay_state = AALARM_OVERLAY_WARN
- light_color = LIGHT_COLOR_LAVA
- set_light(brightness_on)
- if(2)
- add_overlay(AALARM_OVERLAY_DANGER)
- overlay_state = AALARM_OVERLAY_DANGER
- light_color = LIGHT_COLOR_RED
- set_light(brightness_on)
-
- SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
- update_light()
-
-/obj/machinery/airalarm/process()
- if((stat & (NOPOWER|BROKEN)) || shorted)
- return
-
- var/turf/location = get_turf(src)
- if(!location)
- return
-
- var/datum/tlv/cur_tlv
-
- var/datum/gas_mixture/environment = location.return_air()
- var/list/env_gases = environment.gases
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
-
- cur_tlv = TLV["pressure"]
- var/environment_pressure = environment.return_pressure()
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
-
- cur_tlv = TLV["temperature"]
- var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
-
- var/gas_dangerlevel = 0
- for(var/gas_id in env_gases)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- cur_tlv = TLV[gas_id]
- gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
-
- GAS_GARBAGE_COLLECT(environment.gases)
-
- var/old_danger_level = danger_level
- danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
-
- if(old_danger_level != danger_level)
- apply_danger_level()
- if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
- mode = AALARM_MODE_SCRUBBING
- apply_mode()
-
- return
-
-
-/obj/machinery/airalarm/proc/post_alert(alert_level)
- var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
-
- if(!frequency)
- return
-
- var/datum/signal/alert_signal = new(list(
- "zone" = get_area_name(src),
- "type" = "Atmospheric"
- ))
- if(alert_level==2)
- alert_signal.data["alert"] = "severe"
- else if (alert_level==1)
- alert_signal.data["alert"] = "minor"
- else if (alert_level==0)
- alert_signal.data["alert"] = "clear"
-
- frequency.post_signal(src, alert_signal, range = -1)
-
-/obj/machinery/airalarm/proc/apply_danger_level()
- var/area/A = get_area(src)
-
- var/new_area_danger_level = 0
- for(var/obj/machinery/airalarm/AA in A)
- if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
- new_area_danger_level = max(new_area_danger_level,AA.danger_level)
- if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state
- post_alert(new_area_danger_level)
-
- update_icon()
-
-/obj/machinery/airalarm/attackby(obj/item/W, mob/user, params)
- switch(buildstage)
- if(2)
- if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut())
- W.play_tool_sound(src)
- to_chat(user, "You cut the final wires.")
- new /obj/item/stack/cable_coil(loc, 5)
- buildstage = 1
- update_icon()
- return
- else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up.
- W.play_tool_sound(src)
- panel_open = !panel_open
- to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].")
- update_icon()
- return
- else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card
- togglelock(user)
- else if(panel_open && is_wire_tool(W))
- wires.interact(user)
- return
- if(1)
- if(istype(W, /obj/item/crowbar))
- user.visible_message("[user.name] removes the electronics from [src.name].",\
- "You start prying out the circuit...")
- W.play_tool_sound(src)
- if (W.use_tool(src, user, 20))
- if (buildstage == 1)
- to_chat(user, "You remove the air alarm electronics.")
- new /obj/item/electronics/airalarm( src.loc )
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- buildstage = 0
- update_icon()
- return
-
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/cable = W
- if(cable.get_amount() < 5)
- to_chat(user, "You need five lengths of cable to wire the air alarm!")
- return
- user.visible_message("[user.name] wires the air alarm.", \
- "You start wiring the air alarm...")
- if (do_after(user, 20, target = src))
- if (cable.get_amount() >= 5 && buildstage == 1)
- cable.use(5)
- to_chat(user, "You wire the air alarm.")
- wires.repair()
- aidisabled = 0
- locked = FALSE
- mode = 1
- shorted = 0
- post_alert(0)
- buildstage = 2
- update_icon()
- return
- if(0)
- if(istype(W, /obj/item/electronics/airalarm))
- if(user.temporarilyRemoveItemFromInventory(W))
- to_chat(user, "You insert the circuit.")
- buildstage = 1
- update_icon()
- qdel(W)
- return
-
- if(istype(W, /obj/item/electroadaptive_pseudocircuit))
- var/obj/item/electroadaptive_pseudocircuit/P = W
- if(!P.adapt_circuit(user, 25))
- return
- user.visible_message("[user] fabricates a circuit and places it into [src].", \
- "You adapt an air alarm circuit and slot it into the assembly.")
- buildstage = 1
- update_icon()
- return
-
- if(istype(W, /obj/item/wrench))
- to_chat(user, "You detach \the [src] from the wall.")
- W.play_tool_sound(src)
- new /obj/item/wallframe/airalarm( user.loc )
- qdel(src)
- return
-
- return ..()
-
-/obj/machinery/airalarm/AltClick(mob/user)
- ..()
- if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
- return
- else
- togglelock(user)
-
-/obj/machinery/airalarm/proc/togglelock(mob/living/user)
- if(stat & (NOPOWER|BROKEN))
- to_chat(user, "It does nothing!")
- else
- if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
- locked = !locked
- updateUsrDialog()
- to_chat(user, "You [ locked ? "lock" : "unlock"] the air alarm interface.")
- else
- to_chat(user, "Access denied.")
- return
-
-/obj/machinery/airalarm/power_change()
- ..()
- if(stat & NOPOWER)
- set_light(0)
- update_icon()
-
-/obj/machinery/airalarm/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- visible_message("Sparks fly out of [src]!", "You emag [src], disabling its safeties.")
- playsound(src, "sparks", 50, 1)
-
-/obj/machinery/airalarm/obj_break(damage_flag)
- ..()
- update_icon()
- set_light(0)
-
-/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
- if(!(flags_1 & NODECONSTRUCT_1))
- new /obj/item/stack/sheet/metal(loc, 2)
- var/obj/item/I = new /obj/item/electronics/airalarm(loc)
- if(!disassembled)
- I.obj_integrity = I.max_integrity * 0.5
- new /obj/item/stack/cable_coil(loc, 3)
- qdel(src)
-
-#undef AALARM_MODE_SCRUBBING
-#undef AALARM_MODE_VENTING
-#undef AALARM_MODE_PANIC
-#undef AALARM_MODE_REPLACEMENT
-#undef AALARM_MODE_OFF
-#undef AALARM_MODE_FLOOD
-#undef AALARM_MODE_SIPHON
-#undef AALARM_MODE_CONTAMINATED
-#undef AALARM_MODE_REFILL
-#undef AALARM_REPORT_TIMEOUT
+/datum/tlv
+ var/min2
+ var/min1
+ var/max1
+ var/max2
+
+/datum/tlv/New(min2 as num, min1 as num, max1 as num, max2 as num)
+ if(min2) src.min2 = min2
+ if(min1) src.min1 = min1
+ if(max1) src.max1 = max1
+ if(max2) src.max2 = max2
+
+/datum/tlv/proc/get_danger_level(val as num)
+ if(max2 != -1 && val >= max2)
+ return 2
+ if(min2 != -1 && val <= min2)
+ return 2
+ if(max1 != -1 && val >= max1)
+ return 1
+ if(min1 != -1 && val <= min1)
+ return 1
+ return 0
+
+/datum/tlv/no_checks
+ min2 = -1
+ min1 = -1
+ max1 = -1
+ max2 = -1
+
+/datum/tlv/dangerous
+ min2 = -1
+ min1 = -1
+ max1 = 0.2
+ max2 = 0.5
+
+/obj/item/electronics/airalarm
+ name = "air alarm electronics"
+ icon_state = "airalarm_electronics"
+
+/obj/item/wallframe/airalarm
+ name = "air alarm frame"
+ desc = "Used for building Air Alarms."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "alarm_bitem"
+ result_path = /obj/machinery/airalarm
+
+#define AALARM_MODE_SCRUBBING 1
+#define AALARM_MODE_VENTING 2 //makes draught
+#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables widenet)
+#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing
+#define AALARM_MODE_OFF 5
+#define AALARM_MODE_FLOOD 6 //Emagged mode; turns off scrubbers and pressure checks on vents
+#define AALARM_MODE_SIPHON 7 //Scrubbers suck air
+#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing.
+#define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output
+
+#define AALARM_REPORT_TIMEOUT 100
+
+#define AALARM_OVERLAY_OFF "alarm_off"
+#define AALARM_OVERLAY_GREEN "alarm_green"
+#define AALARM_OVERLAY_WARN "alarm_amber"
+#define AALARM_OVERLAY_DANGER "alarm_red"
+
+/obj/machinery/airalarm
+ name = "air alarm"
+ desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "alarm0"
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 4
+ active_power_usage = 8
+ power_channel = ENVIRON
+ req_access = list(ACCESS_ATMOSPHERICS)
+ max_integrity = 250
+ integrity_failure = 80
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+
+ var/danger_level = 0
+ var/mode = AALARM_MODE_SCRUBBING
+
+ var/locked = TRUE
+ var/aidisabled = 0
+ var/shorted = 0
+ var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
+ var/brightness_on = 1
+
+ var/frequency = FREQ_ATMOS_CONTROL
+ var/alarm_frequency = FREQ_ATMOS_ALARMS
+ var/datum/radio_frequency/radio_connection
+
+ var/list/TLV = list( // Breathable air.
+ "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
+ "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66),
+ /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
+ /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
+ /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
+ /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
+ /datum/gas/plasma = new/datum/tlv/dangerous,
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
+ /datum/gas/nitryl = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
+ )
+
+/obj/machinery/airalarm/server // No checks here.
+ TLV = list(
+ "pressure" = new/datum/tlv/no_checks,
+ "temperature" = new/datum/tlv/no_checks,
+ /datum/gas/oxygen = new/datum/tlv/no_checks,
+ /datum/gas/nitrogen = new/datum/tlv/no_checks,
+ /datum/gas/carbon_dioxide = new/datum/tlv/no_checks,
+ /datum/gas/miasma = new/datum/tlv/no_checks,
+ /datum/gas/plasma = new/datum/tlv/no_checks,
+ /datum/gas/nitrous_oxide = new/datum/tlv/no_checks,
+ /datum/gas/bz = new/datum/tlv/no_checks,
+ /datum/gas/hypernoblium = new/datum/tlv/no_checks,
+ /datum/gas/water_vapor = new/datum/tlv/no_checks,
+ /datum/gas/tritium = new/datum/tlv/no_checks,
+ /datum/gas/stimulum = new/datum/tlv/no_checks,
+ /datum/gas/nitryl = new/datum/tlv/no_checks,
+ /datum/gas/pluoxium = new/datum/tlv/no_checks
+ )
+
+/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
+ TLV = list(
+ "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
+ "temperature" = new/datum/tlv(T0C-73.15, T0C-63.15, T0C, T0C+10),
+ /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
+ /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
+ /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
+ /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
+ /datum/gas/plasma = new/datum/tlv/dangerous,
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
+ /datum/gas/nitryl = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
+ )
+
+/obj/machinery/airalarm/unlocked
+ locked = FALSE
+
+/obj/machinery/airalarm/engine
+ name = "engine air alarm"
+ locked = FALSE
+ req_access = null
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_ENGINE)
+
+/obj/machinery/airalarm/mixingchamber
+ name = "chamber air alarm"
+ locked = FALSE
+ req_access = null
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_TOX, ACCESS_TOX_STORAGE)
+
+/obj/machinery/airalarm/all_access
+ name = "all-access air alarm"
+ desc = "This particular atmos control unit appears to have no access restrictions."
+ locked = FALSE
+ req_access = null
+ req_one_access = null
+
+/obj/machinery/airalarm/syndicate //general syndicate access
+ req_access = list(ACCESS_SYNDICATE)
+
+/obj/machinery/airalarm/directional/north //Pixel offsets get overwritten on New()
+ dir = SOUTH
+ pixel_y = 24
+
+/obj/machinery/airalarm/directional/south
+ dir = NORTH
+ pixel_y = -24
+
+/obj/machinery/airalarm/directional/east
+ dir = WEST
+ pixel_x = 24
+
+/obj/machinery/airalarm/directional/west
+ dir = EAST
+ pixel_x = -24
+
+//all air alarms in area are connected via magic
+/area
+ var/list/air_vent_names = list()
+ var/list/air_scrub_names = list()
+ var/list/air_vent_info = list()
+ var/list/air_scrub_info = list()
+
+/obj/machinery/airalarm/Initialize(mapload, ndir, nbuild)
+ . = ..()
+ wires = new /datum/wires/airalarm(src)
+
+ if(ndir)
+ setDir(ndir)
+
+ if(nbuild)
+ buildstage = 0
+ panel_open = TRUE
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
+
+ if(name == initial(name))
+ name = "[get_area_name(src)] Air Alarm"
+
+ power_change()
+ set_frequency(frequency)
+
+/obj/machinery/airalarm/Destroy()
+ SSradio.remove_object(src, frequency)
+ qdel(wires)
+ wires = null
+ return ..()
+
+/obj/machinery/airalarm/examine(mob/user)
+ . = ..()
+ switch(buildstage)
+ if(0)
+ to_chat(user, "It is missing air alarm electronics.")
+ if(1)
+ to_chat(user, "It is missing wiring.")
+ if(2)
+ to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface.")
+
+/obj/machinery/airalarm/ui_status(mob/user)
+ if(user.has_unlimited_silicon_privilege && aidisabled)
+ to_chat(user, "AI control has been disabled.")
+ else if(!shorted)
+ return ..()
+ return UI_CLOSE
+
+/obj/machinery/airalarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "airalarm", name, 440, 650, master_ui, state)
+ ui.open()
+
+/obj/machinery/airalarm/ui_data(mob/user)
+ var/data = list(
+ "locked" = locked,
+ "siliconUser" = user.has_unlimited_silicon_privilege,
+ "emagged" = (obj_flags & EMAGGED ? 1 : 0),
+ "danger_level" = danger_level,
+ )
+
+ var/area/A = get_area(src)
+ data["atmos_alarm"] = A.atmosalm
+ data["fire_alarm"] = A.fire
+
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/environment = T.return_air()
+ var/datum/tlv/cur_tlv
+
+ data["environment_data"] = list()
+ var/pressure = environment.return_pressure()
+ cur_tlv = TLV["pressure"]
+ data["environment_data"] += list(list(
+ "name" = "Pressure",
+ "value" = pressure,
+ "unit" = "kPa",
+ "danger_level" = cur_tlv.get_danger_level(pressure)
+ ))
+ var/temperature = environment.temperature
+ cur_tlv = TLV["temperature"]
+ data["environment_data"] += list(list(
+ "name" = "Temperature",
+ "value" = temperature,
+ "unit" = "K ([round(temperature - T0C, 0.1)]C)",
+ "danger_level" = cur_tlv.get_danger_level(temperature)
+ ))
+ var/total_moles = environment.total_moles()
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+ for(var/gas_id in environment.gases)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ cur_tlv = TLV[gas_id]
+ data["environment_data"] += list(list(
+ "name" = GLOB.meta_gas_names[gas_id],
+ "value" = environment.gases[gas_id] / total_moles * 100,
+ "unit" = "%",
+ "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
+ ))
+
+ if(!locked || user.has_unlimited_silicon_privilege)
+ data["vents"] = list()
+ for(var/id_tag in A.air_vent_names)
+ var/long_name = A.air_vent_names[id_tag]
+ var/list/info = A.air_vent_info[id_tag]
+ if(!info || info["frequency"] != frequency)
+ continue
+ data["vents"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "checks" = info["checks"],
+ "excheck" = info["checks"]&1,
+ "incheck" = info["checks"]&2,
+ "direction" = info["direction"],
+ "external" = info["external"],
+ "internal" = info["internal"],
+ "extdefault"= (info["external"] == ONE_ATMOSPHERE),
+ "intdefault"= (info["internal"] == 0)
+ ))
+ data["scrubbers"] = list()
+ for(var/id_tag in A.air_scrub_names)
+ var/long_name = A.air_scrub_names[id_tag]
+ var/list/info = A.air_scrub_info[id_tag]
+ if(!info || info["frequency"] != frequency)
+ continue
+ data["scrubbers"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "scrubbing" = info["scrubbing"],
+ "widenet" = info["widenet"],
+ "filter_types" = info["filter_types"]
+ ))
+ data["mode"] = mode
+ data["modes"] = list()
+ data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0))
+ data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0))
+ data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0))
+ data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 1))
+ data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1))
+ data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1))
+ data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1))
+ data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0))
+ if(obj_flags & EMAGGED)
+ data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1))
+
+ var/datum/tlv/selected
+ var/list/thresholds = list()
+
+ selected = TLV["pressure"]
+ thresholds += list(list("name" = "Pressure", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2))
+
+ selected = TLV["temperature"]
+ thresholds += list(list("name" = "Temperature", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2))
+
+ for(var/gas_id in GLOB.meta_gas_names)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ selected = TLV[gas_id]
+ thresholds += list(list("name" = GLOB.meta_gas_names[gas_id], "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2))
+
+ data["thresholds"] = thresholds
+ return data
+
+/obj/machinery/airalarm/ui_act(action, params)
+ if(..() || buildstage != 2)
+ return
+ if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled))
+ return
+ var/device_id = params["id_tag"]
+ switch(action)
+ if("lock")
+ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN))
+ locked = !locked
+ . = TRUE
+ if("power", "toggle_filter", "widenet", "scrubbing")
+ send_signal(device_id, list("[action]" = params["val"]), usr)
+ . = TRUE
+ if("excheck")
+ send_signal(device_id, list("checks" = text2num(params["val"])^1), usr)
+ . = TRUE
+ if("incheck")
+ send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
+ . = TRUE
+ if("set_external_pressure", "set_internal_pressure")
+ var/area/A = get_area(src)
+ var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
+ if(!isnull(target) && !..())
+ send_signal(device_id, list("[action]" = target), usr)
+ . = TRUE
+ if("reset_external_pressure")
+ send_signal(device_id, list("reset_external_pressure"), usr)
+ . = TRUE
+ if("reset_internal_pressure")
+ send_signal(device_id, list("reset_internal_pressure"), usr)
+ . = TRUE
+ if("threshold")
+ var/env = params["env"]
+ if(text2path(env))
+ env = text2path(env)
+
+ var/name = params["var"]
+ var/datum/tlv/tlv = TLV[env]
+ if(isnull(tlv))
+ return
+ var/value = input("New [name] for [env]:", name, tlv.vars[name]) as num|null
+ if(!isnull(value) && !..())
+ if(value < 0)
+ tlv.vars[name] = -1
+ else
+ tlv.vars[name] = round(value, 0.01)
+ investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS)
+ . = TRUE
+ if("mode")
+ mode = text2num(params["mode"])
+ investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(usr)]",INVESTIGATE_ATMOS)
+ apply_mode()
+ . = TRUE
+ if("alarm")
+ var/area/A = get_area(src)
+ if(A.atmosalert(2, src))
+ post_alert(2)
+ . = TRUE
+ if("reset")
+ var/area/A = get_area(src)
+ if(A.atmosalert(0, src))
+ post_alert(0)
+ . = TRUE
+ update_icon()
+
+/obj/machinery/airalarm/proc/reset(wire)
+ switch(wire)
+ if(WIRE_POWER)
+ if(!wires.is_cut(WIRE_POWER))
+ shorted = FALSE
+ update_icon()
+ if(WIRE_AI)
+ if(!wires.is_cut(WIRE_AI))
+ aidisabled = FALSE
+
+
+/obj/machinery/airalarm/proc/shock(mob/user, prb)
+ if((stat & (NOPOWER))) // unpowered, no shock
+ return 0
+ if(!prob(prb))
+ return 0 //you lucked out, no shock for you
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, src)
+ s.start() //sparks always.
+ if (electrocute_mob(user, get_area(src), src, 1, TRUE))
+ return 1
+ else
+ return 0
+
+/obj/machinery/airalarm/proc/refresh_all()
+ var/area/A = get_area(src)
+ for(var/id_tag in A.air_vent_names)
+ var/list/I = A.air_vent_info[id_tag]
+ if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
+ continue
+ send_signal(id_tag, list("status"))
+ for(var/id_tag in A.air_scrub_names)
+ var/list/I = A.air_scrub_info[id_tag]
+ if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
+ continue
+ send_signal(id_tag, list("status"))
+
+/obj/machinery/airalarm/proc/set_frequency(new_frequency)
+ SSradio.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
+
+/obj/machinery/airalarm/proc/send_signal(target, list/command, mob/user)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new(command)
+ signal.data["tag"] = target
+ signal.data["sigtype"] = "command"
+ signal.data["user"] = user
+ radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
+
+ return 1
+
+/obj/machinery/airalarm/proc/get_mode_name(mode_value)
+ switch(mode_value)
+ if(AALARM_MODE_SCRUBBING)
+ return "Filtering"
+ if(AALARM_MODE_CONTAMINATED)
+ return "Contaminated"
+ if(AALARM_MODE_VENTING)
+ return "Draught"
+ if(AALARM_MODE_REFILL)
+ return "Refill"
+ if(AALARM_MODE_PANIC)
+ return "Panic Siphon"
+ if(AALARM_MODE_REPLACEMENT)
+ return "Cycle"
+ if(AALARM_MODE_SIPHON)
+ return "Siphon"
+ if(AALARM_MODE_OFF)
+ return "Off"
+ if(AALARM_MODE_FLOOD)
+ return "Flood"
+
+/obj/machinery/airalarm/proc/apply_mode()
+ var/area/A = get_area(src)
+ switch(mode)
+ if(AALARM_MODE_SCRUBBING)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
+ "scrubbing" = 1,
+ "widenet" = 0,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE
+ ))
+ if(AALARM_MODE_CONTAMINATED)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(
+ /datum/gas/carbon_dioxide,
+ /datum/gas/miasma,
+ /datum/gas/plasma,
+ /datum/gas/water_vapor,
+ /datum/gas/hypernoblium,
+ /datum/gas/nitrous_oxide,
+ /datum/gas/nitryl,
+ /datum/gas/tritium,
+ /datum/gas/bz,
+ /datum/gas/stimulum,
+ /datum/gas/pluoxium
+ ),
+ "scrubbing" = 1,
+ "widenet" = 1,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE
+ ))
+ if(AALARM_MODE_VENTING)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 0,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE*2
+ ))
+ if(AALARM_MODE_REFILL)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
+ "scrubbing" = 1,
+ "widenet" = 0,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE * 3
+ ))
+ if(AALARM_MODE_PANIC,
+ AALARM_MODE_REPLACEMENT)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 1,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ if(AALARM_MODE_SIPHON)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 0,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+
+ if(AALARM_MODE_OFF)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ if(AALARM_MODE_FLOOD)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 2,
+ "set_internal_pressure" = 0
+ ))
+
+/obj/machinery/airalarm/update_icon()
+ set_light(0)
+ cut_overlays()
+ SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
+ if(stat & NOPOWER)
+ icon_state = "alarm0"
+ return
+
+ if(stat & BROKEN)
+ icon_state = "alarmx"
+ return
+
+ if(panel_open)
+ switch(buildstage)
+ if(2)
+ icon_state = "alarmx"
+ if(1)
+ icon_state = "alarm_b2"
+ if(0)
+ icon_state = "alarm_b1"
+ return
+
+ icon_state = "alarm1"
+ var/overlay_state = AALARM_OVERLAY_OFF
+ var/area/A = get_area(src)
+ switch(max(danger_level, A.atmosalm))
+ if(0)
+ add_overlay(AALARM_OVERLAY_GREEN)
+ overlay_state = AALARM_OVERLAY_GREEN
+ light_color = LIGHT_COLOR_GREEN
+ set_light(brightness_on)
+ if(1)
+ add_overlay(AALARM_OVERLAY_WARN)
+ overlay_state = AALARM_OVERLAY_WARN
+ light_color = LIGHT_COLOR_LAVA
+ set_light(brightness_on)
+ if(2)
+ add_overlay(AALARM_OVERLAY_DANGER)
+ overlay_state = AALARM_OVERLAY_DANGER
+ light_color = LIGHT_COLOR_RED
+ set_light(brightness_on)
+
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
+ update_light()
+
+/obj/machinery/airalarm/process()
+ if((stat & (NOPOWER|BROKEN)) || shorted)
+ return
+
+ var/turf/location = get_turf(src)
+ if(!location)
+ return
+
+ var/datum/tlv/cur_tlv
+
+ var/datum/gas_mixture/environment = location.return_air()
+ var/list/env_gases = environment.gases
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+
+ cur_tlv = TLV["pressure"]
+ var/environment_pressure = environment.return_pressure()
+ var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
+
+ cur_tlv = TLV["temperature"]
+ var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
+
+ var/gas_dangerlevel = 0
+ for(var/gas_id in env_gases)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ cur_tlv = TLV[gas_id]
+ gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
+
+ GAS_GARBAGE_COLLECT(environment.gases)
+
+ var/old_danger_level = danger_level
+ danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
+
+ if(old_danger_level != danger_level)
+ apply_danger_level()
+ if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
+ mode = AALARM_MODE_SCRUBBING
+ apply_mode()
+
+ return
+
+
+/obj/machinery/airalarm/proc/post_alert(alert_level)
+ var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
+
+ if(!frequency)
+ return
+
+ var/datum/signal/alert_signal = new(list(
+ "zone" = get_area_name(src),
+ "type" = "Atmospheric"
+ ))
+ if(alert_level==2)
+ alert_signal.data["alert"] = "severe"
+ else if (alert_level==1)
+ alert_signal.data["alert"] = "minor"
+ else if (alert_level==0)
+ alert_signal.data["alert"] = "clear"
+
+ frequency.post_signal(src, alert_signal, range = -1)
+
+/obj/machinery/airalarm/proc/apply_danger_level()
+ var/area/A = get_area(src)
+
+ var/new_area_danger_level = 0
+ for(var/obj/machinery/airalarm/AA in A)
+ if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
+ new_area_danger_level = max(new_area_danger_level,AA.danger_level)
+ if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state
+ post_alert(new_area_danger_level)
+
+ update_icon()
+
+/obj/machinery/airalarm/attackby(obj/item/W, mob/user, params)
+ switch(buildstage)
+ if(2)
+ if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut())
+ W.play_tool_sound(src)
+ to_chat(user, "You cut the final wires.")
+ new /obj/item/stack/cable_coil(loc, 5)
+ buildstage = 1
+ update_icon()
+ return
+ else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up.
+ W.play_tool_sound(src)
+ panel_open = !panel_open
+ to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].")
+ update_icon()
+ return
+ else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card
+ togglelock(user)
+ else if(panel_open && is_wire_tool(W))
+ wires.interact(user)
+ return
+ if(1)
+ if(istype(W, /obj/item/crowbar))
+ user.visible_message("[user.name] removes the electronics from [src.name].",\
+ "You start prying out the circuit...")
+ W.play_tool_sound(src)
+ if (W.use_tool(src, user, 20))
+ if (buildstage == 1)
+ to_chat(user, "You remove the air alarm electronics.")
+ new /obj/item/electronics/airalarm( src.loc )
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ buildstage = 0
+ update_icon()
+ return
+
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/cable = W
+ if(cable.get_amount() < 5)
+ to_chat(user, "You need five lengths of cable to wire the air alarm!")
+ return
+ user.visible_message("[user.name] wires the air alarm.", \
+ "You start wiring the air alarm...")
+ if (do_after(user, 20, target = src))
+ if (cable.get_amount() >= 5 && buildstage == 1)
+ cable.use(5)
+ to_chat(user, "You wire the air alarm.")
+ wires.repair()
+ aidisabled = 0
+ locked = FALSE
+ mode = 1
+ shorted = 0
+ post_alert(0)
+ buildstage = 2
+ update_icon()
+ return
+ if(0)
+ if(istype(W, /obj/item/electronics/airalarm))
+ if(user.temporarilyRemoveItemFromInventory(W))
+ to_chat(user, "You insert the circuit.")
+ buildstage = 1
+ update_icon()
+ qdel(W)
+ return
+
+ if(istype(W, /obj/item/electroadaptive_pseudocircuit))
+ var/obj/item/electroadaptive_pseudocircuit/P = W
+ if(!P.adapt_circuit(user, 25))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt an air alarm circuit and slot it into the assembly.")
+ buildstage = 1
+ update_icon()
+ return
+
+ if(istype(W, /obj/item/wrench))
+ to_chat(user, "You detach \the [src] from the wall.")
+ W.play_tool_sound(src)
+ new /obj/item/wallframe/airalarm( user.loc )
+ qdel(src)
+ return
+
+ return ..()
+
+/obj/machinery/airalarm/AltClick(mob/user)
+ ..()
+ if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
+ return
+ else
+ togglelock(user)
+
+/obj/machinery/airalarm/proc/togglelock(mob/living/user)
+ if(stat & (NOPOWER|BROKEN))
+ to_chat(user, "It does nothing!")
+ else
+ if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
+ locked = !locked
+ updateUsrDialog()
+ to_chat(user, "You [ locked ? "lock" : "unlock"] the air alarm interface.")
+ else
+ to_chat(user, "Access denied.")
+ return
+
+/obj/machinery/airalarm/power_change()
+ ..()
+ if(stat & NOPOWER)
+ set_light(0)
+ update_icon()
+
+/obj/machinery/airalarm/emag_act(mob/user)
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ visible_message("Sparks fly out of [src]!", "You emag [src], disabling its safeties.")
+ playsound(src, "sparks", 50, 1)
+ return TRUE
+
+/obj/machinery/airalarm/obj_break(damage_flag)
+ ..()
+ update_icon()
+ set_light(0)
+
+/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ var/obj/item/I = new /obj/item/electronics/airalarm(loc)
+ if(!disassembled)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 3)
+ qdel(src)
+
+#undef AALARM_MODE_SCRUBBING
+#undef AALARM_MODE_VENTING
+#undef AALARM_MODE_PANIC
+#undef AALARM_MODE_REPLACEMENT
+#undef AALARM_MODE_OFF
+#undef AALARM_MODE_FLOOD
+#undef AALARM_MODE_SIPHON
+#undef AALARM_MODE_CONTAMINATED
+#undef AALARM_MODE_REFILL
+#undef AALARM_REPORT_TIMEOUT
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index b5b9a616d0..1a607b4b96 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -36,6 +36,7 @@
cat |= EXPORT_EMAG
/obj/machinery/computer/cargo/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
user.visible_message("[user] swipes a suspicious card through [src]!",
@@ -48,6 +49,8 @@
var/obj/item/circuitboard/computer/cargo/board = circuit
board.contraband = TRUE
board.obj_flags |= EMAGGED
+ req_access = list()
+ return TRUE
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index 5288c27ff6..0097346a34 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -54,6 +54,7 @@
..()
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(obj_flags & EMAGGED)
return
user.visible_message("[user] swipes a suspicious card through [src]!",
@@ -63,6 +64,8 @@
var/obj/item/circuitboard/computer/cargo/board = circuit
board.obj_flags |= EMAGGED
packin_up()
+ req_access = list()
+ return TRUE
/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
meme_pack_data = list() // sorry for what?
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 06f23574e1..5442fcb932 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -817,6 +817,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
var/file = GLOB.vox_sounds[name]
Export("##action=load_rsc", file)
stoplag()
+ for (var/name in GLOB.vox_sounds_male)
+ var/file = GLOB.vox_sounds_male[name]
+ Export("##action=load_rsc", file)
+ stoplag()
#endif
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 64a1f48962..d487b873b1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -919,11 +919,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
Description | "
for(var/j in GLOB.loadout_items[gear_tab])
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
- var/donoritem
- if(gear.ckeywhitelist && gear.ckeywhitelist.len)
- donoritem = TRUE
- if(!(user.ckey in gear.ckeywhitelist))
- continue
+ var/donoritem = gear.donoritem
+ if(donoritem && !gear.donator_ckey_check(user.ckey))
+ continue
var/class_link = ""
if(gear.type in chosen_gear)
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
@@ -2245,7 +2243,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!is_loadout_slot_available(G.category))
to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!")
return
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(user.ckey))
to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.")
return
if(gear_points >= initial(G.cost))
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index a87e95e28c..387aa65d20 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -24,11 +24,13 @@
desc = "[desc] The display is flickering slightly."
/obj/item/clothing/glasses/hud/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "PZZTTPFFFT")
desc = "[desc] The display is flickering slightly."
+ return TRUE
/obj/item/clothing/glasses/hud/health
name = "health scanner HUD"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 73fde5d50f..041f0ba012 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -312,8 +312,8 @@
/obj/item/clothing/head/pharaoh
name = "pharaoh hat"
desc = "Walk like an Egyptian."
- icon_state = "pharoah_hat"
- icon_state = "pharoah_hat"
+ icon_state = "pharaoh_hat"
+ icon_state = "pharaoh_hat"
/obj/item/clothing/head/jester/alt
name = "jester hat"
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index f004f07bf5..086d47e8bf 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -69,12 +69,14 @@
/obj/item/clothing/mask/gas/sechailer/attack_self()
halt()
-/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob)
- if(safety)
- safety = FALSE
- to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.")
- else
+
+/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user)
+ . = ..()
+ if(!safety)
return
+ safety = FALSE
+ to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.")
+ return TRUE
/obj/item/clothing/mask/gas/sechailer/verb/halt()
set category = "Object"
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 86c8f5335f..523ed55aa4 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -45,16 +45,23 @@
R.recalculateChannels()
/datum/outfit/ert/commander/alert
- name = "ERT Commander - High Alert"
+ name = "ERT Commander - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
- /obj/item/gun/energy/pulse/pistol/loyalpin=1)
+ /obj/item/gun/energy/e_gun=1)
l_pocket = /obj/item/melee/transforming/energy/sword/saber
+/datum/outfit/ert/commander/alert/red
+ name = "ERT Commander - Red Alert"
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/pulse/pistol/loyalpin=1)
+
/datum/outfit/ert/security
name = "ERT Security"
@@ -80,15 +87,22 @@
R.recalculateChannels()
/datum/outfit/ert/security/alert
- name = "ERT Security - High Alert"
+ name = "ERT Security - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/melee/baton/loaded=1,\
- /obj/item/gun/energy/pulse/carbine/loyalpin=1)
+ /obj/item/gun/energy/e_gun/stun=1)
+/datum/outfit/ert/security/alert/red
+ name = "ERT Security - Red Alert"
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/storage/box/handcuffs=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/gun/energy/pulse/carbine/loyalpin=1)
/datum/outfit/ert/medic
name = "ERT Medic"
@@ -117,9 +131,18 @@
R.recalculateChannels()
/datum/outfit/ert/medic/alert
- name = "ERT Medic - High Alert"
+ name = "ERT Medic - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/e_gun=1,\
+ /obj/item/reagent_containers/hypospray/combat/nanites=1,\
+ /obj/item/gun/medbeam=1)
+
+/datum/outfit/ert/medic/alert/red
+ name = "ERT Medic - Red Alert"
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
@@ -154,9 +177,17 @@
R.recalculateChannels()
/datum/outfit/ert/engineer/alert
- name = "ERT Engineer - High Alert"
+ name = "ERT Engineer - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/e_gun=1,\
+ /obj/item/construction/rcd/combat=1)
+
+/datum/outfit/ert/engineer/alert/red
+ name = "ERT Engineer - Red Alert"
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 85503c720a..2694497579 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -624,19 +624,19 @@
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
slowdown = 6 //Slow
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
name = "M.A.S.O.N RIG helmet"
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
item_color = "ancient"
brightness_on = 16
scan_reagents = TRUE
@@ -644,7 +644,7 @@
tint = 1
var/obj/machinery/doppler_array/integrated/bomb_radar
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
. = ..()
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index dc1b2b6dc3..8a3dbbf274 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -468,11 +468,11 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
allowed = list(/obj/item/clothing/mask/facehugger/toy)
-/obj/item/clothing/suit/nemes
- name = "pharoah tunic"
+/obj/item/clothing/suit/pharaoh
+ name = "pharaoh tunic"
desc = "Lavish space tomb not included."
- icon_state = "pharoah"
- icon_state = "pharoah"
+ icon_state = "pharaoh"
+ icon_state = "pharaoh"
body_parts_covered = CHEST|GROIN
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 17ddacb32f..616c00b6c1 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -703,14 +703,6 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
-/obj/item/clothing/under/durathread
- name = "durathread jumpsuit"
- desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
- icon_state = "durathread"
- item_state = "durathread"
- item_color = "durathread"
- can_adjust = FALSE
- armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
/obj/item/clothing/under/gear_harness
name = "gear harness"
@@ -725,5 +717,15 @@
icon_state = "durathread"
item_state = "durathread"
item_color = "durathread"
+ can_adjust = TRUE
+ armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
+
+/obj/item/clothing/under/duraskirt
+ name = "durathread jumpskirt"
+ desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer. Being a short skirt, it naturally doesn't protect the legs."
+ icon_state = "duraskirt"
+ item_state = "duraskirt"
+ item_color = "durathread"
can_adjust = FALSE
+ body_parts_covered = CHEST|GROIN|ARMS
armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 2790a8cec7..73052acfe1 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -359,6 +359,7 @@
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/shard = 1,
/obj/item/stack/rods = 1)
+ parts = list(/obj/item/shard = 1)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 4ffc10f9c2..6cc11afdf5 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -149,6 +149,7 @@
active_power_usage = 50 + spawned.len * 3 + effects.len * 5
/obj/machinery/computer/holodeck/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
if(!LAZYLEN(emag_programs))
@@ -160,6 +161,7 @@
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.")
log_game("[key_name(user)] emagged the Holodeck Control Console")
nerf(!(obj_flags & EMAGGED))
+ return TRUE
/obj/machinery/computer/holodeck/emp_act(severity)
. = ..()
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index e9ad49eedd..ef019387e8 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -224,6 +224,10 @@
species = "strawberry"
plantname = "Strawberry Vine"
product = /obj/item/reagent_containers/food/snacks/grown/strawberry
+ growthstages = 6
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "strawberry-grow"
+ icon_dead = "berry-dead"
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
mutatelist = list()
diff --git a/code/modules/hydroponics/grown/peach.dm b/code/modules/hydroponics/grown/peach.dm
new file mode 100644
index 0000000000..6fbf933bd1
--- /dev/null
+++ b/code/modules/hydroponics/grown/peach.dm
@@ -0,0 +1,27 @@
+// Peach
+/obj/item/seeds/peach
+ name = "pack of peach seeds"
+ desc = "These seeds grow into peach trees."
+ icon_state = "seed-peach"
+ species = "peach"
+ plantname = "Peach Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/peach
+ lifespan = 65
+ endurance = 40
+ yield = 3
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "peach-grow"
+ icon_dead = "peach-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
+
+/obj/item/reagent_containers/food/snacks/grown/peach
+ seed = /obj/item/seeds/peach
+ name = "peach"
+ desc = "It's fuzzy!"
+ icon_state = "peach"
+ filling_color = "#FF4500"
+ bitesize = 25
+ foodtype = FRUIT
+ juice_results = list("peachjuice" = 0)
+ tastes = list("peach" = 1)
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 699df5de12..ef58943731 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -343,8 +343,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
return ..()
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
- if(density && !(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
+ . = ..()
+ if(!density || obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
if(..())
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 86499e694b..4a0faf69f5 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -214,8 +214,11 @@
return ..()
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
- if(locked)
- boom(user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(!locked)
+ return
+ boom(user)
+ return TRUE
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
if(locked)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 4a628c5f34..953da6cbb0 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -128,9 +128,12 @@ GLOBAL_LIST(labor_sheet_values)
qdel(src)
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
- if(!(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
- to_chat(user, "PZZTTPFFFT")
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(user, "PZZTTPFFFT")
+ return TRUE
/**********************Prisoner Collection Unit**************************/
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 7add723a06..5990c70813 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -787,30 +787,30 @@
/obj/item/melee/ghost_sword/process()
ghost_check()
-/obj/item/melee/ghost_sword/proc/ghost_check()
- var/ghost_counter = 0
- var/turf/T = get_turf(src)
- var/list/contents = T.GetAllContents()
- var/mob/dead/observer/current_spirits = list()
- for(var/thing in contents)
- var/atom/A = thing
- A.transfer_observers_to(src)
-
- for(var/i in orbiters?.orbiters)
- if(!isobserver(i))
+/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
+ for(var/i in A.orbiters?.orbiters)
+ if(!isobserver(i) || (i in L))
continue
+ L |= i
+ recursive_orbit_collect(i, L)
+
+/obj/item/melee/ghost_sword/proc/ghost_check()
+ var/list/mob/dead/observer/current_spirits = list()
+
+ recursive_orbit_collect(src, current_spirits)
+ recursive_orbit_collect(loc, current_spirits) //anything holding us
+
+ for(var/i in spirits - current_spirits)
var/mob/dead/observer/G = i
- ghost_counter++
- G.invisibility = 0
- current_spirits |= G
-
- for(var/mob/dead/observer/G in spirits - current_spirits)
G.invisibility = GLOB.observer_default_invisibility
-
+
+ for(var/i in current_spirits)
+ var/mob/dead/observer/G = i
+ G.invisibility = 0
+
spirits = current_spirits
-
- return ghost_counter
-
+ return length(spirits)
+
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
force = 0
var/ghost_counter = ghost_check()
@@ -1335,4 +1335,4 @@
if(2)
new /obj/item/wisp_lantern(src)
if(3)
- new /obj/item/prisoncube(src)
\ No newline at end of file
+ new /obj/item/prisoncube(src)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b53655ca7c..9acecea545 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -702,7 +702,7 @@
clear_fullscreen("critvision")
//Oxygen damage overlay
- var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + stamdamageoverlaytemp
+ var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
if(windedup)
var/severity = 0
switch(windedup)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index a067be798f..794194b3a1 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -61,6 +61,5 @@
var/next_hallucination = 0
var/cpr_time = 1 //CPR cooldown.
var/damageoverlaytemp = 0
- var/stamdamageoverlaytemp = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 7a0a2d8ad8..35b0384145 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -25,11 +25,11 @@
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
- var/undie_color = "#FFFFFF"
+ var/undie_color = "FFFFFF"
var/undershirt = "Nude" //Which undershirt the player wants
- var/shirt_color = "#FFFFFF"
+ var/shirt_color = "FFFFFF"
var/socks = "Nude" //Which socks the player wants
- var/socks_color = "#FFFFFF"
+ var/socks_color = "FFFFFF"
var/backbag = DBACKPACK //Which backpack type the player has chosen.
var/jumpsuit_style = PREF_SUIT //suit/skirt
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 9abfc5826f..0f83e675fc 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
if(UNDIE_COLORABLE(S))
- MA.color = "[H.socks_color]"
+ MA.color = "#[H.socks_color]"
standing += MA
if(standing.len)
@@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma.
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
- var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang/)
+ var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang && !/datum/antagonist/gang/boss)
if(rev)
rev.remove_revolutionary(FALSE, user)
if(gang)
@@ -1781,7 +1781,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(CLONE)
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
if(STAMINA)
- H.stamdamageoverlaytemp = 20
if(BP)
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
H.update_stamina()
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index f0144e022d..36e4e18817 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -4,9 +4,8 @@
if(notransform)
return
- if(damageoverlaytemp || stamdamageoverlaytemp)
+ if(damageoverlaytemp)
damageoverlaytemp = 0
- stamdamageoverlaytemp = 0
update_damage_hud()
if(stat != DEAD) //Reagent processing needs to come before breathing, to prevent edge cases.
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 4ac5c1f0bb..c6d4527812 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -100,6 +100,8 @@
last_announcement = message
+ var/voxType = input(src, "Male or female VOX?", "VOX-gender") in list("male", "female")
+
if(!message || announcing_vox > world.time)
return
@@ -121,7 +123,9 @@
if(!word)
words -= word
continue
- if(!GLOB.vox_sounds[word])
+ if(!GLOB.vox_sounds[word] && voxType == "female")
+ incorrect_words += word
+ if(!GLOB.vox_sounds_male[word] && voxType == "male")
incorrect_words += word
if(incorrect_words.len)
@@ -133,16 +137,21 @@
log_game("[key_name(src)] made a vocal announcement with the following message: [message].")
for(var/word in words)
- play_vox_word(word, src.z, null)
+ play_vox_word(word, src.z, null, voxType)
-/proc/play_vox_word(word, z_level, mob/only_listener)
+/proc/play_vox_word(word, z_level, mob/only_listener, voxType = "female")
word = lowertext(word)
- if(GLOB.vox_sounds[word])
+ if( (GLOB.vox_sounds[word] && voxType == "female") || (GLOB.vox_sounds_male[word] && voxType == "male") )
- var/sound_file = GLOB.vox_sounds[word]
+ var/sound_file
+
+ if(voxType == "female")
+ sound_file = GLOB.vox_sounds[word]
+ else
+ sound_file = GLOB.vox_sounds_male[word]
var/sound/voice = sound(sound_file, wait = 1, channel = CHANNEL_VOX)
voice.status = SOUND_STREAM
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index c90c719e8a..0f09b6f62a 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -92,17 +92,18 @@
/mob/living/silicon/robot/emag_act(mob/user)
if(user == src)//To prevent syndieborgs from emagging themselves
- return
+ return FALSE
+ if(world.time < emag_cooldown)
+ return FALSE
+ . = ..()
if(!opened)//Cover is closed
if(locked)
to_chat(user, "You emag the cover lock.")
locked = FALSE
if(shell) //A warning to Traitors who may not know that emagging AI shells does not slave them.
to_chat(user, "[src] seems to be controlled remotely! Emagging the interface may not work as expected.")
- else
- to_chat(user, "The cover is already unlocked!")
- return
- if(world.time < emag_cooldown)
+ return TRUE
+ to_chat(user, "The cover is already unlocked!")
return
if(wiresexposed)
to_chat(user, "You must unexpose the wires first!")
@@ -115,20 +116,24 @@
to_chat(src, "\"[text2ratvar("You will serve Engine above all else")]!\"\n\
ALERT: Subversion attempt denied.")
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they serve only Ratvar.")
- return
+ return TRUE
if(connected_ai && connected_ai.mind && connected_ai.mind.has_antag_datum(/datum/antagonist/traitor))
to_chat(src, "ALERT: Foreign software execution prevented.")
to_chat(connected_ai, "ALERT: Cyborg unit \[[src]] successfully defended against subversion.")
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they were slaved to traitor AI [connected_ai].")
- return
+ return TRUE
if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however.
to_chat(user, "[src] is remotely controlled! Your emag attempt has triggered a system reset instead!")
log_game("[key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.")
ResetModule()
- return
+ return TRUE
+ INVOKE_ASYNC(src, .proc/beep_boop_rogue_bot, user)
+ return TRUE
+
+/mob/living/silicon/robot/proc/beep_boop_rogue_bot(mob/user)
SetEmagged(1)
SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
lawupdate = 0
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 91515e4511..49261d6e38 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -187,22 +187,23 @@
qdel(src)
/mob/living/simple_animal/bot/emag_act(mob/user)
+ . = ..()
if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again.
locked = FALSE
emagged = 1
to_chat(user, "You bypass [src]'s controls.")
- return
- if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging.
- emagged = 2
- remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
- locked = TRUE //Access denied forever!
- bot_reset()
- turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
- to_chat(src, "(#$*#$^^( OVERRIDE DETECTED")
- log_combat(user, src, "emagged")
- return
- else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet.
+ return TRUE
+ if(!open)
to_chat(user, "You need to open maintenance panel first!")
+ return
+ emagged = 2
+ remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
+ locked = TRUE //Access denied forever!
+ bot_reset()
+ turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
+ to_chat(src, "(#$*#$^^( OVERRIDE DETECTED")
+ log_combat(user, src, "emagged")
+ return TRUE
/mob/living/simple_animal/bot/examine(mob/user)
..()
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index e09eb13886..bdffb032a3 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -78,7 +78,7 @@
return ..()
/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "[src] buzzes and beeps.")
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 9db21f13e0..a72b71be85 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -478,18 +478,19 @@
to_chat(user, "The superglue binding [src]'s toy swords to its chassis snaps!")
for(var/IS in 1 to toyswordamt)
new /obj/item/toy/sword(Tsec)
+ toyswordamt--
if(ASSEMBLY_FIFTH_STEP)
if(istype(I, /obj/item/melee/transforming/energy/sword/saber))
if(swordamt < 3)
if(!user.temporarilyRemoveItemFromInventory(I))
return
- created_name = "General Beepsky"
- name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
- icon_state = "grievous_assembly"
- to_chat(user, "You bolt [I] onto one of [src]'s arm slots.")
- qdel(I)
- swordamt ++
+ created_name = "General Beepsky"
+ name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
+ icon_state = "grievous_assembly"
+ to_chat(user, "You bolt [I] onto one of [src]'s arm slots.")
+ qdel(I)
+ swordamt ++
else
if(!can_finish_build(I, user))
return
@@ -505,6 +506,7 @@
to_chat(user, "You unbolt [src]'s energy swords")
for(var/IS in 1 to swordamt)
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
+ swordamt--
//Firebot Assembly
/obj/item/bot_assembly/firebot
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 0781c2907a..e272878574 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -195,7 +195,7 @@ Auto Patrol[]"},
shootAt(user)
/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm
index 1c2a6393ae..2b52da6821 100644
--- a/code/modules/mob/living/simple_animal/bot/firebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/firebot.dm
@@ -120,7 +120,7 @@
return dat
/mob/living/simple_animal/bot/firebot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 1)
if(user)
to_chat(user, "[src] buzzes and beeps.")
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 4709680ad9..396c6de166 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -124,7 +124,7 @@
..()
/mob/living/simple_animal/bot/floorbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "[src] buzzes and beeps.")
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index e069b46e9d..1c19cd82a1 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -127,10 +127,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
..()
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
- user << "You short out [src]'s sound control system. It gives out an evil laugh!!"
oldtarget_name = user.name
audible_message("[src] gives out an evil laugh!")
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 5eaaaea175..1bff7dc10c 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -240,7 +240,7 @@
step_to(src, (get_step_away(src,user)))
/mob/living/simple_animal/bot/medbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
declare_crit = 0
if(user)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 2efdf09f24..1bc7493684 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -115,6 +115,7 @@
return
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(emagged < 1)
emagged = TRUE
if(!open)
@@ -122,6 +123,7 @@
to_chat(user, "You [locked ? "lock" : "unlock"] [src]'s controls!")
flick("mulebot-emagged", src)
playsound(src, "sparks", 100, 0)
+ return TRUE
/mob/living/simple_animal/bot/mulebot/update_icon()
if(open)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index b6ef509d54..9572b4dafc 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -190,7 +190,7 @@ Auto Patrol: []"},
return
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index a50af21d47..86f63a729d 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -897,6 +897,11 @@
. = ..()
+/mob/living/simple_animal/parrot/Poly/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
+ . = ..()
+ if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions.
+ world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE)
+
/mob/living/simple_animal/parrot/Poly/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 07985215d8..29b4689317 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -69,7 +69,7 @@
if(Target.Adjacent(src))
Target.attack_slime(src)
- return
+ break
if(!Target.lying && prob(80))
if(Target.client && Target.health >= 20)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c64702f9ef..f1602f429c 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -457,13 +457,17 @@
set name = ".click"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .click macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/verb/DisDblClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num)
set name = ".dblclick"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .dblclick macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/Topic(href, href_list)
if(href_list["mach_close"])
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index 580374c5c0..db4cdc2ff5 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -178,13 +178,13 @@
turn_on(user)
/obj/item/modular_computer/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "\The [src] was already emagged.")
- return 0
- else
- obj_flags |= EMAGGED
- to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
- return 1
+ return
+ obj_flags |= EMAGGED
+ to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
+ return TRUE
/obj/item/modular_computer/examine(mob/user)
..()
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 19d3b56046..b3476e7046 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -44,7 +44,9 @@
cpu.attack_ghost(user)
/obj/machinery/modular_computer/emag_act(mob/user)
- return cpu ? cpu.emag_act(user) : 1
+ . = ..()
+ if(cpu)
+ . |= cpu.emag_act(user)
/obj/machinery/modular_computer/update_icon()
cut_overlays()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7c377ffa22..d837f0d420 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -267,7 +267,7 @@
to_chat(user, "There is an integration cog installed!")
to_chat(user, "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.")
-
+
if(issilicon(user))
to_chat(user, "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].")
@@ -747,7 +747,7 @@
if(damage_flag == "melee" && damage_amount < damage_deflection)
return 0
. = ..()
-
+
/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(!(stat & BROKEN))
@@ -759,21 +759,23 @@
update_icon()
/obj/machinery/power/apc/emag_act(mob/user)
- if(!(obj_flags & EMAGGED) && !malfhack)
- if(opened)
- to_chat(user, "You must close the cover to swipe an ID card!")
- else if(panel_open)
- to_chat(user, "You must close the panel first!")
- else if(stat & (BROKEN|MAINT))
- to_chat(user, "Nothing happens!")
- else
- flick("apc-spark", src)
- playsound(src, "sparks", 75, 1)
- obj_flags |= EMAGGED
- locked = FALSE
- to_chat(user, "You emag the APC interface.")
- update_icon()
-
+ . = ..()
+ if(obj_flags & EMAGGED || malfhack)
+ return
+ if(opened)
+ to_chat(user, "You must close the cover to swipe an ID card!")
+ else if(panel_open)
+ to_chat(user, "You must close the panel first!")
+ else if(stat & (BROKEN|MAINT))
+ to_chat(user, "Nothing happens!")
+ else
+ flick("apc-spark", src)
+ playsound(src, "sparks", 75, 1)
+ obj_flags |= EMAGGED
+ locked = FALSE
+ to_chat(user, "You emag the APC interface.")
+ update_icon()
+ return TRUE
// attack with hand - remove cell (if cover open) or interact with the APC
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 7a6e313cd0..7375a3e17a 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -194,10 +194,12 @@
return ..()
/obj/machinery/power/port_gen/pacman/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
emp_act(EMP_HEAVY)
+ return TRUE
/obj/machinery/power/port_gen/pacman/attack_ai(mob/user)
interact(user)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index d805713fa6..4d6ede69d1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -339,12 +339,13 @@
projectile_sound = initial(projectile_sound)
/obj/machinery/power/emitter/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
locked = FALSE
obj_flags |= EMAGGED
- if(user)
- user.visible_message("[user.name] emags [src].","You short out the lock.")
+ user?.visible_message("[user.name] emags [src].","You short out the lock.")
+ return TRUE
/obj/machinery/power/emitter/prototype
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index bc05e784a4..35710f8d61 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -84,16 +84,18 @@
/obj/singularity/attack_tk(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
+ log_game("[key_name(C)] has been disintegrated by attempting to telekenetically grab a singularity.")
C.visible_message("[C]'s head begins to collapse in on itself!", "Your head feels like it's collapsing in on itself! This was really not a good idea!", "You hear something crack and explode in gore.")
var/turf/T = get_turf(C)
for(var/i in 1 to 3)
C.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
new /obj/effect/gibspawner/generic(T)
sleep(1)
- C.ghostize()
var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD)
rip_u.dismember(BURN) //nice try jedi
qdel(rip_u)
+ return
+ return ..()
/obj/singularity/ex_act(severity, target)
switch(severity)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 026c39c6cf..3c151d4e77 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -5,12 +5,21 @@
#define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty.
#define OXYGEN_HEAT_PENALTY 1
#define CO2_HEAT_PENALTY 0.1
-#define NITROGEN_HEAT_MODIFIER -1.5
+#define PLUOXIUM_HEAT_PENALTY -1
+#define TRITIUM_HEAT_PENALTY 10
+#define NITROGEN_HEAT_PENALTY -1.5
+#define BZ_HEAT_PENALTY 5
#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation.
#define PLASMA_TRANSMIT_MODIFIER 4
+#define BZ_TRANSMIT_MODIFIER -2
+
+#define TRITIUM_RADIOACTIVITY_MODIFIER 3 //Higher == Crystal spews out more radiation
+#define BZ_RADIOACTIVITY_MODIFIER 5
+#define PLUOXIUM_RADIOACTIVITY_MODIFIER -2
#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage.
+#define PLUOXIUM_HEAT_RESISTANCE 3
#define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts.
#define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached
@@ -53,6 +62,7 @@
#define SUPERMATTER_EMERGENCY_PERCENT 25
#define SUPERMATTER_DANGER_PERCENT 50
#define SUPERMATTER_WARNING_PERCENT 100
+#define CRITICAL_TEMPERATURE 10000
#define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS
@@ -102,6 +112,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/o2comp = 0
var/co2comp = 0
var/n2ocomp = 0
+ var/pluoxiumcomp = 0
+ var/tritiumcomp = 0
+ var/bzcomp = 0
+
+ var/pluoxiumbonus = 0
var/combined_gas = 0
var/gasmix_power_ratio = 0
@@ -184,8 +199,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
to_chat(H, "You get headaches just from looking at it.")
return
-#define CRITICAL_TEMPERATURE 10000
-
/obj/machinery/power/supermatter_crystal/proc/get_status()
var/turf/T = get_turf(src)
if(!T)
@@ -354,16 +367,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0)
o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0)
co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0)
+ pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0)
+ tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0)
+ bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0)
n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0)
n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0)
- gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1)
+ if(pluoxiumcomp >= 0.15)
+ pluoxiumbonus = 1 //makes pluoxium only work at 15%+
+ else
+ pluoxiumbonus = 0
- dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5)
- dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1)
+ gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1)
- power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0)
+ dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (tritiumcomp * TRITIUM_HEAT_PENALTY) + ((pluoxiumcomp * PLUOXIUM_HEAT_PENALTY) * pluoxiumbonus) + (n2comp * NITROGEN_HEAT_PENALTY) + (bzcomp * BZ_HEAT_PENALTY), 0.5)
+ dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1)
+
+ power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER), 0)
//more moles of gases are harder to heat than fewer, so let's scale heat damage around them
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
@@ -392,7 +413,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
if(prob(50))
- radiation_pulse(src, power * (1 + power_transmission_bonus/10))
+ radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%)
+ if(bzcomp >= 0.4 && prob(30 * bzcomp))
+ src.fire_nuclear_particles() // Start to emit radballs at a maximum of 30% chance per tick
var/device_energy = power * REACTION_POWER_MODIFIER
@@ -527,11 +550,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
/obj/machinery/power/supermatter_crystal/attack_tk(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
+ log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a supermatter crystal.")
to_chat(C, "That was a really dense idea.")
- C.ghostize()
+ C.visible_message("A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
rip_u.Remove(C)
qdel(rip_u)
+ return
+ return ..()
/obj/machinery/power/supermatter_crystal/attack_paw(mob/user)
dust_mob(user, cause = "monkey attack")
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index bbad3e08b0..9a5486dfe2 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -132,11 +132,14 @@
/obj/singularity/energy_ball/attack_tk(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
+ log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a tesla ball.")
to_chat(C, "That was a shockingly dumb idea.")
+ C.visible_message("A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!")
var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
- C.ghostize(0)
+ rip_u.Remove(C)
qdel(rip_u)
- C.death()
+ return
+ return ..()
/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
if (istype(target))
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 089c79effd..0940144721 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -59,6 +59,9 @@
/obj/item/ammo_casing/energy/laser/redtag/hitscan
projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan
+/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy
+ projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan/holy
+
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
e_cost = 50
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index f6356dce99..12006440d2 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -127,15 +127,14 @@
/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
if(magazine && istype(A, /obj/item/ammo_casing))
- if(user.temporarilyRemoveItemFromInventory(A))
- if(!chambered)
- to_chat(user, "You load a new [A] into \the [src].")
- playsound(src, "gun_insert_full_magazine", 70, 1)
- chamber_round()
- update_icon()
- return TRUE
- else
- to_chat(user, "You cannot seem to get \the [A] out of your hands!")
+ if(chambered)
+ to_chat(user, "[src] already has a [magazine_wording] chambered.")
+ return
+ if(magazine.attackby(A, user, silent = TRUE))
+ to_chat(user, "You load a new [A] into \the [src].")
+ playsound(src, "gun_insert_full_magazine", 70, 1)
+ chamber_round()
+ update_icon()
/obj/item/gun/ballistic/rocketlauncher/update_icon()
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 856dfed78b..7d71a9acdd 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -40,7 +40,7 @@
if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
- pump(user)
+ pump(user, TRUE)
recentpump = world.time + 10
if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
@@ -52,7 +52,9 @@
process_fire(user, user, FALSE)
. = 1
-/obj/item/gun/ballistic/shotgun/proc/pump(mob/M)
+/obj/item/gun/ballistic/shotgun/proc/pump(mob/M, visible = TRUE)
+ if(visible)
+ M.visible_message("[M] racks [src].", "You rack [src].")
playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1)
pump_unload(M)
pump_reload(M)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index cd0dd53d48..bb97f9cf99 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -159,3 +159,65 @@
/obj/item/gun/energy/laser/redtag/hitscan
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan)
+
+/obj/item/gun/energy/laser/redtag/hitscan/chaplain
+ name = "\improper holy lasrifle"
+ desc = "A lasrifle from the old Imperium. This one seems to be blessed by techpriests."
+ icon_state = "LaserAK"
+ item_state = null
+ force = 14
+ pin = /obj/item/firing_pin/holy
+ icon = 'modular_citadel/icons/obj/guns/VGguns.dmi'
+ ammo_x_offset = 4
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy)
+ lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi'
+ var/chaplain_spawnable = TRUE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
+ throw_speed = 3
+ throw_range = 4
+ throwforce = 10
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+
+/obj/item/gun/energy/laser/redtag/hitscan/chaplain/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
+ if(!ishuman(user) || !ishuman(target))
+ return
+
+ if(semicd)
+ return
+
+ if(user == target)
+ target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \
+ "You stick [src] in your mouth, ready to pull the trigger...")
+ else
+ target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \
+ "[user] points [src] at your head, ready to pull the trigger...")
+
+ semicd = TRUE
+
+ if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
+ if(user)
+ if(user == target)
+ user.visible_message("[user] decided not to shoot.")
+ else if(target && target.Adjacent(user))
+ target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!")
+ semicd = FALSE
+ return
+
+ semicd = FALSE
+
+ target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!")
+
+ playsound('sound/weapons/dink.ogg', 30, 1)
+
+ if((iscultist(target)) || (is_servant_of_ratvar(target)))
+ chambered.BB.damage *= 1500
+
+ else if(chambered && chambered.BB)
+ chambered.BB.damage *= 5
+
+ process_fire(target, user, TRUE, params)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 05d6367306..9103340790 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -37,10 +37,12 @@
to_chat(user, "This firearm already has a firing pin installed.")
/obj/item/firing_pin/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You override the authentication mechanism.")
+ return TRUE
/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G)
gun = G
@@ -186,6 +188,15 @@
desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
selfdestruct = TRUE
+/obj/item/firing_pin/holy
+ name = "blessed pin"
+ desc = "A firing pin that only responds to those who are holier than thou."
+
+/obj/item/firing_pin/holy/pin_auth(mob/living/user)
+ if(user.mind.isholy)
+ return TRUE
+ return FALSE
+
// Laser tag pins
/obj/item/firing_pin/tag
name = "laser tag firing pin"
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index cbd0348743..e43eb5a3bc 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -151,6 +151,11 @@
/obj/item/projectile/beam/lasertag/redtag/hitscan
hitscan = TRUE
+/obj/item/projectile/beam/lasertag/redtag/hitscan/holy
+ name = "lasrifle beam"
+ damage = 0.1
+ damage_type = BURN
+
/obj/item/projectile/beam/lasertag/bluetag
icon_state = "bluelaser"
suit_types = list(/obj/item/clothing/suit/redtag)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index bc998c6657..9a228b28e3 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -139,12 +139,14 @@
/obj/machinery/chem_dispenser/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "[src] has no functional safeties to emag.")
return
to_chat(user, "You short out [src]'s safeties.")
dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/chem_dispenser/ex_act(severity, target)
if(severity < 3)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index eb7438aa20..4dc0d145dc 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1177,7 +1177,7 @@
M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS
M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
M.adjustCloneLoss(-1 * REM, 0)
- M.adjustStaminaLoss(-30 * REM, 0)
+ M.adjustStaminaLoss(-13 * REM, 0)
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
M.druggy = min(max(0, M.druggy + 10), 15) //See above
..()
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 33568524cd..d3db4f75b3 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -742,6 +742,13 @@
surgery = /datum/surgery/advanced/reconstruction
research_icon_state = "surgery_chest"
+/datum/design/surgery/surgery_toxinhealing
+ name = "Body Rejuvenation"
+ desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals."
+ id = "surgery_toxinhealing"
+ surgery = /datum/surgery/advanced/toxichealing
+ research_icon_state = "surgery_chest"
+
/datum/design/surgery/revival
name = "Revival"
desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life."
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 4a6f9625f1..77eebca696 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -379,6 +379,16 @@
////////////Tools//////////////
///////////////////////////////
+/datum/design/rcd_upgrade
+ name = "Advanced RCD designs upgrade"
+ desc = "Adds the computer frame and machine frame to the RCD."
+ id = "rcd_upgrade"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
+ build_path = /obj/item/rcd_upgrade
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
/datum/design/exwelder
name = "Experimental Welding Tool"
desc = "An experimental welder capable of self-fuel generation."
diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm
index 60dd78cf94..824d033bf4 100644
--- a/code/modules/research/nanites/nanite_remote.dm
+++ b/code/modules/research/nanites/nanite_remote.dm
@@ -37,6 +37,7 @@
to_chat(user, "Access denied.")
/obj/item/nanite_remote/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You override [src]'s ID lock.")
@@ -44,6 +45,7 @@
if(locked)
locked = FALSE
update_icon()
+ return TRUE
/obj/item/nanite_remote/update_icon()
. = ..()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index cb5062904d..a7d7857a24 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -184,12 +184,14 @@ Nothing else in the console has ID requirements.
..()
/obj/machinery/computer/rdconsole/emag_act(mob/user)
- if(!(obj_flags & EMAGGED))
- to_chat(user, "You disable the security protocols[locked? " and unlock the console":""].")
- playsound(src, "sparks", 75, 1)
- obj_flags |= EMAGGED
- locked = FALSE
- return ..()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ to_chat(user, "You disable the security protocols[locked? " and unlock the console":""].")
+ playsound(src, "sparks", 75, 1)
+ obj_flags |= EMAGGED
+ locked = FALSE
+ return TRUE
/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/multitool/I)
var/lathe = linked_lathe && linked_lathe.multitool_act(user, I)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 20e05782ef..b3e114d2ad 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -155,8 +155,10 @@
src.updateUsrDialog()
/obj/machinery/computer/rdservercontrol/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
playsound(src, "sparks", 75, 1)
obj_flags |= EMAGGED
to_chat(user, "You disable the security protocols.")
+ return TRUE
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 9c3a1a4f36..3721e7943e 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -115,7 +115,7 @@
display_name = "Advanced Surgery"
description = "When simple medicine doesn't cut it."
prereq_ids = list("adv_biotech")
- design_ids = list("surgery_lobotomy", "surgery_reconstruction", "organbox")
+ design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -172,7 +172,7 @@
display_name = "Advanced Engineering"
description = "Pushing the boundaries of physics, one chainsaw-fist at a time."
prereq_ids = list("engineering", "emp_basic")
- design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription")
+ design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
export_price = 5000
@@ -447,15 +447,6 @@
"portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
"bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Arcade Games"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine") // Magic money
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 2000
-
/datum/techweb_node/comp_recordkeeping
id = "comp_recordkeeping"
display_name = "Computerized Recordkeeping"
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 0c957919a1..946f0fb9a4 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -63,11 +63,13 @@
to_chat(usr, "Unable to comply.")
/obj/machinery/computer/shuttle/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
req_access = list()
obj_flags |= EMAGGED
to_chat(user, "You fried the consoles ID checking system.")
+ return TRUE
/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 020b4b29ab..119023d465 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -134,6 +134,8 @@
. = TRUE
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user)
+ . = ..()
+
// How did you even get on the shuttle before it go to the station?
if(!IS_DOCKED)
return
@@ -159,6 +161,7 @@
authorized += ID
process()
+ return TRUE
/obj/machinery/computer/emergency_shuttle/Destroy()
// Our fake IDs that the emag generated are just there for colour
@@ -459,10 +462,12 @@
return
/obj/machinery/computer/shuttle/pod/emag_act(mob/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You fry the pod's alert level checking system.")
+ return TRUE
/obj/machinery/computer/shuttle/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
. = ..()
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 06e38bb3eb..39ab087f9c 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -12,7 +12,7 @@
/obj/machinery/computer/shuttle/ferry/emag_act(mob/user)
if(!allow_emag)
to_chat(user, "[src]'s security firewall is far too powerful for you to bypass.")
- return FALSE
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
return ..()
/obj/machinery/computer/shuttle/ferry/attack_ai()
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index d1435a554c..9bea790957 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -48,7 +48,7 @@
return
/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
- return
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/obj/structure/table/abductor/wabbajack
name = "wabbajack altar"
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index be88d0ecdc..b09dee04c7 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -198,9 +198,11 @@
change_meteor_chance(0.5)
/obj/machinery/satellite/meteor_shield/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You access the satellite's debug mode, increasing the chance of meteor strikes.")
if(active)
change_meteor_chance(4)
+ return TRUE
diff --git a/code/modules/surgery/advanced/toxichealing.dm b/code/modules/surgery/advanced/toxichealing.dm
new file mode 100644
index 0000000000..a82287831c
--- /dev/null
+++ b/code/modules/surgery/advanced/toxichealing.dm
@@ -0,0 +1,37 @@
+/datum/surgery/advanced/toxichealing
+ name = "Body Rejuvenation"
+ desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals."
+ steps = list(/datum/surgery_step/incise,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/toxichealing,
+ /datum/surgery_step/close)
+
+ species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ possible_locs = list(BODY_ZONE_CHEST)
+ requires_bodypart_type = 0
+
+/datum/surgery_step/toxichealing
+ name = "rejuvenate body"
+ implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
+ repeatable = TRUE
+ time = 25
+
+/datum/surgery_step/toxichealing/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] starts rejuvenating some of [target]'s flesh back to life.", "You start knitting some of [target]'s flesh back to life.")
+
+/datum/surgery_step/toxichealing/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] fixes some of [target]'s wounds.", "You succeed in fixing some of [target]'s wounds.")
+ target.heal_bodypart_damage(0,0,30) //Heals stam
+ target.adjustToxLoss(-15, 0, TRUE)
+ target.adjustOxyLoss(-20, 0)
+ return TRUE
+
+/datum/surgery_step/toxichealing/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] screws up!", "You screwed up!")
+ target.take_bodypart_damage(25,0)
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/surgery/embalming.dm b/code/modules/surgery/embalming.dm
new file mode 100644
index 0000000000..f74d864245
--- /dev/null
+++ b/code/modules/surgery/embalming.dm
@@ -0,0 +1,31 @@
+/datum/surgery/embalming //Fast and easy way to husk bodys
+ name = "Embalming"
+ desc = "A surgical procedure that prevents a corps from producing."
+ steps = list(/datum/surgery_step/incise,
+ /datum/surgery_step/embalming,
+ /datum/surgery_step/close)
+
+ species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ possible_locs = list(BODY_ZONE_CHEST)
+ requires_bodypart_type = 0
+
+/datum/surgery_step/embalming
+ name = "embalming body"
+ implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
+ implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30)
+ time = 10
+ chems_needed = list("drying_agent", "sterilizine")
+ require_all_chems = FALSE
+
+/datum/surgery_step/embalming/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] starts to embalm [target]'s body.", "You start embalming [target]'s body.")
+
+/datum/surgery_step/embalming/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] embalms [target]'s body.", "You succeed in embalming [target]'s body.")
+ ADD_TRAIT(target, TRAIT_HUSK, MAGIC_TRAIT) //Husk's prevent body smell
+ return FALSE
+
+/datum/surgery_step/embalming/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] screws up!", "You screwed up!")
+ ADD_TRAIT(target, TRAIT_NOCLONE, MAGIC_TRAIT) //That body is ruined, but still gives miasma
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 33e62d21e4..2489aa0705 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -185,11 +185,12 @@
zone = BODY_ZONE_L_ARM
/obj/item/organ/cyberimp/arm/toolset/emag_act()
- if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list))
- to_chat(usr, "You unlock [src]'s integrated knife!")
- items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
- return 1
- return 0
+ . = ..()
+ if(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list)
+ return
+ to_chat(usr, "You unlock [src]'s integrated knife!")
+ items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
+ return TRUE
/obj/item/organ/cyberimp/arm/esword
name = "arm-mounted energy blade"
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 781fdb24f5..09e955d2f9 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1838,7 +1838,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \
Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
item = /obj/item/reagent_containers/hypospray/magillitis
- cost = 15
+ cost = 8
restricted_roles = list("Geneticist", "Chief Medical Officer")
/datum/uplink_item/role_restricted/modified_syringe_gun
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 63ef4fda5a..e504ea84f2 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -63,11 +63,13 @@
DumpMobs(TRUE)
/obj/vehicle/sealed/car/clowncar/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You scramble the clowncar child safety lock and a panel with 6 colorful buttons appears!")
initialize_controller_action_type(/datum/action/vehicle/sealed/RollTheDice, VEHICLE_CONTROL_DRIVE)
+ return TRUE
/obj/vehicle/sealed/car/clowncar/Destroy()
playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100)
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 410952397d..5165343993 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -65,7 +65,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/scan_id = 1
var/obj/item/coin/coin
var/obj/item/stack/spacecash/bill
-
+
var/global/vending_cache = list() //used for storing the icons of items being vended
var/dish_quants = list() //used by the snack machine's custom compartment to count dishes.
@@ -306,10 +306,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
. = ..()
/obj/machinery/vending/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You short out the product lock on [src].")
+ return TRUE
/obj/machinery/vending/_try_interact(mob/user)
if(seconds_electrified && !(stat & NOPOWER))
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index b1b69a8cd2..d230f40af0 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -24,6 +24,7 @@
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
+ /obj/item/seeds/peach = 3,
/obj/item/seeds/peanutseed = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 08ed655297..015890419d 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -320,6 +320,9 @@
/obj/item/clothing/suit/nun = 2,
/obj/item/clothing/head/nun_hood = 2,
/obj/item/clothing/suit/holidaypriest = 2,
+ /obj/item/clothing/suit/pharaoh = 2,
+ /obj/item/clothing/head/nemes = 1,
+ /obj/item/clothing/head/pharaoh = 1,
/obj/item/storage/fancy/candle_box = 3)
refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe
diff --git a/config/config.txt b/config/config.txt
index 3bc9f873a9..a01f5424da 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -4,6 +4,7 @@ $include game_options.txt
$include dbconfig.txt
$include comms.txt
$include antag_rep.txt
+$include donator_groupings.txt
# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt
new file mode 100644
index 0000000000..b26d1efe22
--- /dev/null
+++ b/config/donator_groupings.txt
@@ -0,0 +1,8 @@
+#this is a bad system but I'm lazy so it piggybacks off config loader system.
+#Specify group followed by ckey for each ckey.
+
+#TIER_1_DONATORS test_ckey
+
+#TIER_2_DONATORS test_ckey
+
+#TIER_3_DONATORS test_ckey
diff --git a/html/changelogs/AutoChangeLog-pr-8537.yml b/html/changelogs/AutoChangeLog-pr-8537.yml
new file mode 100644
index 0000000000..a537ba1c3a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8537.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes emags wasting charges on un-emaggable & co stuff."
diff --git a/html/changelogs/AutoChangeLog-pr-8649.yml b/html/changelogs/AutoChangeLog-pr-8649.yml
new file mode 100644
index 0000000000..c8f61cc24e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8649.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "The default amount of z-levels reserved specifically for space ruin generation has been increased from 1 to 2"
diff --git a/html/changelogs/AutoChangeLog-pr-8932.yml b/html/changelogs/AutoChangeLog-pr-8932.yml
new file mode 100644
index 0000000000..d9038ef1a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8932.yml
@@ -0,0 +1,7 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds a gun range to Box Station"
+ - rscadd: "Provides some extra power grid connections"
+ - rscdel: "Sunglasses and Earmuffs removed from the Warden's Office - they can be found at the range instead"
+ - tweak: "Rearranges a few objects within the prison as to accommodate the new gun range"
diff --git a/html/changelogs/AutoChangeLog-pr-9057.yml b/html/changelogs/AutoChangeLog-pr-9057.yml
new file mode 100644
index 0000000000..4df1b23ca7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9057.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - rscadd: "Adds male AI vox."
diff --git a/html/changelogs/AutoChangeLog-pr-9080.yml b/html/changelogs/AutoChangeLog-pr-9080.yml
new file mode 100644
index 0000000000..1ae1e3e2aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9080.yml
@@ -0,0 +1,4 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - rscadd: "Adds 3 new music tracks."
diff --git a/html/changelogs/AutoChangeLog-pr-9089.yml b/html/changelogs/AutoChangeLog-pr-9089.yml
new file mode 100644
index 0000000000..dc1e351f25
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9089.yml
@@ -0,0 +1,6 @@
+author: "original by Tlaltecuhtli, port by sishen1542"
+delete-after: True
+changes:
+ - rscadd: "rcd disk that gives rcd computer frame and machine frame designs"
+ - rscadd: "upgraded rcd in CE lockers"
+ - tweak: "moved deconstruction to the upgrade disk, ashwalker rcd comes upgraded"
diff --git a/html/changelogs/AutoChangeLog-pr-9132.yml b/html/changelogs/AutoChangeLog-pr-9132.yml
new file mode 100644
index 0000000000..f9dee17687
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9132.yml
@@ -0,0 +1,4 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - imageadd: "Updated the sprites of all the regular crates"
diff --git a/html/changelogs/AutoChangeLog-pr-9168.yml b/html/changelogs/AutoChangeLog-pr-9168.yml
new file mode 100644
index 0000000000..2375f6a28a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9168.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Added looc hotkey"
diff --git a/html/changelogs/AutoChangeLog-pr-9169.yml b/html/changelogs/AutoChangeLog-pr-9169.yml
new file mode 100644
index 0000000000..2a9d3ae34b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9169.yml
@@ -0,0 +1,8 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds a mass driver to Delta Station's chapel"
+ - rscadd: "Adds a second means of entry into the chapel"
+ - tweak: "Slightly expands the chapel to make room for the driver, slight adjustment to air systems"
+ - tweak: "Clears a path in the station exterior for the mass driver to work properly"
+ - tweak: "Nearby maintenance loot has been relocated to accommodate the chapel expansion, surrounding area has been \"cleaned up\" somewhat"
diff --git a/html/changelogs/AutoChangeLog-pr-9172.yml b/html/changelogs/AutoChangeLog-pr-9172.yml
new file mode 100644
index 0000000000..751cfa6d26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9172.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Racking shotguns is now more threatening."
diff --git a/html/changelogs/AutoChangeLog-pr-9175.yml b/html/changelogs/AutoChangeLog-pr-9175.yml
new file mode 100644
index 0000000000..d3aa92d42d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9175.yml
@@ -0,0 +1,5 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - rscadd: "Added durathread jumpskirt"
+ - imageadd: "Duraskirt sprites and rolled down jumpsuit sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9177.yml b/html/changelogs/AutoChangeLog-pr-9177.yml
new file mode 100644
index 0000000000..4b8a06c8af
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9177.yml
@@ -0,0 +1,5 @@
+author: "JTGSZ"
+delete-after: True
+changes:
+ - tweak: "Added one more gang boss slot bringing total to 4 from 3"
+ - bugfix: "Fixed Gang Boss being able to be deconverted"
diff --git a/html/changelogs/AutoChangeLog-pr-9178.yml b/html/changelogs/AutoChangeLog-pr-9178.yml
new file mode 100644
index 0000000000..2a6de13f5e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9178.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - bugfix: "the `!tgs poly` command now actually works"
diff --git a/html/changelogs/AutoChangeLog-pr-9180.yml b/html/changelogs/AutoChangeLog-pr-9180.yml
new file mode 100644
index 0000000000..e184ad3205
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9180.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - rscadd: "Poly now has a 0.01% chance per squawk to speak through the TGS relay."
diff --git a/html/changelogs/AutoChangeLog-pr-9183.yml b/html/changelogs/AutoChangeLog-pr-9183.yml
new file mode 100644
index 0000000000..dc5b5a8bdb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9183.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes Blood Cult conversion prompts"
diff --git a/html/changelogs/AutoChangeLog-pr-9184.yml b/html/changelogs/AutoChangeLog-pr-9184.yml
new file mode 100644
index 0000000000..d0b4d1fa7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9184.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscdel: "Removes an obnoxious temporary overlay var."
diff --git a/html/changelogs/AutoChangeLog-pr-9186.yml b/html/changelogs/AutoChangeLog-pr-9186.yml
new file mode 100644
index 0000000000..f0497ee7c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9186.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "added pharaoh gear to chaplain vendor"
+ - spellcheck: "fixed typos in pharaoh items"
diff --git a/html/changelogs/AutoChangeLog-pr-9194.yml b/html/changelogs/AutoChangeLog-pr-9194.yml
new file mode 100644
index 0000000000..24299209ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9194.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - tweak: "added obj/item/key to wallet whitelist"
diff --git a/html/changelogs/AutoChangeLog-pr-9200.yml b/html/changelogs/AutoChangeLog-pr-9200.yml
new file mode 100644
index 0000000000..d1be09ee4a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9200.yml
@@ -0,0 +1,4 @@
+author: "Owai-Seek"
+delete-after: True
+changes:
+ - bugfix: "fixed them strawberries"
diff --git a/html/changelogs/AutoChangeLog-pr-9204.yml b/html/changelogs/AutoChangeLog-pr-9204.yml
new file mode 100644
index 0000000000..3b70354fd9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9204.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "/cursed from a item path"
diff --git a/html/changelogs/AutoChangeLog-pr-9208.yml b/html/changelogs/AutoChangeLog-pr-9208.yml
new file mode 100644
index 0000000000..1645164266
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9208.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "colorable socks can be colored again."
diff --git a/html/changelogs/AutoChangeLog-pr-9209.yml b/html/changelogs/AutoChangeLog-pr-9209.yml
new file mode 100644
index 0000000000..5ed81d6856
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9209.yml
@@ -0,0 +1,4 @@
+author: "original by redmoogle, port by sishen1542"
+delete-after: True
+changes:
+ - rscadd: "Added support for 3 new gasses; Tritium, Pluoxium, and BZ"
diff --git a/html/changelogs/AutoChangeLog-pr-9210.yml b/html/changelogs/AutoChangeLog-pr-9210.yml
new file mode 100644
index 0000000000..b02811e7a8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9210.yml
@@ -0,0 +1,7 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - tweak: "CentCom has noticed the lack of coffins in Delta Station's chapel and provided some, but in exchange for reducing the chapel morgue's capacity."
+ - tweak: "Fixed a maintenance door the chaplain should have been able to open."
+ - bugfix: "Fixes space areas outside the driver
+removal: CentCom Defense Analysts have ordered the maintenance hatch to the Mass Driver room be removed citing \"security concerns\"."
diff --git a/html/changelogs/AutoChangeLog-pr-9212.yml b/html/changelogs/AutoChangeLog-pr-9212.yml
new file mode 100644
index 0000000000..48e8b8b4d3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9212.yml
@@ -0,0 +1,5 @@
+author: "dapnee"
+delete-after: True
+changes:
+ - rscadd: "Plasmaglass tables, spears, tiny plasmaglass shards"
+ - bugfix: "Plasmaglass structures now drop plasmaglass shards instead of nothing"
diff --git a/html/changelogs/AutoChangeLog-pr-9216.yml b/html/changelogs/AutoChangeLog-pr-9216.yml
new file mode 100644
index 0000000000..0be9314dbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9216.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "oops not being blacklisted"
diff --git a/html/changelogs/AutoChangeLog-pr-9219.yml b/html/changelogs/AutoChangeLog-pr-9219.yml
new file mode 100644
index 0000000000..138991e507
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9219.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "ports a fix"
diff --git a/html/changelogs/AutoChangeLog-pr-9221.yml b/html/changelogs/AutoChangeLog-pr-9221.yml
new file mode 100644
index 0000000000..0256c4a7c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9221.yml
@@ -0,0 +1,9 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "holy lasrifle, hypertool, divine lightblade, and blessed baseball bat. Four new holy weapons!"
+ - balance: "stamina and force tweaks for most holy weapons."
+ - tweak: "prayer beads no longer deconvert after a 10 second timer, now just inject holy water for delayed effect"
+ - tweak: "cultist runes are now destroyed with a bible or a null rod"
+ - tweak: "bo-staff now functions as a nerfed sleepy carp staff"
+ - bugfix: "fixed kevinz code to add in non-null rod child items as holy weapons"
diff --git a/html/changelogs/AutoChangeLog-pr-9227.yml b/html/changelogs/AutoChangeLog-pr-9227.yml
new file mode 100644
index 0000000000..9f6bfabdc4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9227.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Missing sprites with bad ones"
diff --git a/html/changelogs/AutoChangeLog-pr-9229.yml b/html/changelogs/AutoChangeLog-pr-9229.yml
new file mode 100644
index 0000000000..5c617f6ab0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9229.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "emag charge amount"
diff --git a/html/changelogs/AutoChangeLog-pr-9235.yml b/html/changelogs/AutoChangeLog-pr-9235.yml
new file mode 100644
index 0000000000..112f34a7f0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9235.yml
@@ -0,0 +1,5 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - rscdel: "Removes autoscan"
+ - balance: "Scanning people now requires someone to operate the cloning computer regardless of part level."
diff --git a/html/changelogs/AutoChangeLog-pr-9238.yml b/html/changelogs/AutoChangeLog-pr-9238.yml
new file mode 100644
index 0000000000..b2eb8db233
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9238.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Surgerys and spays in bags"
diff --git a/html/changelogs/AutoChangeLog-pr-9239.yml b/html/changelogs/AutoChangeLog-pr-9239.yml
new file mode 100644
index 0000000000..781dcd82b6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9239.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "earthbloods stam regen"
diff --git a/html/changelogs/AutoChangeLog-pr-9242.yml b/html/changelogs/AutoChangeLog-pr-9242.yml
new file mode 100644
index 0000000000..1e47385e67
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9242.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - tweak: "blood cult ritual daggers fit in jack/combat boots"
diff --git a/html/changelogs/AutoChangeLog-pr-9248.yml b/html/changelogs/AutoChangeLog-pr-9248.yml
new file mode 100644
index 0000000000..3e6eff727c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9248.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - imageadd: "Red to Blue/Black crosses as questioned by Bhijn"
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 52822ed5be..b22f50623c 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 9de3ffae8c..09bfd9e0a2 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
index 5529edfa51..5e04b3daa3 100644
Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
index e902dcdc3b..4b304cfc3e 100644
Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi
index ecc92c7d20..8b96b84236 100644
Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi
index 92e5b91323..202bab9e21 100644
Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index c53fa85262..896a87ff3a 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 7ba0ec9604..740ad43d42 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 43d35d5df5..f783331c19 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a8ec22c950..e151808cb1 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 88e68eea2d..dc5fa1399d 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 25c9b0eb06..40844c9a29 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 4165719a3c..3ab7f4b510 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 47d05e3470..0a4152af64 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 0ac8ccf566..0831d47577 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index 9b0bc9816b..029d49e196 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 5ced9cad20..fe126cadd8 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 55a7f60a5c..a78ce898e0 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 8788567b36..6336669501 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/machines/harvester.dmi b/icons/obj/machines/harvester.dmi
index d6d9b01fc6..ce272c5774 100644
Binary files a/icons/obj/machines/harvester.dmi and b/icons/obj/machines/harvester.dmi differ
diff --git a/icons/obj/machines/sleeper.dmi b/icons/obj/machines/sleeper.dmi
index b027d0d7b1..ff9e2b197a 100644
Binary files a/icons/obj/machines/sleeper.dmi and b/icons/obj/machines/sleeper.dmi differ
diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi
index a575ab292f..e7875efa26 100644
Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ
diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi
new file mode 100644
index 0000000000..808e79aa43
Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index e5d61fbfe0..fae8134791 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/modular_citadel/code/controllers/subsystem/job.dm b/modular_citadel/code/controllers/subsystem/job.dm
index c433042ae6..46aef6f529 100644
--- a/modular_citadel/code/controllers/subsystem/job.dm
+++ b/modular_citadel/code/controllers/subsystem/job.dm
@@ -13,7 +13,7 @@
var/permitted = TRUE
if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles))
permitted = FALSE
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(the_mob.client.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
permitted = FALSE
diff --git a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
index 334d6bf423..1653b8d314 100644
--- a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
@@ -64,7 +64,7 @@
name = "Cyber"
color = "#00f904" //Cyber and waffle shared colors, I made these guys green and made weed darker green.
inner_outfits = list(/obj/item/clothing/under/color/lightbrown)
- outer_outfits = list(/obj/item/clothing/suit/nemes)
+ outer_outfits = list(/obj/item/clothing/suit/pharaoh)
/datum/team/gang/donk
name = "Donk"
@@ -136,4 +136,4 @@
name = "Weed"
color = "#6cd648"
inner_outfits = list(/obj/item/clothing/under/color/darkgreen)
- outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
\ No newline at end of file
+ outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
diff --git a/modular_citadel/code/game/machinery/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
index ac3621b58a..c45eb48caa 100644
--- a/modular_citadel/code/game/machinery/plasmacases.dm
+++ b/modular_citadel/code/game/machinery/plasmacases.dm
@@ -19,5 +19,6 @@
return MouseDrop(user)
/obj/structure/guncase/plasma/emag_act()
- to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
- return
\ No newline at end of file
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(!.)
+ to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/ids.dm b/modular_citadel/code/game/objects/ids.dm
index 89a3c0f0c2..8ef724581e 100644
--- a/modular_citadel/code/game/objects/ids.dm
+++ b/modular_citadel/code/game/objects/ids.dm
@@ -49,7 +49,7 @@
/obj/item/emagrecharge
name = "electromagnet charging device"
- desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices."
+ desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell."
icon = 'icons/obj/module.dmi'
icon_state = "cell_mini"
item_flags = NOBLUDGEON
@@ -63,7 +63,7 @@
to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent.")
/obj/item/card/emag
- var/uses = 10
+ var/uses = 15
/obj/item/card/emag/examine(mob/user)
. = ..()
diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm
index 3ecc6cc31b..06cdb0f5fd 100644
--- a/modular_citadel/code/game/objects/items/holy_weapons.dm
+++ b/modular_citadel/code/game/objects/items/holy_weapons.dm
@@ -30,24 +30,16 @@
"You kneel[M == user ? null : " next to [M]"] and begin a prayer to [deity_name].")
praying = TRUE
- if(do_after(user, 100, target = M))
+ if(do_after(user, 20, target = M))
if(istype(M, /mob/living/carbon/human)) // This probably should not work on catpeople. They're unholy abominations.
var/mob/living/carbon/human/target = M
-
- if(iscultist(M) || is_servant_of_ratvar(M)) //ripped from holywater code.
- if(iscultist(M))
- SSticker.mode.remove_cultist(M.mind, FALSE, TRUE)
- else if(is_servant_of_ratvar(M))
- remove_servant_of_ratvar(M)
-
+ M.reagents.add_reagent("holywater", 5)
to_chat(target, "[user]'s prayer to [deity_name] has eased your pain!")
target.adjustToxLoss(-5, TRUE, TRUE)
target.adjustOxyLoss(-5)
target.adjustBruteLoss(-5)
target.adjustFireLoss(-5)
-
praying = FALSE
-
else
to_chat(user, "Your prayer to [deity_name] was interrupted.")
praying = FALSE
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index 68ab229f0a..4cf1d326a2 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -130,15 +130,6 @@
else
return ..()
-/obj/item/melee/transforming/energy/sword/cx/chaplain
- name = "divine lightblade"
- force_on = 20 //haha i'll regret this
- block_chance = 50
-
-/obj/item/melee/transforming/energy/sword/cx/chaplain/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE)
-
//OBLIGATORY TOY MEMES /////////////////////////////////////
/obj/item/toy/sword/cx
@@ -271,6 +262,21 @@
spinnable = FALSE
total_mass_on = 4
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain
+ name = "\improper divine lightblade"
+ desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
+ force = 5
+ force_unwielded = 5
+ force_wielded = 20
+ block_chance = 50
+ armour_penetration = 0
+ var/chaplain_spawnable = TRUE
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+
/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params)
return TRUE
@@ -380,4 +386,4 @@
/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
desc = "A custom-built toy with fancy rainbow lights built-in."
- hacked = TRUE
\ No newline at end of file
+ hacked = TRUE
diff --git a/modular_citadel/code/game/objects/items/melee/misc.dm b/modular_citadel/code/game/objects/items/melee/misc.dm
index 6a53adcc1f..48c221696e 100644
--- a/modular_citadel/code/game/objects/items/melee/misc.dm
+++ b/modular_citadel/code/game/objects/items/melee/misc.dm
@@ -4,7 +4,7 @@
var/hardstun_ds = 1
var/softstun_ds = 0
var/stam_dmg = 30
- cooldown = 20
+ cooldown = 0
total_mass = 3.75
/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user)
diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm
index 39f4158646..501e0fa25a 100644
--- a/modular_citadel/code/modules/admin/chat_commands.dm
+++ b/modular_citadel/code/modules/admin/chat_commands.dm
@@ -27,19 +27,13 @@
var/list/speech_buffer
/datum/tgs_chat_command/poly/Run()
- GenerateSayList() //Has a check in here, but we're gunna sanity it after
- if(!speech_buffer)
- return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
-
-
-/datum/tgs_chat_command/poly/proc/GenerateSayList()
LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point
if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time.
return "[pick(speech_buffer)]"
else
var/json_file = file("data/npc_saves/Poly.json")
if(!fexists(json_file))
- return
+ return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
var/list/json = json_decode(file2text(json_file))
speech_buffer = json["phrases"]
- return "[pick(speech_buffer)]"
\ No newline at end of file
+ return "[pick(speech_buffer)]"
diff --git a/modular_citadel/code/modules/cargo/console.dm b/modular_citadel/code/modules/cargo/console.dm
index 490f72d1d1..f54a6c577a 100644
--- a/modular_citadel/code/modules/cargo/console.dm
+++ b/modular_citadel/code/modules/cargo/console.dm
@@ -1,13 +1,9 @@
/obj/machinery/computer/cargo
req_access = list(ACCESS_CARGO)
-
+
/obj/machinery/computer/cargo/request
req_access = list()
-/obj/machinery/computer/cargo/emag_act(mob/user)
- req_access = list()
- . = ..()
-
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
if(!allowed(usr))
to_chat(usr, "Access denied.")
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
similarity index 79%
rename from modular_citadel/code/modules/client/loadout/loadout.dm
rename to modular_citadel/code/modules/client/loadout/_loadout.dm
index 2e11519d0b..d48da1b863 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -50,12 +50,32 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/path //item-to-spawn path
var/cost = 1 //normally, each loadout costs a single point.
var/geargroupID //defines the ID that the gear inherits from the config
+
+ //NEW DONATOR SYTSEM STUFF
+ var/donoritem //autoset on new if null
+ var/donator_group_id //New donator group ID system.
+ //END
+
var/list/restricted_roles
+
+ //Old donator system/snowflake ckey whitelist, used for single ckeys/exceptions
var/list/ckeywhitelist
+ //END
+
var/restricted_desc
/datum/gear/New()
- ..()
+ if(isnull(donoritem))
+ if(donator_group_id || ckeywhitelist)
+ donoritem = TRUE
if(!description && path)
var/obj/O = path
description = initial(O.desc)
+
+//a comprehensive donator check proc is intentionally not implemented due to the fact that we (((might))) have job-whitelists for donator items in the future and I like to stay on the safe side.
+
+//ckey only check
+/datum/gear/proc/donator_ckey_check(key)
+ if(ckeywhitelist && ckeywhitelist.Find(key))
+ return TRUE
+ return IS_CKEY_DONATOR_GROUP(key, donator_group_id)
diff --git a/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
new file mode 100644
index 0000000000..b1e112aac5
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
@@ -0,0 +1,633 @@
+// List is required to compile the resources into the game when it loads.
+// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
+#ifdef AI_VOX
+
+GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'modular_citadel/sound/vox/_comma.ogg',
+"." = 'modular_citadel/sound/vox/_period.ogg',
+"a" = 'modular_citadel/sound/vox/a.ogg',
+"accelerating" = 'modular_citadel/sound/vox/accelerating.ogg',
+"accelerator" = 'modular_citadel/sound/vox/accelerator.ogg',
+"accepted" = 'modular_citadel/sound/vox/accepted.ogg',
+"access" = 'modular_citadel/sound/vox/access.ogg',
+"acknowledge" = 'modular_citadel/sound/vox/acknowledge.ogg',
+"acknowledged" = 'modular_citadel/sound/vox/acknowledged.ogg',
+"acquired" = 'modular_citadel/sound/vox/acquired.ogg',
+"acquisition" = 'modular_citadel/sound/vox/acquisition.ogg',
+"across" = 'modular_citadel/sound/vox/across.ogg',
+"activate" = 'modular_citadel/sound/vox/activate.ogg',
+"activated" = 'modular_citadel/sound/vox/activated.ogg',
+"activity" = 'modular_citadel/sound/vox/activity.ogg',
+"adios" = 'modular_citadel/sound/vox/adios.ogg',
+"administration" = 'modular_citadel/sound/vox/administration.ogg',
+"advanced" = 'modular_citadel/sound/vox/advanced.ogg',
+"after" = 'modular_citadel/sound/vox/after.ogg',
+"agent" = 'modular_citadel/sound/vox/agent.ogg',
+"alarm" = 'modular_citadel/sound/vox/alarm.ogg',
+"alert" = 'modular_citadel/sound/vox/alert.ogg',
+"alien" = 'modular_citadel/sound/vox/alien.ogg',
+"aligned" = 'modular_citadel/sound/vox/aligned.ogg',
+"all" = 'modular_citadel/sound/vox/all.ogg',
+"alpha" = 'modular_citadel/sound/vox/alpha.ogg',
+"am" = 'modular_citadel/sound/vox/am.ogg',
+"amigo" = 'modular_citadel/sound/vox/amigo.ogg',
+"ammunition" = 'modular_citadel/sound/vox/ammunition.ogg',
+"an" = 'modular_citadel/sound/vox/an.ogg',
+"and" = 'modular_citadel/sound/vox/and.ogg',
+"announcement" = 'modular_citadel/sound/vox/announcement.ogg',
+"anomalous" = 'modular_citadel/sound/vox/anomalous.ogg',
+"antenna" = 'modular_citadel/sound/vox/antenna.ogg',
+"any" = 'modular_citadel/sound/vox/any.ogg',
+"apprehend" = 'modular_citadel/sound/vox/apprehend.ogg',
+"approach" = 'modular_citadel/sound/vox/approach.ogg',
+"are" = 'modular_citadel/sound/vox/are.ogg',
+"area" = 'modular_citadel/sound/vox/area.ogg',
+"arm" = 'modular_citadel/sound/vox/arm.ogg',
+"armed" = 'modular_citadel/sound/vox/armed.ogg',
+"armor" = 'modular_citadel/sound/vox/armor.ogg',
+"armory" = 'modular_citadel/sound/vox/armory.ogg',
+"arrest" = 'modular_citadel/sound/vox/arrest.ogg',
+"ass" = 'modular_citadel/sound/vox/ass.ogg',
+"at" = 'modular_citadel/sound/vox/at.ogg',
+"atomic" = 'modular_citadel/sound/vox/atomic.ogg',
+"attention" = 'modular_citadel/sound/vox/attention.ogg',
+"authorize" = 'modular_citadel/sound/vox/authorize.ogg',
+"authorized" = 'modular_citadel/sound/vox/authorized.ogg',
+"automatic" = 'modular_citadel/sound/vox/automatic.ogg',
+"away" = 'modular_citadel/sound/vox/away.ogg',
+"b" = 'modular_citadel/sound/vox/b.ogg',
+"back" = 'modular_citadel/sound/vox/back.ogg',
+"backman" = 'modular_citadel/sound/vox/backman.ogg',
+"bad" = 'modular_citadel/sound/vox/bad.ogg',
+"bag" = 'modular_citadel/sound/vox/bag.ogg',
+"bailey" = 'modular_citadel/sound/vox/bailey.ogg',
+"barracks" = 'modular_citadel/sound/vox/barracks.ogg',
+"base" = 'modular_citadel/sound/vox/base.ogg',
+"bay" = 'modular_citadel/sound/vox/bay.ogg',
+"be" = 'modular_citadel/sound/vox/be.ogg',
+"been" = 'modular_citadel/sound/vox/been.ogg',
+"before" = 'modular_citadel/sound/vox/before.ogg',
+"beyond" = 'modular_citadel/sound/vox/beyond.ogg',
+"biohazard" = 'modular_citadel/sound/vox/biohazard.ogg',
+"biological" = 'modular_citadel/sound/vox/biological.ogg',
+"birdwell" = 'modular_citadel/sound/vox/birdwell.ogg',
+"bizwarn" = 'modular_citadel/sound/vox/bizwarn.ogg',
+"black" = 'modular_citadel/sound/vox/black.ogg',
+"blast" = 'modular_citadel/sound/vox/blast.ogg',
+"blocked" = 'modular_citadel/sound/vox/blocked.ogg',
+"bloop" = 'modular_citadel/sound/vox/bloop.ogg',
+"blue" = 'modular_citadel/sound/vox/blue.ogg',
+"bottom" = 'modular_citadel/sound/vox/bottom.ogg',
+"bravo" = 'modular_citadel/sound/vox/bravo.ogg',
+"breach" = 'modular_citadel/sound/vox/breach.ogg',
+"breached" = 'modular_citadel/sound/vox/breached.ogg',
+"break" = 'modular_citadel/sound/vox/break.ogg',
+"bridge" = 'modular_citadel/sound/vox/bridge.ogg',
+"bust" = 'modular_citadel/sound/vox/bust.ogg',
+"but" = 'modular_citadel/sound/vox/but.ogg',
+"button" = 'modular_citadel/sound/vox/button.ogg',
+"buzwarn" = 'modular_citadel/sound/vox/buzwarn.ogg',
+"bypass" = 'modular_citadel/sound/vox/bypass.ogg',
+"c" = 'modular_citadel/sound/vox/c.ogg',
+"cable" = 'modular_citadel/sound/vox/cable.ogg',
+"call" = 'modular_citadel/sound/vox/call.ogg',
+"called" = 'modular_citadel/sound/vox/called.ogg',
+"canal" = 'modular_citadel/sound/vox/canal.ogg',
+"cap" = 'modular_citadel/sound/vox/cap.ogg',
+"captain" = 'modular_citadel/sound/vox/captain.ogg',
+"capture" = 'modular_citadel/sound/vox/capture.ogg',
+"captured" = 'modular_citadel/sound/vox/captured.ogg',
+"ceiling" = 'modular_citadel/sound/vox/ceiling.ogg',
+"celsius" = 'modular_citadel/sound/vox/celsius.ogg',
+"center" = 'modular_citadel/sound/vox/center.ogg',
+"centi" = 'modular_citadel/sound/vox/centi.ogg',
+"central" = 'modular_citadel/sound/vox/central.ogg',
+"chamber" = 'modular_citadel/sound/vox/chamber.ogg',
+"charlie" = 'modular_citadel/sound/vox/charlie.ogg',
+"check" = 'modular_citadel/sound/vox/check.ogg',
+"checkpoint" = 'modular_citadel/sound/vox/checkpoint.ogg',
+"chemical" = 'modular_citadel/sound/vox/chemical.ogg',
+"cleanup" = 'modular_citadel/sound/vox/cleanup.ogg',
+"clear" = 'modular_citadel/sound/vox/clear.ogg',
+"clearance" = 'modular_citadel/sound/vox/clearance.ogg',
+"close" = 'modular_citadel/sound/vox/close.ogg',
+"clown" = 'modular_citadel/sound/vox/clown.ogg',
+"code" = 'modular_citadel/sound/vox/code.ogg',
+"coded" = 'modular_citadel/sound/vox/coded.ogg',
+"collider" = 'modular_citadel/sound/vox/collider.ogg',
+"command" = 'modular_citadel/sound/vox/command.ogg',
+"communication" = 'modular_citadel/sound/vox/communication.ogg',
+"complex" = 'modular_citadel/sound/vox/complex.ogg',
+"computer" = 'modular_citadel/sound/vox/computer.ogg',
+"condition" = 'modular_citadel/sound/vox/condition.ogg',
+"containment" = 'modular_citadel/sound/vox/containment.ogg',
+"contamination" = 'modular_citadel/sound/vox/contamination.ogg',
+"control" = 'modular_citadel/sound/vox/control.ogg',
+"coolant" = 'modular_citadel/sound/vox/coolant.ogg',
+"coomer" = 'modular_citadel/sound/vox/coomer.ogg',
+"core" = 'modular_citadel/sound/vox/core.ogg',
+"correct" = 'modular_citadel/sound/vox/correct.ogg',
+"corridor" = 'modular_citadel/sound/vox/corridor.ogg',
+"crew" = 'modular_citadel/sound/vox/crew.ogg',
+"cross" = 'modular_citadel/sound/vox/cross.ogg',
+"cryogenic" = 'modular_citadel/sound/vox/cryogenic.ogg',
+"d" = 'modular_citadel/sound/vox/d.ogg',
+"dadeda" = 'modular_citadel/sound/vox/dadeda.ogg',
+"damage" = 'modular_citadel/sound/vox/damage.ogg',
+"damaged" = 'modular_citadel/sound/vox/damaged.ogg',
+"danger" = 'modular_citadel/sound/vox/danger.ogg',
+"day" = 'modular_citadel/sound/vox/day.ogg',
+"deactivated" = 'modular_citadel/sound/vox/deactivated.ogg',
+"decompression" = 'modular_citadel/sound/vox/decompression.ogg',
+"decontamination" = 'modular_citadel/sound/vox/decontamination.ogg',
+"deeoo" = 'modular_citadel/sound/vox/deeoo.ogg',
+"defense" = 'modular_citadel/sound/vox/defense.ogg',
+"degrees" = 'modular_citadel/sound/vox/degrees.ogg',
+"delta" = 'modular_citadel/sound/vox/delta.ogg',
+"denied" = 'modular_citadel/sound/vox/denied.ogg',
+"deploy" = 'modular_citadel/sound/vox/deploy.ogg',
+"deployed" = 'modular_citadel/sound/vox/deployed.ogg',
+"destroy" = 'modular_citadel/sound/vox/destroy.ogg',
+"destroyed" = 'modular_citadel/sound/vox/destroyed.ogg',
+"detain" = 'modular_citadel/sound/vox/detain.ogg',
+"detected" = 'modular_citadel/sound/vox/detected.ogg',
+"detonation" = 'modular_citadel/sound/vox/detonation.ogg',
+"device" = 'modular_citadel/sound/vox/device.ogg',
+"did" = 'modular_citadel/sound/vox/did.ogg',
+"die" = 'modular_citadel/sound/vox/die.ogg',
+"dimensional" = 'modular_citadel/sound/vox/dimensional.ogg',
+"dirt" = 'modular_citadel/sound/vox/dirt.ogg',
+"disengaged" = 'modular_citadel/sound/vox/disengaged.ogg',
+"dish" = 'modular_citadel/sound/vox/dish.ogg',
+"disposal" = 'modular_citadel/sound/vox/disposal.ogg',
+"distance" = 'modular_citadel/sound/vox/distance.ogg',
+"distortion" = 'modular_citadel/sound/vox/distortion.ogg',
+"do" = 'modular_citadel/sound/vox/do.ogg',
+"doctor" = 'modular_citadel/sound/vox/doctor.ogg',
+"doop" = 'modular_citadel/sound/vox/doop.ogg',
+"door" = 'modular_citadel/sound/vox/door.ogg',
+"down" = 'modular_citadel/sound/vox/down.ogg',
+"dual" = 'modular_citadel/sound/vox/dual.ogg',
+"duct" = 'modular_citadel/sound/vox/duct.ogg',
+"e" = 'modular_citadel/sound/vox/e.ogg',
+"east" = 'modular_citadel/sound/vox/east.ogg',
+"echo" = 'modular_citadel/sound/vox/echo.ogg',
+"ed" = 'modular_citadel/sound/vox/ed.ogg',
+"effect" = 'modular_citadel/sound/vox/effect.ogg',
+"egress" = 'modular_citadel/sound/vox/egress.ogg',
+"eight" = 'modular_citadel/sound/vox/eight.ogg',
+"eighteen" = 'modular_citadel/sound/vox/eighteen.ogg',
+"eighty" = 'modular_citadel/sound/vox/eighty.ogg',
+"electric" = 'modular_citadel/sound/vox/electric.ogg',
+"electromagnetic" = 'modular_citadel/sound/vox/electromagnetic.ogg',
+"elevator" = 'modular_citadel/sound/vox/elevator.ogg',
+"eleven" = 'modular_citadel/sound/vox/eleven.ogg',
+"eliminate" = 'modular_citadel/sound/vox/eliminate.ogg',
+"emergency" = 'modular_citadel/sound/vox/emergency.ogg',
+"enemy" = 'modular_citadel/sound/vox/enemy.ogg',
+"energy" = 'modular_citadel/sound/vox/energy.ogg',
+"engage" = 'modular_citadel/sound/vox/engage.ogg',
+"engaged" = 'modular_citadel/sound/vox/engaged.ogg',
+"engine" = 'modular_citadel/sound/vox/engine.ogg',
+"enter" = 'modular_citadel/sound/vox/enter.ogg',
+"entry" = 'modular_citadel/sound/vox/entry.ogg',
+"environment" = 'modular_citadel/sound/vox/environment.ogg',
+"error" = 'modular_citadel/sound/vox/error.ogg',
+"escape" = 'modular_citadel/sound/vox/escape.ogg',
+"evacuate" = 'modular_citadel/sound/vox/evacuate.ogg',
+"exchange" = 'modular_citadel/sound/vox/exchange.ogg',
+"exit" = 'modular_citadel/sound/vox/exit.ogg',
+"expect" = 'modular_citadel/sound/vox/expect.ogg',
+"experiment" = 'modular_citadel/sound/vox/experiment.ogg',
+"experimental" = 'modular_citadel/sound/vox/experimental.ogg',
+"explode" = 'modular_citadel/sound/vox/explode.ogg',
+"explosion" = 'modular_citadel/sound/vox/explosion.ogg',
+"exposure" = 'modular_citadel/sound/vox/exposure.ogg',
+"exterminate" = 'modular_citadel/sound/vox/exterminate.ogg',
+"extinguish" = 'modular_citadel/sound/vox/extinguish.ogg',
+"extinguisher" = 'modular_citadel/sound/vox/extinguisher.ogg',
+"extreme" = 'modular_citadel/sound/vox/extreme.ogg',
+"f" = 'modular_citadel/sound/vox/f.ogg',
+"face" = 'modular_citadel/sound/vox/face.ogg',
+"facility" = 'modular_citadel/sound/vox/facility.ogg',
+"fahrenheit" = 'modular_citadel/sound/vox/fahrenheit.ogg',
+"failed" = 'modular_citadel/sound/vox/failed.ogg',
+"failure" = 'modular_citadel/sound/vox/failure.ogg',
+"farthest" = 'modular_citadel/sound/vox/farthest.ogg',
+"fast" = 'modular_citadel/sound/vox/fast.ogg',
+"feet" = 'modular_citadel/sound/vox/feet.ogg',
+"field" = 'modular_citadel/sound/vox/field.ogg',
+"fifteen" = 'modular_citadel/sound/vox/fifteen.ogg',
+"fifth" = 'modular_citadel/sound/vox/fifth.ogg',
+"fifty" = 'modular_citadel/sound/vox/fifty.ogg',
+"final" = 'modular_citadel/sound/vox/final.ogg',
+"fine" = 'modular_citadel/sound/vox/fine.ogg',
+"fire" = 'modular_citadel/sound/vox/fire.ogg',
+"first" = 'modular_citadel/sound/vox/first.ogg',
+"five" = 'modular_citadel/sound/vox/five.ogg',
+"flag" = 'modular_citadel/sound/vox/flag.ogg',
+"flooding" = 'modular_citadel/sound/vox/flooding.ogg',
+"floor" = 'modular_citadel/sound/vox/floor.ogg',
+"fool" = 'modular_citadel/sound/vox/fool.ogg',
+"for" = 'modular_citadel/sound/vox/for.ogg',
+"forbidden" = 'modular_citadel/sound/vox/forbidden.ogg',
+"force" = 'modular_citadel/sound/vox/force.ogg',
+"forms" = 'modular_citadel/sound/vox/forms.ogg',
+"found" = 'modular_citadel/sound/vox/found.ogg',
+"four" = 'modular_citadel/sound/vox/four.ogg',
+"fourteen" = 'modular_citadel/sound/vox/fourteen.ogg',
+"fourth" = 'modular_citadel/sound/vox/fourth.ogg',
+"fourty" = 'modular_citadel/sound/vox/fourty.ogg',
+"foxtrot" = 'modular_citadel/sound/vox/foxtrot.ogg',
+"freeman" = 'modular_citadel/sound/vox/freeman.ogg',
+"freezer" = 'modular_citadel/sound/vox/freezer.ogg',
+"from" = 'modular_citadel/sound/vox/from.ogg',
+"front" = 'modular_citadel/sound/vox/front.ogg',
+"fuel" = 'modular_citadel/sound/vox/fuel.ogg',
+"g" = 'modular_citadel/sound/vox/g.ogg',
+"gay" = 'modular_citadel/sound/vox/gay.ogg',
+"get" = 'modular_citadel/sound/vox/get.ogg',
+"go" = 'modular_citadel/sound/vox/go.ogg',
+"going" = 'modular_citadel/sound/vox/going.ogg',
+"good" = 'modular_citadel/sound/vox/good.ogg',
+"goodbye" = 'modular_citadel/sound/vox/goodbye.ogg',
+"gordon" = 'modular_citadel/sound/vox/gordon.ogg',
+"got" = 'modular_citadel/sound/vox/got.ogg',
+"government" = 'modular_citadel/sound/vox/government.ogg',
+"granted" = 'modular_citadel/sound/vox/granted.ogg',
+"great" = 'modular_citadel/sound/vox/great.ogg',
+"green" = 'modular_citadel/sound/vox/green.ogg',
+"grenade" = 'modular_citadel/sound/vox/grenade.ogg',
+"guard" = 'modular_citadel/sound/vox/guard.ogg',
+"gulf" = 'modular_citadel/sound/vox/gulf.ogg',
+"gun" = 'modular_citadel/sound/vox/gun.ogg',
+"guthrie" = 'modular_citadel/sound/vox/guthrie.ogg',
+"handling" = 'modular_citadel/sound/vox/handling.ogg',
+"hangar" = 'modular_citadel/sound/vox/hangar.ogg',
+"has" = 'modular_citadel/sound/vox/has.ogg',
+"have" = 'modular_citadel/sound/vox/have.ogg',
+"hazard" = 'modular_citadel/sound/vox/hazard.ogg',
+"head" = 'modular_citadel/sound/vox/head.ogg',
+"health" = 'modular_citadel/sound/vox/health.ogg',
+"heat" = 'modular_citadel/sound/vox/heat.ogg',
+"helicopter" = 'modular_citadel/sound/vox/helicopter.ogg',
+"helium" = 'modular_citadel/sound/vox/helium.ogg',
+"hello" = 'modular_citadel/sound/vox/hello.ogg',
+"help" = 'modular_citadel/sound/vox/help.ogg',
+"here" = 'modular_citadel/sound/vox/here.ogg',
+"hide" = 'modular_citadel/sound/vox/hide.ogg',
+"high" = 'modular_citadel/sound/vox/high.ogg',
+"highest" = 'modular_citadel/sound/vox/highest.ogg',
+"hit" = 'modular_citadel/sound/vox/hit.ogg',
+"holds" = 'modular_citadel/sound/vox/holds.ogg',
+"hole" = 'modular_citadel/sound/vox/hole.ogg',
+"hostile" = 'modular_citadel/sound/vox/hostile.ogg',
+"hot" = 'modular_citadel/sound/vox/hot.ogg',
+"hotel" = 'modular_citadel/sound/vox/hotel.ogg',
+"hour" = 'modular_citadel/sound/vox/hour.ogg',
+"hours" = 'modular_citadel/sound/vox/hours.ogg',
+"hundred" = 'modular_citadel/sound/vox/hundred.ogg',
+"hydro" = 'modular_citadel/sound/vox/hydro.ogg',
+"i" = 'modular_citadel/sound/vox/i.ogg',
+"idiot" = 'modular_citadel/sound/vox/idiot.ogg',
+"illegal" = 'modular_citadel/sound/vox/illegal.ogg',
+"immediate" = 'modular_citadel/sound/vox/immediate.ogg',
+"immediately" = 'modular_citadel/sound/vox/immediately.ogg',
+"in" = 'modular_citadel/sound/vox/in.ogg',
+"inches" = 'modular_citadel/sound/vox/inches.ogg',
+"india" = 'modular_citadel/sound/vox/india.ogg',
+"ing" = 'modular_citadel/sound/vox/ing.ogg',
+"inoperative" = 'modular_citadel/sound/vox/inoperative.ogg',
+"inside" = 'modular_citadel/sound/vox/inside.ogg',
+"inspection" = 'modular_citadel/sound/vox/inspection.ogg',
+"inspector" = 'modular_citadel/sound/vox/inspector.ogg',
+"interchange" = 'modular_citadel/sound/vox/interchange.ogg',
+"intruder" = 'modular_citadel/sound/vox/intruder.ogg',
+"invallid" = 'modular_citadel/sound/vox/invallid.ogg',
+"invasion" = 'modular_citadel/sound/vox/invasion.ogg',
+"is" = 'modular_citadel/sound/vox/is.ogg',
+"it" = 'modular_citadel/sound/vox/it.ogg',
+"johnson" = 'modular_citadel/sound/vox/johnson.ogg',
+"juliet" = 'modular_citadel/sound/vox/juliet.ogg',
+"key" = 'modular_citadel/sound/vox/key.ogg',
+"kill" = 'modular_citadel/sound/vox/kill.ogg',
+"kilo" = 'modular_citadel/sound/vox/kilo.ogg',
+"kit" = 'modular_citadel/sound/vox/kit.ogg',
+"lab" = 'modular_citadel/sound/vox/lab.ogg',
+"lambda" = 'modular_citadel/sound/vox/lambda.ogg',
+"laser" = 'modular_citadel/sound/vox/laser.ogg',
+"last" = 'modular_citadel/sound/vox/last.ogg',
+"launch" = 'modular_citadel/sound/vox/launch.ogg',
+"leak" = 'modular_citadel/sound/vox/leak.ogg',
+"leave" = 'modular_citadel/sound/vox/leave.ogg',
+"left" = 'modular_citadel/sound/vox/left.ogg',
+"legal" = 'modular_citadel/sound/vox/legal.ogg',
+"level" = 'modular_citadel/sound/vox/level.ogg',
+"lever" = 'modular_citadel/sound/vox/lever.ogg',
+"lie" = 'modular_citadel/sound/vox/lie.ogg',
+"lieutenant" = 'modular_citadel/sound/vox/lieutenant.ogg',
+"life" = 'modular_citadel/sound/vox/life.ogg',
+"light" = 'modular_citadel/sound/vox/light.ogg',
+"lima" = 'modular_citadel/sound/vox/lima.ogg',
+"liquid" = 'modular_citadel/sound/vox/liquid.ogg',
+"loading" = 'modular_citadel/sound/vox/loading.ogg',
+"locate" = 'modular_citadel/sound/vox/locate.ogg',
+"located" = 'modular_citadel/sound/vox/located.ogg',
+"location" = 'modular_citadel/sound/vox/location.ogg',
+"lock" = 'modular_citadel/sound/vox/lock.ogg',
+"locked" = 'modular_citadel/sound/vox/locked.ogg',
+"locker" = 'modular_citadel/sound/vox/locker.ogg',
+"lockout" = 'modular_citadel/sound/vox/lockout.ogg',
+"lower" = 'modular_citadel/sound/vox/lower.ogg',
+"lowest" = 'modular_citadel/sound/vox/lowest.ogg',
+"magnetic" = 'modular_citadel/sound/vox/magnetic.ogg',
+"main" = 'modular_citadel/sound/vox/main.ogg',
+"maintenance" = 'modular_citadel/sound/vox/maintenance.ogg',
+"malfunction" = 'modular_citadel/sound/vox/malfunction.ogg',
+"man" = 'modular_citadel/sound/vox/man.ogg',
+"mass" = 'modular_citadel/sound/vox/mass.ogg',
+"materials" = 'modular_citadel/sound/vox/materials.ogg',
+"maximum" = 'modular_citadel/sound/vox/maximum.ogg',
+"may" = 'modular_citadel/sound/vox/may.ogg',
+"med" = 'modular_citadel/sound/vox/med.ogg',
+"medical" = 'modular_citadel/sound/vox/medical.ogg',
+"men" = 'modular_citadel/sound/vox/men.ogg',
+"mercy" = 'modular_citadel/sound/vox/mercy.ogg',
+"mesa" = 'modular_citadel/sound/vox/mesa.ogg',
+"message" = 'modular_citadel/sound/vox/message.ogg',
+"meter" = 'modular_citadel/sound/vox/meter.ogg',
+"micro" = 'modular_citadel/sound/vox/micro.ogg',
+"middle" = 'modular_citadel/sound/vox/middle.ogg',
+"mike" = 'modular_citadel/sound/vox/mike.ogg',
+"miles" = 'modular_citadel/sound/vox/miles.ogg',
+"military" = 'modular_citadel/sound/vox/military.ogg',
+"milli" = 'modular_citadel/sound/vox/milli.ogg',
+"million" = 'modular_citadel/sound/vox/million.ogg',
+"minefield" = 'modular_citadel/sound/vox/minefield.ogg',
+"minimum" = 'modular_citadel/sound/vox/minimum.ogg',
+"minutes" = 'modular_citadel/sound/vox/minutes.ogg',
+"mister" = 'modular_citadel/sound/vox/mister.ogg',
+"mode" = 'modular_citadel/sound/vox/mode.ogg',
+"motor" = 'modular_citadel/sound/vox/motor.ogg',
+"motorpool" = 'modular_citadel/sound/vox/motorpool.ogg',
+"move" = 'modular_citadel/sound/vox/move.ogg',
+"must" = 'modular_citadel/sound/vox/must.ogg',
+"nearest" = 'modular_citadel/sound/vox/nearest.ogg',
+"nice" = 'modular_citadel/sound/vox/nice.ogg',
+"nine" = 'modular_citadel/sound/vox/nine.ogg',
+"nineteen" = 'modular_citadel/sound/vox/nineteen.ogg',
+"ninety" = 'modular_citadel/sound/vox/ninety.ogg',
+"no" = 'modular_citadel/sound/vox/no.ogg',
+"nominal" = 'modular_citadel/sound/vox/nominal.ogg',
+"north" = 'modular_citadel/sound/vox/north.ogg',
+"not" = 'modular_citadel/sound/vox/not.ogg',
+"november" = 'modular_citadel/sound/vox/november.ogg',
+"now" = 'modular_citadel/sound/vox/now.ogg',
+"number" = 'modular_citadel/sound/vox/number.ogg',
+"objective" = 'modular_citadel/sound/vox/objective.ogg',
+"observation" = 'modular_citadel/sound/vox/observation.ogg',
+"of" = 'modular_citadel/sound/vox/of.ogg',
+"officer" = 'modular_citadel/sound/vox/officer.ogg',
+"ok" = 'modular_citadel/sound/vox/ok.ogg',
+"on" = 'modular_citadel/sound/vox/on.ogg',
+"one" = 'modular_citadel/sound/vox/one.ogg',
+"open" = 'modular_citadel/sound/vox/open.ogg',
+"operating" = 'modular_citadel/sound/vox/operating.ogg',
+"operations" = 'modular_citadel/sound/vox/operations.ogg',
+"operative" = 'modular_citadel/sound/vox/operative.ogg',
+"option" = 'modular_citadel/sound/vox/option.ogg',
+"order" = 'modular_citadel/sound/vox/order.ogg',
+"organic" = 'modular_citadel/sound/vox/organic.ogg',
+"oscar" = 'modular_citadel/sound/vox/oscar.ogg',
+"out" = 'modular_citadel/sound/vox/out.ogg',
+"outside" = 'modular_citadel/sound/vox/outside.ogg',
+"over" = 'modular_citadel/sound/vox/over.ogg',
+"overload" = 'modular_citadel/sound/vox/overload.ogg',
+"override" = 'modular_citadel/sound/vox/override.ogg',
+"pacify" = 'modular_citadel/sound/vox/pacify.ogg',
+"pain" = 'modular_citadel/sound/vox/pain.ogg',
+"pal" = 'modular_citadel/sound/vox/pal.ogg',
+"panel" = 'modular_citadel/sound/vox/panel.ogg',
+"percent" = 'modular_citadel/sound/vox/percent.ogg',
+"perimeter" = 'modular_citadel/sound/vox/perimeter.ogg',
+"permitted" = 'modular_citadel/sound/vox/permitted.ogg',
+"personnel" = 'modular_citadel/sound/vox/personnel.ogg',
+"pipe" = 'modular_citadel/sound/vox/pipe.ogg',
+"plant" = 'modular_citadel/sound/vox/plant.ogg',
+"platform" = 'modular_citadel/sound/vox/platform.ogg',
+"please" = 'modular_citadel/sound/vox/please.ogg',
+"point" = 'modular_citadel/sound/vox/point.ogg',
+"portal" = 'modular_citadel/sound/vox/portal.ogg',
+"power" = 'modular_citadel/sound/vox/power.ogg',
+"presence" = 'modular_citadel/sound/vox/presence.ogg',
+"press" = 'modular_citadel/sound/vox/press.ogg',
+"primary" = 'modular_citadel/sound/vox/primary.ogg',
+"proceed" = 'modular_citadel/sound/vox/proceed.ogg',
+"processing" = 'modular_citadel/sound/vox/processing.ogg',
+"progress" = 'modular_citadel/sound/vox/progress.ogg',
+"proper" = 'modular_citadel/sound/vox/proper.ogg',
+"propulsion" = 'modular_citadel/sound/vox/propulsion.ogg',
+"prosecute" = 'modular_citadel/sound/vox/prosecute.ogg',
+"protective" = 'modular_citadel/sound/vox/protective.ogg',
+"push" = 'modular_citadel/sound/vox/push.ogg',
+"quantum" = 'modular_citadel/sound/vox/quantum.ogg',
+"quebec" = 'modular_citadel/sound/vox/quebec.ogg',
+"question" = 'modular_citadel/sound/vox/question.ogg',
+"questioning" = 'modular_citadel/sound/vox/questioning.ogg',
+"quick" = 'modular_citadel/sound/vox/quick.ogg',
+"quit" = 'modular_citadel/sound/vox/quit.ogg',
+"radiation" = 'modular_citadel/sound/vox/radiation.ogg',
+"radioactive" = 'modular_citadel/sound/vox/radioactive.ogg',
+"rads" = 'modular_citadel/sound/vox/rads.ogg',
+"rapid" = 'modular_citadel/sound/vox/rapid.ogg',
+"reach" = 'modular_citadel/sound/vox/reach.ogg',
+"reached" = 'modular_citadel/sound/vox/reached.ogg',
+"reactor" = 'modular_citadel/sound/vox/reactor.ogg',
+"red" = 'modular_citadel/sound/vox/red.ogg',
+"relay" = 'modular_citadel/sound/vox/relay.ogg',
+"released" = 'modular_citadel/sound/vox/released.ogg',
+"remaining" = 'modular_citadel/sound/vox/remaining.ogg',
+"renegade" = 'modular_citadel/sound/vox/renegade.ogg',
+"repair" = 'modular_citadel/sound/vox/repair.ogg',
+"report" = 'modular_citadel/sound/vox/report.ogg',
+"reports" = 'modular_citadel/sound/vox/reports.ogg',
+"required" = 'modular_citadel/sound/vox/required.ogg',
+"research" = 'modular_citadel/sound/vox/research.ogg',
+"reset" = 'modular_citadel/sound/vox/reset.ogg',
+"resevoir" = 'modular_citadel/sound/vox/resevoir.ogg',
+"resistance" = 'modular_citadel/sound/vox/resistance.ogg',
+"returned" = 'modular_citadel/sound/vox/returned.ogg',
+"right" = 'modular_citadel/sound/vox/right.ogg',
+"rocket" = 'modular_citadel/sound/vox/rocket.ogg',
+"roger" = 'modular_citadel/sound/vox/roger.ogg',
+"romeo" = 'modular_citadel/sound/vox/romeo.ogg',
+"room" = 'modular_citadel/sound/vox/room.ogg',
+"round" = 'modular_citadel/sound/vox/round.ogg',
+"run" = 'modular_citadel/sound/vox/run.ogg',
+"safe" = 'modular_citadel/sound/vox/safe.ogg',
+"safety" = 'modular_citadel/sound/vox/safety.ogg',
+"sargeant" = 'modular_citadel/sound/vox/sargeant.ogg',
+"satellite" = 'modular_citadel/sound/vox/satellite.ogg',
+"save" = 'modular_citadel/sound/vox/save.ogg',
+"science" = 'modular_citadel/sound/vox/science.ogg',
+"scores" = 'modular_citadel/sound/vox/scores.ogg',
+"scream" = 'modular_citadel/sound/vox/scream.ogg',
+"screen" = 'modular_citadel/sound/vox/screen.ogg',
+"search" = 'modular_citadel/sound/vox/search.ogg',
+"second" = 'modular_citadel/sound/vox/second.ogg',
+"secondary" = 'modular_citadel/sound/vox/secondary.ogg',
+"seconds" = 'modular_citadel/sound/vox/seconds.ogg',
+"sector" = 'modular_citadel/sound/vox/sector.ogg',
+"secure" = 'modular_citadel/sound/vox/secure.ogg',
+"secured" = 'modular_citadel/sound/vox/secured.ogg',
+"security" = 'modular_citadel/sound/vox/security.ogg',
+"select" = 'modular_citadel/sound/vox/select.ogg',
+"selected" = 'modular_citadel/sound/vox/selected.ogg',
+"service" = 'modular_citadel/sound/vox/service.ogg',
+"seven" = 'modular_citadel/sound/vox/seven.ogg',
+"seventeen" = 'modular_citadel/sound/vox/seventeen.ogg',
+"seventy" = 'modular_citadel/sound/vox/seventy.ogg',
+"severe" = 'modular_citadel/sound/vox/severe.ogg',
+"sewage" = 'modular_citadel/sound/vox/sewage.ogg',
+"sewer" = 'modular_citadel/sound/vox/sewer.ogg',
+"shield" = 'modular_citadel/sound/vox/shield.ogg',
+"shipment" = 'modular_citadel/sound/vox/shipment.ogg',
+"shock" = 'modular_citadel/sound/vox/shock.ogg',
+"shoot" = 'modular_citadel/sound/vox/shoot.ogg',
+"shower" = 'modular_citadel/sound/vox/shower.ogg',
+"shut" = 'modular_citadel/sound/vox/shut.ogg',
+"side" = 'modular_citadel/sound/vox/side.ogg',
+"sierra" = 'modular_citadel/sound/vox/sierra.ogg',
+"sight" = 'modular_citadel/sound/vox/sight.ogg',
+"silo" = 'modular_citadel/sound/vox/silo.ogg',
+"six" = 'modular_citadel/sound/vox/six.ogg',
+"sixteen" = 'modular_citadel/sound/vox/sixteen.ogg',
+"sixty" = 'modular_citadel/sound/vox/sixty.ogg',
+"slime" = 'modular_citadel/sound/vox/slime.ogg',
+"slow" = 'modular_citadel/sound/vox/slow.ogg',
+"soldier" = 'modular_citadel/sound/vox/soldier.ogg',
+"some" = 'modular_citadel/sound/vox/some.ogg',
+"someone" = 'modular_citadel/sound/vox/someone.ogg',
+"something" = 'modular_citadel/sound/vox/something.ogg',
+"son" = 'modular_citadel/sound/vox/son.ogg',
+"sorry" = 'modular_citadel/sound/vox/sorry.ogg',
+"south" = 'modular_citadel/sound/vox/south.ogg',
+"squad" = 'modular_citadel/sound/vox/squad.ogg',
+"square" = 'modular_citadel/sound/vox/square.ogg',
+"stairway" = 'modular_citadel/sound/vox/stairway.ogg',
+"status" = 'modular_citadel/sound/vox/status.ogg',
+"sterile" = 'modular_citadel/sound/vox/sterile.ogg',
+"sterilization" = 'modular_citadel/sound/vox/sterilization.ogg',
+"stolen" = 'modular_citadel/sound/vox/stolen.ogg',
+"storage" = 'modular_citadel/sound/vox/storage.ogg',
+"sub" = 'modular_citadel/sound/vox/sub.ogg',
+"subsurface" = 'modular_citadel/sound/vox/subsurface.ogg',
+"sudden" = 'modular_citadel/sound/vox/sudden.ogg',
+"suit" = 'modular_citadel/sound/vox/suit.ogg',
+"superconducting" = 'modular_citadel/sound/vox/superconducting.ogg',
+"supercooled" = 'modular_citadel/sound/vox/supercooled.ogg',
+"supply" = 'modular_citadel/sound/vox/supply.ogg',
+"surface" = 'modular_citadel/sound/vox/surface.ogg',
+"surrender" = 'modular_citadel/sound/vox/surrender.ogg',
+"surround" = 'modular_citadel/sound/vox/surround.ogg',
+"surrounded" = 'modular_citadel/sound/vox/surrounded.ogg',
+"switch" = 'modular_citadel/sound/vox/switch.ogg',
+"system" = 'modular_citadel/sound/vox/system.ogg',
+"systems" = 'modular_citadel/sound/vox/systems.ogg',
+"tactical" = 'modular_citadel/sound/vox/tactical.ogg',
+"take" = 'modular_citadel/sound/vox/take.ogg',
+"talk" = 'modular_citadel/sound/vox/talk.ogg',
+"tango" = 'modular_citadel/sound/vox/tango.ogg',
+"tank" = 'modular_citadel/sound/vox/tank.ogg',
+"target" = 'modular_citadel/sound/vox/target.ogg',
+"team" = 'modular_citadel/sound/vox/team.ogg',
+"temperature" = 'modular_citadel/sound/vox/temperature.ogg',
+"temporal" = 'modular_citadel/sound/vox/temporal.ogg',
+"ten" = 'modular_citadel/sound/vox/ten.ogg',
+"terminal" = 'modular_citadel/sound/vox/terminal.ogg',
+"terminated" = 'modular_citadel/sound/vox/terminated.ogg',
+"termination" = 'modular_citadel/sound/vox/termination.ogg',
+"test" = 'modular_citadel/sound/vox/test.ogg',
+"that" = 'modular_citadel/sound/vox/that.ogg',
+"the" = 'modular_citadel/sound/vox/the.ogg',
+"then" = 'modular_citadel/sound/vox/then.ogg',
+"there" = 'modular_citadel/sound/vox/there.ogg',
+"third" = 'modular_citadel/sound/vox/third.ogg',
+"thirteen" = 'modular_citadel/sound/vox/thirteen.ogg',
+"thirty" = 'modular_citadel/sound/vox/thirty.ogg',
+"this" = 'modular_citadel/sound/vox/this.ogg',
+"those" = 'modular_citadel/sound/vox/those.ogg',
+"thousand" = 'modular_citadel/sound/vox/thousand.ogg',
+"threat" = 'modular_citadel/sound/vox/threat.ogg',
+"three" = 'modular_citadel/sound/vox/three.ogg',
+"through" = 'modular_citadel/sound/vox/through.ogg',
+"time" = 'modular_citadel/sound/vox/time.ogg',
+"to" = 'modular_citadel/sound/vox/to.ogg',
+"top" = 'modular_citadel/sound/vox/top.ogg',
+"topside" = 'modular_citadel/sound/vox/topside.ogg',
+"touch" = 'modular_citadel/sound/vox/touch.ogg',
+"towards" = 'modular_citadel/sound/vox/towards.ogg',
+"track" = 'modular_citadel/sound/vox/track.ogg',
+"train" = 'modular_citadel/sound/vox/train.ogg',
+"transportation" = 'modular_citadel/sound/vox/transportation.ogg',
+"truck" = 'modular_citadel/sound/vox/truck.ogg',
+"tunnel" = 'modular_citadel/sound/vox/tunnel.ogg',
+"turn" = 'modular_citadel/sound/vox/turn.ogg',
+"turret" = 'modular_citadel/sound/vox/turret.ogg',
+"twelve" = 'modular_citadel/sound/vox/twelve.ogg',
+"twenty" = 'modular_citadel/sound/vox/twenty.ogg',
+"two" = 'modular_citadel/sound/vox/two.ogg',
+"unauthorized" = 'modular_citadel/sound/vox/unauthorized.ogg',
+"under" = 'modular_citadel/sound/vox/under.ogg',
+"uniform" = 'modular_citadel/sound/vox/uniform.ogg',
+"unlocked" = 'modular_citadel/sound/vox/unlocked.ogg',
+"until" = 'modular_citadel/sound/vox/until.ogg',
+"up" = 'modular_citadel/sound/vox/up.ogg',
+"upper" = 'modular_citadel/sound/vox/upper.ogg',
+"uranium" = 'modular_citadel/sound/vox/uranium.ogg',
+"us" = 'modular_citadel/sound/vox/us.ogg',
+"usa" = 'modular_citadel/sound/vox/usa.ogg',
+"use" = 'modular_citadel/sound/vox/use.ogg',
+"used" = 'modular_citadel/sound/vox/used.ogg',
+"user" = 'modular_citadel/sound/vox/user.ogg',
+"vacate" = 'modular_citadel/sound/vox/vacate.ogg',
+"valid" = 'modular_citadel/sound/vox/valid.ogg',
+"vapor" = 'modular_citadel/sound/vox/vapor.ogg',
+"vent" = 'modular_citadel/sound/vox/vent.ogg',
+"ventillation" = 'modular_citadel/sound/vox/ventillation.ogg',
+"victor" = 'modular_citadel/sound/vox/victor.ogg',
+"violated" = 'modular_citadel/sound/vox/violated.ogg',
+"violation" = 'modular_citadel/sound/vox/violation.ogg',
+"voltage" = 'modular_citadel/sound/vox/voltage.ogg',
+"vox_login" = 'modular_citadel/sound/vox/vox_login.ogg',
+"walk" = 'modular_citadel/sound/vox/walk.ogg',
+"wall" = 'modular_citadel/sound/vox/wall.ogg',
+"want" = 'modular_citadel/sound/vox/want.ogg',
+"wanted" = 'modular_citadel/sound/vox/wanted.ogg',
+"warm" = 'modular_citadel/sound/vox/warm.ogg',
+"warn" = 'modular_citadel/sound/vox/warn.ogg',
+"warning" = 'modular_citadel/sound/vox/warning.ogg',
+"waste" = 'modular_citadel/sound/vox/waste.ogg',
+"water" = 'modular_citadel/sound/vox/water.ogg',
+"we" = 'modular_citadel/sound/vox/we.ogg',
+"weapon" = 'modular_citadel/sound/vox/weapon.ogg',
+"west" = 'modular_citadel/sound/vox/west.ogg',
+"whiskey" = 'modular_citadel/sound/vox/whiskey.ogg',
+"white" = 'modular_citadel/sound/vox/white.ogg',
+"wilco" = 'modular_citadel/sound/vox/wilco.ogg',
+"will" = 'modular_citadel/sound/vox/will.ogg',
+"with" = 'modular_citadel/sound/vox/with.ogg',
+"without" = 'modular_citadel/sound/vox/without.ogg',
+"woop" = 'modular_citadel/sound/vox/woop.ogg',
+"xeno" = 'modular_citadel/sound/vox/xeno.ogg',
+"yankee" = 'modular_citadel/sound/vox/yankee.ogg',
+"yards" = 'modular_citadel/sound/vox/yards.ogg',
+"year" = 'modular_citadel/sound/vox/year.ogg',
+"yellow" = 'modular_citadel/sound/vox/yellow.ogg',
+"yes" = 'modular_citadel/sound/vox/yes.ogg',
+"you" = 'modular_citadel/sound/vox/you.ogg',
+"your" = 'modular_citadel/sound/vox/your.ogg',
+"yourself" = 'modular_citadel/sound/vox/yourself.ogg',
+"zero" = 'modular_citadel/sound/vox/zero.ogg',
+"zone" = 'modular_citadel/sound/vox/zone.ogg',
+"zulu" = 'modular_citadel/sound/vox/zulu.ogg',))
+#endif
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
index 6cd9e1badc..9e7da03f9b 100755
--- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
@@ -141,12 +141,18 @@
// Gunna allow this for now, still really don't approve - Pooj
/obj/item/hypospray/mkii/emag_act(mob/user)
+ . = ..()
+ if(obj_flags & EMAGGED)
+ to_chat(user, "[src] happens to be already overcharged.")
+ return
inject_wait = COMBAT_WAIT_INJECT
spray_wait = COMBAT_WAIT_SPRAY
spray_self = COMBAT_SELF_INJECT
inject_self = COMBAT_SELF_SPRAY
penetrates = TRUE
to_chat(user, "You overcharge [src]'s control circuit.")
+ obj_flags |= EMAGGED
+ return TRUE
/obj/item/hypospray/mkii/attack_hand(mob/user)
. = ..() //Don't bother changing this or removing it from containers will break.
diff --git a/modular_citadel/icons/firstaid.dmi b/modular_citadel/icons/firstaid.dmi
index e7ac378222..8c603c8762 100644
Binary files a/modular_citadel/icons/firstaid.dmi and b/modular_citadel/icons/firstaid.dmi differ
diff --git a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi
index fa7285ae4c..7fbb26f1af 100644
Binary files a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi and b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi differ
diff --git a/modular_citadel/icons/mob/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi
index c730467e1d..178897fac8 100644
Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/hats.dmi b/modular_citadel/icons/obj/clothing/hats.dmi
new file mode 100644
index 0000000000..ba9b4b5f8e
Binary files /dev/null and b/modular_citadel/icons/obj/clothing/hats.dmi differ
diff --git a/modular_citadel/sound/vox/_comma.ogg b/modular_citadel/sound/vox/_comma.ogg
new file mode 100644
index 0000000000..55ee3102a0
Binary files /dev/null and b/modular_citadel/sound/vox/_comma.ogg differ
diff --git a/modular_citadel/sound/vox/_period.ogg b/modular_citadel/sound/vox/_period.ogg
new file mode 100644
index 0000000000..dfb816d006
Binary files /dev/null and b/modular_citadel/sound/vox/_period.ogg differ
diff --git a/modular_citadel/sound/vox/a.ogg b/modular_citadel/sound/vox/a.ogg
new file mode 100644
index 0000000000..ad3a851290
Binary files /dev/null and b/modular_citadel/sound/vox/a.ogg differ
diff --git a/modular_citadel/sound/vox/accelerating.ogg b/modular_citadel/sound/vox/accelerating.ogg
new file mode 100644
index 0000000000..d6426aa798
Binary files /dev/null and b/modular_citadel/sound/vox/accelerating.ogg differ
diff --git a/modular_citadel/sound/vox/accelerator.ogg b/modular_citadel/sound/vox/accelerator.ogg
new file mode 100644
index 0000000000..6e8e1f10e8
Binary files /dev/null and b/modular_citadel/sound/vox/accelerator.ogg differ
diff --git a/modular_citadel/sound/vox/accepted.ogg b/modular_citadel/sound/vox/accepted.ogg
new file mode 100644
index 0000000000..f6c411f8c5
Binary files /dev/null and b/modular_citadel/sound/vox/accepted.ogg differ
diff --git a/modular_citadel/sound/vox/access.ogg b/modular_citadel/sound/vox/access.ogg
new file mode 100644
index 0000000000..ae8390e516
Binary files /dev/null and b/modular_citadel/sound/vox/access.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledge.ogg b/modular_citadel/sound/vox/acknowledge.ogg
new file mode 100644
index 0000000000..da3143b729
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledge.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledged.ogg b/modular_citadel/sound/vox/acknowledged.ogg
new file mode 100644
index 0000000000..b4b89eaa52
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledged.ogg differ
diff --git a/modular_citadel/sound/vox/acquired.ogg b/modular_citadel/sound/vox/acquired.ogg
new file mode 100644
index 0000000000..ba4595a908
Binary files /dev/null and b/modular_citadel/sound/vox/acquired.ogg differ
diff --git a/modular_citadel/sound/vox/acquisition.ogg b/modular_citadel/sound/vox/acquisition.ogg
new file mode 100644
index 0000000000..fcdf6a9832
Binary files /dev/null and b/modular_citadel/sound/vox/acquisition.ogg differ
diff --git a/modular_citadel/sound/vox/across.ogg b/modular_citadel/sound/vox/across.ogg
new file mode 100644
index 0000000000..d026b3dba9
Binary files /dev/null and b/modular_citadel/sound/vox/across.ogg differ
diff --git a/modular_citadel/sound/vox/activate.ogg b/modular_citadel/sound/vox/activate.ogg
new file mode 100644
index 0000000000..5611c456a7
Binary files /dev/null and b/modular_citadel/sound/vox/activate.ogg differ
diff --git a/modular_citadel/sound/vox/activated.ogg b/modular_citadel/sound/vox/activated.ogg
new file mode 100644
index 0000000000..e3fafca3b2
Binary files /dev/null and b/modular_citadel/sound/vox/activated.ogg differ
diff --git a/modular_citadel/sound/vox/activity.ogg b/modular_citadel/sound/vox/activity.ogg
new file mode 100644
index 0000000000..66535b485d
Binary files /dev/null and b/modular_citadel/sound/vox/activity.ogg differ
diff --git a/modular_citadel/sound/vox/adios.ogg b/modular_citadel/sound/vox/adios.ogg
new file mode 100644
index 0000000000..1eedd5468b
Binary files /dev/null and b/modular_citadel/sound/vox/adios.ogg differ
diff --git a/modular_citadel/sound/vox/administration.ogg b/modular_citadel/sound/vox/administration.ogg
new file mode 100644
index 0000000000..44f8b3e8d8
Binary files /dev/null and b/modular_citadel/sound/vox/administration.ogg differ
diff --git a/modular_citadel/sound/vox/advanced.ogg b/modular_citadel/sound/vox/advanced.ogg
new file mode 100644
index 0000000000..df110dd8db
Binary files /dev/null and b/modular_citadel/sound/vox/advanced.ogg differ
diff --git a/modular_citadel/sound/vox/after.ogg b/modular_citadel/sound/vox/after.ogg
new file mode 100644
index 0000000000..8c0857f99c
Binary files /dev/null and b/modular_citadel/sound/vox/after.ogg differ
diff --git a/modular_citadel/sound/vox/agent.ogg b/modular_citadel/sound/vox/agent.ogg
new file mode 100644
index 0000000000..eae99227bc
Binary files /dev/null and b/modular_citadel/sound/vox/agent.ogg differ
diff --git a/modular_citadel/sound/vox/alarm.ogg b/modular_citadel/sound/vox/alarm.ogg
new file mode 100644
index 0000000000..54bcc0b980
Binary files /dev/null and b/modular_citadel/sound/vox/alarm.ogg differ
diff --git a/modular_citadel/sound/vox/alert.ogg b/modular_citadel/sound/vox/alert.ogg
new file mode 100644
index 0000000000..08620fa58c
Binary files /dev/null and b/modular_citadel/sound/vox/alert.ogg differ
diff --git a/modular_citadel/sound/vox/alien.ogg b/modular_citadel/sound/vox/alien.ogg
new file mode 100644
index 0000000000..cb3c3d7787
Binary files /dev/null and b/modular_citadel/sound/vox/alien.ogg differ
diff --git a/modular_citadel/sound/vox/aligned.ogg b/modular_citadel/sound/vox/aligned.ogg
new file mode 100644
index 0000000000..f561a1ec2f
Binary files /dev/null and b/modular_citadel/sound/vox/aligned.ogg differ
diff --git a/modular_citadel/sound/vox/all.ogg b/modular_citadel/sound/vox/all.ogg
new file mode 100644
index 0000000000..48d05f1007
Binary files /dev/null and b/modular_citadel/sound/vox/all.ogg differ
diff --git a/modular_citadel/sound/vox/alpha.ogg b/modular_citadel/sound/vox/alpha.ogg
new file mode 100644
index 0000000000..b80828c408
Binary files /dev/null and b/modular_citadel/sound/vox/alpha.ogg differ
diff --git a/modular_citadel/sound/vox/am.ogg b/modular_citadel/sound/vox/am.ogg
new file mode 100644
index 0000000000..9d4289758e
Binary files /dev/null and b/modular_citadel/sound/vox/am.ogg differ
diff --git a/modular_citadel/sound/vox/amigo.ogg b/modular_citadel/sound/vox/amigo.ogg
new file mode 100644
index 0000000000..6992689553
Binary files /dev/null and b/modular_citadel/sound/vox/amigo.ogg differ
diff --git a/modular_citadel/sound/vox/ammunition.ogg b/modular_citadel/sound/vox/ammunition.ogg
new file mode 100644
index 0000000000..108fb2dc83
Binary files /dev/null and b/modular_citadel/sound/vox/ammunition.ogg differ
diff --git a/modular_citadel/sound/vox/an.ogg b/modular_citadel/sound/vox/an.ogg
new file mode 100644
index 0000000000..53382c68a0
Binary files /dev/null and b/modular_citadel/sound/vox/an.ogg differ
diff --git a/modular_citadel/sound/vox/and.ogg b/modular_citadel/sound/vox/and.ogg
new file mode 100644
index 0000000000..b9b4de26bf
Binary files /dev/null and b/modular_citadel/sound/vox/and.ogg differ
diff --git a/modular_citadel/sound/vox/announcement.ogg b/modular_citadel/sound/vox/announcement.ogg
new file mode 100644
index 0000000000..ba16d76c18
Binary files /dev/null and b/modular_citadel/sound/vox/announcement.ogg differ
diff --git a/modular_citadel/sound/vox/anomalous.ogg b/modular_citadel/sound/vox/anomalous.ogg
new file mode 100644
index 0000000000..a331afd06e
Binary files /dev/null and b/modular_citadel/sound/vox/anomalous.ogg differ
diff --git a/modular_citadel/sound/vox/antenna.ogg b/modular_citadel/sound/vox/antenna.ogg
new file mode 100644
index 0000000000..547e64786a
Binary files /dev/null and b/modular_citadel/sound/vox/antenna.ogg differ
diff --git a/modular_citadel/sound/vox/any.ogg b/modular_citadel/sound/vox/any.ogg
new file mode 100644
index 0000000000..49d578758b
Binary files /dev/null and b/modular_citadel/sound/vox/any.ogg differ
diff --git a/modular_citadel/sound/vox/apprehend.ogg b/modular_citadel/sound/vox/apprehend.ogg
new file mode 100644
index 0000000000..de0fc4d664
Binary files /dev/null and b/modular_citadel/sound/vox/apprehend.ogg differ
diff --git a/modular_citadel/sound/vox/approach.ogg b/modular_citadel/sound/vox/approach.ogg
new file mode 100644
index 0000000000..3135bb7fc4
Binary files /dev/null and b/modular_citadel/sound/vox/approach.ogg differ
diff --git a/modular_citadel/sound/vox/are.ogg b/modular_citadel/sound/vox/are.ogg
new file mode 100644
index 0000000000..b3e68aa8a6
Binary files /dev/null and b/modular_citadel/sound/vox/are.ogg differ
diff --git a/modular_citadel/sound/vox/area.ogg b/modular_citadel/sound/vox/area.ogg
new file mode 100644
index 0000000000..1408fedf4c
Binary files /dev/null and b/modular_citadel/sound/vox/area.ogg differ
diff --git a/modular_citadel/sound/vox/arm.ogg b/modular_citadel/sound/vox/arm.ogg
new file mode 100644
index 0000000000..e078c567b5
Binary files /dev/null and b/modular_citadel/sound/vox/arm.ogg differ
diff --git a/modular_citadel/sound/vox/armed.ogg b/modular_citadel/sound/vox/armed.ogg
new file mode 100644
index 0000000000..2b1d092658
Binary files /dev/null and b/modular_citadel/sound/vox/armed.ogg differ
diff --git a/modular_citadel/sound/vox/armor.ogg b/modular_citadel/sound/vox/armor.ogg
new file mode 100644
index 0000000000..70217b55a4
Binary files /dev/null and b/modular_citadel/sound/vox/armor.ogg differ
diff --git a/modular_citadel/sound/vox/armory.ogg b/modular_citadel/sound/vox/armory.ogg
new file mode 100644
index 0000000000..22835188f8
Binary files /dev/null and b/modular_citadel/sound/vox/armory.ogg differ
diff --git a/modular_citadel/sound/vox/arrest.ogg b/modular_citadel/sound/vox/arrest.ogg
new file mode 100644
index 0000000000..bfef18601f
Binary files /dev/null and b/modular_citadel/sound/vox/arrest.ogg differ
diff --git a/modular_citadel/sound/vox/ass.ogg b/modular_citadel/sound/vox/ass.ogg
new file mode 100644
index 0000000000..6bf9c01e62
Binary files /dev/null and b/modular_citadel/sound/vox/ass.ogg differ
diff --git a/modular_citadel/sound/vox/at.ogg b/modular_citadel/sound/vox/at.ogg
new file mode 100644
index 0000000000..5146ab9afb
Binary files /dev/null and b/modular_citadel/sound/vox/at.ogg differ
diff --git a/modular_citadel/sound/vox/atomic.ogg b/modular_citadel/sound/vox/atomic.ogg
new file mode 100644
index 0000000000..b8b1e1cec7
Binary files /dev/null and b/modular_citadel/sound/vox/atomic.ogg differ
diff --git a/modular_citadel/sound/vox/attention.ogg b/modular_citadel/sound/vox/attention.ogg
new file mode 100644
index 0000000000..ca5073e6c4
Binary files /dev/null and b/modular_citadel/sound/vox/attention.ogg differ
diff --git a/modular_citadel/sound/vox/authorize.ogg b/modular_citadel/sound/vox/authorize.ogg
new file mode 100644
index 0000000000..7ef68781ef
Binary files /dev/null and b/modular_citadel/sound/vox/authorize.ogg differ
diff --git a/modular_citadel/sound/vox/authorized.ogg b/modular_citadel/sound/vox/authorized.ogg
new file mode 100644
index 0000000000..5142ceba8d
Binary files /dev/null and b/modular_citadel/sound/vox/authorized.ogg differ
diff --git a/modular_citadel/sound/vox/automatic.ogg b/modular_citadel/sound/vox/automatic.ogg
new file mode 100644
index 0000000000..48d09f2304
Binary files /dev/null and b/modular_citadel/sound/vox/automatic.ogg differ
diff --git a/modular_citadel/sound/vox/away.ogg b/modular_citadel/sound/vox/away.ogg
new file mode 100644
index 0000000000..3e99af620e
Binary files /dev/null and b/modular_citadel/sound/vox/away.ogg differ
diff --git a/modular_citadel/sound/vox/b.ogg b/modular_citadel/sound/vox/b.ogg
new file mode 100644
index 0000000000..00b64030d6
Binary files /dev/null and b/modular_citadel/sound/vox/b.ogg differ
diff --git a/modular_citadel/sound/vox/back.ogg b/modular_citadel/sound/vox/back.ogg
new file mode 100644
index 0000000000..a8ca34ef52
Binary files /dev/null and b/modular_citadel/sound/vox/back.ogg differ
diff --git a/modular_citadel/sound/vox/backman.ogg b/modular_citadel/sound/vox/backman.ogg
new file mode 100644
index 0000000000..e0e6351f57
Binary files /dev/null and b/modular_citadel/sound/vox/backman.ogg differ
diff --git a/modular_citadel/sound/vox/bad.ogg b/modular_citadel/sound/vox/bad.ogg
new file mode 100644
index 0000000000..2dd38058a2
Binary files /dev/null and b/modular_citadel/sound/vox/bad.ogg differ
diff --git a/modular_citadel/sound/vox/bag.ogg b/modular_citadel/sound/vox/bag.ogg
new file mode 100644
index 0000000000..6daa1ab172
Binary files /dev/null and b/modular_citadel/sound/vox/bag.ogg differ
diff --git a/modular_citadel/sound/vox/bailey.ogg b/modular_citadel/sound/vox/bailey.ogg
new file mode 100644
index 0000000000..b912fe5801
Binary files /dev/null and b/modular_citadel/sound/vox/bailey.ogg differ
diff --git a/modular_citadel/sound/vox/barracks.ogg b/modular_citadel/sound/vox/barracks.ogg
new file mode 100644
index 0000000000..5e13a42773
Binary files /dev/null and b/modular_citadel/sound/vox/barracks.ogg differ
diff --git a/modular_citadel/sound/vox/base.ogg b/modular_citadel/sound/vox/base.ogg
new file mode 100644
index 0000000000..17d60fbc02
Binary files /dev/null and b/modular_citadel/sound/vox/base.ogg differ
diff --git a/modular_citadel/sound/vox/bay.ogg b/modular_citadel/sound/vox/bay.ogg
new file mode 100644
index 0000000000..7ac9991c69
Binary files /dev/null and b/modular_citadel/sound/vox/bay.ogg differ
diff --git a/modular_citadel/sound/vox/be.ogg b/modular_citadel/sound/vox/be.ogg
new file mode 100644
index 0000000000..01865aba54
Binary files /dev/null and b/modular_citadel/sound/vox/be.ogg differ
diff --git a/modular_citadel/sound/vox/been.ogg b/modular_citadel/sound/vox/been.ogg
new file mode 100644
index 0000000000..cf9e92a032
Binary files /dev/null and b/modular_citadel/sound/vox/been.ogg differ
diff --git a/modular_citadel/sound/vox/before.ogg b/modular_citadel/sound/vox/before.ogg
new file mode 100644
index 0000000000..fc16e8fef4
Binary files /dev/null and b/modular_citadel/sound/vox/before.ogg differ
diff --git a/modular_citadel/sound/vox/beyond.ogg b/modular_citadel/sound/vox/beyond.ogg
new file mode 100644
index 0000000000..e25982e700
Binary files /dev/null and b/modular_citadel/sound/vox/beyond.ogg differ
diff --git a/modular_citadel/sound/vox/biohazard.ogg b/modular_citadel/sound/vox/biohazard.ogg
new file mode 100644
index 0000000000..12d20ff2f3
Binary files /dev/null and b/modular_citadel/sound/vox/biohazard.ogg differ
diff --git a/modular_citadel/sound/vox/biological.ogg b/modular_citadel/sound/vox/biological.ogg
new file mode 100644
index 0000000000..538c2c4604
Binary files /dev/null and b/modular_citadel/sound/vox/biological.ogg differ
diff --git a/modular_citadel/sound/vox/birdwell.ogg b/modular_citadel/sound/vox/birdwell.ogg
new file mode 100644
index 0000000000..d3735d2531
Binary files /dev/null and b/modular_citadel/sound/vox/birdwell.ogg differ
diff --git a/modular_citadel/sound/vox/bizwarn.ogg b/modular_citadel/sound/vox/bizwarn.ogg
new file mode 100644
index 0000000000..1f875c644e
Binary files /dev/null and b/modular_citadel/sound/vox/bizwarn.ogg differ
diff --git a/modular_citadel/sound/vox/black.ogg b/modular_citadel/sound/vox/black.ogg
new file mode 100644
index 0000000000..28e5d48afe
Binary files /dev/null and b/modular_citadel/sound/vox/black.ogg differ
diff --git a/modular_citadel/sound/vox/blast.ogg b/modular_citadel/sound/vox/blast.ogg
new file mode 100644
index 0000000000..84a28e1fc8
Binary files /dev/null and b/modular_citadel/sound/vox/blast.ogg differ
diff --git a/modular_citadel/sound/vox/blocked.ogg b/modular_citadel/sound/vox/blocked.ogg
new file mode 100644
index 0000000000..f6efacfda1
Binary files /dev/null and b/modular_citadel/sound/vox/blocked.ogg differ
diff --git a/modular_citadel/sound/vox/bloop.ogg b/modular_citadel/sound/vox/bloop.ogg
new file mode 100644
index 0000000000..ada6ed636e
Binary files /dev/null and b/modular_citadel/sound/vox/bloop.ogg differ
diff --git a/modular_citadel/sound/vox/blue.ogg b/modular_citadel/sound/vox/blue.ogg
new file mode 100644
index 0000000000..a336a61968
Binary files /dev/null and b/modular_citadel/sound/vox/blue.ogg differ
diff --git a/modular_citadel/sound/vox/bottom.ogg b/modular_citadel/sound/vox/bottom.ogg
new file mode 100644
index 0000000000..b81c30477c
Binary files /dev/null and b/modular_citadel/sound/vox/bottom.ogg differ
diff --git a/modular_citadel/sound/vox/bravo.ogg b/modular_citadel/sound/vox/bravo.ogg
new file mode 100644
index 0000000000..df47058d5c
Binary files /dev/null and b/modular_citadel/sound/vox/bravo.ogg differ
diff --git a/modular_citadel/sound/vox/breach.ogg b/modular_citadel/sound/vox/breach.ogg
new file mode 100644
index 0000000000..3a4bae3f0d
Binary files /dev/null and b/modular_citadel/sound/vox/breach.ogg differ
diff --git a/modular_citadel/sound/vox/breached.ogg b/modular_citadel/sound/vox/breached.ogg
new file mode 100644
index 0000000000..0823bfc0d9
Binary files /dev/null and b/modular_citadel/sound/vox/breached.ogg differ
diff --git a/modular_citadel/sound/vox/break.ogg b/modular_citadel/sound/vox/break.ogg
new file mode 100644
index 0000000000..1bebe2b940
Binary files /dev/null and b/modular_citadel/sound/vox/break.ogg differ
diff --git a/modular_citadel/sound/vox/bridge.ogg b/modular_citadel/sound/vox/bridge.ogg
new file mode 100644
index 0000000000..8de8159b1e
Binary files /dev/null and b/modular_citadel/sound/vox/bridge.ogg differ
diff --git a/modular_citadel/sound/vox/bust.ogg b/modular_citadel/sound/vox/bust.ogg
new file mode 100644
index 0000000000..67622a5e4a
Binary files /dev/null and b/modular_citadel/sound/vox/bust.ogg differ
diff --git a/modular_citadel/sound/vox/but.ogg b/modular_citadel/sound/vox/but.ogg
new file mode 100644
index 0000000000..3c4d7172ef
Binary files /dev/null and b/modular_citadel/sound/vox/but.ogg differ
diff --git a/modular_citadel/sound/vox/button.ogg b/modular_citadel/sound/vox/button.ogg
new file mode 100644
index 0000000000..74639090f8
Binary files /dev/null and b/modular_citadel/sound/vox/button.ogg differ
diff --git a/modular_citadel/sound/vox/buzwarn.ogg b/modular_citadel/sound/vox/buzwarn.ogg
new file mode 100644
index 0000000000..34595dfe9b
Binary files /dev/null and b/modular_citadel/sound/vox/buzwarn.ogg differ
diff --git a/modular_citadel/sound/vox/bypass.ogg b/modular_citadel/sound/vox/bypass.ogg
new file mode 100644
index 0000000000..649fb0ca72
Binary files /dev/null and b/modular_citadel/sound/vox/bypass.ogg differ
diff --git a/modular_citadel/sound/vox/c.ogg b/modular_citadel/sound/vox/c.ogg
new file mode 100644
index 0000000000..99fc8eeb61
Binary files /dev/null and b/modular_citadel/sound/vox/c.ogg differ
diff --git a/modular_citadel/sound/vox/cable.ogg b/modular_citadel/sound/vox/cable.ogg
new file mode 100644
index 0000000000..8a03fec7a3
Binary files /dev/null and b/modular_citadel/sound/vox/cable.ogg differ
diff --git a/modular_citadel/sound/vox/call.ogg b/modular_citadel/sound/vox/call.ogg
new file mode 100644
index 0000000000..1cd702986d
Binary files /dev/null and b/modular_citadel/sound/vox/call.ogg differ
diff --git a/modular_citadel/sound/vox/called.ogg b/modular_citadel/sound/vox/called.ogg
new file mode 100644
index 0000000000..96c87be172
Binary files /dev/null and b/modular_citadel/sound/vox/called.ogg differ
diff --git a/modular_citadel/sound/vox/canal.ogg b/modular_citadel/sound/vox/canal.ogg
new file mode 100644
index 0000000000..0d4e92deb4
Binary files /dev/null and b/modular_citadel/sound/vox/canal.ogg differ
diff --git a/modular_citadel/sound/vox/cap.ogg b/modular_citadel/sound/vox/cap.ogg
new file mode 100644
index 0000000000..c229e6f5b1
Binary files /dev/null and b/modular_citadel/sound/vox/cap.ogg differ
diff --git a/modular_citadel/sound/vox/captain.ogg b/modular_citadel/sound/vox/captain.ogg
new file mode 100644
index 0000000000..69d2521e68
Binary files /dev/null and b/modular_citadel/sound/vox/captain.ogg differ
diff --git a/modular_citadel/sound/vox/capture.ogg b/modular_citadel/sound/vox/capture.ogg
new file mode 100644
index 0000000000..18eab2035b
Binary files /dev/null and b/modular_citadel/sound/vox/capture.ogg differ
diff --git a/modular_citadel/sound/vox/captured.ogg b/modular_citadel/sound/vox/captured.ogg
new file mode 100644
index 0000000000..fd6b652809
Binary files /dev/null and b/modular_citadel/sound/vox/captured.ogg differ
diff --git a/modular_citadel/sound/vox/ceiling.ogg b/modular_citadel/sound/vox/ceiling.ogg
new file mode 100644
index 0000000000..2f8d7eca0a
Binary files /dev/null and b/modular_citadel/sound/vox/ceiling.ogg differ
diff --git a/modular_citadel/sound/vox/celsius.ogg b/modular_citadel/sound/vox/celsius.ogg
new file mode 100644
index 0000000000..abb728c5c3
Binary files /dev/null and b/modular_citadel/sound/vox/celsius.ogg differ
diff --git a/modular_citadel/sound/vox/center.ogg b/modular_citadel/sound/vox/center.ogg
new file mode 100644
index 0000000000..1936e9190d
Binary files /dev/null and b/modular_citadel/sound/vox/center.ogg differ
diff --git a/modular_citadel/sound/vox/centi.ogg b/modular_citadel/sound/vox/centi.ogg
new file mode 100644
index 0000000000..63f9ce0aed
Binary files /dev/null and b/modular_citadel/sound/vox/centi.ogg differ
diff --git a/modular_citadel/sound/vox/central.ogg b/modular_citadel/sound/vox/central.ogg
new file mode 100644
index 0000000000..a805204243
Binary files /dev/null and b/modular_citadel/sound/vox/central.ogg differ
diff --git a/modular_citadel/sound/vox/chamber.ogg b/modular_citadel/sound/vox/chamber.ogg
new file mode 100644
index 0000000000..e3c77e927f
Binary files /dev/null and b/modular_citadel/sound/vox/chamber.ogg differ
diff --git a/modular_citadel/sound/vox/charlie.ogg b/modular_citadel/sound/vox/charlie.ogg
new file mode 100644
index 0000000000..bdadd74ca0
Binary files /dev/null and b/modular_citadel/sound/vox/charlie.ogg differ
diff --git a/modular_citadel/sound/vox/check.ogg b/modular_citadel/sound/vox/check.ogg
new file mode 100644
index 0000000000..f4a2a95de7
Binary files /dev/null and b/modular_citadel/sound/vox/check.ogg differ
diff --git a/modular_citadel/sound/vox/checkpoint.ogg b/modular_citadel/sound/vox/checkpoint.ogg
new file mode 100644
index 0000000000..aca98b09fa
Binary files /dev/null and b/modular_citadel/sound/vox/checkpoint.ogg differ
diff --git a/modular_citadel/sound/vox/chemical.ogg b/modular_citadel/sound/vox/chemical.ogg
new file mode 100644
index 0000000000..f7eae25c99
Binary files /dev/null and b/modular_citadel/sound/vox/chemical.ogg differ
diff --git a/modular_citadel/sound/vox/cleanup.ogg b/modular_citadel/sound/vox/cleanup.ogg
new file mode 100644
index 0000000000..2118f130cb
Binary files /dev/null and b/modular_citadel/sound/vox/cleanup.ogg differ
diff --git a/modular_citadel/sound/vox/clear.ogg b/modular_citadel/sound/vox/clear.ogg
new file mode 100644
index 0000000000..1b97835f0f
Binary files /dev/null and b/modular_citadel/sound/vox/clear.ogg differ
diff --git a/modular_citadel/sound/vox/clearance.ogg b/modular_citadel/sound/vox/clearance.ogg
new file mode 100644
index 0000000000..d2b641df40
Binary files /dev/null and b/modular_citadel/sound/vox/clearance.ogg differ
diff --git a/modular_citadel/sound/vox/close.ogg b/modular_citadel/sound/vox/close.ogg
new file mode 100644
index 0000000000..15e9fd315c
Binary files /dev/null and b/modular_citadel/sound/vox/close.ogg differ
diff --git a/modular_citadel/sound/vox/clown.ogg b/modular_citadel/sound/vox/clown.ogg
new file mode 100644
index 0000000000..e72f9703fd
Binary files /dev/null and b/modular_citadel/sound/vox/clown.ogg differ
diff --git a/modular_citadel/sound/vox/code.ogg b/modular_citadel/sound/vox/code.ogg
new file mode 100644
index 0000000000..cee2e4c036
Binary files /dev/null and b/modular_citadel/sound/vox/code.ogg differ
diff --git a/modular_citadel/sound/vox/coded.ogg b/modular_citadel/sound/vox/coded.ogg
new file mode 100644
index 0000000000..d4435296ae
Binary files /dev/null and b/modular_citadel/sound/vox/coded.ogg differ
diff --git a/modular_citadel/sound/vox/collider.ogg b/modular_citadel/sound/vox/collider.ogg
new file mode 100644
index 0000000000..a29bda0d17
Binary files /dev/null and b/modular_citadel/sound/vox/collider.ogg differ
diff --git a/modular_citadel/sound/vox/comma.ogg b/modular_citadel/sound/vox/comma.ogg
new file mode 100644
index 0000000000..a94221d0ed
Binary files /dev/null and b/modular_citadel/sound/vox/comma.ogg differ
diff --git a/modular_citadel/sound/vox/command.ogg b/modular_citadel/sound/vox/command.ogg
new file mode 100644
index 0000000000..cf6c32f736
Binary files /dev/null and b/modular_citadel/sound/vox/command.ogg differ
diff --git a/modular_citadel/sound/vox/communication.ogg b/modular_citadel/sound/vox/communication.ogg
new file mode 100644
index 0000000000..67ec74b30d
Binary files /dev/null and b/modular_citadel/sound/vox/communication.ogg differ
diff --git a/modular_citadel/sound/vox/complex.ogg b/modular_citadel/sound/vox/complex.ogg
new file mode 100644
index 0000000000..66dad5b30a
Binary files /dev/null and b/modular_citadel/sound/vox/complex.ogg differ
diff --git a/modular_citadel/sound/vox/computer.ogg b/modular_citadel/sound/vox/computer.ogg
new file mode 100644
index 0000000000..849cf4e96c
Binary files /dev/null and b/modular_citadel/sound/vox/computer.ogg differ
diff --git a/modular_citadel/sound/vox/condition.ogg b/modular_citadel/sound/vox/condition.ogg
new file mode 100644
index 0000000000..b16ea99736
Binary files /dev/null and b/modular_citadel/sound/vox/condition.ogg differ
diff --git a/modular_citadel/sound/vox/containment.ogg b/modular_citadel/sound/vox/containment.ogg
new file mode 100644
index 0000000000..0a1424a8c0
Binary files /dev/null and b/modular_citadel/sound/vox/containment.ogg differ
diff --git a/modular_citadel/sound/vox/contamination.ogg b/modular_citadel/sound/vox/contamination.ogg
new file mode 100644
index 0000000000..0d60c1c351
Binary files /dev/null and b/modular_citadel/sound/vox/contamination.ogg differ
diff --git a/modular_citadel/sound/vox/control.ogg b/modular_citadel/sound/vox/control.ogg
new file mode 100644
index 0000000000..7e4fae7220
Binary files /dev/null and b/modular_citadel/sound/vox/control.ogg differ
diff --git a/modular_citadel/sound/vox/coolant.ogg b/modular_citadel/sound/vox/coolant.ogg
new file mode 100644
index 0000000000..ca51223548
Binary files /dev/null and b/modular_citadel/sound/vox/coolant.ogg differ
diff --git a/modular_citadel/sound/vox/coomer.ogg b/modular_citadel/sound/vox/coomer.ogg
new file mode 100644
index 0000000000..eb684a6ab7
Binary files /dev/null and b/modular_citadel/sound/vox/coomer.ogg differ
diff --git a/modular_citadel/sound/vox/core.ogg b/modular_citadel/sound/vox/core.ogg
new file mode 100644
index 0000000000..6170255986
Binary files /dev/null and b/modular_citadel/sound/vox/core.ogg differ
diff --git a/modular_citadel/sound/vox/correct.ogg b/modular_citadel/sound/vox/correct.ogg
new file mode 100644
index 0000000000..99ca3efccc
Binary files /dev/null and b/modular_citadel/sound/vox/correct.ogg differ
diff --git a/modular_citadel/sound/vox/corridor.ogg b/modular_citadel/sound/vox/corridor.ogg
new file mode 100644
index 0000000000..e3ddeb39cc
Binary files /dev/null and b/modular_citadel/sound/vox/corridor.ogg differ
diff --git a/modular_citadel/sound/vox/crew.ogg b/modular_citadel/sound/vox/crew.ogg
new file mode 100644
index 0000000000..b63ce31874
Binary files /dev/null and b/modular_citadel/sound/vox/crew.ogg differ
diff --git a/modular_citadel/sound/vox/cross.ogg b/modular_citadel/sound/vox/cross.ogg
new file mode 100644
index 0000000000..ffd9f4161d
Binary files /dev/null and b/modular_citadel/sound/vox/cross.ogg differ
diff --git a/modular_citadel/sound/vox/cryogenic.ogg b/modular_citadel/sound/vox/cryogenic.ogg
new file mode 100644
index 0000000000..def31fe7c0
Binary files /dev/null and b/modular_citadel/sound/vox/cryogenic.ogg differ
diff --git a/modular_citadel/sound/vox/d.ogg b/modular_citadel/sound/vox/d.ogg
new file mode 100644
index 0000000000..08b85fc9eb
Binary files /dev/null and b/modular_citadel/sound/vox/d.ogg differ
diff --git a/modular_citadel/sound/vox/dadeda.ogg b/modular_citadel/sound/vox/dadeda.ogg
new file mode 100644
index 0000000000..9fd19f577c
Binary files /dev/null and b/modular_citadel/sound/vox/dadeda.ogg differ
diff --git a/modular_citadel/sound/vox/damage.ogg b/modular_citadel/sound/vox/damage.ogg
new file mode 100644
index 0000000000..d45cb0b532
Binary files /dev/null and b/modular_citadel/sound/vox/damage.ogg differ
diff --git a/modular_citadel/sound/vox/damaged.ogg b/modular_citadel/sound/vox/damaged.ogg
new file mode 100644
index 0000000000..cec2617cd2
Binary files /dev/null and b/modular_citadel/sound/vox/damaged.ogg differ
diff --git a/modular_citadel/sound/vox/danger.ogg b/modular_citadel/sound/vox/danger.ogg
new file mode 100644
index 0000000000..50bce6a5a5
Binary files /dev/null and b/modular_citadel/sound/vox/danger.ogg differ
diff --git a/modular_citadel/sound/vox/day.ogg b/modular_citadel/sound/vox/day.ogg
new file mode 100644
index 0000000000..c11c1b696c
Binary files /dev/null and b/modular_citadel/sound/vox/day.ogg differ
diff --git a/modular_citadel/sound/vox/deactivated.ogg b/modular_citadel/sound/vox/deactivated.ogg
new file mode 100644
index 0000000000..2c700cf4a7
Binary files /dev/null and b/modular_citadel/sound/vox/deactivated.ogg differ
diff --git a/modular_citadel/sound/vox/decompression.ogg b/modular_citadel/sound/vox/decompression.ogg
new file mode 100644
index 0000000000..39ba52f36a
Binary files /dev/null and b/modular_citadel/sound/vox/decompression.ogg differ
diff --git a/modular_citadel/sound/vox/decontamination.ogg b/modular_citadel/sound/vox/decontamination.ogg
new file mode 100644
index 0000000000..2115ec8aa4
Binary files /dev/null and b/modular_citadel/sound/vox/decontamination.ogg differ
diff --git a/modular_citadel/sound/vox/deeoo.ogg b/modular_citadel/sound/vox/deeoo.ogg
new file mode 100644
index 0000000000..22197de5e6
Binary files /dev/null and b/modular_citadel/sound/vox/deeoo.ogg differ
diff --git a/modular_citadel/sound/vox/defense.ogg b/modular_citadel/sound/vox/defense.ogg
new file mode 100644
index 0000000000..dc00256e0f
Binary files /dev/null and b/modular_citadel/sound/vox/defense.ogg differ
diff --git a/modular_citadel/sound/vox/degrees.ogg b/modular_citadel/sound/vox/degrees.ogg
new file mode 100644
index 0000000000..eb640ca08c
Binary files /dev/null and b/modular_citadel/sound/vox/degrees.ogg differ
diff --git a/modular_citadel/sound/vox/delta.ogg b/modular_citadel/sound/vox/delta.ogg
new file mode 100644
index 0000000000..93cbe2bdb6
Binary files /dev/null and b/modular_citadel/sound/vox/delta.ogg differ
diff --git a/modular_citadel/sound/vox/denied.ogg b/modular_citadel/sound/vox/denied.ogg
new file mode 100644
index 0000000000..8ef3366dbc
Binary files /dev/null and b/modular_citadel/sound/vox/denied.ogg differ
diff --git a/modular_citadel/sound/vox/deploy.ogg b/modular_citadel/sound/vox/deploy.ogg
new file mode 100644
index 0000000000..71bd4c4d7d
Binary files /dev/null and b/modular_citadel/sound/vox/deploy.ogg differ
diff --git a/modular_citadel/sound/vox/deployed.ogg b/modular_citadel/sound/vox/deployed.ogg
new file mode 100644
index 0000000000..d21fa814ba
Binary files /dev/null and b/modular_citadel/sound/vox/deployed.ogg differ
diff --git a/modular_citadel/sound/vox/destroy.ogg b/modular_citadel/sound/vox/destroy.ogg
new file mode 100644
index 0000000000..954d474a07
Binary files /dev/null and b/modular_citadel/sound/vox/destroy.ogg differ
diff --git a/modular_citadel/sound/vox/destroyed.ogg b/modular_citadel/sound/vox/destroyed.ogg
new file mode 100644
index 0000000000..cf5f20bf84
Binary files /dev/null and b/modular_citadel/sound/vox/destroyed.ogg differ
diff --git a/modular_citadel/sound/vox/detain.ogg b/modular_citadel/sound/vox/detain.ogg
new file mode 100644
index 0000000000..98a6d34c2f
Binary files /dev/null and b/modular_citadel/sound/vox/detain.ogg differ
diff --git a/modular_citadel/sound/vox/detected.ogg b/modular_citadel/sound/vox/detected.ogg
new file mode 100644
index 0000000000..80704064a4
Binary files /dev/null and b/modular_citadel/sound/vox/detected.ogg differ
diff --git a/modular_citadel/sound/vox/detonation.ogg b/modular_citadel/sound/vox/detonation.ogg
new file mode 100644
index 0000000000..a6c64c331c
Binary files /dev/null and b/modular_citadel/sound/vox/detonation.ogg differ
diff --git a/modular_citadel/sound/vox/device.ogg b/modular_citadel/sound/vox/device.ogg
new file mode 100644
index 0000000000..3f1b4905df
Binary files /dev/null and b/modular_citadel/sound/vox/device.ogg differ
diff --git a/modular_citadel/sound/vox/did.ogg b/modular_citadel/sound/vox/did.ogg
new file mode 100644
index 0000000000..966e8a3a13
Binary files /dev/null and b/modular_citadel/sound/vox/did.ogg differ
diff --git a/modular_citadel/sound/vox/die.ogg b/modular_citadel/sound/vox/die.ogg
new file mode 100644
index 0000000000..b2f99b4152
Binary files /dev/null and b/modular_citadel/sound/vox/die.ogg differ
diff --git a/modular_citadel/sound/vox/dimensional.ogg b/modular_citadel/sound/vox/dimensional.ogg
new file mode 100644
index 0000000000..a4ed638db0
Binary files /dev/null and b/modular_citadel/sound/vox/dimensional.ogg differ
diff --git a/modular_citadel/sound/vox/dirt.ogg b/modular_citadel/sound/vox/dirt.ogg
new file mode 100644
index 0000000000..b175b93205
Binary files /dev/null and b/modular_citadel/sound/vox/dirt.ogg differ
diff --git a/modular_citadel/sound/vox/disengaged.ogg b/modular_citadel/sound/vox/disengaged.ogg
new file mode 100644
index 0000000000..eb75ab975b
Binary files /dev/null and b/modular_citadel/sound/vox/disengaged.ogg differ
diff --git a/modular_citadel/sound/vox/dish.ogg b/modular_citadel/sound/vox/dish.ogg
new file mode 100644
index 0000000000..3b0f1f58ce
Binary files /dev/null and b/modular_citadel/sound/vox/dish.ogg differ
diff --git a/modular_citadel/sound/vox/disposal.ogg b/modular_citadel/sound/vox/disposal.ogg
new file mode 100644
index 0000000000..1a4c1f8bd1
Binary files /dev/null and b/modular_citadel/sound/vox/disposal.ogg differ
diff --git a/modular_citadel/sound/vox/distance.ogg b/modular_citadel/sound/vox/distance.ogg
new file mode 100644
index 0000000000..8bcec9ac7c
Binary files /dev/null and b/modular_citadel/sound/vox/distance.ogg differ
diff --git a/modular_citadel/sound/vox/distortion.ogg b/modular_citadel/sound/vox/distortion.ogg
new file mode 100644
index 0000000000..7ee3a5f560
Binary files /dev/null and b/modular_citadel/sound/vox/distortion.ogg differ
diff --git a/modular_citadel/sound/vox/do.ogg b/modular_citadel/sound/vox/do.ogg
new file mode 100644
index 0000000000..7202691b87
Binary files /dev/null and b/modular_citadel/sound/vox/do.ogg differ
diff --git a/modular_citadel/sound/vox/doctor.ogg b/modular_citadel/sound/vox/doctor.ogg
new file mode 100644
index 0000000000..adbbfab77a
Binary files /dev/null and b/modular_citadel/sound/vox/doctor.ogg differ
diff --git a/modular_citadel/sound/vox/doop.ogg b/modular_citadel/sound/vox/doop.ogg
new file mode 100644
index 0000000000..b497a8594d
Binary files /dev/null and b/modular_citadel/sound/vox/doop.ogg differ
diff --git a/modular_citadel/sound/vox/door.ogg b/modular_citadel/sound/vox/door.ogg
new file mode 100644
index 0000000000..db389b4eb9
Binary files /dev/null and b/modular_citadel/sound/vox/door.ogg differ
diff --git a/modular_citadel/sound/vox/down.ogg b/modular_citadel/sound/vox/down.ogg
new file mode 100644
index 0000000000..e16b0249dd
Binary files /dev/null and b/modular_citadel/sound/vox/down.ogg differ
diff --git a/modular_citadel/sound/vox/dual.ogg b/modular_citadel/sound/vox/dual.ogg
new file mode 100644
index 0000000000..d8833faf9b
Binary files /dev/null and b/modular_citadel/sound/vox/dual.ogg differ
diff --git a/modular_citadel/sound/vox/duct.ogg b/modular_citadel/sound/vox/duct.ogg
new file mode 100644
index 0000000000..23379f6cc2
Binary files /dev/null and b/modular_citadel/sound/vox/duct.ogg differ
diff --git a/modular_citadel/sound/vox/e.ogg b/modular_citadel/sound/vox/e.ogg
new file mode 100644
index 0000000000..105ea13ef2
Binary files /dev/null and b/modular_citadel/sound/vox/e.ogg differ
diff --git a/modular_citadel/sound/vox/east.ogg b/modular_citadel/sound/vox/east.ogg
new file mode 100644
index 0000000000..9e69856edb
Binary files /dev/null and b/modular_citadel/sound/vox/east.ogg differ
diff --git a/modular_citadel/sound/vox/echo.ogg b/modular_citadel/sound/vox/echo.ogg
new file mode 100644
index 0000000000..3ee16750a4
Binary files /dev/null and b/modular_citadel/sound/vox/echo.ogg differ
diff --git a/modular_citadel/sound/vox/ed.ogg b/modular_citadel/sound/vox/ed.ogg
new file mode 100644
index 0000000000..094bd4f3ba
Binary files /dev/null and b/modular_citadel/sound/vox/ed.ogg differ
diff --git a/modular_citadel/sound/vox/effect.ogg b/modular_citadel/sound/vox/effect.ogg
new file mode 100644
index 0000000000..01a77a1bba
Binary files /dev/null and b/modular_citadel/sound/vox/effect.ogg differ
diff --git a/modular_citadel/sound/vox/egress.ogg b/modular_citadel/sound/vox/egress.ogg
new file mode 100644
index 0000000000..6da62c754a
Binary files /dev/null and b/modular_citadel/sound/vox/egress.ogg differ
diff --git a/modular_citadel/sound/vox/eight.ogg b/modular_citadel/sound/vox/eight.ogg
new file mode 100644
index 0000000000..7c64ba326b
Binary files /dev/null and b/modular_citadel/sound/vox/eight.ogg differ
diff --git a/modular_citadel/sound/vox/eighteen.ogg b/modular_citadel/sound/vox/eighteen.ogg
new file mode 100644
index 0000000000..73330bfaa2
Binary files /dev/null and b/modular_citadel/sound/vox/eighteen.ogg differ
diff --git a/modular_citadel/sound/vox/eighty.ogg b/modular_citadel/sound/vox/eighty.ogg
new file mode 100644
index 0000000000..c190b69e02
Binary files /dev/null and b/modular_citadel/sound/vox/eighty.ogg differ
diff --git a/modular_citadel/sound/vox/electric.ogg b/modular_citadel/sound/vox/electric.ogg
new file mode 100644
index 0000000000..7d7154b350
Binary files /dev/null and b/modular_citadel/sound/vox/electric.ogg differ
diff --git a/modular_citadel/sound/vox/electromagnetic.ogg b/modular_citadel/sound/vox/electromagnetic.ogg
new file mode 100644
index 0000000000..160725e8c0
Binary files /dev/null and b/modular_citadel/sound/vox/electromagnetic.ogg differ
diff --git a/modular_citadel/sound/vox/elevator.ogg b/modular_citadel/sound/vox/elevator.ogg
new file mode 100644
index 0000000000..bcafc3ce3f
Binary files /dev/null and b/modular_citadel/sound/vox/elevator.ogg differ
diff --git a/modular_citadel/sound/vox/eleven.ogg b/modular_citadel/sound/vox/eleven.ogg
new file mode 100644
index 0000000000..6607692e1d
Binary files /dev/null and b/modular_citadel/sound/vox/eleven.ogg differ
diff --git a/modular_citadel/sound/vox/eliminate.ogg b/modular_citadel/sound/vox/eliminate.ogg
new file mode 100644
index 0000000000..2e81f5eb6c
Binary files /dev/null and b/modular_citadel/sound/vox/eliminate.ogg differ
diff --git a/modular_citadel/sound/vox/emergency.ogg b/modular_citadel/sound/vox/emergency.ogg
new file mode 100644
index 0000000000..5d2e068944
Binary files /dev/null and b/modular_citadel/sound/vox/emergency.ogg differ
diff --git a/modular_citadel/sound/vox/enemy.ogg b/modular_citadel/sound/vox/enemy.ogg
new file mode 100644
index 0000000000..ecee923235
Binary files /dev/null and b/modular_citadel/sound/vox/enemy.ogg differ
diff --git a/modular_citadel/sound/vox/energy.ogg b/modular_citadel/sound/vox/energy.ogg
new file mode 100644
index 0000000000..82d07e95dd
Binary files /dev/null and b/modular_citadel/sound/vox/energy.ogg differ
diff --git a/modular_citadel/sound/vox/engage.ogg b/modular_citadel/sound/vox/engage.ogg
new file mode 100644
index 0000000000..7e1cf2e625
Binary files /dev/null and b/modular_citadel/sound/vox/engage.ogg differ
diff --git a/modular_citadel/sound/vox/engaged.ogg b/modular_citadel/sound/vox/engaged.ogg
new file mode 100644
index 0000000000..0e8196b026
Binary files /dev/null and b/modular_citadel/sound/vox/engaged.ogg differ
diff --git a/modular_citadel/sound/vox/engine.ogg b/modular_citadel/sound/vox/engine.ogg
new file mode 100644
index 0000000000..0ed1b4bd80
Binary files /dev/null and b/modular_citadel/sound/vox/engine.ogg differ
diff --git a/modular_citadel/sound/vox/enter.ogg b/modular_citadel/sound/vox/enter.ogg
new file mode 100644
index 0000000000..d7392eeada
Binary files /dev/null and b/modular_citadel/sound/vox/enter.ogg differ
diff --git a/modular_citadel/sound/vox/entry.ogg b/modular_citadel/sound/vox/entry.ogg
new file mode 100644
index 0000000000..1ef6b14442
Binary files /dev/null and b/modular_citadel/sound/vox/entry.ogg differ
diff --git a/modular_citadel/sound/vox/environment.ogg b/modular_citadel/sound/vox/environment.ogg
new file mode 100644
index 0000000000..d05ba3106a
Binary files /dev/null and b/modular_citadel/sound/vox/environment.ogg differ
diff --git a/modular_citadel/sound/vox/error.ogg b/modular_citadel/sound/vox/error.ogg
new file mode 100644
index 0000000000..237191732a
Binary files /dev/null and b/modular_citadel/sound/vox/error.ogg differ
diff --git a/modular_citadel/sound/vox/escape.ogg b/modular_citadel/sound/vox/escape.ogg
new file mode 100644
index 0000000000..15e1181ac6
Binary files /dev/null and b/modular_citadel/sound/vox/escape.ogg differ
diff --git a/modular_citadel/sound/vox/evacuate.ogg b/modular_citadel/sound/vox/evacuate.ogg
new file mode 100644
index 0000000000..d0d755f1ba
Binary files /dev/null and b/modular_citadel/sound/vox/evacuate.ogg differ
diff --git a/modular_citadel/sound/vox/exchange.ogg b/modular_citadel/sound/vox/exchange.ogg
new file mode 100644
index 0000000000..d69eac774a
Binary files /dev/null and b/modular_citadel/sound/vox/exchange.ogg differ
diff --git a/modular_citadel/sound/vox/exit.ogg b/modular_citadel/sound/vox/exit.ogg
new file mode 100644
index 0000000000..a201b6b76b
Binary files /dev/null and b/modular_citadel/sound/vox/exit.ogg differ
diff --git a/modular_citadel/sound/vox/expect.ogg b/modular_citadel/sound/vox/expect.ogg
new file mode 100644
index 0000000000..95e559fdd3
Binary files /dev/null and b/modular_citadel/sound/vox/expect.ogg differ
diff --git a/modular_citadel/sound/vox/experiment.ogg b/modular_citadel/sound/vox/experiment.ogg
new file mode 100644
index 0000000000..34ef253e69
Binary files /dev/null and b/modular_citadel/sound/vox/experiment.ogg differ
diff --git a/modular_citadel/sound/vox/experimental.ogg b/modular_citadel/sound/vox/experimental.ogg
new file mode 100644
index 0000000000..6635998222
Binary files /dev/null and b/modular_citadel/sound/vox/experimental.ogg differ
diff --git a/modular_citadel/sound/vox/explode.ogg b/modular_citadel/sound/vox/explode.ogg
new file mode 100644
index 0000000000..16b38926e4
Binary files /dev/null and b/modular_citadel/sound/vox/explode.ogg differ
diff --git a/modular_citadel/sound/vox/explosion.ogg b/modular_citadel/sound/vox/explosion.ogg
new file mode 100644
index 0000000000..ede66453bd
Binary files /dev/null and b/modular_citadel/sound/vox/explosion.ogg differ
diff --git a/modular_citadel/sound/vox/exposure.ogg b/modular_citadel/sound/vox/exposure.ogg
new file mode 100644
index 0000000000..d2f66ca1ba
Binary files /dev/null and b/modular_citadel/sound/vox/exposure.ogg differ
diff --git a/modular_citadel/sound/vox/exterminate.ogg b/modular_citadel/sound/vox/exterminate.ogg
new file mode 100644
index 0000000000..34be77f8e2
Binary files /dev/null and b/modular_citadel/sound/vox/exterminate.ogg differ
diff --git a/modular_citadel/sound/vox/extinguish.ogg b/modular_citadel/sound/vox/extinguish.ogg
new file mode 100644
index 0000000000..c003ff4547
Binary files /dev/null and b/modular_citadel/sound/vox/extinguish.ogg differ
diff --git a/modular_citadel/sound/vox/extinguisher.ogg b/modular_citadel/sound/vox/extinguisher.ogg
new file mode 100644
index 0000000000..d23b898014
Binary files /dev/null and b/modular_citadel/sound/vox/extinguisher.ogg differ
diff --git a/modular_citadel/sound/vox/extreme.ogg b/modular_citadel/sound/vox/extreme.ogg
new file mode 100644
index 0000000000..c3f5a2d9f0
Binary files /dev/null and b/modular_citadel/sound/vox/extreme.ogg differ
diff --git a/modular_citadel/sound/vox/f.ogg b/modular_citadel/sound/vox/f.ogg
new file mode 100644
index 0000000000..344734986f
Binary files /dev/null and b/modular_citadel/sound/vox/f.ogg differ
diff --git a/modular_citadel/sound/vox/face.ogg b/modular_citadel/sound/vox/face.ogg
new file mode 100644
index 0000000000..acdd8722ef
Binary files /dev/null and b/modular_citadel/sound/vox/face.ogg differ
diff --git a/modular_citadel/sound/vox/facility.ogg b/modular_citadel/sound/vox/facility.ogg
new file mode 100644
index 0000000000..43649febb0
Binary files /dev/null and b/modular_citadel/sound/vox/facility.ogg differ
diff --git a/modular_citadel/sound/vox/fahrenheit.ogg b/modular_citadel/sound/vox/fahrenheit.ogg
new file mode 100644
index 0000000000..4730726ea4
Binary files /dev/null and b/modular_citadel/sound/vox/fahrenheit.ogg differ
diff --git a/modular_citadel/sound/vox/failed.ogg b/modular_citadel/sound/vox/failed.ogg
new file mode 100644
index 0000000000..f801962345
Binary files /dev/null and b/modular_citadel/sound/vox/failed.ogg differ
diff --git a/modular_citadel/sound/vox/failure.ogg b/modular_citadel/sound/vox/failure.ogg
new file mode 100644
index 0000000000..e9b5808f27
Binary files /dev/null and b/modular_citadel/sound/vox/failure.ogg differ
diff --git a/modular_citadel/sound/vox/farthest.ogg b/modular_citadel/sound/vox/farthest.ogg
new file mode 100644
index 0000000000..3d18f669b1
Binary files /dev/null and b/modular_citadel/sound/vox/farthest.ogg differ
diff --git a/modular_citadel/sound/vox/fast.ogg b/modular_citadel/sound/vox/fast.ogg
new file mode 100644
index 0000000000..dbf82c32a4
Binary files /dev/null and b/modular_citadel/sound/vox/fast.ogg differ
diff --git a/modular_citadel/sound/vox/feet.ogg b/modular_citadel/sound/vox/feet.ogg
new file mode 100644
index 0000000000..eba093e73d
Binary files /dev/null and b/modular_citadel/sound/vox/feet.ogg differ
diff --git a/modular_citadel/sound/vox/field.ogg b/modular_citadel/sound/vox/field.ogg
new file mode 100644
index 0000000000..bba79e6ddd
Binary files /dev/null and b/modular_citadel/sound/vox/field.ogg differ
diff --git a/modular_citadel/sound/vox/fifteen.ogg b/modular_citadel/sound/vox/fifteen.ogg
new file mode 100644
index 0000000000..60eca844ae
Binary files /dev/null and b/modular_citadel/sound/vox/fifteen.ogg differ
diff --git a/modular_citadel/sound/vox/fifth.ogg b/modular_citadel/sound/vox/fifth.ogg
new file mode 100644
index 0000000000..d6a76567d2
Binary files /dev/null and b/modular_citadel/sound/vox/fifth.ogg differ
diff --git a/modular_citadel/sound/vox/fifty.ogg b/modular_citadel/sound/vox/fifty.ogg
new file mode 100644
index 0000000000..30fd60072b
Binary files /dev/null and b/modular_citadel/sound/vox/fifty.ogg differ
diff --git a/modular_citadel/sound/vox/final.ogg b/modular_citadel/sound/vox/final.ogg
new file mode 100644
index 0000000000..d06bef9fc2
Binary files /dev/null and b/modular_citadel/sound/vox/final.ogg differ
diff --git a/modular_citadel/sound/vox/fine.ogg b/modular_citadel/sound/vox/fine.ogg
new file mode 100644
index 0000000000..3445a9ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fine.ogg differ
diff --git a/modular_citadel/sound/vox/fire.ogg b/modular_citadel/sound/vox/fire.ogg
new file mode 100644
index 0000000000..094043b953
Binary files /dev/null and b/modular_citadel/sound/vox/fire.ogg differ
diff --git a/modular_citadel/sound/vox/first.ogg b/modular_citadel/sound/vox/first.ogg
new file mode 100644
index 0000000000..84977e4eb7
Binary files /dev/null and b/modular_citadel/sound/vox/first.ogg differ
diff --git a/modular_citadel/sound/vox/five.ogg b/modular_citadel/sound/vox/five.ogg
new file mode 100644
index 0000000000..0a28539c34
Binary files /dev/null and b/modular_citadel/sound/vox/five.ogg differ
diff --git a/modular_citadel/sound/vox/flag.ogg b/modular_citadel/sound/vox/flag.ogg
new file mode 100644
index 0000000000..0d13587d60
Binary files /dev/null and b/modular_citadel/sound/vox/flag.ogg differ
diff --git a/modular_citadel/sound/vox/flooding.ogg b/modular_citadel/sound/vox/flooding.ogg
new file mode 100644
index 0000000000..c32bf475f5
Binary files /dev/null and b/modular_citadel/sound/vox/flooding.ogg differ
diff --git a/modular_citadel/sound/vox/floor.ogg b/modular_citadel/sound/vox/floor.ogg
new file mode 100644
index 0000000000..14d4a84131
Binary files /dev/null and b/modular_citadel/sound/vox/floor.ogg differ
diff --git a/modular_citadel/sound/vox/fool.ogg b/modular_citadel/sound/vox/fool.ogg
new file mode 100644
index 0000000000..965251cc4a
Binary files /dev/null and b/modular_citadel/sound/vox/fool.ogg differ
diff --git a/modular_citadel/sound/vox/for.ogg b/modular_citadel/sound/vox/for.ogg
new file mode 100644
index 0000000000..b69a8f4b6c
Binary files /dev/null and b/modular_citadel/sound/vox/for.ogg differ
diff --git a/modular_citadel/sound/vox/forbidden.ogg b/modular_citadel/sound/vox/forbidden.ogg
new file mode 100644
index 0000000000..23daae8496
Binary files /dev/null and b/modular_citadel/sound/vox/forbidden.ogg differ
diff --git a/modular_citadel/sound/vox/force.ogg b/modular_citadel/sound/vox/force.ogg
new file mode 100644
index 0000000000..ff4cb84c3a
Binary files /dev/null and b/modular_citadel/sound/vox/force.ogg differ
diff --git a/modular_citadel/sound/vox/forms.ogg b/modular_citadel/sound/vox/forms.ogg
new file mode 100644
index 0000000000..7ef1862bb6
Binary files /dev/null and b/modular_citadel/sound/vox/forms.ogg differ
diff --git a/modular_citadel/sound/vox/found.ogg b/modular_citadel/sound/vox/found.ogg
new file mode 100644
index 0000000000..660a2f8520
Binary files /dev/null and b/modular_citadel/sound/vox/found.ogg differ
diff --git a/modular_citadel/sound/vox/four.ogg b/modular_citadel/sound/vox/four.ogg
new file mode 100644
index 0000000000..df8adfcd31
Binary files /dev/null and b/modular_citadel/sound/vox/four.ogg differ
diff --git a/modular_citadel/sound/vox/fourteen.ogg b/modular_citadel/sound/vox/fourteen.ogg
new file mode 100644
index 0000000000..21b61a0fd5
Binary files /dev/null and b/modular_citadel/sound/vox/fourteen.ogg differ
diff --git a/modular_citadel/sound/vox/fourth.ogg b/modular_citadel/sound/vox/fourth.ogg
new file mode 100644
index 0000000000..986102ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fourth.ogg differ
diff --git a/modular_citadel/sound/vox/fourty.ogg b/modular_citadel/sound/vox/fourty.ogg
new file mode 100644
index 0000000000..b0edb0a7c7
Binary files /dev/null and b/modular_citadel/sound/vox/fourty.ogg differ
diff --git a/modular_citadel/sound/vox/foxtrot.ogg b/modular_citadel/sound/vox/foxtrot.ogg
new file mode 100644
index 0000000000..3be534fd22
Binary files /dev/null and b/modular_citadel/sound/vox/foxtrot.ogg differ
diff --git a/modular_citadel/sound/vox/freeman.ogg b/modular_citadel/sound/vox/freeman.ogg
new file mode 100644
index 0000000000..b2bc590942
Binary files /dev/null and b/modular_citadel/sound/vox/freeman.ogg differ
diff --git a/modular_citadel/sound/vox/freezer.ogg b/modular_citadel/sound/vox/freezer.ogg
new file mode 100644
index 0000000000..6bb30ad953
Binary files /dev/null and b/modular_citadel/sound/vox/freezer.ogg differ
diff --git a/modular_citadel/sound/vox/from.ogg b/modular_citadel/sound/vox/from.ogg
new file mode 100644
index 0000000000..535de03d14
Binary files /dev/null and b/modular_citadel/sound/vox/from.ogg differ
diff --git a/modular_citadel/sound/vox/front.ogg b/modular_citadel/sound/vox/front.ogg
new file mode 100644
index 0000000000..f1755a788b
Binary files /dev/null and b/modular_citadel/sound/vox/front.ogg differ
diff --git a/modular_citadel/sound/vox/fuel.ogg b/modular_citadel/sound/vox/fuel.ogg
new file mode 100644
index 0000000000..53d7889314
Binary files /dev/null and b/modular_citadel/sound/vox/fuel.ogg differ
diff --git a/modular_citadel/sound/vox/g.ogg b/modular_citadel/sound/vox/g.ogg
new file mode 100644
index 0000000000..a3702ca3e5
Binary files /dev/null and b/modular_citadel/sound/vox/g.ogg differ
diff --git a/modular_citadel/sound/vox/gay.ogg b/modular_citadel/sound/vox/gay.ogg
new file mode 100644
index 0000000000..a70d05716b
Binary files /dev/null and b/modular_citadel/sound/vox/gay.ogg differ
diff --git a/modular_citadel/sound/vox/get.ogg b/modular_citadel/sound/vox/get.ogg
new file mode 100644
index 0000000000..b5c0d47cd5
Binary files /dev/null and b/modular_citadel/sound/vox/get.ogg differ
diff --git a/modular_citadel/sound/vox/go.ogg b/modular_citadel/sound/vox/go.ogg
new file mode 100644
index 0000000000..f7dcb56f8e
Binary files /dev/null and b/modular_citadel/sound/vox/go.ogg differ
diff --git a/modular_citadel/sound/vox/going.ogg b/modular_citadel/sound/vox/going.ogg
new file mode 100644
index 0000000000..3ff4fe5427
Binary files /dev/null and b/modular_citadel/sound/vox/going.ogg differ
diff --git a/modular_citadel/sound/vox/good.ogg b/modular_citadel/sound/vox/good.ogg
new file mode 100644
index 0000000000..c8115bb5fb
Binary files /dev/null and b/modular_citadel/sound/vox/good.ogg differ
diff --git a/modular_citadel/sound/vox/goodbye.ogg b/modular_citadel/sound/vox/goodbye.ogg
new file mode 100644
index 0000000000..e793ba2fa6
Binary files /dev/null and b/modular_citadel/sound/vox/goodbye.ogg differ
diff --git a/modular_citadel/sound/vox/gordon.ogg b/modular_citadel/sound/vox/gordon.ogg
new file mode 100644
index 0000000000..5d5ab4ddba
Binary files /dev/null and b/modular_citadel/sound/vox/gordon.ogg differ
diff --git a/modular_citadel/sound/vox/got.ogg b/modular_citadel/sound/vox/got.ogg
new file mode 100644
index 0000000000..3d712c9fc4
Binary files /dev/null and b/modular_citadel/sound/vox/got.ogg differ
diff --git a/modular_citadel/sound/vox/government.ogg b/modular_citadel/sound/vox/government.ogg
new file mode 100644
index 0000000000..830b59bac2
Binary files /dev/null and b/modular_citadel/sound/vox/government.ogg differ
diff --git a/modular_citadel/sound/vox/granted.ogg b/modular_citadel/sound/vox/granted.ogg
new file mode 100644
index 0000000000..4dae196cf6
Binary files /dev/null and b/modular_citadel/sound/vox/granted.ogg differ
diff --git a/modular_citadel/sound/vox/great.ogg b/modular_citadel/sound/vox/great.ogg
new file mode 100644
index 0000000000..d820a56179
Binary files /dev/null and b/modular_citadel/sound/vox/great.ogg differ
diff --git a/modular_citadel/sound/vox/green.ogg b/modular_citadel/sound/vox/green.ogg
new file mode 100644
index 0000000000..05f6e6b0fa
Binary files /dev/null and b/modular_citadel/sound/vox/green.ogg differ
diff --git a/modular_citadel/sound/vox/grenade.ogg b/modular_citadel/sound/vox/grenade.ogg
new file mode 100644
index 0000000000..971a5d515b
Binary files /dev/null and b/modular_citadel/sound/vox/grenade.ogg differ
diff --git a/modular_citadel/sound/vox/guard.ogg b/modular_citadel/sound/vox/guard.ogg
new file mode 100644
index 0000000000..795ba08486
Binary files /dev/null and b/modular_citadel/sound/vox/guard.ogg differ
diff --git a/modular_citadel/sound/vox/gulf.ogg b/modular_citadel/sound/vox/gulf.ogg
new file mode 100644
index 0000000000..87cc1f953d
Binary files /dev/null and b/modular_citadel/sound/vox/gulf.ogg differ
diff --git a/modular_citadel/sound/vox/gun.ogg b/modular_citadel/sound/vox/gun.ogg
new file mode 100644
index 0000000000..472620ea76
Binary files /dev/null and b/modular_citadel/sound/vox/gun.ogg differ
diff --git a/modular_citadel/sound/vox/guthrie.ogg b/modular_citadel/sound/vox/guthrie.ogg
new file mode 100644
index 0000000000..b87c5f6cb1
Binary files /dev/null and b/modular_citadel/sound/vox/guthrie.ogg differ
diff --git a/modular_citadel/sound/vox/handling.ogg b/modular_citadel/sound/vox/handling.ogg
new file mode 100644
index 0000000000..be05e82d75
Binary files /dev/null and b/modular_citadel/sound/vox/handling.ogg differ
diff --git a/modular_citadel/sound/vox/hangar.ogg b/modular_citadel/sound/vox/hangar.ogg
new file mode 100644
index 0000000000..d6fe4084ae
Binary files /dev/null and b/modular_citadel/sound/vox/hangar.ogg differ
diff --git a/modular_citadel/sound/vox/has.ogg b/modular_citadel/sound/vox/has.ogg
new file mode 100644
index 0000000000..055cb0dc15
Binary files /dev/null and b/modular_citadel/sound/vox/has.ogg differ
diff --git a/modular_citadel/sound/vox/have.ogg b/modular_citadel/sound/vox/have.ogg
new file mode 100644
index 0000000000..c514165582
Binary files /dev/null and b/modular_citadel/sound/vox/have.ogg differ
diff --git a/modular_citadel/sound/vox/hazard.ogg b/modular_citadel/sound/vox/hazard.ogg
new file mode 100644
index 0000000000..032b1fb251
Binary files /dev/null and b/modular_citadel/sound/vox/hazard.ogg differ
diff --git a/modular_citadel/sound/vox/head.ogg b/modular_citadel/sound/vox/head.ogg
new file mode 100644
index 0000000000..e4902fcc6f
Binary files /dev/null and b/modular_citadel/sound/vox/head.ogg differ
diff --git a/modular_citadel/sound/vox/health.ogg b/modular_citadel/sound/vox/health.ogg
new file mode 100644
index 0000000000..c11ad1bcf2
Binary files /dev/null and b/modular_citadel/sound/vox/health.ogg differ
diff --git a/modular_citadel/sound/vox/heat.ogg b/modular_citadel/sound/vox/heat.ogg
new file mode 100644
index 0000000000..a6c0752ab8
Binary files /dev/null and b/modular_citadel/sound/vox/heat.ogg differ
diff --git a/modular_citadel/sound/vox/helicopter.ogg b/modular_citadel/sound/vox/helicopter.ogg
new file mode 100644
index 0000000000..6bfe6466b2
Binary files /dev/null and b/modular_citadel/sound/vox/helicopter.ogg differ
diff --git a/modular_citadel/sound/vox/helium.ogg b/modular_citadel/sound/vox/helium.ogg
new file mode 100644
index 0000000000..4a5c8326a5
Binary files /dev/null and b/modular_citadel/sound/vox/helium.ogg differ
diff --git a/modular_citadel/sound/vox/hello.ogg b/modular_citadel/sound/vox/hello.ogg
new file mode 100644
index 0000000000..622e4669ef
Binary files /dev/null and b/modular_citadel/sound/vox/hello.ogg differ
diff --git a/modular_citadel/sound/vox/help.ogg b/modular_citadel/sound/vox/help.ogg
new file mode 100644
index 0000000000..038438d63b
Binary files /dev/null and b/modular_citadel/sound/vox/help.ogg differ
diff --git a/modular_citadel/sound/vox/here.ogg b/modular_citadel/sound/vox/here.ogg
new file mode 100644
index 0000000000..ef69f1b282
Binary files /dev/null and b/modular_citadel/sound/vox/here.ogg differ
diff --git a/modular_citadel/sound/vox/hide.ogg b/modular_citadel/sound/vox/hide.ogg
new file mode 100644
index 0000000000..aa329d1f72
Binary files /dev/null and b/modular_citadel/sound/vox/hide.ogg differ
diff --git a/modular_citadel/sound/vox/high.ogg b/modular_citadel/sound/vox/high.ogg
new file mode 100644
index 0000000000..c20e382388
Binary files /dev/null and b/modular_citadel/sound/vox/high.ogg differ
diff --git a/modular_citadel/sound/vox/highest.ogg b/modular_citadel/sound/vox/highest.ogg
new file mode 100644
index 0000000000..d64bfd528c
Binary files /dev/null and b/modular_citadel/sound/vox/highest.ogg differ
diff --git a/modular_citadel/sound/vox/hit.ogg b/modular_citadel/sound/vox/hit.ogg
new file mode 100644
index 0000000000..bfe3cd0501
Binary files /dev/null and b/modular_citadel/sound/vox/hit.ogg differ
diff --git a/modular_citadel/sound/vox/holds.ogg b/modular_citadel/sound/vox/holds.ogg
new file mode 100644
index 0000000000..41b88d990e
Binary files /dev/null and b/modular_citadel/sound/vox/holds.ogg differ
diff --git a/modular_citadel/sound/vox/hole.ogg b/modular_citadel/sound/vox/hole.ogg
new file mode 100644
index 0000000000..a5dea701c8
Binary files /dev/null and b/modular_citadel/sound/vox/hole.ogg differ
diff --git a/modular_citadel/sound/vox/hostile.ogg b/modular_citadel/sound/vox/hostile.ogg
new file mode 100644
index 0000000000..7b8e495c87
Binary files /dev/null and b/modular_citadel/sound/vox/hostile.ogg differ
diff --git a/modular_citadel/sound/vox/hot.ogg b/modular_citadel/sound/vox/hot.ogg
new file mode 100644
index 0000000000..508f643856
Binary files /dev/null and b/modular_citadel/sound/vox/hot.ogg differ
diff --git a/modular_citadel/sound/vox/hotel.ogg b/modular_citadel/sound/vox/hotel.ogg
new file mode 100644
index 0000000000..5a5b66cdbf
Binary files /dev/null and b/modular_citadel/sound/vox/hotel.ogg differ
diff --git a/modular_citadel/sound/vox/hour.ogg b/modular_citadel/sound/vox/hour.ogg
new file mode 100644
index 0000000000..39f0fd0917
Binary files /dev/null and b/modular_citadel/sound/vox/hour.ogg differ
diff --git a/modular_citadel/sound/vox/hours.ogg b/modular_citadel/sound/vox/hours.ogg
new file mode 100644
index 0000000000..691b7a643b
Binary files /dev/null and b/modular_citadel/sound/vox/hours.ogg differ
diff --git a/modular_citadel/sound/vox/hundred.ogg b/modular_citadel/sound/vox/hundred.ogg
new file mode 100644
index 0000000000..3a254a137a
Binary files /dev/null and b/modular_citadel/sound/vox/hundred.ogg differ
diff --git a/modular_citadel/sound/vox/hydro.ogg b/modular_citadel/sound/vox/hydro.ogg
new file mode 100644
index 0000000000..47c9ad5d01
Binary files /dev/null and b/modular_citadel/sound/vox/hydro.ogg differ
diff --git a/modular_citadel/sound/vox/i.ogg b/modular_citadel/sound/vox/i.ogg
new file mode 100644
index 0000000000..1c4ce81b7a
Binary files /dev/null and b/modular_citadel/sound/vox/i.ogg differ
diff --git a/modular_citadel/sound/vox/idiot.ogg b/modular_citadel/sound/vox/idiot.ogg
new file mode 100644
index 0000000000..66e058effc
Binary files /dev/null and b/modular_citadel/sound/vox/idiot.ogg differ
diff --git a/modular_citadel/sound/vox/illegal.ogg b/modular_citadel/sound/vox/illegal.ogg
new file mode 100644
index 0000000000..e1f22738bd
Binary files /dev/null and b/modular_citadel/sound/vox/illegal.ogg differ
diff --git a/modular_citadel/sound/vox/immediate.ogg b/modular_citadel/sound/vox/immediate.ogg
new file mode 100644
index 0000000000..3e551dfa57
Binary files /dev/null and b/modular_citadel/sound/vox/immediate.ogg differ
diff --git a/modular_citadel/sound/vox/immediately.ogg b/modular_citadel/sound/vox/immediately.ogg
new file mode 100644
index 0000000000..0ca780ddac
Binary files /dev/null and b/modular_citadel/sound/vox/immediately.ogg differ
diff --git a/modular_citadel/sound/vox/in.ogg b/modular_citadel/sound/vox/in.ogg
new file mode 100644
index 0000000000..e0b20f4795
Binary files /dev/null and b/modular_citadel/sound/vox/in.ogg differ
diff --git a/modular_citadel/sound/vox/inches.ogg b/modular_citadel/sound/vox/inches.ogg
new file mode 100644
index 0000000000..058f8e9131
Binary files /dev/null and b/modular_citadel/sound/vox/inches.ogg differ
diff --git a/modular_citadel/sound/vox/india.ogg b/modular_citadel/sound/vox/india.ogg
new file mode 100644
index 0000000000..1eefc45266
Binary files /dev/null and b/modular_citadel/sound/vox/india.ogg differ
diff --git a/modular_citadel/sound/vox/ing.ogg b/modular_citadel/sound/vox/ing.ogg
new file mode 100644
index 0000000000..d8c5c72fc9
Binary files /dev/null and b/modular_citadel/sound/vox/ing.ogg differ
diff --git a/modular_citadel/sound/vox/inoperative.ogg b/modular_citadel/sound/vox/inoperative.ogg
new file mode 100644
index 0000000000..01f13af948
Binary files /dev/null and b/modular_citadel/sound/vox/inoperative.ogg differ
diff --git a/modular_citadel/sound/vox/inside.ogg b/modular_citadel/sound/vox/inside.ogg
new file mode 100644
index 0000000000..778f4539ed
Binary files /dev/null and b/modular_citadel/sound/vox/inside.ogg differ
diff --git a/modular_citadel/sound/vox/inspection.ogg b/modular_citadel/sound/vox/inspection.ogg
new file mode 100644
index 0000000000..60a2b3e788
Binary files /dev/null and b/modular_citadel/sound/vox/inspection.ogg differ
diff --git a/modular_citadel/sound/vox/inspector.ogg b/modular_citadel/sound/vox/inspector.ogg
new file mode 100644
index 0000000000..177651d631
Binary files /dev/null and b/modular_citadel/sound/vox/inspector.ogg differ
diff --git a/modular_citadel/sound/vox/interchange.ogg b/modular_citadel/sound/vox/interchange.ogg
new file mode 100644
index 0000000000..6c4230d2d1
Binary files /dev/null and b/modular_citadel/sound/vox/interchange.ogg differ
diff --git a/modular_citadel/sound/vox/intruder.ogg b/modular_citadel/sound/vox/intruder.ogg
new file mode 100644
index 0000000000..db4810966f
Binary files /dev/null and b/modular_citadel/sound/vox/intruder.ogg differ
diff --git a/modular_citadel/sound/vox/invallid.ogg b/modular_citadel/sound/vox/invallid.ogg
new file mode 100644
index 0000000000..b2e5628fa5
Binary files /dev/null and b/modular_citadel/sound/vox/invallid.ogg differ
diff --git a/modular_citadel/sound/vox/invasion.ogg b/modular_citadel/sound/vox/invasion.ogg
new file mode 100644
index 0000000000..8e9a41fc10
Binary files /dev/null and b/modular_citadel/sound/vox/invasion.ogg differ
diff --git a/modular_citadel/sound/vox/is.ogg b/modular_citadel/sound/vox/is.ogg
new file mode 100644
index 0000000000..db3ca1dc81
Binary files /dev/null and b/modular_citadel/sound/vox/is.ogg differ
diff --git a/modular_citadel/sound/vox/it.ogg b/modular_citadel/sound/vox/it.ogg
new file mode 100644
index 0000000000..c0d3de3992
Binary files /dev/null and b/modular_citadel/sound/vox/it.ogg differ
diff --git a/modular_citadel/sound/vox/johnson.ogg b/modular_citadel/sound/vox/johnson.ogg
new file mode 100644
index 0000000000..ea74d8a61f
Binary files /dev/null and b/modular_citadel/sound/vox/johnson.ogg differ
diff --git a/modular_citadel/sound/vox/juliet.ogg b/modular_citadel/sound/vox/juliet.ogg
new file mode 100644
index 0000000000..c9a61b63ab
Binary files /dev/null and b/modular_citadel/sound/vox/juliet.ogg differ
diff --git a/modular_citadel/sound/vox/key.ogg b/modular_citadel/sound/vox/key.ogg
new file mode 100644
index 0000000000..b761d5c1f9
Binary files /dev/null and b/modular_citadel/sound/vox/key.ogg differ
diff --git a/modular_citadel/sound/vox/kill.ogg b/modular_citadel/sound/vox/kill.ogg
new file mode 100644
index 0000000000..00db499476
Binary files /dev/null and b/modular_citadel/sound/vox/kill.ogg differ
diff --git a/modular_citadel/sound/vox/kilo.ogg b/modular_citadel/sound/vox/kilo.ogg
new file mode 100644
index 0000000000..7786c4fc7c
Binary files /dev/null and b/modular_citadel/sound/vox/kilo.ogg differ
diff --git a/modular_citadel/sound/vox/kit.ogg b/modular_citadel/sound/vox/kit.ogg
new file mode 100644
index 0000000000..15bbe46087
Binary files /dev/null and b/modular_citadel/sound/vox/kit.ogg differ
diff --git a/modular_citadel/sound/vox/lab.ogg b/modular_citadel/sound/vox/lab.ogg
new file mode 100644
index 0000000000..2031fdd255
Binary files /dev/null and b/modular_citadel/sound/vox/lab.ogg differ
diff --git a/modular_citadel/sound/vox/lambda.ogg b/modular_citadel/sound/vox/lambda.ogg
new file mode 100644
index 0000000000..f933c45376
Binary files /dev/null and b/modular_citadel/sound/vox/lambda.ogg differ
diff --git a/modular_citadel/sound/vox/laser.ogg b/modular_citadel/sound/vox/laser.ogg
new file mode 100644
index 0000000000..04b5ec4341
Binary files /dev/null and b/modular_citadel/sound/vox/laser.ogg differ
diff --git a/modular_citadel/sound/vox/last.ogg b/modular_citadel/sound/vox/last.ogg
new file mode 100644
index 0000000000..9ce61ac234
Binary files /dev/null and b/modular_citadel/sound/vox/last.ogg differ
diff --git a/modular_citadel/sound/vox/launch.ogg b/modular_citadel/sound/vox/launch.ogg
new file mode 100644
index 0000000000..c8e3b0820e
Binary files /dev/null and b/modular_citadel/sound/vox/launch.ogg differ
diff --git a/modular_citadel/sound/vox/leak.ogg b/modular_citadel/sound/vox/leak.ogg
new file mode 100644
index 0000000000..3154ac53c3
Binary files /dev/null and b/modular_citadel/sound/vox/leak.ogg differ
diff --git a/modular_citadel/sound/vox/leave.ogg b/modular_citadel/sound/vox/leave.ogg
new file mode 100644
index 0000000000..cec4a6befd
Binary files /dev/null and b/modular_citadel/sound/vox/leave.ogg differ
diff --git a/modular_citadel/sound/vox/left.ogg b/modular_citadel/sound/vox/left.ogg
new file mode 100644
index 0000000000..c6f32829ad
Binary files /dev/null and b/modular_citadel/sound/vox/left.ogg differ
diff --git a/modular_citadel/sound/vox/legal.ogg b/modular_citadel/sound/vox/legal.ogg
new file mode 100644
index 0000000000..c8f5163bd1
Binary files /dev/null and b/modular_citadel/sound/vox/legal.ogg differ
diff --git a/modular_citadel/sound/vox/level.ogg b/modular_citadel/sound/vox/level.ogg
new file mode 100644
index 0000000000..4d898a5ef7
Binary files /dev/null and b/modular_citadel/sound/vox/level.ogg differ
diff --git a/modular_citadel/sound/vox/lever.ogg b/modular_citadel/sound/vox/lever.ogg
new file mode 100644
index 0000000000..28c8c33e76
Binary files /dev/null and b/modular_citadel/sound/vox/lever.ogg differ
diff --git a/modular_citadel/sound/vox/lie.ogg b/modular_citadel/sound/vox/lie.ogg
new file mode 100644
index 0000000000..1516dc0072
Binary files /dev/null and b/modular_citadel/sound/vox/lie.ogg differ
diff --git a/modular_citadel/sound/vox/lieutenant.ogg b/modular_citadel/sound/vox/lieutenant.ogg
new file mode 100644
index 0000000000..1393b36008
Binary files /dev/null and b/modular_citadel/sound/vox/lieutenant.ogg differ
diff --git a/modular_citadel/sound/vox/life.ogg b/modular_citadel/sound/vox/life.ogg
new file mode 100644
index 0000000000..0d03320ce2
Binary files /dev/null and b/modular_citadel/sound/vox/life.ogg differ
diff --git a/modular_citadel/sound/vox/light.ogg b/modular_citadel/sound/vox/light.ogg
new file mode 100644
index 0000000000..c4e8a9fc78
Binary files /dev/null and b/modular_citadel/sound/vox/light.ogg differ
diff --git a/modular_citadel/sound/vox/lima.ogg b/modular_citadel/sound/vox/lima.ogg
new file mode 100644
index 0000000000..84e26666cf
Binary files /dev/null and b/modular_citadel/sound/vox/lima.ogg differ
diff --git a/modular_citadel/sound/vox/liquid.ogg b/modular_citadel/sound/vox/liquid.ogg
new file mode 100644
index 0000000000..b942e3cf6c
Binary files /dev/null and b/modular_citadel/sound/vox/liquid.ogg differ
diff --git a/modular_citadel/sound/vox/loading.ogg b/modular_citadel/sound/vox/loading.ogg
new file mode 100644
index 0000000000..2dfefd952e
Binary files /dev/null and b/modular_citadel/sound/vox/loading.ogg differ
diff --git a/modular_citadel/sound/vox/locate.ogg b/modular_citadel/sound/vox/locate.ogg
new file mode 100644
index 0000000000..2ea19ec257
Binary files /dev/null and b/modular_citadel/sound/vox/locate.ogg differ
diff --git a/modular_citadel/sound/vox/located.ogg b/modular_citadel/sound/vox/located.ogg
new file mode 100644
index 0000000000..cd161b556b
Binary files /dev/null and b/modular_citadel/sound/vox/located.ogg differ
diff --git a/modular_citadel/sound/vox/location.ogg b/modular_citadel/sound/vox/location.ogg
new file mode 100644
index 0000000000..966c9ae3f6
Binary files /dev/null and b/modular_citadel/sound/vox/location.ogg differ
diff --git a/modular_citadel/sound/vox/lock.ogg b/modular_citadel/sound/vox/lock.ogg
new file mode 100644
index 0000000000..c4c89992db
Binary files /dev/null and b/modular_citadel/sound/vox/lock.ogg differ
diff --git a/modular_citadel/sound/vox/locked.ogg b/modular_citadel/sound/vox/locked.ogg
new file mode 100644
index 0000000000..d1a05ba323
Binary files /dev/null and b/modular_citadel/sound/vox/locked.ogg differ
diff --git a/modular_citadel/sound/vox/locker.ogg b/modular_citadel/sound/vox/locker.ogg
new file mode 100644
index 0000000000..2c5c9ccb4b
Binary files /dev/null and b/modular_citadel/sound/vox/locker.ogg differ
diff --git a/modular_citadel/sound/vox/lockout.ogg b/modular_citadel/sound/vox/lockout.ogg
new file mode 100644
index 0000000000..36748ecb71
Binary files /dev/null and b/modular_citadel/sound/vox/lockout.ogg differ
diff --git a/modular_citadel/sound/vox/lower.ogg b/modular_citadel/sound/vox/lower.ogg
new file mode 100644
index 0000000000..a3a6a3ae9d
Binary files /dev/null and b/modular_citadel/sound/vox/lower.ogg differ
diff --git a/modular_citadel/sound/vox/lowest.ogg b/modular_citadel/sound/vox/lowest.ogg
new file mode 100644
index 0000000000..787fa2a961
Binary files /dev/null and b/modular_citadel/sound/vox/lowest.ogg differ
diff --git a/modular_citadel/sound/vox/magnetic.ogg b/modular_citadel/sound/vox/magnetic.ogg
new file mode 100644
index 0000000000..1211ab1cfd
Binary files /dev/null and b/modular_citadel/sound/vox/magnetic.ogg differ
diff --git a/modular_citadel/sound/vox/main.ogg b/modular_citadel/sound/vox/main.ogg
new file mode 100644
index 0000000000..a1e49b2c16
Binary files /dev/null and b/modular_citadel/sound/vox/main.ogg differ
diff --git a/modular_citadel/sound/vox/maintenance.ogg b/modular_citadel/sound/vox/maintenance.ogg
new file mode 100644
index 0000000000..691fea8b60
Binary files /dev/null and b/modular_citadel/sound/vox/maintenance.ogg differ
diff --git a/modular_citadel/sound/vox/malfunction.ogg b/modular_citadel/sound/vox/malfunction.ogg
new file mode 100644
index 0000000000..5e0d416d4f
Binary files /dev/null and b/modular_citadel/sound/vox/malfunction.ogg differ
diff --git a/modular_citadel/sound/vox/man.ogg b/modular_citadel/sound/vox/man.ogg
new file mode 100644
index 0000000000..10ca95640a
Binary files /dev/null and b/modular_citadel/sound/vox/man.ogg differ
diff --git a/modular_citadel/sound/vox/mass.ogg b/modular_citadel/sound/vox/mass.ogg
new file mode 100644
index 0000000000..6b785f5e8b
Binary files /dev/null and b/modular_citadel/sound/vox/mass.ogg differ
diff --git a/modular_citadel/sound/vox/materials.ogg b/modular_citadel/sound/vox/materials.ogg
new file mode 100644
index 0000000000..0321e579f7
Binary files /dev/null and b/modular_citadel/sound/vox/materials.ogg differ
diff --git a/modular_citadel/sound/vox/maximum.ogg b/modular_citadel/sound/vox/maximum.ogg
new file mode 100644
index 0000000000..ef566342a7
Binary files /dev/null and b/modular_citadel/sound/vox/maximum.ogg differ
diff --git a/modular_citadel/sound/vox/may.ogg b/modular_citadel/sound/vox/may.ogg
new file mode 100644
index 0000000000..2f9fa02cf0
Binary files /dev/null and b/modular_citadel/sound/vox/may.ogg differ
diff --git a/modular_citadel/sound/vox/med.ogg b/modular_citadel/sound/vox/med.ogg
new file mode 100644
index 0000000000..280a12362f
Binary files /dev/null and b/modular_citadel/sound/vox/med.ogg differ
diff --git a/modular_citadel/sound/vox/medical.ogg b/modular_citadel/sound/vox/medical.ogg
new file mode 100644
index 0000000000..3a293f31b2
Binary files /dev/null and b/modular_citadel/sound/vox/medical.ogg differ
diff --git a/modular_citadel/sound/vox/men.ogg b/modular_citadel/sound/vox/men.ogg
new file mode 100644
index 0000000000..a9e92245f1
Binary files /dev/null and b/modular_citadel/sound/vox/men.ogg differ
diff --git a/modular_citadel/sound/vox/mercy.ogg b/modular_citadel/sound/vox/mercy.ogg
new file mode 100644
index 0000000000..2de89bc70a
Binary files /dev/null and b/modular_citadel/sound/vox/mercy.ogg differ
diff --git a/modular_citadel/sound/vox/mesa.ogg b/modular_citadel/sound/vox/mesa.ogg
new file mode 100644
index 0000000000..649d3671ba
Binary files /dev/null and b/modular_citadel/sound/vox/mesa.ogg differ
diff --git a/modular_citadel/sound/vox/message.ogg b/modular_citadel/sound/vox/message.ogg
new file mode 100644
index 0000000000..1454e3df9e
Binary files /dev/null and b/modular_citadel/sound/vox/message.ogg differ
diff --git a/modular_citadel/sound/vox/meter.ogg b/modular_citadel/sound/vox/meter.ogg
new file mode 100644
index 0000000000..7afc6fb3d1
Binary files /dev/null and b/modular_citadel/sound/vox/meter.ogg differ
diff --git a/modular_citadel/sound/vox/micro.ogg b/modular_citadel/sound/vox/micro.ogg
new file mode 100644
index 0000000000..38d59ed2de
Binary files /dev/null and b/modular_citadel/sound/vox/micro.ogg differ
diff --git a/modular_citadel/sound/vox/middle.ogg b/modular_citadel/sound/vox/middle.ogg
new file mode 100644
index 0000000000..ef33287eff
Binary files /dev/null and b/modular_citadel/sound/vox/middle.ogg differ
diff --git a/modular_citadel/sound/vox/mike.ogg b/modular_citadel/sound/vox/mike.ogg
new file mode 100644
index 0000000000..27d4fdeb9e
Binary files /dev/null and b/modular_citadel/sound/vox/mike.ogg differ
diff --git a/modular_citadel/sound/vox/miles.ogg b/modular_citadel/sound/vox/miles.ogg
new file mode 100644
index 0000000000..fbf06913e2
Binary files /dev/null and b/modular_citadel/sound/vox/miles.ogg differ
diff --git a/modular_citadel/sound/vox/military.ogg b/modular_citadel/sound/vox/military.ogg
new file mode 100644
index 0000000000..8273851291
Binary files /dev/null and b/modular_citadel/sound/vox/military.ogg differ
diff --git a/modular_citadel/sound/vox/milli.ogg b/modular_citadel/sound/vox/milli.ogg
new file mode 100644
index 0000000000..806bccebab
Binary files /dev/null and b/modular_citadel/sound/vox/milli.ogg differ
diff --git a/modular_citadel/sound/vox/million.ogg b/modular_citadel/sound/vox/million.ogg
new file mode 100644
index 0000000000..e4c10a2d86
Binary files /dev/null and b/modular_citadel/sound/vox/million.ogg differ
diff --git a/modular_citadel/sound/vox/minefield.ogg b/modular_citadel/sound/vox/minefield.ogg
new file mode 100644
index 0000000000..b437449d1d
Binary files /dev/null and b/modular_citadel/sound/vox/minefield.ogg differ
diff --git a/modular_citadel/sound/vox/minimum.ogg b/modular_citadel/sound/vox/minimum.ogg
new file mode 100644
index 0000000000..a15483bde6
Binary files /dev/null and b/modular_citadel/sound/vox/minimum.ogg differ
diff --git a/modular_citadel/sound/vox/minutes.ogg b/modular_citadel/sound/vox/minutes.ogg
new file mode 100644
index 0000000000..2b7bf579ea
Binary files /dev/null and b/modular_citadel/sound/vox/minutes.ogg differ
diff --git a/modular_citadel/sound/vox/mister.ogg b/modular_citadel/sound/vox/mister.ogg
new file mode 100644
index 0000000000..bc5409bbed
Binary files /dev/null and b/modular_citadel/sound/vox/mister.ogg differ
diff --git a/modular_citadel/sound/vox/mode.ogg b/modular_citadel/sound/vox/mode.ogg
new file mode 100644
index 0000000000..04d6684bde
Binary files /dev/null and b/modular_citadel/sound/vox/mode.ogg differ
diff --git a/modular_citadel/sound/vox/motor.ogg b/modular_citadel/sound/vox/motor.ogg
new file mode 100644
index 0000000000..5a3084201a
Binary files /dev/null and b/modular_citadel/sound/vox/motor.ogg differ
diff --git a/modular_citadel/sound/vox/motorpool.ogg b/modular_citadel/sound/vox/motorpool.ogg
new file mode 100644
index 0000000000..a29772d545
Binary files /dev/null and b/modular_citadel/sound/vox/motorpool.ogg differ
diff --git a/modular_citadel/sound/vox/move.ogg b/modular_citadel/sound/vox/move.ogg
new file mode 100644
index 0000000000..cc6344813f
Binary files /dev/null and b/modular_citadel/sound/vox/move.ogg differ
diff --git a/modular_citadel/sound/vox/must.ogg b/modular_citadel/sound/vox/must.ogg
new file mode 100644
index 0000000000..d52d2c85e0
Binary files /dev/null and b/modular_citadel/sound/vox/must.ogg differ
diff --git a/modular_citadel/sound/vox/nearest.ogg b/modular_citadel/sound/vox/nearest.ogg
new file mode 100644
index 0000000000..fdf34564ad
Binary files /dev/null and b/modular_citadel/sound/vox/nearest.ogg differ
diff --git a/modular_citadel/sound/vox/nice.ogg b/modular_citadel/sound/vox/nice.ogg
new file mode 100644
index 0000000000..102f0eaf87
Binary files /dev/null and b/modular_citadel/sound/vox/nice.ogg differ
diff --git a/modular_citadel/sound/vox/nine.ogg b/modular_citadel/sound/vox/nine.ogg
new file mode 100644
index 0000000000..1d4fd45add
Binary files /dev/null and b/modular_citadel/sound/vox/nine.ogg differ
diff --git a/modular_citadel/sound/vox/nineteen.ogg b/modular_citadel/sound/vox/nineteen.ogg
new file mode 100644
index 0000000000..907ecc6e92
Binary files /dev/null and b/modular_citadel/sound/vox/nineteen.ogg differ
diff --git a/modular_citadel/sound/vox/ninety.ogg b/modular_citadel/sound/vox/ninety.ogg
new file mode 100644
index 0000000000..0f1c3c4fb5
Binary files /dev/null and b/modular_citadel/sound/vox/ninety.ogg differ
diff --git a/modular_citadel/sound/vox/no.ogg b/modular_citadel/sound/vox/no.ogg
new file mode 100644
index 0000000000..85d8497891
Binary files /dev/null and b/modular_citadel/sound/vox/no.ogg differ
diff --git a/modular_citadel/sound/vox/nominal.ogg b/modular_citadel/sound/vox/nominal.ogg
new file mode 100644
index 0000000000..45da127f1b
Binary files /dev/null and b/modular_citadel/sound/vox/nominal.ogg differ
diff --git a/modular_citadel/sound/vox/north.ogg b/modular_citadel/sound/vox/north.ogg
new file mode 100644
index 0000000000..03eb6f88d2
Binary files /dev/null and b/modular_citadel/sound/vox/north.ogg differ
diff --git a/modular_citadel/sound/vox/not.ogg b/modular_citadel/sound/vox/not.ogg
new file mode 100644
index 0000000000..bc691af375
Binary files /dev/null and b/modular_citadel/sound/vox/not.ogg differ
diff --git a/modular_citadel/sound/vox/november.ogg b/modular_citadel/sound/vox/november.ogg
new file mode 100644
index 0000000000..4819c132dc
Binary files /dev/null and b/modular_citadel/sound/vox/november.ogg differ
diff --git a/modular_citadel/sound/vox/now.ogg b/modular_citadel/sound/vox/now.ogg
new file mode 100644
index 0000000000..0e26869bac
Binary files /dev/null and b/modular_citadel/sound/vox/now.ogg differ
diff --git a/modular_citadel/sound/vox/number.ogg b/modular_citadel/sound/vox/number.ogg
new file mode 100644
index 0000000000..c139db7d17
Binary files /dev/null and b/modular_citadel/sound/vox/number.ogg differ
diff --git a/modular_citadel/sound/vox/objective.ogg b/modular_citadel/sound/vox/objective.ogg
new file mode 100644
index 0000000000..2496f83ccf
Binary files /dev/null and b/modular_citadel/sound/vox/objective.ogg differ
diff --git a/modular_citadel/sound/vox/observation.ogg b/modular_citadel/sound/vox/observation.ogg
new file mode 100644
index 0000000000..af04410915
Binary files /dev/null and b/modular_citadel/sound/vox/observation.ogg differ
diff --git a/modular_citadel/sound/vox/of.ogg b/modular_citadel/sound/vox/of.ogg
new file mode 100644
index 0000000000..ee71e1a46e
Binary files /dev/null and b/modular_citadel/sound/vox/of.ogg differ
diff --git a/modular_citadel/sound/vox/officer.ogg b/modular_citadel/sound/vox/officer.ogg
new file mode 100644
index 0000000000..c9f94915e6
Binary files /dev/null and b/modular_citadel/sound/vox/officer.ogg differ
diff --git a/modular_citadel/sound/vox/ok.ogg b/modular_citadel/sound/vox/ok.ogg
new file mode 100644
index 0000000000..cf58af4d13
Binary files /dev/null and b/modular_citadel/sound/vox/ok.ogg differ
diff --git a/modular_citadel/sound/vox/on.ogg b/modular_citadel/sound/vox/on.ogg
new file mode 100644
index 0000000000..3c59c6abd8
Binary files /dev/null and b/modular_citadel/sound/vox/on.ogg differ
diff --git a/modular_citadel/sound/vox/one.ogg b/modular_citadel/sound/vox/one.ogg
new file mode 100644
index 0000000000..377f270179
Binary files /dev/null and b/modular_citadel/sound/vox/one.ogg differ
diff --git a/modular_citadel/sound/vox/open.ogg b/modular_citadel/sound/vox/open.ogg
new file mode 100644
index 0000000000..81c11de72f
Binary files /dev/null and b/modular_citadel/sound/vox/open.ogg differ
diff --git a/modular_citadel/sound/vox/operating.ogg b/modular_citadel/sound/vox/operating.ogg
new file mode 100644
index 0000000000..cd2de79d79
Binary files /dev/null and b/modular_citadel/sound/vox/operating.ogg differ
diff --git a/modular_citadel/sound/vox/operations.ogg b/modular_citadel/sound/vox/operations.ogg
new file mode 100644
index 0000000000..9323d95f46
Binary files /dev/null and b/modular_citadel/sound/vox/operations.ogg differ
diff --git a/modular_citadel/sound/vox/operative.ogg b/modular_citadel/sound/vox/operative.ogg
new file mode 100644
index 0000000000..ba9c7d0cf4
Binary files /dev/null and b/modular_citadel/sound/vox/operative.ogg differ
diff --git a/modular_citadel/sound/vox/option.ogg b/modular_citadel/sound/vox/option.ogg
new file mode 100644
index 0000000000..c404be5556
Binary files /dev/null and b/modular_citadel/sound/vox/option.ogg differ
diff --git a/modular_citadel/sound/vox/order.ogg b/modular_citadel/sound/vox/order.ogg
new file mode 100644
index 0000000000..2961f353ed
Binary files /dev/null and b/modular_citadel/sound/vox/order.ogg differ
diff --git a/modular_citadel/sound/vox/organic.ogg b/modular_citadel/sound/vox/organic.ogg
new file mode 100644
index 0000000000..6195be46b4
Binary files /dev/null and b/modular_citadel/sound/vox/organic.ogg differ
diff --git a/modular_citadel/sound/vox/oscar.ogg b/modular_citadel/sound/vox/oscar.ogg
new file mode 100644
index 0000000000..5f43814f5e
Binary files /dev/null and b/modular_citadel/sound/vox/oscar.ogg differ
diff --git a/modular_citadel/sound/vox/out.ogg b/modular_citadel/sound/vox/out.ogg
new file mode 100644
index 0000000000..3a64ae9751
Binary files /dev/null and b/modular_citadel/sound/vox/out.ogg differ
diff --git a/modular_citadel/sound/vox/outside.ogg b/modular_citadel/sound/vox/outside.ogg
new file mode 100644
index 0000000000..a6417b9f97
Binary files /dev/null and b/modular_citadel/sound/vox/outside.ogg differ
diff --git a/modular_citadel/sound/vox/over.ogg b/modular_citadel/sound/vox/over.ogg
new file mode 100644
index 0000000000..193bbd797b
Binary files /dev/null and b/modular_citadel/sound/vox/over.ogg differ
diff --git a/modular_citadel/sound/vox/overload.ogg b/modular_citadel/sound/vox/overload.ogg
new file mode 100644
index 0000000000..d90e52e97d
Binary files /dev/null and b/modular_citadel/sound/vox/overload.ogg differ
diff --git a/modular_citadel/sound/vox/override.ogg b/modular_citadel/sound/vox/override.ogg
new file mode 100644
index 0000000000..f2efb63799
Binary files /dev/null and b/modular_citadel/sound/vox/override.ogg differ
diff --git a/modular_citadel/sound/vox/pacify.ogg b/modular_citadel/sound/vox/pacify.ogg
new file mode 100644
index 0000000000..232865ebe2
Binary files /dev/null and b/modular_citadel/sound/vox/pacify.ogg differ
diff --git a/modular_citadel/sound/vox/pain.ogg b/modular_citadel/sound/vox/pain.ogg
new file mode 100644
index 0000000000..88e8813158
Binary files /dev/null and b/modular_citadel/sound/vox/pain.ogg differ
diff --git a/modular_citadel/sound/vox/pal.ogg b/modular_citadel/sound/vox/pal.ogg
new file mode 100644
index 0000000000..185a15a6ac
Binary files /dev/null and b/modular_citadel/sound/vox/pal.ogg differ
diff --git a/modular_citadel/sound/vox/panel.ogg b/modular_citadel/sound/vox/panel.ogg
new file mode 100644
index 0000000000..e200e9ddd9
Binary files /dev/null and b/modular_citadel/sound/vox/panel.ogg differ
diff --git a/modular_citadel/sound/vox/percent.ogg b/modular_citadel/sound/vox/percent.ogg
new file mode 100644
index 0000000000..43c04572ba
Binary files /dev/null and b/modular_citadel/sound/vox/percent.ogg differ
diff --git a/modular_citadel/sound/vox/perimeter.ogg b/modular_citadel/sound/vox/perimeter.ogg
new file mode 100644
index 0000000000..7bd3f039ef
Binary files /dev/null and b/modular_citadel/sound/vox/perimeter.ogg differ
diff --git a/modular_citadel/sound/vox/period.ogg b/modular_citadel/sound/vox/period.ogg
new file mode 100644
index 0000000000..e333dc159b
Binary files /dev/null and b/modular_citadel/sound/vox/period.ogg differ
diff --git a/modular_citadel/sound/vox/permitted.ogg b/modular_citadel/sound/vox/permitted.ogg
new file mode 100644
index 0000000000..832fec7c24
Binary files /dev/null and b/modular_citadel/sound/vox/permitted.ogg differ
diff --git a/modular_citadel/sound/vox/personnel.ogg b/modular_citadel/sound/vox/personnel.ogg
new file mode 100644
index 0000000000..f499fb9f1d
Binary files /dev/null and b/modular_citadel/sound/vox/personnel.ogg differ
diff --git a/modular_citadel/sound/vox/pipe.ogg b/modular_citadel/sound/vox/pipe.ogg
new file mode 100644
index 0000000000..63ab07e4cb
Binary files /dev/null and b/modular_citadel/sound/vox/pipe.ogg differ
diff --git a/modular_citadel/sound/vox/plant.ogg b/modular_citadel/sound/vox/plant.ogg
new file mode 100644
index 0000000000..d82d73900d
Binary files /dev/null and b/modular_citadel/sound/vox/plant.ogg differ
diff --git a/modular_citadel/sound/vox/platform.ogg b/modular_citadel/sound/vox/platform.ogg
new file mode 100644
index 0000000000..cf9eb6ce53
Binary files /dev/null and b/modular_citadel/sound/vox/platform.ogg differ
diff --git a/modular_citadel/sound/vox/please.ogg b/modular_citadel/sound/vox/please.ogg
new file mode 100644
index 0000000000..cc21919798
Binary files /dev/null and b/modular_citadel/sound/vox/please.ogg differ
diff --git a/modular_citadel/sound/vox/point.ogg b/modular_citadel/sound/vox/point.ogg
new file mode 100644
index 0000000000..29925c714c
Binary files /dev/null and b/modular_citadel/sound/vox/point.ogg differ
diff --git a/modular_citadel/sound/vox/portal.ogg b/modular_citadel/sound/vox/portal.ogg
new file mode 100644
index 0000000000..4492842d97
Binary files /dev/null and b/modular_citadel/sound/vox/portal.ogg differ
diff --git a/modular_citadel/sound/vox/power.ogg b/modular_citadel/sound/vox/power.ogg
new file mode 100644
index 0000000000..109dde7b19
Binary files /dev/null and b/modular_citadel/sound/vox/power.ogg differ
diff --git a/modular_citadel/sound/vox/presence.ogg b/modular_citadel/sound/vox/presence.ogg
new file mode 100644
index 0000000000..fc929ee991
Binary files /dev/null and b/modular_citadel/sound/vox/presence.ogg differ
diff --git a/modular_citadel/sound/vox/press.ogg b/modular_citadel/sound/vox/press.ogg
new file mode 100644
index 0000000000..704c907141
Binary files /dev/null and b/modular_citadel/sound/vox/press.ogg differ
diff --git a/modular_citadel/sound/vox/primary.ogg b/modular_citadel/sound/vox/primary.ogg
new file mode 100644
index 0000000000..6f667e6a57
Binary files /dev/null and b/modular_citadel/sound/vox/primary.ogg differ
diff --git a/modular_citadel/sound/vox/proceed.ogg b/modular_citadel/sound/vox/proceed.ogg
new file mode 100644
index 0000000000..86df9fcf25
Binary files /dev/null and b/modular_citadel/sound/vox/proceed.ogg differ
diff --git a/modular_citadel/sound/vox/processing.ogg b/modular_citadel/sound/vox/processing.ogg
new file mode 100644
index 0000000000..f5aae3574c
Binary files /dev/null and b/modular_citadel/sound/vox/processing.ogg differ
diff --git a/modular_citadel/sound/vox/progress.ogg b/modular_citadel/sound/vox/progress.ogg
new file mode 100644
index 0000000000..c07c102a97
Binary files /dev/null and b/modular_citadel/sound/vox/progress.ogg differ
diff --git a/modular_citadel/sound/vox/proper.ogg b/modular_citadel/sound/vox/proper.ogg
new file mode 100644
index 0000000000..0dbfbaf599
Binary files /dev/null and b/modular_citadel/sound/vox/proper.ogg differ
diff --git a/modular_citadel/sound/vox/propulsion.ogg b/modular_citadel/sound/vox/propulsion.ogg
new file mode 100644
index 0000000000..8a4a77274a
Binary files /dev/null and b/modular_citadel/sound/vox/propulsion.ogg differ
diff --git a/modular_citadel/sound/vox/prosecute.ogg b/modular_citadel/sound/vox/prosecute.ogg
new file mode 100644
index 0000000000..c0895c54ef
Binary files /dev/null and b/modular_citadel/sound/vox/prosecute.ogg differ
diff --git a/modular_citadel/sound/vox/protective.ogg b/modular_citadel/sound/vox/protective.ogg
new file mode 100644
index 0000000000..67c1f1195b
Binary files /dev/null and b/modular_citadel/sound/vox/protective.ogg differ
diff --git a/modular_citadel/sound/vox/push.ogg b/modular_citadel/sound/vox/push.ogg
new file mode 100644
index 0000000000..2d9cfca1f7
Binary files /dev/null and b/modular_citadel/sound/vox/push.ogg differ
diff --git a/modular_citadel/sound/vox/quantum.ogg b/modular_citadel/sound/vox/quantum.ogg
new file mode 100644
index 0000000000..5082f84e7d
Binary files /dev/null and b/modular_citadel/sound/vox/quantum.ogg differ
diff --git a/modular_citadel/sound/vox/quebec.ogg b/modular_citadel/sound/vox/quebec.ogg
new file mode 100644
index 0000000000..59e84cd4a3
Binary files /dev/null and b/modular_citadel/sound/vox/quebec.ogg differ
diff --git a/modular_citadel/sound/vox/question.ogg b/modular_citadel/sound/vox/question.ogg
new file mode 100644
index 0000000000..197f11ca9a
Binary files /dev/null and b/modular_citadel/sound/vox/question.ogg differ
diff --git a/modular_citadel/sound/vox/questioning.ogg b/modular_citadel/sound/vox/questioning.ogg
new file mode 100644
index 0000000000..ba0436cf32
Binary files /dev/null and b/modular_citadel/sound/vox/questioning.ogg differ
diff --git a/modular_citadel/sound/vox/quick.ogg b/modular_citadel/sound/vox/quick.ogg
new file mode 100644
index 0000000000..19d4e91261
Binary files /dev/null and b/modular_citadel/sound/vox/quick.ogg differ
diff --git a/modular_citadel/sound/vox/quit.ogg b/modular_citadel/sound/vox/quit.ogg
new file mode 100644
index 0000000000..7ab07efa87
Binary files /dev/null and b/modular_citadel/sound/vox/quit.ogg differ
diff --git a/modular_citadel/sound/vox/radiation.ogg b/modular_citadel/sound/vox/radiation.ogg
new file mode 100644
index 0000000000..8d8fbdc001
Binary files /dev/null and b/modular_citadel/sound/vox/radiation.ogg differ
diff --git a/modular_citadel/sound/vox/radioactive.ogg b/modular_citadel/sound/vox/radioactive.ogg
new file mode 100644
index 0000000000..f5751882d4
Binary files /dev/null and b/modular_citadel/sound/vox/radioactive.ogg differ
diff --git a/modular_citadel/sound/vox/rads.ogg b/modular_citadel/sound/vox/rads.ogg
new file mode 100644
index 0000000000..e42722dd62
Binary files /dev/null and b/modular_citadel/sound/vox/rads.ogg differ
diff --git a/modular_citadel/sound/vox/rapid.ogg b/modular_citadel/sound/vox/rapid.ogg
new file mode 100644
index 0000000000..c803204bc8
Binary files /dev/null and b/modular_citadel/sound/vox/rapid.ogg differ
diff --git a/modular_citadel/sound/vox/reach.ogg b/modular_citadel/sound/vox/reach.ogg
new file mode 100644
index 0000000000..ab1a02e9ee
Binary files /dev/null and b/modular_citadel/sound/vox/reach.ogg differ
diff --git a/modular_citadel/sound/vox/reached.ogg b/modular_citadel/sound/vox/reached.ogg
new file mode 100644
index 0000000000..eddba60eed
Binary files /dev/null and b/modular_citadel/sound/vox/reached.ogg differ
diff --git a/modular_citadel/sound/vox/reactor.ogg b/modular_citadel/sound/vox/reactor.ogg
new file mode 100644
index 0000000000..75ea481a37
Binary files /dev/null and b/modular_citadel/sound/vox/reactor.ogg differ
diff --git a/modular_citadel/sound/vox/red.ogg b/modular_citadel/sound/vox/red.ogg
new file mode 100644
index 0000000000..97f2513772
Binary files /dev/null and b/modular_citadel/sound/vox/red.ogg differ
diff --git a/modular_citadel/sound/vox/relay.ogg b/modular_citadel/sound/vox/relay.ogg
new file mode 100644
index 0000000000..edc904c3f4
Binary files /dev/null and b/modular_citadel/sound/vox/relay.ogg differ
diff --git a/modular_citadel/sound/vox/released.ogg b/modular_citadel/sound/vox/released.ogg
new file mode 100644
index 0000000000..b86a39af72
Binary files /dev/null and b/modular_citadel/sound/vox/released.ogg differ
diff --git a/modular_citadel/sound/vox/remaining.ogg b/modular_citadel/sound/vox/remaining.ogg
new file mode 100644
index 0000000000..3ca55d3373
Binary files /dev/null and b/modular_citadel/sound/vox/remaining.ogg differ
diff --git a/modular_citadel/sound/vox/renegade.ogg b/modular_citadel/sound/vox/renegade.ogg
new file mode 100644
index 0000000000..6a4a3f3d50
Binary files /dev/null and b/modular_citadel/sound/vox/renegade.ogg differ
diff --git a/modular_citadel/sound/vox/repair.ogg b/modular_citadel/sound/vox/repair.ogg
new file mode 100644
index 0000000000..9435fe2ade
Binary files /dev/null and b/modular_citadel/sound/vox/repair.ogg differ
diff --git a/modular_citadel/sound/vox/report.ogg b/modular_citadel/sound/vox/report.ogg
new file mode 100644
index 0000000000..873ad6cbfe
Binary files /dev/null and b/modular_citadel/sound/vox/report.ogg differ
diff --git a/modular_citadel/sound/vox/reports.ogg b/modular_citadel/sound/vox/reports.ogg
new file mode 100644
index 0000000000..2fbf3151d0
Binary files /dev/null and b/modular_citadel/sound/vox/reports.ogg differ
diff --git a/modular_citadel/sound/vox/required.ogg b/modular_citadel/sound/vox/required.ogg
new file mode 100644
index 0000000000..902071124c
Binary files /dev/null and b/modular_citadel/sound/vox/required.ogg differ
diff --git a/modular_citadel/sound/vox/research.ogg b/modular_citadel/sound/vox/research.ogg
new file mode 100644
index 0000000000..c75b2ad2d0
Binary files /dev/null and b/modular_citadel/sound/vox/research.ogg differ
diff --git a/modular_citadel/sound/vox/reset.ogg b/modular_citadel/sound/vox/reset.ogg
new file mode 100644
index 0000000000..9864b79a54
Binary files /dev/null and b/modular_citadel/sound/vox/reset.ogg differ
diff --git a/modular_citadel/sound/vox/resevoir.ogg b/modular_citadel/sound/vox/resevoir.ogg
new file mode 100644
index 0000000000..30364c6400
Binary files /dev/null and b/modular_citadel/sound/vox/resevoir.ogg differ
diff --git a/modular_citadel/sound/vox/resistance.ogg b/modular_citadel/sound/vox/resistance.ogg
new file mode 100644
index 0000000000..dfbe6c512d
Binary files /dev/null and b/modular_citadel/sound/vox/resistance.ogg differ
diff --git a/modular_citadel/sound/vox/returned.ogg b/modular_citadel/sound/vox/returned.ogg
new file mode 100644
index 0000000000..0119402e24
Binary files /dev/null and b/modular_citadel/sound/vox/returned.ogg differ
diff --git a/modular_citadel/sound/vox/right.ogg b/modular_citadel/sound/vox/right.ogg
new file mode 100644
index 0000000000..b46b8cb135
Binary files /dev/null and b/modular_citadel/sound/vox/right.ogg differ
diff --git a/modular_citadel/sound/vox/rocket.ogg b/modular_citadel/sound/vox/rocket.ogg
new file mode 100644
index 0000000000..bfb2d3b0ed
Binary files /dev/null and b/modular_citadel/sound/vox/rocket.ogg differ
diff --git a/modular_citadel/sound/vox/roger.ogg b/modular_citadel/sound/vox/roger.ogg
new file mode 100644
index 0000000000..b249613c56
Binary files /dev/null and b/modular_citadel/sound/vox/roger.ogg differ
diff --git a/modular_citadel/sound/vox/romeo.ogg b/modular_citadel/sound/vox/romeo.ogg
new file mode 100644
index 0000000000..4c0b2356e3
Binary files /dev/null and b/modular_citadel/sound/vox/romeo.ogg differ
diff --git a/modular_citadel/sound/vox/room.ogg b/modular_citadel/sound/vox/room.ogg
new file mode 100644
index 0000000000..5151e39d46
Binary files /dev/null and b/modular_citadel/sound/vox/room.ogg differ
diff --git a/modular_citadel/sound/vox/round.ogg b/modular_citadel/sound/vox/round.ogg
new file mode 100644
index 0000000000..685f42d223
Binary files /dev/null and b/modular_citadel/sound/vox/round.ogg differ
diff --git a/modular_citadel/sound/vox/run.ogg b/modular_citadel/sound/vox/run.ogg
new file mode 100644
index 0000000000..9d6012cf3b
Binary files /dev/null and b/modular_citadel/sound/vox/run.ogg differ
diff --git a/modular_citadel/sound/vox/safe.ogg b/modular_citadel/sound/vox/safe.ogg
new file mode 100644
index 0000000000..d7a16d66b4
Binary files /dev/null and b/modular_citadel/sound/vox/safe.ogg differ
diff --git a/modular_citadel/sound/vox/safety.ogg b/modular_citadel/sound/vox/safety.ogg
new file mode 100644
index 0000000000..68ad663df4
Binary files /dev/null and b/modular_citadel/sound/vox/safety.ogg differ
diff --git a/modular_citadel/sound/vox/sargeant.ogg b/modular_citadel/sound/vox/sargeant.ogg
new file mode 100644
index 0000000000..1ab4150c9c
Binary files /dev/null and b/modular_citadel/sound/vox/sargeant.ogg differ
diff --git a/modular_citadel/sound/vox/satellite.ogg b/modular_citadel/sound/vox/satellite.ogg
new file mode 100644
index 0000000000..c07895ab77
Binary files /dev/null and b/modular_citadel/sound/vox/satellite.ogg differ
diff --git a/modular_citadel/sound/vox/save.ogg b/modular_citadel/sound/vox/save.ogg
new file mode 100644
index 0000000000..8a53055d62
Binary files /dev/null and b/modular_citadel/sound/vox/save.ogg differ
diff --git a/modular_citadel/sound/vox/science.ogg b/modular_citadel/sound/vox/science.ogg
new file mode 100644
index 0000000000..6e2e748cbb
Binary files /dev/null and b/modular_citadel/sound/vox/science.ogg differ
diff --git a/modular_citadel/sound/vox/scores.ogg b/modular_citadel/sound/vox/scores.ogg
new file mode 100644
index 0000000000..3328f38dc7
Binary files /dev/null and b/modular_citadel/sound/vox/scores.ogg differ
diff --git a/modular_citadel/sound/vox/scream.ogg b/modular_citadel/sound/vox/scream.ogg
new file mode 100644
index 0000000000..c795ca95ba
Binary files /dev/null and b/modular_citadel/sound/vox/scream.ogg differ
diff --git a/modular_citadel/sound/vox/screen.ogg b/modular_citadel/sound/vox/screen.ogg
new file mode 100644
index 0000000000..514cc3f71a
Binary files /dev/null and b/modular_citadel/sound/vox/screen.ogg differ
diff --git a/modular_citadel/sound/vox/search.ogg b/modular_citadel/sound/vox/search.ogg
new file mode 100644
index 0000000000..638710b721
Binary files /dev/null and b/modular_citadel/sound/vox/search.ogg differ
diff --git a/modular_citadel/sound/vox/second.ogg b/modular_citadel/sound/vox/second.ogg
new file mode 100644
index 0000000000..fc4dc806ca
Binary files /dev/null and b/modular_citadel/sound/vox/second.ogg differ
diff --git a/modular_citadel/sound/vox/secondary.ogg b/modular_citadel/sound/vox/secondary.ogg
new file mode 100644
index 0000000000..3cffa3dbe9
Binary files /dev/null and b/modular_citadel/sound/vox/secondary.ogg differ
diff --git a/modular_citadel/sound/vox/seconds.ogg b/modular_citadel/sound/vox/seconds.ogg
new file mode 100644
index 0000000000..98d08be46c
Binary files /dev/null and b/modular_citadel/sound/vox/seconds.ogg differ
diff --git a/modular_citadel/sound/vox/sector.ogg b/modular_citadel/sound/vox/sector.ogg
new file mode 100644
index 0000000000..ae2d733b87
Binary files /dev/null and b/modular_citadel/sound/vox/sector.ogg differ
diff --git a/modular_citadel/sound/vox/secure.ogg b/modular_citadel/sound/vox/secure.ogg
new file mode 100644
index 0000000000..c860e376dd
Binary files /dev/null and b/modular_citadel/sound/vox/secure.ogg differ
diff --git a/modular_citadel/sound/vox/secured.ogg b/modular_citadel/sound/vox/secured.ogg
new file mode 100644
index 0000000000..3134b679fa
Binary files /dev/null and b/modular_citadel/sound/vox/secured.ogg differ
diff --git a/modular_citadel/sound/vox/security.ogg b/modular_citadel/sound/vox/security.ogg
new file mode 100644
index 0000000000..40f6bc61af
Binary files /dev/null and b/modular_citadel/sound/vox/security.ogg differ
diff --git a/modular_citadel/sound/vox/select.ogg b/modular_citadel/sound/vox/select.ogg
new file mode 100644
index 0000000000..ef04570d32
Binary files /dev/null and b/modular_citadel/sound/vox/select.ogg differ
diff --git a/modular_citadel/sound/vox/selected.ogg b/modular_citadel/sound/vox/selected.ogg
new file mode 100644
index 0000000000..23891f5189
Binary files /dev/null and b/modular_citadel/sound/vox/selected.ogg differ
diff --git a/modular_citadel/sound/vox/service.ogg b/modular_citadel/sound/vox/service.ogg
new file mode 100644
index 0000000000..90294bd34b
Binary files /dev/null and b/modular_citadel/sound/vox/service.ogg differ
diff --git a/modular_citadel/sound/vox/seven.ogg b/modular_citadel/sound/vox/seven.ogg
new file mode 100644
index 0000000000..a0b2de4119
Binary files /dev/null and b/modular_citadel/sound/vox/seven.ogg differ
diff --git a/modular_citadel/sound/vox/seventeen.ogg b/modular_citadel/sound/vox/seventeen.ogg
new file mode 100644
index 0000000000..f23a0b0572
Binary files /dev/null and b/modular_citadel/sound/vox/seventeen.ogg differ
diff --git a/modular_citadel/sound/vox/seventy.ogg b/modular_citadel/sound/vox/seventy.ogg
new file mode 100644
index 0000000000..54f6cd6aef
Binary files /dev/null and b/modular_citadel/sound/vox/seventy.ogg differ
diff --git a/modular_citadel/sound/vox/severe.ogg b/modular_citadel/sound/vox/severe.ogg
new file mode 100644
index 0000000000..9a0cf3784e
Binary files /dev/null and b/modular_citadel/sound/vox/severe.ogg differ
diff --git a/modular_citadel/sound/vox/sewage.ogg b/modular_citadel/sound/vox/sewage.ogg
new file mode 100644
index 0000000000..44fb0d7fd5
Binary files /dev/null and b/modular_citadel/sound/vox/sewage.ogg differ
diff --git a/modular_citadel/sound/vox/sewer.ogg b/modular_citadel/sound/vox/sewer.ogg
new file mode 100644
index 0000000000..10516d86de
Binary files /dev/null and b/modular_citadel/sound/vox/sewer.ogg differ
diff --git a/modular_citadel/sound/vox/shield.ogg b/modular_citadel/sound/vox/shield.ogg
new file mode 100644
index 0000000000..c190383867
Binary files /dev/null and b/modular_citadel/sound/vox/shield.ogg differ
diff --git a/modular_citadel/sound/vox/shipment.ogg b/modular_citadel/sound/vox/shipment.ogg
new file mode 100644
index 0000000000..9677d3db98
Binary files /dev/null and b/modular_citadel/sound/vox/shipment.ogg differ
diff --git a/modular_citadel/sound/vox/shock.ogg b/modular_citadel/sound/vox/shock.ogg
new file mode 100644
index 0000000000..1c44bcca33
Binary files /dev/null and b/modular_citadel/sound/vox/shock.ogg differ
diff --git a/modular_citadel/sound/vox/shoot.ogg b/modular_citadel/sound/vox/shoot.ogg
new file mode 100644
index 0000000000..978a4aaa35
Binary files /dev/null and b/modular_citadel/sound/vox/shoot.ogg differ
diff --git a/modular_citadel/sound/vox/shower.ogg b/modular_citadel/sound/vox/shower.ogg
new file mode 100644
index 0000000000..d131987f13
Binary files /dev/null and b/modular_citadel/sound/vox/shower.ogg differ
diff --git a/modular_citadel/sound/vox/shut.ogg b/modular_citadel/sound/vox/shut.ogg
new file mode 100644
index 0000000000..ceba400b93
Binary files /dev/null and b/modular_citadel/sound/vox/shut.ogg differ
diff --git a/modular_citadel/sound/vox/side.ogg b/modular_citadel/sound/vox/side.ogg
new file mode 100644
index 0000000000..dbc3a7c9ff
Binary files /dev/null and b/modular_citadel/sound/vox/side.ogg differ
diff --git a/modular_citadel/sound/vox/sierra.ogg b/modular_citadel/sound/vox/sierra.ogg
new file mode 100644
index 0000000000..5c33745f28
Binary files /dev/null and b/modular_citadel/sound/vox/sierra.ogg differ
diff --git a/modular_citadel/sound/vox/sight.ogg b/modular_citadel/sound/vox/sight.ogg
new file mode 100644
index 0000000000..027c356b8d
Binary files /dev/null and b/modular_citadel/sound/vox/sight.ogg differ
diff --git a/modular_citadel/sound/vox/silo.ogg b/modular_citadel/sound/vox/silo.ogg
new file mode 100644
index 0000000000..3e0801f8ba
Binary files /dev/null and b/modular_citadel/sound/vox/silo.ogg differ
diff --git a/modular_citadel/sound/vox/six.ogg b/modular_citadel/sound/vox/six.ogg
new file mode 100644
index 0000000000..3544814963
Binary files /dev/null and b/modular_citadel/sound/vox/six.ogg differ
diff --git a/modular_citadel/sound/vox/sixteen.ogg b/modular_citadel/sound/vox/sixteen.ogg
new file mode 100644
index 0000000000..8c1159e147
Binary files /dev/null and b/modular_citadel/sound/vox/sixteen.ogg differ
diff --git a/modular_citadel/sound/vox/sixty.ogg b/modular_citadel/sound/vox/sixty.ogg
new file mode 100644
index 0000000000..bdf47b25b8
Binary files /dev/null and b/modular_citadel/sound/vox/sixty.ogg differ
diff --git a/modular_citadel/sound/vox/slime.ogg b/modular_citadel/sound/vox/slime.ogg
new file mode 100644
index 0000000000..0a6c1254e8
Binary files /dev/null and b/modular_citadel/sound/vox/slime.ogg differ
diff --git a/modular_citadel/sound/vox/slow.ogg b/modular_citadel/sound/vox/slow.ogg
new file mode 100644
index 0000000000..7639f9c7c2
Binary files /dev/null and b/modular_citadel/sound/vox/slow.ogg differ
diff --git a/modular_citadel/sound/vox/soldier.ogg b/modular_citadel/sound/vox/soldier.ogg
new file mode 100644
index 0000000000..3eb10ff590
Binary files /dev/null and b/modular_citadel/sound/vox/soldier.ogg differ
diff --git a/modular_citadel/sound/vox/some.ogg b/modular_citadel/sound/vox/some.ogg
new file mode 100644
index 0000000000..bcb5bbbbd3
Binary files /dev/null and b/modular_citadel/sound/vox/some.ogg differ
diff --git a/modular_citadel/sound/vox/someone.ogg b/modular_citadel/sound/vox/someone.ogg
new file mode 100644
index 0000000000..420a58e925
Binary files /dev/null and b/modular_citadel/sound/vox/someone.ogg differ
diff --git a/modular_citadel/sound/vox/something.ogg b/modular_citadel/sound/vox/something.ogg
new file mode 100644
index 0000000000..e3d26ede65
Binary files /dev/null and b/modular_citadel/sound/vox/something.ogg differ
diff --git a/modular_citadel/sound/vox/son.ogg b/modular_citadel/sound/vox/son.ogg
new file mode 100644
index 0000000000..843536c84a
Binary files /dev/null and b/modular_citadel/sound/vox/son.ogg differ
diff --git a/modular_citadel/sound/vox/sorry.ogg b/modular_citadel/sound/vox/sorry.ogg
new file mode 100644
index 0000000000..c125765112
Binary files /dev/null and b/modular_citadel/sound/vox/sorry.ogg differ
diff --git a/modular_citadel/sound/vox/south.ogg b/modular_citadel/sound/vox/south.ogg
new file mode 100644
index 0000000000..d32f048772
Binary files /dev/null and b/modular_citadel/sound/vox/south.ogg differ
diff --git a/modular_citadel/sound/vox/squad.ogg b/modular_citadel/sound/vox/squad.ogg
new file mode 100644
index 0000000000..582f6459af
Binary files /dev/null and b/modular_citadel/sound/vox/squad.ogg differ
diff --git a/modular_citadel/sound/vox/square.ogg b/modular_citadel/sound/vox/square.ogg
new file mode 100644
index 0000000000..a9beddd3c9
Binary files /dev/null and b/modular_citadel/sound/vox/square.ogg differ
diff --git a/modular_citadel/sound/vox/stairway.ogg b/modular_citadel/sound/vox/stairway.ogg
new file mode 100644
index 0000000000..31b0042edd
Binary files /dev/null and b/modular_citadel/sound/vox/stairway.ogg differ
diff --git a/modular_citadel/sound/vox/status.ogg b/modular_citadel/sound/vox/status.ogg
new file mode 100644
index 0000000000..611088f19a
Binary files /dev/null and b/modular_citadel/sound/vox/status.ogg differ
diff --git a/modular_citadel/sound/vox/sterile.ogg b/modular_citadel/sound/vox/sterile.ogg
new file mode 100644
index 0000000000..4e4d9fad22
Binary files /dev/null and b/modular_citadel/sound/vox/sterile.ogg differ
diff --git a/modular_citadel/sound/vox/sterilization.ogg b/modular_citadel/sound/vox/sterilization.ogg
new file mode 100644
index 0000000000..fec2104d0b
Binary files /dev/null and b/modular_citadel/sound/vox/sterilization.ogg differ
diff --git a/modular_citadel/sound/vox/stolen.ogg b/modular_citadel/sound/vox/stolen.ogg
new file mode 100644
index 0000000000..7e8c624bdf
Binary files /dev/null and b/modular_citadel/sound/vox/stolen.ogg differ
diff --git a/modular_citadel/sound/vox/storage.ogg b/modular_citadel/sound/vox/storage.ogg
new file mode 100644
index 0000000000..e47ef4e09f
Binary files /dev/null and b/modular_citadel/sound/vox/storage.ogg differ
diff --git a/modular_citadel/sound/vox/sub.ogg b/modular_citadel/sound/vox/sub.ogg
new file mode 100644
index 0000000000..ca9a621ad1
Binary files /dev/null and b/modular_citadel/sound/vox/sub.ogg differ
diff --git a/modular_citadel/sound/vox/subsurface.ogg b/modular_citadel/sound/vox/subsurface.ogg
new file mode 100644
index 0000000000..08c98d50f5
Binary files /dev/null and b/modular_citadel/sound/vox/subsurface.ogg differ
diff --git a/modular_citadel/sound/vox/sudden.ogg b/modular_citadel/sound/vox/sudden.ogg
new file mode 100644
index 0000000000..7140e0f874
Binary files /dev/null and b/modular_citadel/sound/vox/sudden.ogg differ
diff --git a/modular_citadel/sound/vox/suit.ogg b/modular_citadel/sound/vox/suit.ogg
new file mode 100644
index 0000000000..c636d5f278
Binary files /dev/null and b/modular_citadel/sound/vox/suit.ogg differ
diff --git a/modular_citadel/sound/vox/superconducting.ogg b/modular_citadel/sound/vox/superconducting.ogg
new file mode 100644
index 0000000000..244bda01c6
Binary files /dev/null and b/modular_citadel/sound/vox/superconducting.ogg differ
diff --git a/modular_citadel/sound/vox/supercooled.ogg b/modular_citadel/sound/vox/supercooled.ogg
new file mode 100644
index 0000000000..c758cdf7f8
Binary files /dev/null and b/modular_citadel/sound/vox/supercooled.ogg differ
diff --git a/modular_citadel/sound/vox/supply.ogg b/modular_citadel/sound/vox/supply.ogg
new file mode 100644
index 0000000000..13341124b3
Binary files /dev/null and b/modular_citadel/sound/vox/supply.ogg differ
diff --git a/modular_citadel/sound/vox/surface.ogg b/modular_citadel/sound/vox/surface.ogg
new file mode 100644
index 0000000000..f498cfd6bd
Binary files /dev/null and b/modular_citadel/sound/vox/surface.ogg differ
diff --git a/modular_citadel/sound/vox/surrender.ogg b/modular_citadel/sound/vox/surrender.ogg
new file mode 100644
index 0000000000..ba1864d38f
Binary files /dev/null and b/modular_citadel/sound/vox/surrender.ogg differ
diff --git a/modular_citadel/sound/vox/surround.ogg b/modular_citadel/sound/vox/surround.ogg
new file mode 100644
index 0000000000..7a3ab9a69a
Binary files /dev/null and b/modular_citadel/sound/vox/surround.ogg differ
diff --git a/modular_citadel/sound/vox/surrounded.ogg b/modular_citadel/sound/vox/surrounded.ogg
new file mode 100644
index 0000000000..464ae912f4
Binary files /dev/null and b/modular_citadel/sound/vox/surrounded.ogg differ
diff --git a/modular_citadel/sound/vox/switch.ogg b/modular_citadel/sound/vox/switch.ogg
new file mode 100644
index 0000000000..d007893d35
Binary files /dev/null and b/modular_citadel/sound/vox/switch.ogg differ
diff --git a/modular_citadel/sound/vox/system.ogg b/modular_citadel/sound/vox/system.ogg
new file mode 100644
index 0000000000..fb459b927f
Binary files /dev/null and b/modular_citadel/sound/vox/system.ogg differ
diff --git a/modular_citadel/sound/vox/systems.ogg b/modular_citadel/sound/vox/systems.ogg
new file mode 100644
index 0000000000..37072c97f4
Binary files /dev/null and b/modular_citadel/sound/vox/systems.ogg differ
diff --git a/modular_citadel/sound/vox/tactical.ogg b/modular_citadel/sound/vox/tactical.ogg
new file mode 100644
index 0000000000..ae294b916b
Binary files /dev/null and b/modular_citadel/sound/vox/tactical.ogg differ
diff --git a/modular_citadel/sound/vox/take.ogg b/modular_citadel/sound/vox/take.ogg
new file mode 100644
index 0000000000..83409da4a3
Binary files /dev/null and b/modular_citadel/sound/vox/take.ogg differ
diff --git a/modular_citadel/sound/vox/talk.ogg b/modular_citadel/sound/vox/talk.ogg
new file mode 100644
index 0000000000..043385c389
Binary files /dev/null and b/modular_citadel/sound/vox/talk.ogg differ
diff --git a/modular_citadel/sound/vox/tango.ogg b/modular_citadel/sound/vox/tango.ogg
new file mode 100644
index 0000000000..f852cb0df3
Binary files /dev/null and b/modular_citadel/sound/vox/tango.ogg differ
diff --git a/modular_citadel/sound/vox/tank.ogg b/modular_citadel/sound/vox/tank.ogg
new file mode 100644
index 0000000000..df09c12f98
Binary files /dev/null and b/modular_citadel/sound/vox/tank.ogg differ
diff --git a/modular_citadel/sound/vox/target.ogg b/modular_citadel/sound/vox/target.ogg
new file mode 100644
index 0000000000..0601cac45b
Binary files /dev/null and b/modular_citadel/sound/vox/target.ogg differ
diff --git a/modular_citadel/sound/vox/team.ogg b/modular_citadel/sound/vox/team.ogg
new file mode 100644
index 0000000000..4fc1a7f198
Binary files /dev/null and b/modular_citadel/sound/vox/team.ogg differ
diff --git a/modular_citadel/sound/vox/temperature.ogg b/modular_citadel/sound/vox/temperature.ogg
new file mode 100644
index 0000000000..d7b92a0cdc
Binary files /dev/null and b/modular_citadel/sound/vox/temperature.ogg differ
diff --git a/modular_citadel/sound/vox/temporal.ogg b/modular_citadel/sound/vox/temporal.ogg
new file mode 100644
index 0000000000..c2f9aedb48
Binary files /dev/null and b/modular_citadel/sound/vox/temporal.ogg differ
diff --git a/modular_citadel/sound/vox/ten.ogg b/modular_citadel/sound/vox/ten.ogg
new file mode 100644
index 0000000000..704d38c1ae
Binary files /dev/null and b/modular_citadel/sound/vox/ten.ogg differ
diff --git a/modular_citadel/sound/vox/terminal.ogg b/modular_citadel/sound/vox/terminal.ogg
new file mode 100644
index 0000000000..f756e03064
Binary files /dev/null and b/modular_citadel/sound/vox/terminal.ogg differ
diff --git a/modular_citadel/sound/vox/terminated.ogg b/modular_citadel/sound/vox/terminated.ogg
new file mode 100644
index 0000000000..52d35451b0
Binary files /dev/null and b/modular_citadel/sound/vox/terminated.ogg differ
diff --git a/modular_citadel/sound/vox/termination.ogg b/modular_citadel/sound/vox/termination.ogg
new file mode 100644
index 0000000000..aec4df5b01
Binary files /dev/null and b/modular_citadel/sound/vox/termination.ogg differ
diff --git a/modular_citadel/sound/vox/test.ogg b/modular_citadel/sound/vox/test.ogg
new file mode 100644
index 0000000000..df3ab175c6
Binary files /dev/null and b/modular_citadel/sound/vox/test.ogg differ
diff --git a/modular_citadel/sound/vox/that.ogg b/modular_citadel/sound/vox/that.ogg
new file mode 100644
index 0000000000..442dc3d264
Binary files /dev/null and b/modular_citadel/sound/vox/that.ogg differ
diff --git a/modular_citadel/sound/vox/the.ogg b/modular_citadel/sound/vox/the.ogg
new file mode 100644
index 0000000000..71caecef1f
Binary files /dev/null and b/modular_citadel/sound/vox/the.ogg differ
diff --git a/modular_citadel/sound/vox/then.ogg b/modular_citadel/sound/vox/then.ogg
new file mode 100644
index 0000000000..916d9276af
Binary files /dev/null and b/modular_citadel/sound/vox/then.ogg differ
diff --git a/modular_citadel/sound/vox/there.ogg b/modular_citadel/sound/vox/there.ogg
new file mode 100644
index 0000000000..c3536a2f72
Binary files /dev/null and b/modular_citadel/sound/vox/there.ogg differ
diff --git a/modular_citadel/sound/vox/third.ogg b/modular_citadel/sound/vox/third.ogg
new file mode 100644
index 0000000000..ba1125fe5b
Binary files /dev/null and b/modular_citadel/sound/vox/third.ogg differ
diff --git a/modular_citadel/sound/vox/thirteen.ogg b/modular_citadel/sound/vox/thirteen.ogg
new file mode 100644
index 0000000000..b3585a2d3b
Binary files /dev/null and b/modular_citadel/sound/vox/thirteen.ogg differ
diff --git a/modular_citadel/sound/vox/thirty.ogg b/modular_citadel/sound/vox/thirty.ogg
new file mode 100644
index 0000000000..cac0402265
Binary files /dev/null and b/modular_citadel/sound/vox/thirty.ogg differ
diff --git a/modular_citadel/sound/vox/this.ogg b/modular_citadel/sound/vox/this.ogg
new file mode 100644
index 0000000000..e7acd16108
Binary files /dev/null and b/modular_citadel/sound/vox/this.ogg differ
diff --git a/modular_citadel/sound/vox/those.ogg b/modular_citadel/sound/vox/those.ogg
new file mode 100644
index 0000000000..149a806b23
Binary files /dev/null and b/modular_citadel/sound/vox/those.ogg differ
diff --git a/modular_citadel/sound/vox/thousand.ogg b/modular_citadel/sound/vox/thousand.ogg
new file mode 100644
index 0000000000..fd5d46bf9b
Binary files /dev/null and b/modular_citadel/sound/vox/thousand.ogg differ
diff --git a/modular_citadel/sound/vox/threat.ogg b/modular_citadel/sound/vox/threat.ogg
new file mode 100644
index 0000000000..d4aa8d1d13
Binary files /dev/null and b/modular_citadel/sound/vox/threat.ogg differ
diff --git a/modular_citadel/sound/vox/three.ogg b/modular_citadel/sound/vox/three.ogg
new file mode 100644
index 0000000000..72bab5ff6b
Binary files /dev/null and b/modular_citadel/sound/vox/three.ogg differ
diff --git a/modular_citadel/sound/vox/through.ogg b/modular_citadel/sound/vox/through.ogg
new file mode 100644
index 0000000000..9f527f38c7
Binary files /dev/null and b/modular_citadel/sound/vox/through.ogg differ
diff --git a/modular_citadel/sound/vox/time.ogg b/modular_citadel/sound/vox/time.ogg
new file mode 100644
index 0000000000..ff32baa603
Binary files /dev/null and b/modular_citadel/sound/vox/time.ogg differ
diff --git a/modular_citadel/sound/vox/to.ogg b/modular_citadel/sound/vox/to.ogg
new file mode 100644
index 0000000000..9e7f76c84d
Binary files /dev/null and b/modular_citadel/sound/vox/to.ogg differ
diff --git a/modular_citadel/sound/vox/top.ogg b/modular_citadel/sound/vox/top.ogg
new file mode 100644
index 0000000000..bc6b0bce22
Binary files /dev/null and b/modular_citadel/sound/vox/top.ogg differ
diff --git a/modular_citadel/sound/vox/topside.ogg b/modular_citadel/sound/vox/topside.ogg
new file mode 100644
index 0000000000..34dfaf4405
Binary files /dev/null and b/modular_citadel/sound/vox/topside.ogg differ
diff --git a/modular_citadel/sound/vox/touch.ogg b/modular_citadel/sound/vox/touch.ogg
new file mode 100644
index 0000000000..fe34a1b083
Binary files /dev/null and b/modular_citadel/sound/vox/touch.ogg differ
diff --git a/modular_citadel/sound/vox/towards.ogg b/modular_citadel/sound/vox/towards.ogg
new file mode 100644
index 0000000000..edb2bf04d1
Binary files /dev/null and b/modular_citadel/sound/vox/towards.ogg differ
diff --git a/modular_citadel/sound/vox/track.ogg b/modular_citadel/sound/vox/track.ogg
new file mode 100644
index 0000000000..447d1f6982
Binary files /dev/null and b/modular_citadel/sound/vox/track.ogg differ
diff --git a/modular_citadel/sound/vox/train.ogg b/modular_citadel/sound/vox/train.ogg
new file mode 100644
index 0000000000..e4b78fe638
Binary files /dev/null and b/modular_citadel/sound/vox/train.ogg differ
diff --git a/modular_citadel/sound/vox/transportation.ogg b/modular_citadel/sound/vox/transportation.ogg
new file mode 100644
index 0000000000..78d2122ccb
Binary files /dev/null and b/modular_citadel/sound/vox/transportation.ogg differ
diff --git a/modular_citadel/sound/vox/truck.ogg b/modular_citadel/sound/vox/truck.ogg
new file mode 100644
index 0000000000..5822f17d83
Binary files /dev/null and b/modular_citadel/sound/vox/truck.ogg differ
diff --git a/modular_citadel/sound/vox/tunnel.ogg b/modular_citadel/sound/vox/tunnel.ogg
new file mode 100644
index 0000000000..3264b41496
Binary files /dev/null and b/modular_citadel/sound/vox/tunnel.ogg differ
diff --git a/modular_citadel/sound/vox/turn.ogg b/modular_citadel/sound/vox/turn.ogg
new file mode 100644
index 0000000000..5a8a32cbd4
Binary files /dev/null and b/modular_citadel/sound/vox/turn.ogg differ
diff --git a/modular_citadel/sound/vox/turret.ogg b/modular_citadel/sound/vox/turret.ogg
new file mode 100644
index 0000000000..96d5bf6da9
Binary files /dev/null and b/modular_citadel/sound/vox/turret.ogg differ
diff --git a/modular_citadel/sound/vox/twelve.ogg b/modular_citadel/sound/vox/twelve.ogg
new file mode 100644
index 0000000000..2e45cf797d
Binary files /dev/null and b/modular_citadel/sound/vox/twelve.ogg differ
diff --git a/modular_citadel/sound/vox/twenty.ogg b/modular_citadel/sound/vox/twenty.ogg
new file mode 100644
index 0000000000..c54922a384
Binary files /dev/null and b/modular_citadel/sound/vox/twenty.ogg differ
diff --git a/modular_citadel/sound/vox/two.ogg b/modular_citadel/sound/vox/two.ogg
new file mode 100644
index 0000000000..e1abe93d97
Binary files /dev/null and b/modular_citadel/sound/vox/two.ogg differ
diff --git a/modular_citadel/sound/vox/unauthorized.ogg b/modular_citadel/sound/vox/unauthorized.ogg
new file mode 100644
index 0000000000..2238e09696
Binary files /dev/null and b/modular_citadel/sound/vox/unauthorized.ogg differ
diff --git a/modular_citadel/sound/vox/under.ogg b/modular_citadel/sound/vox/under.ogg
new file mode 100644
index 0000000000..8445ce571a
Binary files /dev/null and b/modular_citadel/sound/vox/under.ogg differ
diff --git a/modular_citadel/sound/vox/uniform.ogg b/modular_citadel/sound/vox/uniform.ogg
new file mode 100644
index 0000000000..6d3029ed7f
Binary files /dev/null and b/modular_citadel/sound/vox/uniform.ogg differ
diff --git a/modular_citadel/sound/vox/unlocked.ogg b/modular_citadel/sound/vox/unlocked.ogg
new file mode 100644
index 0000000000..1f66ba7003
Binary files /dev/null and b/modular_citadel/sound/vox/unlocked.ogg differ
diff --git a/modular_citadel/sound/vox/until.ogg b/modular_citadel/sound/vox/until.ogg
new file mode 100644
index 0000000000..00e1417aaa
Binary files /dev/null and b/modular_citadel/sound/vox/until.ogg differ
diff --git a/modular_citadel/sound/vox/up.ogg b/modular_citadel/sound/vox/up.ogg
new file mode 100644
index 0000000000..31d9dd13cc
Binary files /dev/null and b/modular_citadel/sound/vox/up.ogg differ
diff --git a/modular_citadel/sound/vox/upper.ogg b/modular_citadel/sound/vox/upper.ogg
new file mode 100644
index 0000000000..c26d7450ed
Binary files /dev/null and b/modular_citadel/sound/vox/upper.ogg differ
diff --git a/modular_citadel/sound/vox/uranium.ogg b/modular_citadel/sound/vox/uranium.ogg
new file mode 100644
index 0000000000..8eeed7b34e
Binary files /dev/null and b/modular_citadel/sound/vox/uranium.ogg differ
diff --git a/modular_citadel/sound/vox/us.ogg b/modular_citadel/sound/vox/us.ogg
new file mode 100644
index 0000000000..1d0cc90667
Binary files /dev/null and b/modular_citadel/sound/vox/us.ogg differ
diff --git a/modular_citadel/sound/vox/usa.ogg b/modular_citadel/sound/vox/usa.ogg
new file mode 100644
index 0000000000..2a057059f7
Binary files /dev/null and b/modular_citadel/sound/vox/usa.ogg differ
diff --git a/modular_citadel/sound/vox/use.ogg b/modular_citadel/sound/vox/use.ogg
new file mode 100644
index 0000000000..6fdb0d2f51
Binary files /dev/null and b/modular_citadel/sound/vox/use.ogg differ
diff --git a/modular_citadel/sound/vox/used.ogg b/modular_citadel/sound/vox/used.ogg
new file mode 100644
index 0000000000..126ab4cce3
Binary files /dev/null and b/modular_citadel/sound/vox/used.ogg differ
diff --git a/modular_citadel/sound/vox/user.ogg b/modular_citadel/sound/vox/user.ogg
new file mode 100644
index 0000000000..fa99d50a09
Binary files /dev/null and b/modular_citadel/sound/vox/user.ogg differ
diff --git a/modular_citadel/sound/vox/vacate.ogg b/modular_citadel/sound/vox/vacate.ogg
new file mode 100644
index 0000000000..1eadec9832
Binary files /dev/null and b/modular_citadel/sound/vox/vacate.ogg differ
diff --git a/modular_citadel/sound/vox/valid.ogg b/modular_citadel/sound/vox/valid.ogg
new file mode 100644
index 0000000000..5ec3b93b3b
Binary files /dev/null and b/modular_citadel/sound/vox/valid.ogg differ
diff --git a/modular_citadel/sound/vox/vapor.ogg b/modular_citadel/sound/vox/vapor.ogg
new file mode 100644
index 0000000000..9ceb555e77
Binary files /dev/null and b/modular_citadel/sound/vox/vapor.ogg differ
diff --git a/modular_citadel/sound/vox/vent.ogg b/modular_citadel/sound/vox/vent.ogg
new file mode 100644
index 0000000000..47f37d441f
Binary files /dev/null and b/modular_citadel/sound/vox/vent.ogg differ
diff --git a/modular_citadel/sound/vox/ventillation.ogg b/modular_citadel/sound/vox/ventillation.ogg
new file mode 100644
index 0000000000..a8e9928e7c
Binary files /dev/null and b/modular_citadel/sound/vox/ventillation.ogg differ
diff --git a/modular_citadel/sound/vox/victor.ogg b/modular_citadel/sound/vox/victor.ogg
new file mode 100644
index 0000000000..686b6fd7cd
Binary files /dev/null and b/modular_citadel/sound/vox/victor.ogg differ
diff --git a/modular_citadel/sound/vox/violated.ogg b/modular_citadel/sound/vox/violated.ogg
new file mode 100644
index 0000000000..01ebe6a2de
Binary files /dev/null and b/modular_citadel/sound/vox/violated.ogg differ
diff --git a/modular_citadel/sound/vox/violation.ogg b/modular_citadel/sound/vox/violation.ogg
new file mode 100644
index 0000000000..2d9e1b6fbe
Binary files /dev/null and b/modular_citadel/sound/vox/violation.ogg differ
diff --git a/modular_citadel/sound/vox/voltage.ogg b/modular_citadel/sound/vox/voltage.ogg
new file mode 100644
index 0000000000..64417b2556
Binary files /dev/null and b/modular_citadel/sound/vox/voltage.ogg differ
diff --git a/modular_citadel/sound/vox/vox_login.ogg b/modular_citadel/sound/vox/vox_login.ogg
new file mode 100644
index 0000000000..5c406191a2
Binary files /dev/null and b/modular_citadel/sound/vox/vox_login.ogg differ
diff --git a/modular_citadel/sound/vox/walk.ogg b/modular_citadel/sound/vox/walk.ogg
new file mode 100644
index 0000000000..6d4cebd36c
Binary files /dev/null and b/modular_citadel/sound/vox/walk.ogg differ
diff --git a/modular_citadel/sound/vox/wall.ogg b/modular_citadel/sound/vox/wall.ogg
new file mode 100644
index 0000000000..8f34bb6fdd
Binary files /dev/null and b/modular_citadel/sound/vox/wall.ogg differ
diff --git a/modular_citadel/sound/vox/want.ogg b/modular_citadel/sound/vox/want.ogg
new file mode 100644
index 0000000000..b307dbfdc6
Binary files /dev/null and b/modular_citadel/sound/vox/want.ogg differ
diff --git a/modular_citadel/sound/vox/wanted.ogg b/modular_citadel/sound/vox/wanted.ogg
new file mode 100644
index 0000000000..a783e64ee2
Binary files /dev/null and b/modular_citadel/sound/vox/wanted.ogg differ
diff --git a/modular_citadel/sound/vox/warm.ogg b/modular_citadel/sound/vox/warm.ogg
new file mode 100644
index 0000000000..00fbe521b1
Binary files /dev/null and b/modular_citadel/sound/vox/warm.ogg differ
diff --git a/modular_citadel/sound/vox/warn.ogg b/modular_citadel/sound/vox/warn.ogg
new file mode 100644
index 0000000000..931ae208c6
Binary files /dev/null and b/modular_citadel/sound/vox/warn.ogg differ
diff --git a/modular_citadel/sound/vox/warning.ogg b/modular_citadel/sound/vox/warning.ogg
new file mode 100644
index 0000000000..e237c5e0ae
Binary files /dev/null and b/modular_citadel/sound/vox/warning.ogg differ
diff --git a/modular_citadel/sound/vox/waste.ogg b/modular_citadel/sound/vox/waste.ogg
new file mode 100644
index 0000000000..7152c80fc8
Binary files /dev/null and b/modular_citadel/sound/vox/waste.ogg differ
diff --git a/modular_citadel/sound/vox/water.ogg b/modular_citadel/sound/vox/water.ogg
new file mode 100644
index 0000000000..fdced84c63
Binary files /dev/null and b/modular_citadel/sound/vox/water.ogg differ
diff --git a/modular_citadel/sound/vox/we.ogg b/modular_citadel/sound/vox/we.ogg
new file mode 100644
index 0000000000..f31d0c34d3
Binary files /dev/null and b/modular_citadel/sound/vox/we.ogg differ
diff --git a/modular_citadel/sound/vox/weapon.ogg b/modular_citadel/sound/vox/weapon.ogg
new file mode 100644
index 0000000000..fcf4b8bf07
Binary files /dev/null and b/modular_citadel/sound/vox/weapon.ogg differ
diff --git a/modular_citadel/sound/vox/west.ogg b/modular_citadel/sound/vox/west.ogg
new file mode 100644
index 0000000000..35eb23ac27
Binary files /dev/null and b/modular_citadel/sound/vox/west.ogg differ
diff --git a/modular_citadel/sound/vox/whiskey.ogg b/modular_citadel/sound/vox/whiskey.ogg
new file mode 100644
index 0000000000..53102ef546
Binary files /dev/null and b/modular_citadel/sound/vox/whiskey.ogg differ
diff --git a/modular_citadel/sound/vox/white.ogg b/modular_citadel/sound/vox/white.ogg
new file mode 100644
index 0000000000..b9c2c6e8fb
Binary files /dev/null and b/modular_citadel/sound/vox/white.ogg differ
diff --git a/modular_citadel/sound/vox/wilco.ogg b/modular_citadel/sound/vox/wilco.ogg
new file mode 100644
index 0000000000..08f1b38f60
Binary files /dev/null and b/modular_citadel/sound/vox/wilco.ogg differ
diff --git a/modular_citadel/sound/vox/will.ogg b/modular_citadel/sound/vox/will.ogg
new file mode 100644
index 0000000000..8b11eec8d5
Binary files /dev/null and b/modular_citadel/sound/vox/will.ogg differ
diff --git a/modular_citadel/sound/vox/with.ogg b/modular_citadel/sound/vox/with.ogg
new file mode 100644
index 0000000000..100131ddfd
Binary files /dev/null and b/modular_citadel/sound/vox/with.ogg differ
diff --git a/modular_citadel/sound/vox/without.ogg b/modular_citadel/sound/vox/without.ogg
new file mode 100644
index 0000000000..5e6b99206f
Binary files /dev/null and b/modular_citadel/sound/vox/without.ogg differ
diff --git a/modular_citadel/sound/vox/woop.ogg b/modular_citadel/sound/vox/woop.ogg
new file mode 100644
index 0000000000..c29a975858
Binary files /dev/null and b/modular_citadel/sound/vox/woop.ogg differ
diff --git a/modular_citadel/sound/vox/xeno.ogg b/modular_citadel/sound/vox/xeno.ogg
new file mode 100644
index 0000000000..9230e650c7
Binary files /dev/null and b/modular_citadel/sound/vox/xeno.ogg differ
diff --git a/modular_citadel/sound/vox/yankee.ogg b/modular_citadel/sound/vox/yankee.ogg
new file mode 100644
index 0000000000..ea5578d28f
Binary files /dev/null and b/modular_citadel/sound/vox/yankee.ogg differ
diff --git a/modular_citadel/sound/vox/yards.ogg b/modular_citadel/sound/vox/yards.ogg
new file mode 100644
index 0000000000..7b911ad4bd
Binary files /dev/null and b/modular_citadel/sound/vox/yards.ogg differ
diff --git a/modular_citadel/sound/vox/year.ogg b/modular_citadel/sound/vox/year.ogg
new file mode 100644
index 0000000000..7cd1065af1
Binary files /dev/null and b/modular_citadel/sound/vox/year.ogg differ
diff --git a/modular_citadel/sound/vox/yellow.ogg b/modular_citadel/sound/vox/yellow.ogg
new file mode 100644
index 0000000000..87668cd45f
Binary files /dev/null and b/modular_citadel/sound/vox/yellow.ogg differ
diff --git a/modular_citadel/sound/vox/yes.ogg b/modular_citadel/sound/vox/yes.ogg
new file mode 100644
index 0000000000..24be399de3
Binary files /dev/null and b/modular_citadel/sound/vox/yes.ogg differ
diff --git a/modular_citadel/sound/vox/you.ogg b/modular_citadel/sound/vox/you.ogg
new file mode 100644
index 0000000000..4a30e5c721
Binary files /dev/null and b/modular_citadel/sound/vox/you.ogg differ
diff --git a/modular_citadel/sound/vox/your.ogg b/modular_citadel/sound/vox/your.ogg
new file mode 100644
index 0000000000..12d49c3ded
Binary files /dev/null and b/modular_citadel/sound/vox/your.ogg differ
diff --git a/modular_citadel/sound/vox/yourself.ogg b/modular_citadel/sound/vox/yourself.ogg
new file mode 100644
index 0000000000..03a0af6531
Binary files /dev/null and b/modular_citadel/sound/vox/yourself.ogg differ
diff --git a/modular_citadel/sound/vox/zero.ogg b/modular_citadel/sound/vox/zero.ogg
new file mode 100644
index 0000000000..e14f91344c
Binary files /dev/null and b/modular_citadel/sound/vox/zero.ogg differ
diff --git a/modular_citadel/sound/vox/zone.ogg b/modular_citadel/sound/vox/zone.ogg
new file mode 100644
index 0000000000..3c8834c8f4
Binary files /dev/null and b/modular_citadel/sound/vox/zone.ogg differ
diff --git a/modular_citadel/sound/vox/zulu.ogg b/modular_citadel/sound/vox/zulu.ogg
new file mode 100644
index 0000000000..739cdd2187
Binary files /dev/null and b/modular_citadel/sound/vox/zulu.ogg differ
diff --git a/sound/music/flyinghigh.ogg b/sound/music/flyinghigh.ogg
new file mode 100644
index 0000000000..4f1aa1458a
Binary files /dev/null and b/sound/music/flyinghigh.ogg differ
diff --git a/sound/music/samsara.ogg b/sound/music/samsara.ogg
new file mode 100644
index 0000000000..4842aab3e5
Binary files /dev/null and b/sound/music/samsara.ogg differ
diff --git a/sound/music/theend.ogg b/sound/music/theend.ogg
new file mode 100644
index 0000000000..52255eee2a
Binary files /dev/null and b/sound/music/theend.ogg differ
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index a8409188fc..c67bf6b4a6 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -22,3 +22,6 @@ sound/music/goodbyemoonmen.ogg
sound/music/flytothemoon_otomatone.ogg
sound/music/milkyway.ogg
sound/music/rocketridersprayer.ogg
+sound/music/theend.ogg
+sound/music/flyinghigh.ogg
+sound/music/samsara.ogg
diff --git a/tgstation.dme b/tgstation.dme
index bc1c1a134b..25daba0be6 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -41,6 +41,7 @@
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\donator_groupings.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\flags.dm"
@@ -115,6 +116,7 @@
#include "code\__HELPERS\AStar.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\dates.dm"
+#include "code\__HELPERS\donator_groupings.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\game.dm"
#include "code\__HELPERS\global_lists.dm"
@@ -159,6 +161,7 @@
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
#include "code\_globalvars\lists\medals.dm"
+#include "code\_globalvars\lists\misc.dm"
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
@@ -218,6 +221,7 @@
#include "code\controllers\configuration\configuration.dm"
#include "code\controllers\configuration\entries\comms.dm"
#include "code\controllers\configuration\entries\dbconfig.dm"
+#include "code\controllers\configuration\entries\donator.dm"
#include "code\controllers\configuration\entries\game_options.dm"
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\subsystem\acid.dm"
@@ -1729,6 +1733,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peach.dm"
#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
@@ -2705,6 +2710,7 @@
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\dental_implant.dm"
+#include "code\modules\surgery\embalming.dm"
#include "code\modules\surgery\eye_surgery.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
@@ -2726,6 +2732,7 @@
#include "code\modules\surgery\advanced\pacification.dm"
#include "code\modules\surgery\advanced\reconstruction.dm"
#include "code\modules\surgery\advanced\revival.dm"
+#include "code\modules\surgery\advanced\toxichealing.dm"
#include "code\modules\surgery\advanced\viral_bonding.dm"
#include "code\modules\surgery\advanced\bioware\bioware.dm"
#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm"
@@ -2939,6 +2946,7 @@
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
+#include "modular_citadel\code\modules\client\loadout\_loadout.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
#include "modular_citadel\code\modules\client\loadout\_service.dm"
@@ -2947,7 +2955,6 @@
#include "modular_citadel\code\modules\client\loadout\gloves.dm"
#include "modular_citadel\code\modules\client\loadout\hands.dm"
#include "modular_citadel\code\modules\client\loadout\head.dm"
-#include "modular_citadel\code\modules\client\loadout\loadout.dm"
#include "modular_citadel\code\modules\client\loadout\mask.dm"
#include "modular_citadel\code\modules\client\loadout\neck.dm"
#include "modular_citadel\code\modules\client\loadout\shoes.dm"
@@ -3008,6 +3015,7 @@
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\ai\vox_sounds.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"