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/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/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/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/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/his_grace.dm b/code/game/objects/items/his_grace.dm
index c6f246ab97..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")
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index ad4384f9f5..6e3deaa694 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -704,8 +704,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..eedf5f85c1 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -19,11 +19,11 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
singular_name = "glass sheet"
icon_state = "sheet-glass"
item_state = "sheet-glass"
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
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)
@@ -83,11 +83,11 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
singular_name = "plasma glass sheet"
icon_state = "sheet-pglass"
item_state = "sheet-pglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
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
@@ -134,11 +134,11 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
item_state = "sheet-rglass"
- materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/metal=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
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(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT, /datum/material/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)
@@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
singular_name = "titanium glass sheet"
icon_state = "sheet-titaniumglass"
item_state = "sheet-titaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "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/titaniumglass
@@ -217,7 +217,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
singular_name = "plastitanium glass sheet"
icon_state = "sheet-plastitaniumglass"
item_state = "sheet-plastitaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "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/plastitaniumglass
@@ -237,14 +237,15 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
item_state = "shard-glass"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
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(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/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 a57527c1c1..887b6f5a2e 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -407,6 +407,7 @@
new /obj/item/stack/cable_coil/random(src)
new /obj/item/wirecutters(src)
new /obj/item/multitool(src)
+ new /obj/item/pipe_dispenser(src)
/obj/item/storage/backpack/duffelbag/clown
name = "clown's duffel bag"
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index bca13f2a45..ed547bc17d 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -40,9 +40,18 @@
/obj/item/storage/briefcase/lawyer/family
name = "battered briefcase"
- desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. Comes with an added belt clip!"
+ icon_state = "gbriefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
+ desc = "An old briefcase with a golden trim. It's clear they don't make them as good as they used to. Comes with an added belt clip!"
slot_flags = ITEM_SLOT_BELT
+/obj/item/storage/briefcase/lawyer/family/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_combined_w_class = 14
+
/obj/item/storage/briefcase/lawyer/family/PopulateContents()
new /obj/item/stamp/law(src)
new /obj/item/pen/fountain(src)
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..f224a6abc7 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)
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/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/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/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index a69694ced9..9330e9b153 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -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/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index de3ade389f..f0aa10f2da 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -193,7 +193,7 @@
else if(ispath(build_type, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type]
cost = IC.materials[MAT_METAL]
- else if(!build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])
+ else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"]))
return
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
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/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 96e7c4310b..e66d70f492 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -33,16 +33,18 @@
/obj/item/clothing/mask/facehugger/lamarr
name = "Lamarr"
- sterile = 1
+ sterile = TRUE
/obj/item/clothing/mask/facehugger/dead
icon_state = "facehugger_dead"
item_state = "facehugger_inactive"
+ sterile = TRUE
stat = DEAD
/obj/item/clothing/mask/facehugger/impregnated
icon_state = "facehugger_impregnated"
item_state = "facehugger_impregnated"
+ sterile = TRUE
stat = DEAD
/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
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/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 026c39c6cf..19db73dfdd 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
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/pins.dm b/code/modules/projectiles/pins.dm
index 05d6367306..da3743f053 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
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/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..99397897c6 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -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/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 b56d7ce84e..781fdb24f5 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1459,6 +1459,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
desc = "A cheap bottle of one use syndicate brand super glue. \
Use on any item to make it undroppable. \
Be careful not to glue an item you're already holding!"
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
item = /obj/item/syndie_glue
cost = 2
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 40c2a8bd22..88083ce1d1 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -321,6 +321,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-8968.yml b/html/changelogs/AutoChangeLog-pr-8968.yml
new file mode 100644
index 0000000000..0a0b0e84d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8968.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "oversight in benos"
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-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-9142.yml b/html/changelogs/AutoChangeLog-pr-9142.yml
new file mode 100644
index 0000000000..75fbfe4155
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9142.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "glue uplinks"
diff --git a/html/changelogs/AutoChangeLog-pr-9145.yml b/html/changelogs/AutoChangeLog-pr-9145.yml
new file mode 100644
index 0000000000..27e5712dd0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9145.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "RPDs to drones"
diff --git a/html/changelogs/AutoChangeLog-pr-9155.yml b/html/changelogs/AutoChangeLog-pr-9155.yml
new file mode 100644
index 0000000000..ad16ff6276
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9155.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - server: "Poly's speech now echos to the chat bot."
diff --git a/html/changelogs/AutoChangeLog-pr-9162.yml b/html/changelogs/AutoChangeLog-pr-9162.yml
new file mode 100644
index 0000000000..a415ce8bbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9162.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "storage tweaks for belt briefcase"
+ - imageadd: "codersprite for belt briefcase"
diff --git a/html/changelogs/AutoChangeLog-pr-9164.yml b/html/changelogs/AutoChangeLog-pr-9164.yml
new file mode 100644
index 0000000000..08d7ccec18
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9164.yml
@@ -0,0 +1,4 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - imageadd: "missing durathread sprites"
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-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/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 ea13294dfe..09bfd9e0a2 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi
index 08bc3814b0..38aaa98254 100644
Binary files a/icons/mob/inhands/equipment/briefcase_lefthand.dmi and b/icons/mob/inhands/equipment/briefcase_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi
index 5cc42559cd..fbcea4580e 100644
Binary files a/icons/mob/inhands/equipment/briefcase_righthand.dmi and b/icons/mob/inhands/equipment/briefcase_righthand.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/mask.dmi b/icons/mob/mask.dmi
index 5f0b665ff4..019ae09517 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.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 4b7b67b39f..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/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 e6a2e70ba9..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/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/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 6d2b2b64cd..ac2d42378a 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index a977936155..e5d61fbfe0 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/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 918b1dda5a..501e0fa25a 100644
--- a/modular_citadel/code/modules/admin/chat_commands.dm
+++ b/modular_citadel/code/modules/admin/chat_commands.dm
@@ -20,3 +20,20 @@
/datum/tgs_chat_command/despacito/Run()
return "https://www.youtube.com/watch?v=kJQP7kiw5Fk"
+
+/datum/tgs_chat_command/poly
+ name = "poly"
+ help_text = "The Lewder, more applicable Poly speak for Citadel Station 13."
+ var/list/speech_buffer
+
+/datum/tgs_chat_command/poly/Run()
+ 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 "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
+ var/list/json = json_decode(file2text(json_file))
+ speech_buffer = json["phrases"]
+ 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/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index 19964e59c5..aea900d110 100644
Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.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..7218b87e0b 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"
@@ -2939,6 +2944,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 +2953,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 +3013,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"