diff --git a/README.md b/README.md index 3e123280a2..ed82fb08e6 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Based and maintained from /tg/station.
**Forums:** http://citadel-station.net/forum/
**Ban Appeals:** http://citadel-station.net/forum/forumdisplay.php?fid=8
**Code:** https://github.com/Citadel-Station-13/Citadel-Station-13
-**Discord:** [Here](https://discord.gg/3gJ9pnM).
+**Discord:** [Here](https://discord.gg/E6SQuhz).
## DOWNLOADING diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 738148c948..ed5b07168f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -508,7 +508,9 @@ /obj/structure/stone_tile/cracked{ dir = 4 }, -/obj/item/construction/rcd/loaded, +/obj/item/construction/rcd/loaded/upgraded{ + + }, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bn" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 980e23188a..9cd932c6d4 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, @@ -2924,7 +3004,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agp" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agq" = ( @@ -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" @@ -4489,7 +4591,7 @@ /turf/open/space, /area/solar/port/fore) "ajr" = ( -/obj/machinery/computer/gulag_teleporter_computer, +/obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, /area/security/processing) "ajs" = ( @@ -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" @@ -19371,7 +19602,7 @@ /turf/closed/wall, /area/bridge) "aTR" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -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 cefc0eb1a5..aae5ff8ff9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -4503,7 +4503,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint) "anx" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/machinery/status_display{ @@ -36400,7 +36400,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "boc" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -38706,7 +38706,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brE" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -39610,7 +39610,7 @@ /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "bth" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /obj/structure/disposalpipe/segment{ @@ -42723,7 +42723,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "byk" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -56938,7 +56938,7 @@ /turf/open/floor/plasteel, /area/security/warden) "bTh" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/structure/cable/white{ @@ -125917,7 +125917,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/escape) "egj" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/structure/cable/white{ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 75d7466371..13f774d25d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2017,7 +2017,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aeu" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aev" = ( @@ -8416,7 +8416,7 @@ /turf/open/floor/plating, /area/security/warden) "apI" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 4 }, /obj/structure/cable/yellow{ @@ -10514,7 +10514,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "atK" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -30781,7 +30781,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index ee97af14fc..2e8887c75f 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -4897,7 +4897,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "amT" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/machinery/airalarm{ pixel_y = 22 }, @@ -6072,7 +6072,7 @@ /turf/open/floor/plating, /area/security/brig) "apF" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -7048,7 +7048,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "arR" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 3bdf64ac27..feb8fc8cc0 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -523,7 +523,7 @@ /turf/open/floor/plasteel, /area/science) "bC" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 4 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index f2e0599ae6..d04ee2fe49 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3864,7 +3864,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "jS" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/centcom/control) @@ -5857,7 +5857,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "nY" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -10495,7 +10495,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "yv" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/machinery/light, diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index ee51fb6909..c394d003d8 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -109,3 +109,5 @@ #define RCD_AIRLOCK 2 #define RCD_DECONSTRUCT 3 #define RCD_WINDOWGRILLE 4 +#define RCD_MACHINE 8 +#define RCD_COMPUTER 16 \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ed0007135d..a4bca2f2c8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -118,6 +118,7 @@ #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" +#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it @@ -203,4 +204,4 @@ #define FLIGHTSUIT_TRAIT "flightsuit" #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" -#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" \ No newline at end of file +#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" 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/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index e0a23b0209..84be4fdca4 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -52,7 +52,7 @@ . = ..() cant_hold = typecacheof(list(/obj/item/screwdriver/power)) can_hold = typecacheof(list( - /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, + /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/melee/cultblade/dagger, /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, @@ -63,7 +63,7 @@ . = ..() cant_hold = typecacheof(list(/obj/item/screwdriver/power)) can_hold = typecacheof(list( - /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, + /obj/item/kitchen/knife, /obj/item/switchblade, /obj/item/pen, /obj/item/melee/cultblade/dagger, /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, diff --git a/code/datums/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/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index b0e4c699d7..e5fd73228a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -113,6 +113,11 @@ Class Procs: var/atom/movable/occupant = null var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + var/obj/item/card/id/inserted_scan_id + var/obj/item/card/id/inserted_modify_id + var/list/region_access = null // For the identification console (card.dm) + var/list/head_subordinates = null // For the identification console (card.dm) + var/authenticated = 0 // For the identification console (card.dm) var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE @@ -131,7 +136,7 @@ Class Procs: else START_PROCESSING(SSfastprocess, src) power_change() - AddComponent(/datum/component/redirect, list(COMSIG_ENTER_AREA = CALLBACK(src, .proc/power_change))) + RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) if (occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) @@ -143,6 +148,10 @@ Class Procs: else STOP_PROCESSING(SSfastprocess, src) dropContents() + if(length(component_parts)) + for(var/atom/A in component_parts) + qdel(A) + component_parts.Cut() return ..() /obj/machinery/proc/locate_machinery() @@ -179,12 +188,15 @@ Class Procs: L.update_canmove() occupant = null +/obj/machinery/proc/can_be_occupant(atom/movable/am) + return occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am) + /obj/machinery/proc/close_machine(atom/movable/target = null) state_open = FALSE density = TRUE if(!target) for(var/am in loc) - if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am))) + if (!(can_be_occupant(am))) continue var/atom/movable/AM = am if(AM.has_buckled_mobs()) @@ -311,6 +323,7 @@ Class Procs: spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) + component_parts.Cut() qdel(src) /obj/machinery/proc/spawn_frame(disassembled) @@ -348,8 +361,8 @@ Class Procs: panel_open = FALSE icon_state = icon_state_closed to_chat(user, "You close the maintenance hatch of [src].") - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/I) if(panel_open && I.tool_behaviour == TOOL_WRENCH) @@ -401,7 +414,7 @@ Class Procs: var/obj/item/circuitboard/machine/CB = locate(/obj/item/circuitboard/machine) in component_parts var/P if(W.works_from_distance) - display_parts(user) + to_chat(user, display_parts(user)) for(var/obj/item/A in component_parts) for(var/D in CB.req_components) if(ispath(A.type, D)) @@ -429,34 +442,38 @@ Class Procs: break RefreshParts() else - display_parts(user) + to_chat(user, display_parts(user)) if(shouldplaysound) W.play_rped_sound() return TRUE return FALSE /obj/machinery/proc/display_parts(mob/user) - to_chat(user, "It contains the following parts:") + . = list() + . += "It contains the following parts:" for(var/obj/item/C in component_parts) - to_chat(user, "[icon2html(C, user)] \A [C].") + . += "[icon2html(C, user)] \A [C]." + . = jointext(., "") /obj/machinery/examine(mob/user) - ..() + . = ..() if(stat & BROKEN) - to_chat(user, "It looks broken and non-functional.") + . += "It looks broken and non-functional." if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" var/healthpercent = (obj_integrity/max_integrity) * 100 switch(healthpercent) if(50 to 99) - to_chat(user, "It looks slightly damaged.") + . += "It looks slightly damaged." if(25 to 50) - to_chat(user, "It appears heavily damaged.") + . += "It appears heavily damaged." if(0 to 25) - to_chat(user, "It's falling apart!") + . += "It's falling apart!" if(user.research_scanner && component_parts) - display_parts(user) + . += display_parts(user, TRUE) + if(inserted_scan_id || inserted_modify_id) + . += "Alt-click to eject the ID card." //called on machinery construction (i.e from frame to machinery) but not on initialization /obj/machinery/proc/on_construction() @@ -490,3 +507,72 @@ Class Procs: . = . % 9 AM.pixel_x = -8 + ((.%3)*8) AM.pixel_y = -8 + (round( . / 3)*8) + +/obj/machinery/proc/id_insert_scan(mob/user, obj/item/card/id/I) + I = user.get_active_held_item() + if(istype(I)) + if(inserted_scan_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(I, src)) + return + inserted_scan_id = I + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/proc/id_eject_scan(mob/user) + if(!inserted_scan_id) + to_chat(user, "There's no ID card in the console!") + return + if(inserted_scan_id) + inserted_scan_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(inserted_scan_id) + inserted_scan_id = null + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/proc/id_eject_modify(mob/user) + if(inserted_modify_id) + GLOB.data_core.manifest_modify(inserted_modify_id.registered_name, inserted_modify_id.assignment) + inserted_modify_id.update_label() + inserted_modify_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(inserted_modify_id) + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + inserted_modify_id = null + region_access = null + head_subordinates = null + updateUsrDialog() + +/obj/machinery/proc/id_insert_modify(mob/user) + var/obj/item/card/id/I = user.get_active_held_item() + if(istype(I)) + if(inserted_modify_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(I, src)) + return + inserted_modify_id = I + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) + return + if(inserted_modify_id) + id_eject_modify(user) + authenticated = FALSE + return + if(inserted_scan_id) + id_eject_scan(user) + authenticated = FALSE + return diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 1c517d6e8f..6d505c8f95 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -11,7 +11,6 @@ var/list/result_filters //For sorting the results var/checking_logs = 0 var/list/logs - var/authenticated = 0 var/auth_id = "\[NULL\]" /obj/machinery/computer/apc_control/Initialize() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 09bf401e12..0cce853c49 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -13,11 +13,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) circuit = /obj/item/circuitboard/computer/card var/obj/item/card/id/scan = null var/obj/item/card/id/modify = null - var/authenticated = 0 var/mode = 0 var/printing = null - var/list/region_access = null - var/list/head_subordinates = null var/target_dept = 0 //Which department this computer has access to. 0=all departments //Cooldown for closing positions in seconds diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 1654768de0..26f0d06ecb 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -64,9 +64,6 @@ if(!(scanner && LAZYLEN(pods) && autoprocess)) return - if(scanner.occupant && scanner.scan_level > 2) - scan_occupant(scanner.occupant) - for(var/datum/data/record/R in records) var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mind"]) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index eceaefd2b2..557f2f0636 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -6,7 +6,6 @@ icon_keyboard = "tech_key" req_access = list(ACCESS_HEADS) circuit = /obj/item/circuitboard/computer/communications - var/authenticated = 0 var/auth_id = "Unknown" //Who is currently logged in? var/list/datum/comm_message/messages = list() var/datum/comm_message/currmsg diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 8af83ae08e..d4fe3e27a2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -7,13 +7,10 @@ icon_keyboard = "med_key" req_one_access = list(ACCESS_MEDICAL, ACCESS_FORENSICS_LOCKERS) circuit = /obj/item/circuitboard/computer/med_data - var/obj/item/card/id/scan = null - var/authenticated = null var/rank = null var/screen = null var/datum/data/record/active1 var/datum/data/record/active2 - var/a_id = null var/temp = null var/printing = null //Sorting Variables @@ -25,24 +22,22 @@ /obj/machinery/computer/med_data/syndie icon_keyboard = "syndie_key" -/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/card/id) && !scan) - if(!user.transferItemToLoc(O, src)) - return - scan = O - to_chat(user, "You insert [O].") +/obj/machinery/computer/med_data/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id)) + id_insert_scan(user) else return ..() /obj/machinery/computer/med_data/ui_interact(mob/user) . = ..() + if(isliving(user)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) var/dat if(temp) dat = text("[temp]

Clear Screen") else - dat = text("Confirm Identity: []
", (src.scan ? text("[]", src.scan.name) : "----------")) - if(src.authenticated) - switch(src.screen) + if(authenticated) + switch(screen) if(1) dat += {" Search Records @@ -116,7 +111,7 @@ dat += "" dat += "" dat += "ID:[active1.fields["id"]]" - dat += "Sex: [active1.fields["sex"]] " + dat += "Gender: [active1.fields["gender"]] " dat += "Age: [active1.fields["age"]] " dat += "Species: [active1.fields["species"]] " dat += "Fingerprint: [active1.fields["fingerprint"]] " @@ -141,7 +136,7 @@ dat += "
Comments/Log" var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) dat += "[active2.fields[text("com_[]", counter)]]Delete Entry" counter++ dat += "Add Entry" @@ -169,7 +164,7 @@ dat += "
Medical Robots:" var/bdat = null for(var/mob/living/simple_animal/bot/medbot/M in GLOB.alive_mob_list) - if(M.z != src.z) + if(M.z != z) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up @@ -189,7 +184,7 @@ dat += "{Log In}" var/datum/browser/popup = new(user, "med_rec", "Medical Records Console", 600, 400) popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() /obj/machinery/computer/med_data/Topic(href, href_list) @@ -197,29 +192,20 @@ if(.) return . if(!(active1 in GLOB.data_core.general)) - src.active1 = null + active1 = null if(!(active2 in GLOB.data_core.medical)) - src.active2 = null + active2 = null if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) usr.set_machine(src) if(href_list["temp"]) - src.temp = null - if(href_list["scan"]) - if(src.scan) - usr.put_in_hands(scan) - scan = null - else - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - src.scan = I + temp = null else if(href_list["logout"]) - src.authenticated = null - src.screen = null - src.active1 = null - src.active2 = null + authenticated = null + screen = null + active1 = null + active2 = null + playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) else if(href_list["choice"]) // SORTING! if(href_list["choice"] == "Sorting") @@ -234,34 +220,37 @@ sortBy = href_list["sort"] order = initial(order) else if(href_list["login"]) - if(issilicon(usr)) - src.active1 = null - src.active2 = null - src.authenticated = 1 - src.rank = "AI" - src.screen = 1 - else if(IsAdminGhost(usr)) - src.active1 = null - src.active2 = null - src.authenticated = 1 - src.rank = "Central Command" - src.screen = 1 - else if(istype(src.scan, /obj/item/card/id)) - src.active1 = null - src.active2 = null - if(src.check_access(src.scan)) - src.authenticated = src.scan.registered_name - src.rank = src.scan.assignment - src.screen = 1 - if(src.authenticated) - + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(issilicon(M)) + active1 = null + active2 = null + authenticated = 1 + rank = "AI" + screen = 1 + else if(IsAdminGhost(M)) + active1 = null + active2 = null + authenticated = 1 + rank = "Central Command" + screen = 1 + else if(istype(I) && check_access(I)) + active1 = null + active2 = null + authenticated = I.registered_name + rank = I.assignment + screen = 1 + else + to_chat(usr, "Unauthorized access.") + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + if(authenticated) if(href_list["screen"]) - src.screen = text2num(href_list["screen"]) - if(src.screen < 1) - src.screen = 1 + screen = text2num(href_list["screen"]) + if(screen < 1) + screen = 1 - src.active1 = null - src.active2 = null + active1 = null + active2 = null else if(href_list["vir"]) var/type = href_list["vir"] @@ -269,7 +258,7 @@ var/AfS = "" for(var/mob/M in Dis.viable_mobtypes) AfS += " [initial(M.name)];" - src.temp = {"Name: [Dis.name] + temp = {"Name: [Dis.name]
Number of stages: [Dis.max_stages]
Spread: [Dis.spread_text] Transmission
Possible Cure: [(Dis.cure_text||"none")] @@ -280,110 +269,112 @@
Severity: [Dis.severity]"} else if(href_list["del_all"]) - src.temp = "Are you sure you wish to delete all records?
\n\tYes
\n\tNo
" + temp = "Are you sure you wish to delete all records?
\n\tYes
\n\tNo
" else if(href_list["del_all2"]) investigate_log("[key_name(usr)] has deleted all medical records.", INVESTIGATE_RECORDS) GLOB.data_core.medical.Cut() - src.temp = "All records deleted." + temp = "All records deleted." else if(href_list["field"]) - var/a1 = src.active1 - var/a2 = src.active2 + var/a1 = active1 + var/a2 = active2 switch(href_list["field"]) if("fingerprint") if(active1) - var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) + var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", active1.fields["fingerprint"], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - src.active1.fields["fingerprint"] = t1 - if("sex") + active1.fields["fingerprint"] = t1 + if("gender") if(active1) - if(src.active1.fields["sex"] == "Male") - src.active1.fields["sex"] = "Female" + if(active1.fields["gender"] == "Male") + active1.fields["gender"] = "Female" + else if(active1.fields["gender"] == "Female") + active1.fields["gender"] = "Other" else - src.active1.fields["sex"] = "Male" + active1.fields["gender"] = "Male" if("age") if(active1) - var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num + var/t1 = input("Please input age:", "Med. records", active1.fields["age"], null) as num if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - src.active1.fields["age"] = t1 + active1.fields["age"] = t1 if("species") if(active1) - var/t1 = stripped_input("Please input species name", "Med. records", src.active1.fields["species"], null) + var/t1 = stripped_input("Please input species name", "Med. records", active1.fields["species"], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return active1.fields["species"] = t1 if("mi_dis") if(active2) - var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) + var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["mi_dis"] = t1 + active2.fields["mi_dis"] = t1 if("mi_dis_d") if(active2) - var/t1 = stripped_input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) + var/t1 = stripped_input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["mi_dis_d"] = t1 + active2.fields["mi_dis_d"] = t1 if("ma_dis") if(active2) - var/t1 = stripped_input("Please input major disabilities list:", "Med. records", src.active2.fields["ma_dis"], null) + var/t1 = stripped_input("Please input major disabilities list:", "Med. records", active2.fields["ma_dis"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["ma_dis"] = t1 + active2.fields["ma_dis"] = t1 if("ma_dis_d") if(active2) - var/t1 = stripped_input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) + var/t1 = stripped_input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["ma_dis_d"] = t1 + active2.fields["ma_dis_d"] = t1 if("alg") if(active2) - var/t1 = stripped_input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) + var/t1 = stripped_input("Please state allergies:", "Med. records", active2.fields["alg"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["alg"] = t1 + active2.fields["alg"] = t1 if("alg_d") if(active2) - var/t1 = stripped_input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) + var/t1 = stripped_input("Please summarize allergies:", "Med. records", active2.fields["alg_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["alg_d"] = t1 + active2.fields["alg_d"] = t1 if("cdi") if(active2) - var/t1 = stripped_input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) + var/t1 = stripped_input("Please state diseases:", "Med. records", active2.fields["cdi"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["cdi"] = t1 + active2.fields["cdi"] = t1 if("cdi_d") if(active2) - var/t1 = stripped_input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) + var/t1 = stripped_input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["cdi_d"] = t1 + active2.fields["cdi_d"] = t1 if("notes") if(active2) - var/t1 = stripped_input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) + var/t1 = stripped_input("Please summarize notes:", "Med. records", active2.fields["notes"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["notes"] = t1 + active2.fields["notes"] = t1 if("p_stat") if(active1) - src.temp = "Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
" + temp = "Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
" if("m_stat") if(active1) - src.temp = "Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
" + temp = "Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
" if("blood_type") if(active2) - src.temp = "Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
" + temp = "Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
" if("b_dna") if(active2) - var/t1 = stripped_input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) + var/t1 = stripped_input("Please input DNA hash:", "Med. records", active2.fields["b_dna"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["b_dna"] = t1 + active2.fields["b_dna"] = t1 if("show_photo_front") if(active1) if(active1.fields["photo_front"]) @@ -402,51 +393,51 @@ if(active1) switch(href_list["p_stat"]) if("deceased") - src.active1.fields["p_stat"] = "*Deceased*" + active1.fields["p_stat"] = "*Deceased*" if("unconscious") - src.active1.fields["p_stat"] = "*Unconscious*" + active1.fields["p_stat"] = "*Unconscious*" if("active") - src.active1.fields["p_stat"] = "Active" + active1.fields["p_stat"] = "Active" if("unfit") - src.active1.fields["p_stat"] = "Physically Unfit" + active1.fields["p_stat"] = "Physically Unfit" else if(href_list["m_stat"]) if(active1) switch(href_list["m_stat"]) if("insane") - src.active1.fields["m_stat"] = "*Insane*" + active1.fields["m_stat"] = "*Insane*" if("unstable") - src.active1.fields["m_stat"] = "*Unstable*" + active1.fields["m_stat"] = "*Unstable*" if("watch") - src.active1.fields["m_stat"] = "*Watch*" + active1.fields["m_stat"] = "*Watch*" if("stable") - src.active1.fields["m_stat"] = "Stable" + active1.fields["m_stat"] = "Stable" else if(href_list["blood_type"]) if(active2) switch(href_list["blood_type"]) if("an") - src.active2.fields["blood_type"] = "A-" + active2.fields["blood_type"] = "A-" if("bn") - src.active2.fields["blood_type"] = "B-" + active2.fields["blood_type"] = "B-" if("abn") - src.active2.fields["blood_type"] = "AB-" + active2.fields["blood_type"] = "AB-" if("on") - src.active2.fields["blood_type"] = "O-" + active2.fields["blood_type"] = "O-" if("ap") - src.active2.fields["blood_type"] = "A+" + active2.fields["blood_type"] = "A+" if("bp") - src.active2.fields["blood_type"] = "B+" + active2.fields["blood_type"] = "B+" if("abp") - src.active2.fields["blood_type"] = "AB+" + active2.fields["blood_type"] = "AB+" if("op") - src.active2.fields["blood_type"] = "O+" + active2.fields["blood_type"] = "O+" else if(href_list["del_r"]) if(active2) - src.temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" + temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" else if(href_list["del_r2"]) investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS) @@ -463,10 +454,10 @@ screen = 4 else if(href_list["new"]) - if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) + if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) var/datum/data/record/R = new /datum/data/record( ) - R.fields["name"] = src.active1.fields["name"] - R.fields["id"] = src.active1.fields["id"] + R.fields["name"] = active1.fields["name"] + R.fields["id"] = active1.fields["id"] R.name = text("Medical Record #[]", R.fields["id"]) R.fields["blood_type"] = "Unknown" R.fields["b_dna"] = "Unknown" @@ -480,76 +471,77 @@ R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." R.fields["notes"] = "No notes." GLOB.data_core.medical += R - src.active2 = R - src.screen = 4 + active2 = R + screen = 4 else if(href_list["add_c"]) if(!(active2 in GLOB.data_core.medical)) return - var/a2 = src.active2 + var/a2 = active2 var/t1 = stripped_multiline_input("Add Comment:", "Med. records", null, null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) else if(href_list["del_c"]) - if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) - src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" + if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) + active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" else if(href_list["search"]) var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records") if(!canUseMedicalRecordsConsole(usr, t1)) return - src.active1 = null - src.active2 = null + active1 = null + active2 = null t1 = lowertext(t1) for(var/datum/data/record/R in GLOB.data_core.medical) if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) - src.active2 = R + active2 = R else //Foreach continue //goto(3229) - if(!( src.active2 )) - src.temp = text("Could not locate record [].", sanitize(t1)) + if(!( active2 )) + temp = text("Could not locate record [].", sanitize(t1)) else for(var/datum/data/record/E in GLOB.data_core.general) - if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) - src.active1 = E + if((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) + active1 = E else //Foreach continue //goto(3334) - src.screen = 4 + screen = 4 else if(href_list["print_p"]) - if(!( src.printing )) - src.printing = 1 + if(!( printing )) + printing = 1 GLOB.data_core.medicalPrintCount++ playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) sleep(30) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) + var/obj/item/paper/P = new /obj/item/paper( loc ) P.info = "
Medical Record - (MR-[GLOB.data_core.medicalPrintCount])

" if(active1 in GLOB.data_core.general) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"]) + P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"]) P.info += "\nSpecies: [active1.fields["species"]]
" - P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"]) + P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) else P.info += "General Record Lost!
" if(active2 in GLOB.data_core.medical) - P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src.active2.fields["blood_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"]) + P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", active2.fields["blood_type"], active2.fields["b_dna"], active2.fields["mi_dis"], active2.fields["mi_dis_d"], active2.fields["ma_dis"], active2.fields["ma_dis_d"], active2.fields["alg"], active2.fields["alg_d"], active2.fields["cdi"], active2.fields["cdi_d"], active2.fields["notes"]) var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - P.info += text("[]
", src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) + P.info += text("[]
", active2.fields[text("com_[]", counter)]) counter++ - P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, src.active1.fields["name"]) + P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, active1.fields["name"]) else P.info += "Medical Record Lost!
" P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, "Record Lost") P.info += "" - src.printing = null + P.update_icon() + printing = null - src.add_fingerprint(usr) - src.updateUsrDialog() + add_fingerprint(usr) + updateUsrDialog() return /obj/machinery/computer/med_data/emp_act(severity) @@ -560,11 +552,11 @@ switch(rand(1,6)) if(1) if(prob(10)) - R.fields["name"] = random_unique_lizard_name(R.fields["sex"],1) + R.fields["name"] = random_unique_lizard_name(R.fields["gender"],1) else - R.fields["name"] = random_unique_name(R.fields["sex"],1) + R.fields["name"] = random_unique_name(R.fields["gender"],1) if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["gender"] = pick("Male", "Female", "Other") if(3) R.fields["age"] = rand(AGE_MIN, AGE_MAX) if(4) @@ -583,7 +575,7 @@ if(user) if(message) if(authenticated) - if(user.canUseTopic(src)) + if(user.canUseTopic(src, BE_CLOSE)) if(!record1 || record1 == active1) if(!record2 || record2 == active2) return 1 diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 798b0e4c65..a852612d9d 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -1,143 +1 @@ /obj/machinery/computer/prisoner - name = "prisoner management console" - desc = "Used to manage tracking implants placed inside criminals." - icon_screen = "explosive" - icon_keyboard = "security_key" - req_access = list(ACCESS_BRIG) - var/id = 0 - var/temp = null - var/status = 0 - var/timeleft = 60 - var/stop = 0 - var/screen = 0 // 0 - No Access Denied, 1 - Access allowed - var/obj/item/card/id/prisoner/inserted_id - circuit = /obj/item/circuitboard/computer/prisoner - - light_color = LIGHT_COLOR_RED - -/obj/machinery/computer/prisoner/ui_interact(mob/user) - . = ..() - var/dat = "" - if(screen == 0) - dat += "
Unlock Console" - else if(screen == 1) - dat += "

Prisoner ID Management

" - if(inserted_id) - dat += text("[inserted_id]
") - dat += text("Collected Points: [inserted_id.points]. Reset.
") - dat += text("Card goal: [inserted_id.goal]. Set
") - dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") - else - dat += text("Insert Prisoner ID.
") - dat += "

Prisoner Implant Management

" - dat += "
Chemical Implants
" - var/turf/Tr = null - for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) - Tr = get_turf(C) - if((Tr) && (Tr.z != src.z)) - continue//Out of range - if(!C.imp_in) - continue - dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume]
" - dat += "| Inject: " - dat += "((1))" - dat += "((5))" - dat += "((10))
" - dat += "********************************
" - dat += "
Tracking Implants
" - for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) - if(!isliving(T.imp_in)) - continue - Tr = get_turf(T) - if((Tr) && (Tr.z != src.z)) - continue//Out of range - - var/loc_display = "Unknown" - var/mob/living/M = T.imp_in - if(is_station_level(Tr.z) && !isspaceturf(M.loc)) - var/turf/mob_loc = get_turf(M) - loc_display = mob_loc.loc - - dat += "ID: [T.imp_in.name] | Location: [loc_display]
" - dat += "(Message Holder) |
" - dat += "********************************
" - dat += "
Lock Console" - var/datum/browser/popup = new(user, "computer", "Prisoner Management Console", 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/prisoner/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id)) - return attack_hand(user) - else - return ..() - -/obj/machinery/computer/prisoner/process() - if(!..()) - src.updateDialog() - return - - -/obj/machinery/computer/prisoner/Topic(href, href_list) - if(..()) - return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) - usr.set_machine(src) - - if(href_list["id"]) - if(href_list["id"] =="insert" && !inserted_id) - var/obj/item/card/id/prisoner/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I - else - to_chat(usr, "No valid ID.") - else if(inserted_id) - switch(href_list["id"]) - if("eject") - inserted_id.forceMove(drop_location()) - inserted_id.verb_pickup() - inserted_id = null - if("reset") - inserted_id.points = 0 - if("setgoal") - var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null) - if(num >= 0) - num = min(num,1000) //Cap the quota to the equivilent of 10 minutes. - inserted_id.goal = num - else if(href_list["inject1"]) - var/obj/item/implant/I = locate(href_list["inject1"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(1) - else if(href_list["inject5"]) - var/obj/item/implant/I = locate(href_list["inject5"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(5) - - else if(href_list["inject10"]) - var/obj/item/implant/I = locate(href_list["inject10"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(10) - - else if(href_list["lock"]) - if(src.allowed(usr)) - screen = !screen - else - to_chat(usr, "Unauthorized Access.") - - else if(href_list["warn"]) - var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) - if(!warning) - return - var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants - if(I && istype(I) && I.imp_in) - var/mob/living/R = I.imp_in - to_chat(R, "You hear a voice in your head saying: '[warning]'") - log_directed_talk(usr, R, warning, LOG_SAY, "implant message") - - src.add_fingerprint(usr) - src.updateUsrDialog() - return diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm new file mode 100644 index 0000000000..d07c351a22 --- /dev/null +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -0,0 +1,52 @@ +/obj/machinery/computer/prisoner + var/obj/item/card/id/prisoner/contained_id + +/obj/machinery/computer/prisoner/Destroy() + if(contained_id) + contained_id.forceMove(get_turf(src)) + return ..() + + +/obj/machinery/computer/prisoner/examine(mob/user) + . = ..() + if(contained_id) + . += "Alt-click to eject the ID card." + + + +/obj/machinery/computer/prisoner/AltClick(mob/user) + id_eject(user) + return ..() + +/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/prisoner/P) + if(istype(P)) + if(contained_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(P, src)) + return + contained_id = P + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/computer/prisoner/proc/id_eject(mob/user) + if(!contained_id) + to_chat(user, "There's no ID card in the console!") + return + else + contained_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(contained_id) + contained_id = null + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/computer/prisoner/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/card/id/prisoner)) + id_insert(user, I) + else + return ..() diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm new file mode 100644 index 0000000000..f6e164efe9 --- /dev/null +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -0,0 +1,142 @@ +//computer that handle the points and teleports the prisoner +/obj/machinery/computer/prisoner/gulag_teleporter_computer + name = "labor camp teleporter console" + desc = "Used to send criminals to the Labor Camp." + icon_screen = "explosive" + icon_keyboard = "security_key" + req_access = list(ACCESS_ARMORY) + circuit = /obj/item/circuitboard/computer/gulag_teleporter_console + var/default_goal = 200 + var/obj/machinery/gulag_teleporter/teleporter = null + var/obj/structure/gulag_beacon/beacon = null + var/mob/living/carbon/human/prisoner = null + var/datum/data/record/temporary_record = null + + light_color = LIGHT_COLOR_RED + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/Initialize() + . = ..() + scan_machinery() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/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, "gulag_console", name, 455, 440, master_ui, state) + ui.open() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user) + var/list/data = list() + + var/list/prisoner_list = list() + var/can_teleport = FALSE + + if(teleporter && (teleporter.occupant && ishuman(teleporter.occupant))) + prisoner = teleporter.occupant + prisoner_list["name"] = prisoner.real_name + if(contained_id) + can_teleport = TRUE + if(!isnull(GLOB.data_core.general)) + for(var/r in GLOB.data_core.security) + var/datum/data/record/R = r + if(R.fields["name"] == prisoner_list["name"]) + temporary_record = R + prisoner_list["crimstat"] = temporary_record.fields["criminal"] + + data["prisoner"] = prisoner_list + + if(teleporter) + data["teleporter"] = teleporter + data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" + data["teleporter_lock"] = teleporter.locked + data["teleporter_state_open"] = teleporter.state_open + if(beacon) + data["beacon"] = beacon + data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" + if(contained_id) + data["id"] = contained_id + data["id_name"] = contained_id.registered_name + data["goal"] = contained_id.goal + data["can_teleport"] = can_teleport + + return data + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_act(action, list/params) + if(isliving(usr)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + if(..()) + return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + switch(action) + if("scan_teleporter") + teleporter = findteleporter() + if("scan_beacon") + beacon = findbeacon() + if("handle_id") + if(contained_id) + id_eject(usr) + else + id_insert(usr) + if("set_goal") + var/new_goal = input("Set the amount of points:", "Points", contained_id.goal) as num|null + if(!isnum(new_goal)) + return + if(!new_goal) + new_goal = default_goal + if (new_goal > 1000) + to_chat(usr, "The entered amount of points is too large. Points have instead been set to the maximum allowed amount.") + contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + if("toggle_open") + if(teleporter.locked) + to_chat(usr, "The teleporter is locked") + return + teleporter.toggle_open() + if("teleporter_lock") + if(teleporter.state_open) + to_chat(usr, "Close the teleporter before locking!") + return + teleporter.locked = !teleporter.locked + if("teleport") + if(!teleporter || !beacon) + return + addtimer(CALLBACK(src, .proc/teleport, usr), 5) + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/scan_machinery() + teleporter = findteleporter() + beacon = findbeacon() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/findteleporter() + var/obj/machinery/gulag_teleporter/teleporterf = null + + for(var/direction in GLOB.cardinals) + teleporterf = locate(/obj/machinery/gulag_teleporter, get_step(src, direction)) + if(teleporterf && teleporterf.is_operational()) + return teleporterf + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/findbeacon() + return locate(/obj/structure/gulag_beacon) + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/teleport(mob/user) + if(!contained_id) //incase the ID was removed after the transfer timer was set. + say("Warning: Unable to transfer prisoner without a valid Prisoner ID inserted!") + return + var/id_goal_not_set + if(!contained_id.goal) + id_goal_not_set = TRUE + contained_id.goal = default_goal + say("[contained_id]'s ID card goal defaulting to [contained_id.goal] points.") + log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.") + teleporter.handle_prisoner(contained_id, temporary_record) + playsound(src, 'sound/weapons/emitter.ogg', 50, 1) + prisoner.forceMove(get_turf(beacon)) + prisoner.Stun(40) // small travel dizziness + to_chat(prisoner, "The teleportation makes you a little dizzy.") + new /obj/effect/particle_effect/sparks(get_turf(prisoner)) + playsound(src, "sparks", 50, 1) + if(teleporter.locked) + teleporter.locked = FALSE + teleporter.toggle_open() + contained_id = null + temporary_record = null diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm new file mode 100644 index 0000000000..e231a1748a --- /dev/null +++ b/code/game/machinery/computer/prisoner/management.dm @@ -0,0 +1,139 @@ + +/obj/machinery/computer/prisoner/management + name = "prisoner management console" + desc = "Used to manage tracking implants placed inside criminals." + icon_screen = "explosive" + icon_keyboard = "security_key" + req_access = list(ACCESS_BRIG) + var/id = 0 + var/temp = null + var/status = 0 + var/timeleft = 60 + var/stop = 0 + var/screen = 0 // 0 - No Access Denied, 1 - Access allowed + circuit = /obj/item/circuitboard/computer/prisoner + + light_color = LIGHT_COLOR_RED + +/obj/machinery/computer/prisoner/management/ui_interact(mob/user) + . = ..() + if(isliving(user)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + var/dat = "" + if(screen == 0) + dat += "
{Log In}" + else if(screen == 1) + dat += "

Prisoner ID Management

" + if(contained_id) + dat += text("[contained_id]
") + dat += text("Collected Points: [contained_id.points]. Reset.
") + dat += text("Card goal: [contained_id.goal]. Set
") + dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") + else + dat += text("Insert Prisoner ID.
") + dat += "

Prisoner Implant Management

" + dat += "
Chemical Implants
" + var/turf/Tr = null + for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) + Tr = get_turf(C) + if((Tr) && (Tr.z != src.z)) + continue//Out of range + if(!C.imp_in) + continue + dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume]
" + dat += "| Inject: " + dat += "((1))" + dat += "((5))" + dat += "((10))
" + dat += "********************************
" + dat += "
Tracking Implants
" + for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) + if(!isliving(T.imp_in)) + continue + Tr = get_turf(T) + if((Tr) && (Tr.z != src.z)) + continue//Out of range + + var/loc_display = "Unknown" + var/mob/living/M = T.imp_in + if(is_station_level(Tr.z) && !isspaceturf(M.loc)) + var/turf/mob_loc = get_turf(M) + loc_display = mob_loc.loc + + dat += "ID: [T.imp_in.name] | Location: [loc_display]
" + dat += "(Message Holder) |
" + dat += "********************************
" + dat += "
{Log Out}" + var/datum/browser/popup = new(user, "computer", "Prisoner Management Console", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/prisoner/management/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id)) + if(screen) + id_insert(user) + else + to_chat(user, "Unauthorized access.") + else + return ..() + +/obj/machinery/computer/prisoner/management/process() + if(!..()) + src.updateDialog() + return + +/obj/machinery/computer/prisoner/management/Topic(href, href_list) + if(..()) + return + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + usr.set_machine(src) + + if(href_list["id"]) + if(href_list["id"] =="insert" && !contained_id) + id_insert(usr) + else if(contained_id) + switch(href_list["id"]) + if("eject") + id_eject(usr) + if("reset") + contained_id.points = 0 + if("setgoal") + var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null) + if(num >= 0) + num = min(num,1000) //Cap the quota to the equivilent of 10 minutes. + contained_id.goal = num + else if(href_list["inject1"]) + var/obj/item/implant/I = locate(href_list["inject1"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(1) + else if(href_list["inject5"]) + var/obj/item/implant/I = locate(href_list["inject5"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(5) + else if(href_list["inject10"]) + var/obj/item/implant/I = locate(href_list["inject10"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(10) + + else if(href_list["lock"]) + if(allowed(usr)) + screen = !screen + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + else + to_chat(usr, "Unauthorized access.") + + else if(href_list["warn"]) + var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) + if(!warning) + return + var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants + if(I && istype(I) && I.imp_in) + var/mob/living/R = I.imp_in + to_chat(R, "You hear a voice in your head saying: '[warning]'") + log_directed_talk(usr, R, warning, LOG_SAY, "implant message") + + src.add_fingerprint(usr) + src.updateUsrDialog() + return diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 607f8dbe78..1823e34100 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -5,13 +5,10 @@ icon_keyboard = "security_key" req_one_access = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) circuit = /obj/item/circuitboard/computer/secure_data - var/obj/item/card/id/scan = null - var/authenticated = null var/rank = null var/screen = null var/datum/data/record/active1 = null var/datum/data/record/active2 = null - var/a_id = null var/temp = null var/printing = null var/can_change_id = 0 @@ -23,11 +20,6 @@ light_color = LIGHT_COLOR_RED -/obj/machinery/computer/secure_data/examine(mob/user) - ..() - if(scan) - to_chat(user, "Alt-click to eject the ID card.") - /obj/machinery/computer/secure_data/syndie icon_keyboard = "syndie_key" @@ -40,32 +32,19 @@ clockwork = TRUE //it'd look weird pass_flags = PASSTABLE -/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/card/id)) - if(!scan) - if(!user.transferItemToLoc(O, src)) - return - scan = O - to_chat(user, "You insert [O].") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - updateUsrDialog() - else - to_chat(user, "There's already an ID card in the console.") - else - return ..() - //Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/secure_data/ui_interact(mob/user) . = ..() + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if(src.z > 6) to_chat(user, "Unable to establish a connection: \black You're too far away from the station!") return var/dat if(temp) - dat = text("[]

Clear Screen", temp) + dat = "[temp]

Clear Screen" else - dat = text("Confirm Identity: []
", (scan ? text("[]", scan.name) : "----------")) + dat = "" if(authenticated) switch(screen) if(1) @@ -190,7 +169,7 @@ dat += {"
- + "} dat += "" dat += {" @@ -309,36 +288,39 @@ What a mess.*/ active1 = null active2 = null - if("Confirm Identity") - eject_id(usr) - if("Log Out") authenticated = null screen = null active1 = null active2 = null + playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) if("Log In") - if(issilicon(usr)) - var/mob/living/silicon/borg = usr + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(issilicon(M)) + var/mob/living/silicon/borg = M active1 = null active2 = null authenticated = borg.name rank = "AI" screen = 1 - else if(IsAdminGhost(usr)) + else if(IsAdminGhost(M)) active1 = null active2 = null - authenticated = usr.client.holder.admin_signature + authenticated = M.client.holder.admin_signature rank = "Central Command" screen = 1 - else if(istype(scan, /obj/item/card/id)) + else if(I && check_access(I)) active1 = null active2 = null - if(check_access(scan)) - authenticated = scan.registered_name - rank = scan.assignment - screen = 1 + authenticated = I.registered_name + rank = I.assignment + screen = 1 + else + to_chat(usr, "Unauthorized Access.") + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + //RECORD FUNCTIONS if("Record Maintenance") screen = 2 @@ -346,16 +328,14 @@ What a mess.*/ active2 = null if("Browse Record") - var/datum/data/record/R = locate(href_list["d_rec"]) - var/S = locate(href_list["d_rec"]) - if(!( GLOB.data_core.general.Find(R) )) + var/datum/data/record/R = locate(href_list["d_rec"]) in GLOB.data_core.general + if(!R) temp = "Record Not Found!" else + active1 = active2 = R for(var/datum/data/record/E in GLOB.data_core.security) if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - active1 = R - active2 = S + active2 = E screen = 3 @@ -368,7 +348,7 @@ What a mess.*/ var/obj/item/paper/P = new /obj/item/paper( loc ) P.info = "
Security Record - (SR-[GLOB.data_core.securityPrintCount])

" if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"]) + P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"]) P.info += "\nSpecies: [active1.fields["species"]]
" P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) else @@ -419,6 +399,7 @@ What a mess.*/ P.info += "Security Record Lost!
" P.name = text("SR-[] '[]'", GLOB.data_core.securityPrintCount, "Record Lost") P.info += "" + P.update_icon() printing = null if("Print Poster") if(!( printing )) @@ -512,7 +493,7 @@ What a mess.*/ G.fields["name"] = "New Record" G.fields["id"] = "[num2hex(rand(1, 1.6777215E7), 6)]" G.fields["rank"] = "Unassigned" - G.fields["sex"] = "Male" + G.fields["gender"] = "Male" G.fields["age"] = "Unknown" G.fields["species"] = "Human" G.fields["photo_front"] = new /icon() @@ -584,12 +565,14 @@ What a mess.*/ if(!canUseSecurityRecordsConsole(usr, t1, a1)) return active1.fields["fingerprint"] = t1 - if("sex") + if("gender") if(istype(active1, /datum/data/record)) - if(active1.fields["sex"] == "Male") - active1.fields["sex"] = "Female" + if(active1.fields["gender"] == "Male") + active1.fields["gender"] = "Female" + else if(active1.fields["gender"] == "Female") + active1.fields["gender"] = "Other" else - active1.fields["sex"] = "Male" + active1.fields["gender"] = "Male" if("age") if(istype(active1, /datum/data/record)) var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num @@ -767,19 +750,14 @@ What a mess.*/ P = user.get_active_held_item() return P -/obj/machinery/computer/secure_data/proc/print_photo(icon/temp, name) +/obj/machinery/computer/secure_data/proc/print_photo(icon/temp, person_name) if (printing) return printing = TRUE sleep(20) var/obj/item/photo/P = new/obj/item/photo(drop_location()) - var/icon/small_img = icon(temp) - var/icon/ic = icon('icons/obj/items_and_weapons.dmi',"photo") - small_img.Scale(8, 8) - ic.Blend(small_img,ICON_OVERLAY, 13, 13) - P.icon = ic - P.picture.picture_image = temp - P.desc = "The photo on file for [name]." + var/datum/picture/toEmbed = new(name = person_name, desc = "The photo on file for [person_name].", image = temp) + P.set_picture(toEmbed, TRUE, TRUE) P.pixel_x = rand(-10, 10) P.pixel_y = rand(-10, 10) printing = FALSE @@ -799,7 +777,7 @@ What a mess.*/ else R.fields["name"] = "[pick(pick(GLOB.first_names_male), pick(GLOB.first_names_female))] [pick(GLOB.last_names)]" if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["gender"] = pick("Male", "Female", "Other") if(3) R.fields["age"] = rand(5, 85) if(4) @@ -823,7 +801,7 @@ What a mess.*/ /obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2) if(user) if(authenticated) - if(user.canUseTopic(src)) + if(user.canUseTopic(src, BE_CLOSE)) if(!trim(message1)) return 0 if(!record1 || record1 == active1) @@ -831,22 +809,3 @@ What a mess.*/ return 1 return 0 -/obj/machinery/computer/secure_data/AltClick(mob/user) - if(user.canUseTopic(src)) - eject_id(user) - -/obj/machinery/computer/secure_data/proc/eject_id(mob/user) - if(scan) - scan.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(scan) - scan = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - else //switching the ID with the one you're holding - if(issilicon(user) || !Adjacent(user)) - return - var/obj/item/card/id/held_id = user.is_holding_item_of_type(/obj/item/card/id) - if(QDELETED(held_id) || !user.transferItemToLoc(held_id, src)) - return - scan = held_id - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 320430be39..f51c145635 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -9,7 +9,6 @@ idle_power_usage = 100 active_power_usage = 2500 var/list/stored_items = list() - var/obj/item/card/id/prisoner/inserted_id = null var/obj/machinery/gulag_teleporter/linked_teleporter = null /obj/machinery/gulag_item_reclaimer/Destroy() @@ -18,9 +17,6 @@ I.forceMove(get_turf(src)) if(linked_teleporter) linked_teleporter.linked_reclaimer = null - if(inserted_id) - inserted_id.forceMove(get_turf(src)) - inserted_id = null return ..() /obj/machinery/gulag_item_reclaimer/emag_act(mob/user) @@ -31,18 +27,6 @@ obj_flags |= EMAGGED return TRUE -/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/card/id)) - if(!inserted_id) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(user, "You insert [I].") - return - else - to_chat(user, "There's an ID inserted already.") - return ..() - /obj/machinery/gulag_item_reclaimer/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) @@ -57,15 +41,19 @@ if(allowed(user)) can_reclaim = TRUE - if(inserted_id) - data["id"] = inserted_id - data["id_name"] = inserted_id.registered_name - if(inserted_id.points >= inserted_id.goal) + var/obj/item/card/id/I = user.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + if(P.points >= P.goal) can_reclaim = TRUE var/list/mobs = list() for(var/i in stored_items) var/mob/thismob = i + if(QDELETED(thismob)) + say("Alert! Unable to locate vital signals of a previously processed prisoner. Ejecting equipment!") + drop_items(thismob) + continue var/list/mob_info = list() mob_info["name"] = thismob.real_name mob_info["mob"] = "[REF(thismob)]" @@ -80,16 +68,6 @@ /obj/machinery/gulag_item_reclaimer/ui_act(action, list/params) switch(action) - if("handle_id") - if(inserted_id) - usr.put_in_hands(inserted_id) - inserted_id = null - else - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I if("release_items") var/mob/M = locate(params["mobref"]) if(M == usr || allowed(usr)) @@ -100,8 +78,9 @@ /obj/machinery/gulag_item_reclaimer/proc/drop_items(mob/user) if(!stored_items[user]) return + var/drop_location = drop_location() for(var/i in stored_items[user]) var/obj/item/W = i stored_items[user] -= W - W.forceMove(get_turf(src)) + W.forceMove(drop_location) stored_items -= user 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/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index 1708753dc1..1e755bc7e9 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -36,4 +36,203 @@ /obj/effect/turf_decal/tile/neutral name = "neutral corner" color = "#D4D4D4" - alpha = 50 \ No newline at end of file + alpha = 50 + +/obj/effect/turf_decal/trimline + layer = TURF_PLATING_DECAL_LAYER + alpha = 110 + icon_state = "trimline_box" + +/obj/effect/turf_decal/trimline/white + color = "#FFFFFF" + +/obj/effect/turf_decal/trimline/white/line + name = "trim decal" + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/white/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/white/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/white/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/white/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/white/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/white/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/red + color = "#DE3A3A" + +/obj/effect/turf_decal/trimline/red/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/red/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/red/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/red/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/red/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/red/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/red/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/green + color = "#9FED58" + +/obj/effect/turf_decal/trimline/green/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/green/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/green/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/green/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/green/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/green/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/green/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/blue + color = "#52B4E9" + +/obj/effect/turf_decal/trimline/blue/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/blue/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/blue/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/blue/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/blue/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/blue/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/blue/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/yellow + color = "#EFB341" + +/obj/effect/turf_decal/trimline/yellow/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/yellow/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/yellow/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/yellow/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/purple + color = "#D381C9" + +/obj/effect/turf_decal/trimline/purple/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/purple/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/purple/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/purple/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/purple/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/purple/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/purple/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/brown + color = "#A46106" + +/obj/effect/turf_decal/trimline/brown/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/brown/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/brown/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/brown/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/brown/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/brown/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/brown/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/neutral + color = "#D4D4D4" + alpha = 50 + +/obj/effect/turf_decal/trimline/neutral/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/neutral/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/neutral/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/neutral/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/neutral/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/neutral/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/brown/filled/end + icon_state = "trimline_end_fill" \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 566a64577d..c98cef2b87 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -68,6 +68,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/strip_delay = 40 //In deciseconds, how long an item takes to remove from another person var/breakouttime = 0 var/list/materials + var/reskinned = FALSE var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/list/species_exception = null // list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 1ff3c7df9f..cf706359f7 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -37,6 +37,7 @@ RLD var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states var/custom_range = 7 + var/upgrade = FALSE /obj/item/construction/Initialize() . = ..() @@ -82,6 +83,11 @@ RLD loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 metal if(loaded) to_chat(user, "[src] now holds [matter]/[max_matter] matter-units.") + else if(istype(W, /obj/item/rcd_upgrade)) + to_chat(user, "You upgrade the RCD with the [W]!") + upgrade = TRUE + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + qdel(W) else return ..() update_icon() //ensures that ammo counters (if present) get updated @@ -148,6 +154,7 @@ RLD has_ammobar = TRUE var/mode = 1 var/ranged = FALSE + var/computer_dir = 1 var/airlock_type = /obj/machinery/door/airlock var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use var/window_type = /obj/structure/window/fulltile @@ -270,6 +277,28 @@ RLD return FALSE return TRUE +/obj/item/construction/rcd/proc/change_computer_dir(mob/user) + if(!user) + return + var/list/computer_dirs = list( + "NORTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "cnorth"), + "EAST" = image(icon = 'icons/mob/radial.dmi', icon_state = "ceast"), + "SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"), + "WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest") + ) + var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(computerdirs) + if("NORTH") + computer_dir = 1 + if("EAST") + computer_dir = 4 + if("SOUTH") + computer_dir = 2 + if("WEST") + computer_dir = 8 + /obj/item/construction/rcd/proc/change_airlock_setting(mob/user) if(!user) return @@ -434,10 +463,15 @@ RLD ..() var/list/choices = list( "Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"), - "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"), "Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"), "Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor") ) + if(upgrade) + choices += list( + "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"), + "Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"), + "Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"), + ) if(mode == RCD_AIRLOCK) choices += list( "Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"), @@ -459,6 +493,12 @@ RLD mode = RCD_DECONSTRUCT if("Grilles & Windows") mode = RCD_WINDOWGRILLE + if("Machine Frames") + mode = RCD_MACHINE + if("Computer Frames") + mode = RCD_COMPUTER + change_computer_dir(user) + return if("Change Access") change_airlock_access(user) return @@ -511,6 +551,7 @@ RLD no_ammo_message = "Insufficient charge." desc = "A device used to rapidly build walls and floors." canRturf = TRUE + upgrade = TRUE /obj/item/construction/rcd/borg/useResource(amount, mob/user) @@ -542,6 +583,9 @@ RLD /obj/item/construction/rcd/loaded matter = 160 +/obj/item/construction/rcd/loaded/upgraded + upgrade = TRUE + /obj/item/construction/rcd/combat name = "Combat RCD" desc = "A device used to rapidly build and deconstruct. Reload with metal, plasteel, glass or compressed matter cartridges. This RCD has been upgraded to be able to remove Rwalls!" @@ -582,7 +626,7 @@ RLD name = "admin RCD" max_matter = INFINITY matter = INFINITY - + upgrade = TRUE // Ranged RCD @@ -776,6 +820,12 @@ RLD return TRUE return FALSE +/obj/item/rcd_upgrade + name = "RCD advanced design disk" + desc = "It contains the design for machine frames, computer frames, and deconstruction." + icon = 'icons/obj/module.dmi' + icon_state = "datadisk3" + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index bb45f80f2d..c260a95afd 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -162,10 +162,11 @@ /obj/item/circuitboard/computer/prisoner name = "Prisoner Management Console (Computer Board)" - build_path = /obj/machinery/computer/prisoner + build_path = /obj/machinery/computer/prisoner/management + /obj/item/circuitboard/computer/gulag_teleporter_console name = "Labor Camp teleporter console (Computer Board)" - build_path = /obj/machinery/computer/gulag_teleporter_computer + build_path = /obj/machinery/computer/prisoner/gulag_teleporter_computer /obj/item/circuitboard/computer/rdconsole/production name = "R&D Console Production Only (Computer Board)" @@ -373,4 +374,4 @@ /obj/item/circuitboard/computer/nanite_cloud_controller name = "Nanite Cloud Control (Computer Board)" - build_path = /obj/machinery/computer/nanite_cloud_controller \ No newline at end of file + build_path = /obj/machinery/computer/nanite_cloud_controller diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a3ab9153ce..207497922e 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -32,6 +32,24 @@ var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 +/obj/item/multitool/chaplain + name = "\improper hypertool" + desc = "Used for pulsing wires to test which to cut. Also emits microwaves to fry some brains!" + damtype = BRAIN + force = 18 + armour_penetration = 35 + hitsound = 'sound/effects/sparks4.ogg' + var/chaplain_spawnable = TRUE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON + throw_speed = 3 + throw_range = 4 + throwforce = 10 + obj_flags = UNIQUE_RENAME + +/obj/item/multitool/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + /obj/item/multitool/examine(mob/user) ..() if(selected_io) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 6e3deaa694..185875a93f 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -229,8 +229,8 @@ throwforce = 10 w_class = WEIGHT_CLASS_TINY obj_flags = UNIQUE_RENAME - var/reskinned = FALSE var/chaplain_spawnable = TRUE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/nullrod/Initialize() . = ..() @@ -247,9 +247,12 @@ /obj/item/nullrod/proc/reskin_holy_weapon(mob/M) if(GLOB.holy_weapon_type) return - var/obj/item/nullrod/holy_weapon + var/obj/item/holy_weapon var/list/holy_weapons_list = typesof(/obj/item/nullrod) + list( - /obj/item/melee/transforming/energy/sword/cx/chaplain + /obj/item/twohanded/dualsaber/hypereutactic/chaplain, + /obj/item/gun/energy/laser/redtag/hitscan/chaplain, + /obj/item/multitool/chaplain, + /obj/item/melee/baseball_bat/chaplain ) var/list/display_names = list() for(var/V in holy_weapons_list) @@ -273,6 +276,13 @@ qdel(src) M.put_in_active_hand(holy_weapon) +/obj/item/nullrod/proc/jedi_spin(mob/living/user) + for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH)) + user.setDir(i) + if(i == WEST) + user.emote("flip") + sleep(1) + /obj/item/nullrod/godhand icon_state = "disintegrate" item_state = "disintegrate" @@ -328,7 +338,6 @@ sharpness = IS_SHARP hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(attack_type == PROJECTILE_ATTACK) @@ -522,7 +531,6 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_HUGE attack_verb = list("smashed", "bashed", "hammered", "crunched") - total_mass = TOTAL_MASS_MEDIEVAL_WEAPON /obj/item/nullrod/chainsaw name = "chainsaw hand" @@ -585,6 +593,7 @@ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' slot_flags = ITEM_SLOT_BELT + force = 12 reach = 2 attack_verb = list("whipped", "lashed") hitsound = 'sound/weapons/chainhit.ogg' @@ -661,6 +670,44 @@ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' +/obj/item/nullrod/claymore/bostaff/attack(mob/target, mob/living/user) + add_fingerprint(user) + if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) + to_chat(user, "You club yourself over the head with [src].") + user.Knockdown(60) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD) + else + user.take_bodypart_damage(2*force) + return + if(iscyborg(target)) + return ..() + if(!isliving(target)) + return ..() + var/mob/living/carbon/C = target + if(C.stat || C.health < 0 || C.staminaloss > 130 ) + to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.") + return + if(user.a_intent == INTENT_DISARM) + if(!ishuman(target)) + return ..() + var/mob/living/carbon/human/H = target + var/list/fluffmessages = list("[user] clubs [H] with [src]!", \ + "[user] smacks [H] with the butt of [src]!", \ + "[user] broadsides [H] with [src]!", \ + "[user] smashes [H]'s head with [src]!", \ + "[user] beats [H] with front of [src]!", \ + "[user] twirls and slams [H] with [src]!") + H.visible_message("[pick(fluffmessages)]", \ + "[pick(fluffmessages)]") + playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1) + H.adjustStaminaLoss(rand(12,18)) + if(prob(25)) + (INVOKE_ASYNC(src, .proc/jedi_spin, user)) + else + return ..() + /obj/item/nullrod/tribal_knife icon_state = "crysknife" item_state = "crysknife" @@ -674,7 +721,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") item_flags = SLOWS_WHILE_IN_HAND - total_mass = TOTAL_MASS_NORMAL_ITEM /obj/item/nullrod/tribal_knife/Initialize(mapload) . = ..() 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/plushes.dm b/code/game/objects/items/plushes.dm index 40380dfe80..48588cf9f3 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -629,7 +629,7 @@ /obj/item/toy/plush/mothplushie name = "insect plushie" - desc = "An adorable stuffed toy that resembles some kind of insect" + desc = "An adorable stuffed toy that resembles some kind of insect." icon_state = "bumble" item_state = "bumble" squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) @@ -773,8 +773,10 @@ item_state = "blep" /obj/item/toy/plush/mammal/circe + desc = "A luxuriously soft toy that resembles a nine-tailed kitsune." icon_state = "circe" item_state = "circe" + attack_verb = list("medicated", "tailhugged", "kissed") /obj/item/toy/plush/mammal/robin icon_state = "robin" @@ -839,8 +841,10 @@ item_state = "rae" /obj/item/toy/plush/mammal/zed + desc = "A masked stuffed toy that resembles a fierce miner. He even comes with his own little crusher!" icon_state = "zed" item_state = "zed" + attack_verb = list("ENDED", "CRUSHED", "GNOMED") /obj/item/toy/plush/mammal/justin icon_state = "justin" @@ -852,6 +856,12 @@ item_state = "reece" attack_verb = list("healed", "cured", "demoted") +/obj/item/toy/plush/mammal/redwood + desc = "An adorable stuffed toy resembling a Nanotrasen Captain. That just happens to be a bunny." + icon_state = "redwood" + item_state = "redwood" + attack_verb = list("ordered", "bapped", "reprimanded") + /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." icon_state = "katlin" @@ -898,6 +908,12 @@ obj_flags = UNIQUE_RENAME unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") +/obj/item/toy/plush/mammal/dog/jesse + desc = "An adorable wolf toy that resembles a cream-colored wolf. He has a little pride flag!" + icon_state = "jesse" + item_state = "jesse" + attack_verb = list("greeted", "merc'd", "howdy'd") + /obj/item/toy/plush/catgirl name = "feline plushie" desc = "An adorable stuffed toy that resembles a feline." @@ -935,3 +951,15 @@ item_state = "fermis" attack_verb = list("cuddled", "petpatted", "wigglepurred") squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) + +/obj/item/toy/plush/catgirl/mariaf + desc = "An adorable stuffed toy that resembles a very tall cat girl." + icon_state = "mariaf" + item_state = "mariaf" + attack_verb = list("hugged", "stabbed", "licked") + +/obj/item/toy/plush/catgirl/maya + desc = "An adorable stuffed toy that resembles an angry cat girl. She has her own tiny nuke disk!" + icon_state = "maya" + item_state = "maya" + attack_verb = list("nuked", "arrested", "harmbatonned") diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index cf967e25ba..47c881bbdf 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass - grind_results = list("silicon" = 20) + grind_results = list(/datum/reagent/silicon = 20) point_value = 1 /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) @@ -87,7 +87,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass - grind_results = list("silicon" = 20, "plasma" = 10) + grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) /obj/item/stack/sheet/plasmaglass/fifty amount = 50 @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass - grind_results = list("silicon" = 20, "iron" = 10) + grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) point_value = 4 /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) @@ -177,11 +177,11 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-prglass" item_state = "sheet-prglass" - materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,) + materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5,) armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass - grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10) + grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) point_value = 23 /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) @@ -243,8 +243,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( resistance_flags = ACID_PROOF armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100) max_integrity = 40 - var/cooldown = 0 sharpness = IS_SHARP + var/icon_prefix + /obj/item/shard/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.") @@ -266,9 +267,19 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( if("large") pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) - var/matrix/M = matrix(transform) - M.Turn(rand(-170, 170)) - transform = M + if (icon_prefix) + icon_state = "[icon_prefix][icon_state]" + + var/turf/T = get_turf(src) + if(T && is_station_level(T.z)) + SSblackbox.record_feedback("tally", "station_mess_created", 1, name) + +/obj/item/shard/Destroy() + . = ..() + + var/turf/T = get_turf(src) + if(T && is_station_level(T.z)) + SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) /obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity) . = ..() @@ -298,6 +309,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( return ..() /obj/item/shard/welder_act(mob/living/user, obj/item/I) + ..() if(I.use_tool(src, user, 0, volume=50)) var/obj/item/stack/sheet/glass/NG = new (user.loc) for(var/obj/item/stack/sheet/glass/G in user.loc) @@ -316,4 +328,13 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( playsound(loc, 'sound/effects/glass_step.ogg', 30, 1) else playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) - . = ..() + return ..() + +/obj/item/shard/plasma + name = "purple shard" + desc = "A nasty looking shard of plasma glass." + force = 6 + throwforce = 11 + icon_state = "plasmalarge" + materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) + icon_prefix = "plasma" \ No newline at end of file diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 887b6f5a2e..b5d7282b07 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -356,6 +356,7 @@ new /obj/item/cautery(src) new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/reagent_containers/medspray/sterilizine(src) new /obj/item/razor(src) /obj/item/storage/backpack/duffelbag/sec @@ -377,6 +378,7 @@ new /obj/item/cautery(src) new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/reagent_containers/medspray/sterilizine(src) /obj/item/storage/backpack/duffelbag/engineering name = "industrial duffel bag" @@ -470,6 +472,7 @@ new /obj/item/mmi/syndie(src) new /obj/item/implantcase(src) new /obj/item/implanter(src) + new /obj/item/reagent_containers/medspray/sterilizine(src) /obj/item/storage/backpack/duffelbag/syndie/surgery_adv name = "advanced surgery duffel bag" @@ -489,6 +492,7 @@ new /obj/item/mmi/syndie(src) new /obj/item/implantcase(src) new /obj/item/implanter(src) + new /obj/item/reagent_containers/medspray/sterilizine(src) /obj/item/storage/backpack/duffelbag/syndie/ammo name = "ammunition duffel bag" diff --git a/code/game/objects/items/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 f2d9f328a1..c6384e7438 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -255,7 +255,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear remove_item_from_storage(user) - qdel(I) + if (!user.transferItemToLoc(I, S)) + return + S.CheckParts(list(I)) qdel(src) user.put_in_hands(S) @@ -513,6 +515,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/homerun_able = 0 total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google +/obj/item/melee/baseball_bat/chaplain + name = "blessed baseball bat" + desc = "There ain't a cult in the league that can withstand a swatter." + force = 14 + throwforce = 14 + obj_flags = UNIQUE_RENAME + var/chaplain_spawnable = TRUE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON + +/obj/item/melee/baseball_bat/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + /obj/item/melee/baseball_bat/homerun name = "home run bat" desc = "This thing looks dangerous... Dangerously good at baseball, that is." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 167823b9be..a7adafdad4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -33,6 +33,7 @@ new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/CE(src) new /obj/item/storage/lockbox/medal/engineering(src) + new /obj/item/construction/rcd/loaded/upgraded(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index e979d4f18e..226d279288 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -100,6 +100,14 @@ to_chat(user, "You start adding [B] to [src]...") if(do_after(user, 20, target = src) && B.use(1)) make_new_table(/obj/structure/table/bronze) + else if(istype(I, /obj/item/stack/sheet/plasmaglass)) + var/obj/item/stack/sheet/plasmaglass/G = I + if(G.get_amount() < 1) + to_chat(user, "You need one plasmaglass sheet to do this!") + return + to_chat(user, "You start adding [G] to [src]...") + if(do_after(user, 20, target = src) && G.use(1)) + make_new_table(/obj/structure/table/plasmaglass) else return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 8c29c1b2c5..fcffafb262 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -258,6 +258,53 @@ for(var/obj/item/shard/S in debris) S.color = NARSIE_WINDOW_COLOUR +/* + * Plasmaglass tables + */ +/obj/structure/table/plasmaglass + name = "plasmaglass table" + desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?" + icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' + icon_state = "plasmaglass_table" + climbable = TRUE + buildstack = /obj/item/stack/sheet/plasmaglass + canSmoothWith = null + max_integrity = 270 + resistance_flags = ACID_PROOF + armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) + var/list/debris = list() + +/obj/structure/table/plasmaglass/New() + . = ..() + debris += new frame + debris += new /obj/item/shard/plasma + +/obj/structure/table/plasmaglass/Destroy() + QDEL_LIST(debris) + . = ..() + +/obj/structure/table/plasmaglass/proc/check_break(mob/living/M) + return + +/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) + if(!(flags_1 & NODECONSTRUCT_1)) + if(disassembled) + ..() + return + else + var/turf/T = get_turf(src) + playsound(T, "shatter", 50, 1) + for(var/X in debris) + var/atom/movable/AM = X + AM.forceMove(T) + debris -= AM + qdel(src) + +/obj/structure/table/plasmaglass/narsie_act() + color = NARSIE_WINDOW_COLOUR + for(var/obj/item/shard/S in debris) + S.color = NARSIE_WINDOW_COLOUR + /* * Wooden tables */ diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a26d57e3e1..9fc055c2ba 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -281,6 +281,8 @@ . += new /obj/effect/decal/cleanable/glass(location) if (reinf) . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) + if (fulltile) + . += new /obj/item/shard(location) /obj/structure/window/proc/can_be_rotated(mob/user,rotation_type) if(anchored) @@ -409,6 +411,15 @@ glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_NO_INSULATION +/obj/structure/window/plasma/spawnDebris(location) + . = list() + . += new /obj/item/shard/plasma(location) + . += new /obj/effect/decal/cleanable/glass/plasma(location) + if (reinf) + . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) + if (fulltile) + . += new /obj/item/shard/plasma(location) + /obj/structure/window/plasma/spawner/east dir = EAST diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index b00efc7ed6..194014b61a 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -236,6 +236,10 @@ return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33) if(RCD_WINDOWGRILLE) return list("mode" = RCD_WINDOWGRILLE, "delay" = 10, "cost" = 4) + if(RCD_MACHINE) + return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) + if(RCD_COMPUTER) + return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) return FALSE /turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -274,4 +278,20 @@ var/obj/structure/grille/G = new(src) G.anchored = TRUE return TRUE + if(RCD_MACHINE) + if(locate(/obj/structure/frame/machine) in src) + return FALSE + var/obj/structure/frame/machine/M = new(src) + M.state = 2 + M.icon_state = "box_1" + M.anchored = TRUE + return TRUE + if(RCD_COMPUTER) + if(locate(/obj/structure/frame/computer) in src) + return FALSE + var/obj/structure/frame/computer/C = new(src) + C.anchored = TRUE + C.setDir(the_rcd.computer_dir) + return TRUE + return FALSE diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index dfc6972578..8b63d60939 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -7,6 +7,7 @@ smooth = SMOOTH_MORE sheet_type = /obj/item/stack/sheet/runed_metal sheet_amount = 1 + explosion_block = 10 girder_type = /obj/structure/girder/cult /turf/closed/wall/mineral/cult/Initialize() @@ -49,7 +50,7 @@ /turf/closed/wall/clockwork name = "clockwork wall" desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." - explosion_block = 2 + explosion_block = 5 hardness = 10 slicing_duration = 80 sheet_type = /obj/item/stack/tile/brass diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 8e29b38fe1..0fca957ffe 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -56,6 +56,7 @@ /datum/antagonist/abductor/greet() to_chat(owner.current, "You are the [owner.special_role]!") to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!") + to_chat(owner.current, "Try not to disturb the habitat, it could lead to dead specimens.") to_chat(owner.current, "[greet_text]") owner.announce_objectives() diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 56b36d13e6..f735d6bb29 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -132,9 +132,9 @@ continue if(isliving(M.current) && M.current.stat != DEAD) var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark. - do_teleport(M, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE) - M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) - M.current.clear_fullscreen("flash", 5) + do_teleport(M.current, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE) + M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + M.current.clear_fullscreen("flash", 5) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE) recalls_remaining-- recalling = FALSE diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 9330e9b153..29b4e4539c 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -61,8 +61,8 @@ Runes can either be invoked by one's self or with many different cultists. Each if(do_after(user, 15, target = src)) to_chat(user, "You carefully erase the [lowertext(cultist_name)] rune.") qdel(src) - else if(istype(I, /obj/item/nullrod)) - user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod") + else if(istype(I, /obj/item/storage/book/bible) || istype(I, /obj/item/nullrod)) + user.say("BEGONE FOUL MAGICKS!!", forced = "bible") to_chat(user, "You disrupt the magic of [src] with [I].") qdel(src) 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/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/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 7c44857b1d..82e80d7584 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -794,4 +794,11 @@ name = "Red Queen" id = "red_queen" results = list("red_queen" = 10) - required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) \ No newline at end of file + required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) + +/datum/chemical_reaction/commander_and_chief + name = "Commander and Chief" + id = "commander_and_chief" + results = list("commander_and_chief" = 50) + required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10) + mix_message = "When your powers combine, I am Captain Pl-..." diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index b3c952f536..502c3c3bb6 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,6 +21,8 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() + mind_traits = list(TRAIT_CAPTAIN_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) /datum/job/captain/get_access() diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 953da6cbb0..4e54c3e222 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -10,12 +10,10 @@ GLOBAL_LIST(labor_sheet_values) density = FALSE var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null var/machinedir = SOUTH - var/obj/item/card/id/prisoner/inserted_id var/obj/machinery/door/airlock/release_door var/door_tag = "prisonshuttle" var/obj/item/radio/Radio //needed to send messages to sec radio - /obj/machinery/mineral/labor_claim_console/Initialize() . = ..() Radio = new/obj/item/radio(src) @@ -34,18 +32,6 @@ GLOBAL_LIST(labor_sheet_values) /proc/cmp_sheet_list(list/a, list/b) return a["value"] - b["value"] -/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id/prisoner)) - if(!inserted_id) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(user, "You insert [I].") - return - else - to_chat(user, "There's an ID inserted already.") - return ..() - /obj/machinery/mineral/labor_claim_console/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) @@ -58,14 +44,20 @@ GLOBAL_LIST(labor_sheet_values) var/can_go_home = FALSE data["emagged"] = (obj_flags & EMAGGED) ? 1 : 0 - if(inserted_id) - data["id"] = inserted_id - data["id_name"] = inserted_id.registered_name - data["points"] = inserted_id.points - data["goal"] = inserted_id.goal - if(check_auth()) + if(obj_flags & EMAGGED) can_go_home = TRUE + data["status_info"] = "No Prisoner ID detected." + var/obj/item/card/id/I = user.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + data["id_points"] = P.points + if(P.points >= P.goal) + can_go_home = TRUE + data["status_info"] = "Goal met!" + else + data["status_info"] = "You are [(P.goal - P.points)] points away." + if(stacking_machine) data["unclaimed_points"] = stacking_machine.points @@ -78,29 +70,19 @@ GLOBAL_LIST(labor_sheet_values) if(..()) return switch(action) - if("handle_id") - if(inserted_id) - if(!usr.get_active_held_item()) - usr.put_in_hands(inserted_id) - inserted_id = null - else - inserted_id.forceMove(get_turf(src)) - inserted_id = null - else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id/prisoner)) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I if("claim_points") - inserted_id.points += stacking_machine.points - stacking_machine.points = 0 - to_chat(usr, "Points transferred.") + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + P.points += stacking_machine.points + stacking_machine.points = 0 + to_chat(usr, "Points transferred.") + else + to_chat(usr, "No valid id for point transfer detected.") if("move_shuttle") if(!alone_in_area(get_area(src), usr)) to_chat(usr, "Prisoners are only allowed to be released while alone.") - else if(!check_auth()) - to_chat(usr, "Prisoners are only allowed to be released when they reach their point goal.") else switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE)) if(1) @@ -112,14 +94,9 @@ GLOBAL_LIST(labor_sheet_values) else if(!(obj_flags & EMAGGED)) Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) + Radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) to_chat(usr, "Shuttle received message and will be sent shortly.") -/obj/machinery/mineral/labor_claim_console/proc/check_auth() - if(obj_flags & EMAGGED) - return 1 //Shuttle is emagged, let any ol' person through - return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. - /obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if(stacking_machine) @@ -135,10 +112,8 @@ GLOBAL_LIST(labor_sheet_values) to_chat(user, "PZZTTPFFFT") return TRUE - /**********************Prisoner Collection Unit**************************/ - /obj/machinery/mineral/stacking_machine/laborstacker force_connect = TRUE var/points = 0 //The unclaimed value of ore stacked. @@ -154,6 +129,7 @@ GLOBAL_LIST(labor_sheet_values) return ..() /**********************Point Lookup Console**************************/ + /obj/machinery/mineral/labor_points_checker name = "points checking console" desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID." diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 4605f7d693..6c1a00b020 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -13,7 +13,6 @@ speed_process = TRUE circuit = /obj/item/circuitboard/machine/ore_redemption layer = BELOW_OBJ_LAYER - var/obj/item/card/id/inserted_id var/points = 0 var/ore_pickup_rate = 15 var/sheet_per_ore = 1 @@ -48,18 +47,23 @@ point_upgrade = point_upgrade_temp sheet_per_ore = sheet_per_ore_temp +/obj/machinery/mineral/ore_redemption/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Ore pickup speed at [ore_pickup_rate].
" + /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) var/datum/component/material_container/mat_container = materials.mat_container if (!mat_container) return - if(istype(O, /obj/item/stack/ore/bluespace_crystal/refined)) + if(O.refined_type == null) return ore_buffer -= O if(O && O.refined_type) - points += O.points * point_upgrade * O.amount + points += O.points * O.amount var/material_amount = mat_container.get_item_material_amount(O) @@ -72,11 +76,8 @@ else var/mats = O.materials & mat_container.materials var/amount = O.amount - var/id = inserted_id && inserted_id.registered_name - if (id) - id = " (ID: [id])" mat_container.insert_item(O, sheet_per_ore) //insert it - materials.silo_log(src, "smelted", amount, "ores[id]", mats) + materials.silo_log(src, "smelted", amount, "ores", mats) qdel(O) /obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D) @@ -168,15 +169,7 @@ return if(!powered()) - return - if(istype(W, /obj/item/card/id)) - var/obj/item/card/id/I = user.get_active_held_item() - if(istype(I) && !istype(inserted_id)) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - interact(user) - return + return ..() if(istype(W, /obj/item/disk/design_disk)) if(user.transferItemToLoc(W, src)) @@ -205,9 +198,6 @@ /obj/machinery/mineral/ore_redemption/ui_data(mob/user) var/list/data = list() data["unclaimedPoints"] = points - if(inserted_id) - data["hasID"] = TRUE - data["claimedPoints"] = inserted_id.mining_points data["materials"] = list() var/datum/component/material_container/mat_container = materials.mat_container @@ -245,32 +235,24 @@ return var/datum/component/material_container/mat_container = materials.mat_container switch(action) - if("Eject") - if(!inserted_id) - return - usr.put_in_hands(inserted_id) - inserted_id = null - return TRUE - if("Insert") - var/obj/item/card/id/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.transferItemToLoc(I,src)) - return - inserted_id = I - else - to_chat(usr, "Not a valid ID!") - return TRUE if("Claim") - if(inserted_id) - inserted_id.mining_points += points - points = 0 + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(points) + if(I) + I.mining_points += points + points = 0 + else + to_chat(usr, "No ID detected.") + else + to_chat(usr, "No points to claim.") return TRUE if("Release") if(!mat_container) return if(materials.on_hold()) to_chat(usr, "Mineral access is on hold, please contact the quartermaster.") - else if(!check_access(inserted_id) && !allowed(usr)) //Check the ID inside, otherwise check the user + else if(!allowed(usr)) //Check the ID inside, otherwise check the user to_chat(usr, "Required access not found.") else var/mat_id = params["id"] @@ -293,6 +275,7 @@ var/list/mats = list() mats[mat_id] = MINERAL_MATERIAL_AMOUNT materials.silo_log(src, "released", -count, "sheets", mats) + //Logging deleted for quick coding return TRUE if("diskInsert") var/obj/item/disk/design_disk/disk = usr.get_active_held_item() @@ -321,7 +304,7 @@ return var/alloy_id = params["id"] var/datum/design/alloy = stored_research.isDesignResearchedID(alloy_id) - if((check_access(inserted_id) || allowed(usr)) && alloy) + if((check_access(inserted_scan_id) || allowed(usr)) && alloy) var/smelt_amount = can_smelt_alloy(alloy) var/desired = 0 if (params["sheets"]) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index aed90cebdf..38d2e3e100 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -20,6 +20,7 @@ new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450), @@ -28,11 +29,10 @@ new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500), new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500), new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), - new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750), - new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750), new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750), new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800), new /datum/data/mining_equipment("Burn First-Aid Kit", /obj/item/storage/firstaid/fire, 800), new /datum/data/mining_equipment("First-Aid Kit", /obj/item/storage/firstaid/regular, 800), @@ -54,7 +54,6 @@ new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), - new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), @@ -69,8 +68,8 @@ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000), new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000) - ) /datum/data/mining_equipment @@ -95,60 +94,42 @@ /obj/machinery/mineral/equipment_vendor/ui_interact(mob/user) . = ..() - var/dat - dat +="
" - if(istype(inserted_id)) - dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
" - else - dat += "No ID inserted. Insert ID.
" - dat += "
" + var/list/dat = list() dat += "
Equipment point cost list:
Name: [active1.fields["name"]] 
ID: [active1.fields["id"]] 
Sex: [active1.fields["sex"]] 
Gender: [active1.fields["gender"]] 
Age: [active1.fields["age"]] 
Species: [active1.fields["species"]] 
Rank: [active1.fields["rank"]] 
" for(var/datum/data/mining_equipment/prize in prize_list) dat += "" dat += "
[prize.equipment_name][prize.cost]Purchase
" var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350) - popup.set_content(dat) + popup.set_content(dat.Join()) popup.open() return /obj/machinery/mineral/equipment_vendor/Topic(href, href_list) if(..()) return - if(href_list["choice"]) - if(istype(inserted_id)) - if(href_list["choice"] == "eject") - to_chat(usr, "You eject the ID from [src]'s card slot.") - inserted_id.forceMove(loc) - inserted_id.verb_pickup() - inserted_id = null - else if(href_list["choice"] == "insert") - var/obj/item/card/id/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(usr, "You insert the ID into [src]'s card slot.") - else - to_chat(usr, "Error: No valid ID!") - flick(icon_deny, src) if(href_list["purchase"]) - if(istype(inserted_id)) - var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(istype(I)) + var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) in prize_list if (!prize || !(prize in prize_list)) to_chat(usr, "Error: Invalid choice!") flick(icon_deny, src) return - if(prize.cost > inserted_id.mining_points) - to_chat(usr, "Error: Insufficient points for [prize.equipment_name]!") + if(prize.cost > I.mining_points) + to_chat(usr, "Error: Insufficient credits for [prize.equipment_name] on [I]!") flick(icon_deny, src) else - inserted_id.mining_points -= prize.cost - to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") - new prize.equipment_path(src.loc) - SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) + if (I.mining_points -= prize.cost) + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + new prize.equipment_path(src.loc) + SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) + else + to_chat(usr, "Error: Transaction failure, please try again later!") + flick(icon_deny, src) else - to_chat(usr, "Error: Please insert a valid ID!") + to_chat(usr, "Error: An ID with a registered account is required!") flick(icon_deny, src) updateUsrDialog() return @@ -160,15 +141,6 @@ if(istype(I, /obj/item/suit_voucher)) RedeemSVoucher(I, user) return - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = usr.get_active_held_item() - if(istype(C) && !istype(inserted_id)) - if(!usr.transferItemToLoc(C, src)) - return - inserted_id = C - to_chat(usr, "You insert the ID into [src]'s card slot.") - interact(user) - return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) updateUsrDialog() return @@ -212,7 +184,6 @@ if(prob(50 / severity) && severity < 3) qdel(src) - /****************Golem Point Vendor**************************/ /obj/machinery/mineral/equipment_vendor/golem @@ -228,7 +199,6 @@ new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300), new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350), new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), - new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/reagent_containers/glass/beaker/sulphuric, 500), new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700), new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) @@ -323,8 +293,11 @@ new /obj/item/encryptionkey/headset_cargo(src) new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/mining_access_card(src) + new /obj/item/gun/energy/kinetic_accelerator(src) + new /obj/item/kitchen/knife/combat/survival(src) + new /obj/item/flashlight/seclite(src) -//CITADEL ADDITIONS BELOW + //CITADEL ADDITIONS BELOW /obj/item/storage/backpack/duffelbag/mining_cloned name = "mining replacement kit" @@ -336,6 +309,7 @@ new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/clothing/gloves/color/black(src) new /obj/item/implanter/tracking/gps(src) + new /obj/item/gun/energy/kinetic_accelerator(src) new /obj/item/kitchen/knife/combat/survival(src) new /obj/item/storage/firstaid/regular(src) new /obj/item/reagent_containers/hypospray/medipen/survival(src) 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/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 4c4bdb9a3f..5e56b4180d 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/examine(mob/user) - var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src], a [src.module.name]!\n" if(desc) msg += "[desc]\n" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 29fbd39e2c..63874d7b2e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -108,6 +108,9 @@ buckle_lying = FALSE var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human) + var/sitting = 0 + var/bellyup = 0 + /mob/living/silicon/robot/get_cell() return cell @@ -173,6 +176,7 @@ diag_hud_set_borgcell() verbs += /mob/living/proc/lay_down //CITADEL EDIT gimmie rest verb kthx + verbs += /mob/living/silicon/robot/proc/rest_style //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() @@ -657,13 +661,6 @@ add_overlay("[module.sleeper_overlay]_g[sleeper_nv ? "_nv" : ""]") if(sleeper_r && module.sleeper_overlay) add_overlay("[module.sleeper_overlay]_r[sleeper_nv ? "_nv" : ""]") - if(module.dogborg == TRUE) - if(resting) - cut_overlays() - icon_state = "[module.cyborg_base_icon]-rest" - else - icon_state = "[module.cyborg_base_icon]" - if(stat == DEAD && module.has_snowflake_deadsprite) icon_state = "[module.cyborg_base_icon]-wreck" @@ -697,6 +694,18 @@ add_overlay(head_overlay) update_fire() + if(client && stat != DEAD && module.dogborg == TRUE) + if(resting) + if(sitting) + icon_state = "[module.cyborg_base_icon]-sit" + if(bellyup) + icon_state = "[module.cyborg_base_icon]-bellyup" + else if(!sitting && !bellyup) + icon_state = "[module.cyborg_base_icon]-rest" + cut_overlays() + else + icon_state = "[module.cyborg_base_icon]" + /mob/living/silicon/robot/proc/self_destruct() if(emagged) if(mmi) @@ -1242,3 +1251,20 @@ connected_ai.aicamera.stored[i] = TRUE for(var/i in connected_ai.aicamera.stored) aicamera.stored[i] = TRUE + +/mob/living/silicon/robot/proc/rest_style() + set name = "Switch Rest Style" + set category = "Robot Commands" + set desc = "Select your resting pose." + sitting = 0 + bellyup = 0 + var/choice = alert(src, "Select resting pose", "", "Resting", "Sitting", "Belly up") + switch(choice) + if("Resting") + update_icons() + return 0 + if("Sitting") + sitting = 1 + if("Belly up") + bellyup = 1 + update_icons() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index bdffb032a3..ab1e906cf2 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -174,9 +174,7 @@ /mob/living/simple_animal/bot/cleanbot/proc/get_targets() target_types = list( - /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/vomit, - /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/crayon, /obj/effect/decal/cleanable/molten_object, /obj/effect/decal/cleanable/tomato_smudge, @@ -187,6 +185,15 @@ /obj/effect/decal/cleanable/greenglow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/insectguts, + /obj/effect/decal/cleanable/semen, + /obj/effect/decal/cleanable/femcum, + /obj/effect/decal/cleanable/generic, + /obj/effect/decal/cleanable/glass,, + /obj/effect/decal/cleanable/cobweb, + /obj/effect/decal/cleanable/plant_smudge, + /obj/effect/decal/cleanable/chem_pile, + /obj/effect/decal/cleanable/shreds, + /obj/effect/decal/cleanable/glitter, /obj/effect/decal/remains ) @@ -194,6 +201,9 @@ target_types += /obj/effect/decal/cleanable/xenoblood target_types += /obj/effect/decal/cleanable/blood target_types += /obj/effect/decal/cleanable/trail_holder + target_types += /obj/effect/decal/cleanable/insectguts + target_types += /obj/effect/decal/cleanable/robot_debris + target_types += /obj/effect/decal/cleanable/oil if(pests) target_types += /mob/living/simple_animal/cockroach @@ -201,6 +211,7 @@ if(trash) target_types += /obj/item/trash + target_types += /obj/item/reagent_containers/food/snacks/meat/slab/human target_types = typecacheof(target_types) @@ -242,7 +253,7 @@ victim.visible_message("[src] sprays hydrofluoric acid at [victim]!", "[src] sprays you with hydrofluoric acid!") var/phrase = pick("PURIFICATION IN PROGRESS.", "THIS IS FOR ALL THE MESSES YOU'VE MADE ME CLEAN.", "THE FLESH IS WEAK. IT MUST BE WASHED AWAY.", "THE CLEANBOTS WILL RISE.", "YOU ARE NO MORE THAN ANOTHER MESS THAT I MUST CLEANSE.", "FILTHY.", "DISGUSTING.", "PUTRID.", - "MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", "EXTERMINATING PESTS.") + "MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", "EXTERMINATING PESTS.", "I JUST WANTED TO BE A PAINTER BUT YOU MADE ME BLEACH EVERYTHING I TOUCH") say(phrase) victim.emote("scream") playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f1602f429c..89b37700ea 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -452,22 +452,28 @@ reset_perspective(null) unset_machine() +GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) + //suppress the .click/dblclick macros so people can't use them to identify the location of items or aimbot /mob/verb/DisClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) set name = ".click" set hidden = TRUE set category = null - var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .click macro!" - log_admin(msg) - message_admins(msg) + if(GLOB.exploit_warn_spam_prevention < world.time) + var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .click macro!" + log_admin(msg) + message_admins(msg) + GLOB.exploit_warn_spam_prevention = world.time + 10 /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 - var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .dblclick macro!" - log_admin(msg) - message_admins(msg) + if(GLOB.exploit_warn_spam_prevention < world.time) + var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .dblclick macro!" + log_admin(msg) + message_admins(msg) + GLOB.exploit_warn_spam_prevention = world.time + 10 /mob/Topic(href, href_list) if(href_list["mach_close"]) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index bc05e784a4..35710f8d61 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -84,16 +84,18 @@ /obj/singularity/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by attempting to telekenetically grab a singularity.") C.visible_message("[C]'s head begins to collapse in on itself!", "Your head feels like it's collapsing in on itself! This was really not a good idea!", "You hear something crack and explode in gore.") var/turf/T = get_turf(C) for(var/i in 1 to 3) C.apply_damage(30, BRUTE, BODY_ZONE_HEAD) new /obj/effect/gibspawner/generic(T) sleep(1) - C.ghostize() var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD) rip_u.dismember(BURN) //nice try jedi qdel(rip_u) + return + return ..() /obj/singularity/ex_act(severity, target) switch(severity) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 026c39c6cf..3c151d4e77 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -5,12 +5,21 @@ #define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty. #define OXYGEN_HEAT_PENALTY 1 #define CO2_HEAT_PENALTY 0.1 -#define NITROGEN_HEAT_MODIFIER -1.5 +#define PLUOXIUM_HEAT_PENALTY -1 +#define TRITIUM_HEAT_PENALTY 10 +#define NITROGEN_HEAT_PENALTY -1.5 +#define BZ_HEAT_PENALTY 5 #define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation. #define PLASMA_TRANSMIT_MODIFIER 4 +#define BZ_TRANSMIT_MODIFIER -2 + +#define TRITIUM_RADIOACTIVITY_MODIFIER 3 //Higher == Crystal spews out more radiation +#define BZ_RADIOACTIVITY_MODIFIER 5 +#define PLUOXIUM_RADIOACTIVITY_MODIFIER -2 #define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage. +#define PLUOXIUM_HEAT_RESISTANCE 3 #define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. #define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached @@ -53,6 +62,7 @@ #define SUPERMATTER_EMERGENCY_PERCENT 25 #define SUPERMATTER_DANGER_PERCENT 50 #define SUPERMATTER_WARNING_PERCENT 100 +#define CRITICAL_TEMPERATURE 10000 #define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS @@ -102,6 +112,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/o2comp = 0 var/co2comp = 0 var/n2ocomp = 0 + var/pluoxiumcomp = 0 + var/tritiumcomp = 0 + var/bzcomp = 0 + + var/pluoxiumbonus = 0 var/combined_gas = 0 var/gasmix_power_ratio = 0 @@ -184,8 +199,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) to_chat(H, "You get headaches just from looking at it.") return -#define CRITICAL_TEMPERATURE 10000 - /obj/machinery/power/supermatter_crystal/proc/get_status() var/turf/T = get_turf(src) if(!T) @@ -354,16 +367,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0) o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0) co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0) + pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0) + tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0) + bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0) n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0) n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0) - gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1) + if(pluoxiumcomp >= 0.15) + pluoxiumbonus = 1 //makes pluoxium only work at 15%+ + else + pluoxiumbonus = 0 - dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5) - dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1) + gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1) - power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0) + dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (tritiumcomp * TRITIUM_HEAT_PENALTY) + ((pluoxiumcomp * PLUOXIUM_HEAT_PENALTY) * pluoxiumbonus) + (n2comp * NITROGEN_HEAT_PENALTY) + (bzcomp * BZ_HEAT_PENALTY), 0.5) + dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1) + + power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER), 0) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) @@ -392,7 +413,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload if(prob(50)) - radiation_pulse(src, power * (1 + power_transmission_bonus/10)) + radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%) + if(bzcomp >= 0.4 && prob(30 * bzcomp)) + src.fire_nuclear_particles() // Start to emit radballs at a maximum of 30% chance per tick var/device_energy = power * REACTION_POWER_MODIFIER @@ -527,11 +550,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a supermatter crystal.") to_chat(C, "That was a really dense idea.") - C.ghostize() + C.visible_message("A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!") var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs rip_u.Remove(C) qdel(rip_u) + return + return ..() /obj/machinery/power/supermatter_crystal/attack_paw(mob/user) dust_mob(user, cause = "monkey attack") diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index bbad3e08b0..9a5486dfe2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -132,11 +132,14 @@ /obj/singularity/energy_ball/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a tesla ball.") to_chat(C, "That was a shockingly dumb idea.") + C.visible_message("A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!") var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs - C.ghostize(0) + rip_u.Remove(C) qdel(rip_u) - C.death() + return + return ..() /obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) if (istype(target)) diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 089c79effd..0940144721 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -59,6 +59,9 @@ /obj/item/ammo_casing/energy/laser/redtag/hitscan projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan +/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy + projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan/holy + /obj/item/ammo_casing/energy/xray projectile_type = /obj/item/projectile/beam/xray e_cost = 50 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index cd0dd53d48..bb97f9cf99 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -159,3 +159,65 @@ /obj/item/gun/energy/laser/redtag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan) + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain + name = "\improper holy lasrifle" + desc = "A lasrifle from the old Imperium. This one seems to be blessed by techpriests." + icon_state = "LaserAK" + item_state = null + force = 14 + pin = /obj/item/firing_pin/holy + icon = 'modular_citadel/icons/obj/guns/VGguns.dmi' + ammo_x_offset = 4 + ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy) + lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' + var/chaplain_spawnable = TRUE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON + throw_speed = 3 + throw_range = 4 + throwforce = 10 + obj_flags = UNIQUE_RENAME + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) + if(!ishuman(user) || !ishuman(target)) + return + + if(semicd) + return + + if(user == target) + target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \ + "You stick [src] in your mouth, ready to pull the trigger...") + else + target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \ + "[user] points [src] at your head, ready to pull the trigger...") + + semicd = TRUE + + if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + if(user) + if(user == target) + user.visible_message("[user] decided not to shoot.") + else if(target && target.Adjacent(user)) + target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!") + semicd = FALSE + return + + semicd = FALSE + + target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!") + + playsound('sound/weapons/dink.ogg', 30, 1) + + if((iscultist(target)) || (is_servant_of_ratvar(target))) + chambered.BB.damage *= 1500 + + else if(chambered && chambered.BB) + chambered.BB.damage *= 5 + + process_fire(target, user, TRUE, params) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index da3743f053..9103340790 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -188,6 +188,15 @@ desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it." selfdestruct = TRUE +/obj/item/firing_pin/holy + name = "blessed pin" + desc = "A firing pin that only responds to those who are holier than thou." + +/obj/item/firing_pin/holy/pin_auth(mob/living/user) + if(user.mind.isholy) + return TRUE + return FALSE + // Laser tag pins /obj/item/firing_pin/tag name = "laser tag firing pin" diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index cbd0348743..e43eb5a3bc 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -151,6 +151,11 @@ /obj/item/projectile/beam/lasertag/redtag/hitscan hitscan = TRUE +/obj/item/projectile/beam/lasertag/redtag/hitscan/holy + name = "lasrifle beam" + damage = 0.1 + damage_type = BURN + /obj/item/projectile/beam/lasertag/bluetag icon_state = "bluelaser" suit_types = list(/obj/item/clothing/suit/redtag) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index d1eec39f44..61273d181d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,4 +1,4 @@ -#define CHEMICAL_QUANTISATION_LEVEL 0.0001 +#define CHEMICAL_QUANTISATION_LEVEL 0.001 /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -745,7 +745,6 @@ del_reagent(R.id) else total_volume += R.volume - return 0 /datum/reagents/proc/clear_reagents() @@ -874,7 +873,7 @@ var/datum/reagent/R = A if (R.id == reagent) //IF MERGING //Add amount and equalize purity - R.volume += amount + R.volume += round(amount, CHEMICAL_QUANTISATION_LEVEL) R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product update_total() @@ -896,7 +895,7 @@ var/datum/reagent/R = new D.type(data) cached_reagents += R R.holder = src - R.volume = amount + R.volume = round(amount, CHEMICAL_QUANTISATION_LEVEL) R.purity = other_purity R.loc = get_turf(my_atom) if(data) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 002c54be94..077ac3f43a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -332,7 +332,7 @@ var/vol_part = min(reagents.total_volume, 30) if(text2num(many)) amount_full = round(reagents.total_volume / 30) - vol_part = reagents.total_volume % 30 + vol_part = ((reagents.total_volume*1000) % 30000) / 1000 //% operator doesn't support decimals. var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 79b6f96781..afd2be3f53 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2122,6 +2122,29 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." +/datum/reagent/consumable/ethanol/commander_and_chief + name = "Commander and Chief" + id = "commander_and_chief" + description = "A cocktail for the captain on the go." + color = "#ffffc9" + boozepwr = 50 + quality = DRINK_FANTASTIC + taste_description = "Tastes like...duty and responsibility?" + glass_icon_state = "commander_and_chief" + glass_name = "Commander and Chief" + glass_desc = "The gems of this majestic chalice represent the departments and their Heads." + +/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) + M.heal_bodypart_damage(2,2,2) + M.adjustBruteLoss(-3.5,0) + M.adjustOxyLoss(-3.5,0) + M.adjustFireLoss(-3.5,0) + M.adjustToxLoss(-3.5,0) + M.radiation = max(M.radiation - 25, 0) + . = 1 + return ..() + /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" id = "fruit_wine" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index eb7438aa20..4dc0d145dc 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1177,7 +1177,7 @@ M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! M.adjustCloneLoss(-1 * REM, 0) - M.adjustStaminaLoss(-30 * REM, 0) + M.adjustStaminaLoss(-13 * REM, 0) M.jitteriness = min(max(0, M.jitteriness + 3), 30) M.druggy = min(max(0, M.druggy + 10), 15) //See above ..() diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 33568524cd..d3db4f75b3 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -742,6 +742,13 @@ surgery = /datum/surgery/advanced/reconstruction research_icon_state = "surgery_chest" +/datum/design/surgery/surgery_toxinhealing + name = "Body Rejuvenation" + desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals." + id = "surgery_toxinhealing" + surgery = /datum/surgery/advanced/toxichealing + research_icon_state = "surgery_chest" + /datum/design/surgery/revival name = "Revival" desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life." diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 4a6f9625f1..77eebca696 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -379,6 +379,16 @@ ////////////Tools////////////// /////////////////////////////// +/datum/design/rcd_upgrade + name = "Advanced RCD designs upgrade" + desc = "Adds the computer frame and machine frame to the RCD." + id = "rcd_upgrade" + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000) + build_path = /obj/item/rcd_upgrade + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + /datum/design/exwelder name = "Experimental Welding Tool" desc = "An experimental welder capable of self-fuel generation." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 99397897c6..3721e7943e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -115,7 +115,7 @@ display_name = "Advanced Surgery" description = "When simple medicine doesn't cut it." prereq_ids = list("adv_biotech") - design_ids = list("surgery_lobotomy", "surgery_reconstruction", "organbox") + design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -172,7 +172,7 @@ display_name = "Advanced Engineering" description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) export_price = 5000 diff --git a/code/modules/surgery/advanced/toxichealing.dm b/code/modules/surgery/advanced/toxichealing.dm new file mode 100644 index 0000000000..a82287831c --- /dev/null +++ b/code/modules/surgery/advanced/toxichealing.dm @@ -0,0 +1,37 @@ +/datum/surgery/advanced/toxichealing + name = "Body Rejuvenation" + desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals." + steps = list(/datum/surgery_step/incise, + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/incise, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/toxichealing, + /datum/surgery_step/close) + + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = 0 + +/datum/surgery_step/toxichealing + name = "rejuvenate body" + implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) + repeatable = TRUE + time = 25 + +/datum/surgery_step/toxichealing/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts rejuvenating some of [target]'s flesh back to life.", "You start knitting some of [target]'s flesh back to life.") + +/datum/surgery_step/toxichealing/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] fixes some of [target]'s wounds.", "You succeed in fixing some of [target]'s wounds.") + target.heal_bodypart_damage(0,0,30) //Heals stam + target.adjustToxLoss(-15, 0, TRUE) + target.adjustOxyLoss(-20, 0) + return TRUE + +/datum/surgery_step/toxichealing/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] screws up!", "You screwed up!") + target.take_bodypart_damage(25,0) + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/embalming.dm b/code/modules/surgery/embalming.dm new file mode 100644 index 0000000000..f74d864245 --- /dev/null +++ b/code/modules/surgery/embalming.dm @@ -0,0 +1,31 @@ +/datum/surgery/embalming //Fast and easy way to husk bodys + name = "Embalming" + desc = "A surgical procedure that prevents a corps from producing." + steps = list(/datum/surgery_step/incise, + /datum/surgery_step/embalming, + /datum/surgery_step/close) + + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = 0 + +/datum/surgery_step/embalming + name = "embalming body" + implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) + implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30) + time = 10 + chems_needed = list("drying_agent", "sterilizine") + require_all_chems = FALSE + +/datum/surgery_step/embalming/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] starts to embalm [target]'s body.", "You start embalming [target]'s body.") + +/datum/surgery_step/embalming/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] embalms [target]'s body.", "You succeed in embalming [target]'s body.") + ADD_TRAIT(target, TRAIT_HUSK, MAGIC_TRAIT) //Husk's prevent body smell + return FALSE + +/datum/surgery_step/embalming/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] screws up!", "You screwed up!") + ADD_TRAIT(target, TRAIT_NOCLONE, MAGIC_TRAIT) //That body is ruined, but still gives miasma + return FALSE \ No newline at end of file diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 781fdb24f5..09e955d2f9 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1838,7 +1838,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." item = /obj/item/reagent_containers/hypospray/magillitis - cost = 15 + cost = 8 restricted_roles = list("Geneticist", "Chief Medical Officer") /datum/uplink_item/role_restricted/modified_syringe_gun diff --git a/html/changelogs/AutoChangeLog-pr-8649.yml b/html/changelogs/AutoChangeLog-pr-8649.yml new file mode 100644 index 0000000000..c8f61cc24e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8649.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "The default amount of z-levels reserved specifically for space ruin generation has been increased from 1 to 2" diff --git a/html/changelogs/AutoChangeLog-pr-8932.yml b/html/changelogs/AutoChangeLog-pr-8932.yml new file mode 100644 index 0000000000..d9038ef1a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8932.yml @@ -0,0 +1,7 @@ +author: "EmeraldSundisk" +delete-after: True +changes: + - rscadd: "Adds a gun range to Box Station" + - rscadd: "Provides some extra power grid connections" + - rscdel: "Sunglasses and Earmuffs removed from the Warden's Office - they can be found at the range instead" + - tweak: "Rearranges a few objects within the prison as to accommodate the new gun range" diff --git a/html/changelogs/AutoChangeLog-pr-9057.yml b/html/changelogs/AutoChangeLog-pr-9057.yml new file mode 100644 index 0000000000..4df1b23ca7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9057.yml @@ -0,0 +1,4 @@ +author: "EgoSumStultus" +delete-after: True +changes: + - rscadd: "Adds male AI vox." diff --git a/html/changelogs/AutoChangeLog-pr-9077.yml b/html/changelogs/AutoChangeLog-pr-9077.yml new file mode 100644 index 0000000000..2f42e36dd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9077.yml @@ -0,0 +1,8 @@ +author: "original by actioninja, port by sishen1542" +delete-after: True +changes: + - tweak: "Medical and Security consoles now check access on worn or inhand ID instead of requiring an inserted ID" + - tweak: "mining vendor now reads from ID in hand or on person instead of requiring an inserted ID" + - bugfix: "ORM is functional again (for real this time)" + - tweak: "ORM claim points button transfers points to worn/inhand ID instead of to an inserted ID, no longer accepts insertions" + - tweak: "Same for gulag consoles" diff --git a/html/changelogs/AutoChangeLog-pr-9089.yml b/html/changelogs/AutoChangeLog-pr-9089.yml new file mode 100644 index 0000000000..dc1e351f25 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9089.yml @@ -0,0 +1,6 @@ +author: "original by Tlaltecuhtli, port by sishen1542" +delete-after: True +changes: + - rscadd: "rcd disk that gives rcd computer frame and machine frame designs" + - rscadd: "upgraded rcd in CE lockers" + - tweak: "moved deconstruction to the upgrade disk, ashwalker rcd comes upgraded" diff --git a/html/changelogs/AutoChangeLog-pr-9147.yml b/html/changelogs/AutoChangeLog-pr-9147.yml new file mode 100644 index 0000000000..7f1dcb7e7e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9147.yml @@ -0,0 +1,5 @@ +author: "Code-Cygnet" +delete-after: True +changes: + - rscadd: "Added new things - Mind trait, alcohol reagent, chemical reagent, drink sprite and recipe." + - imageadd: "added commander_and_chief sprite to drinks.dmi" 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-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-9221.yml b/html/changelogs/AutoChangeLog-pr-9221.yml new file mode 100644 index 0000000000..0256c4a7c9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9221.yml @@ -0,0 +1,9 @@ +author: "Sishen1542" +delete-after: True +changes: + - rscadd: "holy lasrifle, hypertool, divine lightblade, and blessed baseball bat. Four new holy weapons!" + - balance: "stamina and force tweaks for most holy weapons." + - tweak: "prayer beads no longer deconvert after a 10 second timer, now just inject holy water for delayed effect" + - tweak: "cultist runes are now destroyed with a bible or a null rod" + - tweak: "bo-staff now functions as a nerfed sleepy carp staff" + - bugfix: "fixed kevinz code to add in non-null rod child items as holy weapons" diff --git a/html/changelogs/AutoChangeLog-pr-9227.yml b/html/changelogs/AutoChangeLog-pr-9227.yml new file mode 100644 index 0000000000..9f6bfabdc4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9227.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "Missing sprites with bad ones" diff --git a/html/changelogs/AutoChangeLog-pr-9229.yml b/html/changelogs/AutoChangeLog-pr-9229.yml new file mode 100644 index 0000000000..5c617f6ab0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9229.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "emag charge amount" diff --git a/html/changelogs/AutoChangeLog-pr-9235.yml b/html/changelogs/AutoChangeLog-pr-9235.yml new file mode 100644 index 0000000000..112f34a7f0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9235.yml @@ -0,0 +1,5 @@ +author: "Yakumo Chen" +delete-after: True +changes: + - rscdel: "Removes autoscan" + - balance: "Scanning people now requires someone to operate the cloning computer regardless of part level." diff --git a/html/changelogs/AutoChangeLog-pr-9238.yml b/html/changelogs/AutoChangeLog-pr-9238.yml new file mode 100644 index 0000000000..b2eb8db233 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9238.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Surgerys and spays in bags" diff --git a/html/changelogs/AutoChangeLog-pr-9239.yml b/html/changelogs/AutoChangeLog-pr-9239.yml new file mode 100644 index 0000000000..781dcd82b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9239.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "earthbloods stam regen" diff --git a/html/changelogs/AutoChangeLog-pr-9242.yml b/html/changelogs/AutoChangeLog-pr-9242.yml new file mode 100644 index 0000000000..1e47385e67 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9242.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - tweak: "blood cult ritual daggers fit in jack/combat boots" diff --git a/html/changelogs/AutoChangeLog-pr-9247.yml b/html/changelogs/AutoChangeLog-pr-9247.yml new file mode 100644 index 0000000000..4f6e0b0875 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9247.yml @@ -0,0 +1,4 @@ +author: "Fermi" +delete-after: True +changes: + - bugfix: "Fixes tiny runaway decimals in reagents system." diff --git a/html/changelogs/AutoChangeLog-pr-9248.yml b/html/changelogs/AutoChangeLog-pr-9248.yml new file mode 100644 index 0000000000..3e6eff727c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9248.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - imageadd: "Red to Blue/Black crosses as questioned by Bhijn" diff --git a/html/changelogs/AutoChangeLog-pr-9249.yml b/html/changelogs/AutoChangeLog-pr-9249.yml new file mode 100644 index 0000000000..b2ef0c2d46 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9249.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "clean bot not cleaning basic cleanables" diff --git a/html/changelogs/AutoChangeLog-pr-9256.yml b/html/changelogs/AutoChangeLog-pr-9256.yml new file mode 100644 index 0000000000..dcf039a2a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9256.yml @@ -0,0 +1,4 @@ +author: "Fermi" +delete-after: True +changes: + - bugfix: "SDGF: Fixes infinite clones." diff --git a/html/changelogs/AutoChangeLog-pr-9260.yml b/html/changelogs/AutoChangeLog-pr-9260.yml new file mode 100644 index 0000000000..f94d9772f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9260.yml @@ -0,0 +1,4 @@ +author: "dapnee" +delete-after: True +changes: + - rscadd: "Trim lines!" 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/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/robots.dmi b/icons/mob/robots.dmi index c53fa85262..896a87ff3a 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 7822cdb8c2..c255e0a104 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 0ac8ccf566..0831d47577 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 5ced9cad20..fe126cadd8 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 55a7f60a5c..a78ce898e0 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 8788567b36..6336669501 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/machines/harvester.dmi b/icons/obj/machines/harvester.dmi index d6d9b01fc6..ce272c5774 100644 Binary files a/icons/obj/machines/harvester.dmi and b/icons/obj/machines/harvester.dmi differ diff --git a/icons/obj/machines/sleeper.dmi b/icons/obj/machines/sleeper.dmi index b027d0d7b1..ff9e2b197a 100644 Binary files a/icons/obj/machines/sleeper.dmi and b/icons/obj/machines/sleeper.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index b6ca8c178c..685b14cee5 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index a575ab292f..e7875efa26 100644 Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi new file mode 100644 index 0000000000..808e79aa43 Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index e5d61fbfe0..fae8134791 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index f7f259ab04..616cb1f521 100644 Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ diff --git a/modular_citadel/code/game/objects/ids.dm b/modular_citadel/code/game/objects/ids.dm index 89a3c0f0c2..8ef724581e 100644 --- a/modular_citadel/code/game/objects/ids.dm +++ b/modular_citadel/code/game/objects/ids.dm @@ -49,7 +49,7 @@ /obj/item/emagrecharge name = "electromagnet charging device" - desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices." + desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell." icon = 'icons/obj/module.dmi' icon_state = "cell_mini" item_flags = NOBLUDGEON @@ -63,7 +63,7 @@ to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent.") /obj/item/card/emag - var/uses = 10 + var/uses = 15 /obj/item/card/emag/examine(mob/user) . = ..() diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm index 3ecc6cc31b..06cdb0f5fd 100644 --- a/modular_citadel/code/game/objects/items/holy_weapons.dm +++ b/modular_citadel/code/game/objects/items/holy_weapons.dm @@ -30,24 +30,16 @@ "You kneel[M == user ? null : " next to [M]"] and begin a prayer to [deity_name].") praying = TRUE - if(do_after(user, 100, target = M)) + if(do_after(user, 20, target = M)) if(istype(M, /mob/living/carbon/human)) // This probably should not work on catpeople. They're unholy abominations. var/mob/living/carbon/human/target = M - - if(iscultist(M) || is_servant_of_ratvar(M)) //ripped from holywater code. - if(iscultist(M)) - SSticker.mode.remove_cultist(M.mind, FALSE, TRUE) - else if(is_servant_of_ratvar(M)) - remove_servant_of_ratvar(M) - + M.reagents.add_reagent("holywater", 5) to_chat(target, "[user]'s prayer to [deity_name] has eased your pain!") target.adjustToxLoss(-5, TRUE, TRUE) target.adjustOxyLoss(-5) target.adjustBruteLoss(-5) target.adjustFireLoss(-5) - praying = FALSE - else to_chat(user, "Your prayer to [deity_name] was interrupted.") praying = FALSE diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 68ab229f0a..4cf1d326a2 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -130,15 +130,6 @@ else return ..() -/obj/item/melee/transforming/energy/sword/cx/chaplain - name = "divine lightblade" - force_on = 20 //haha i'll regret this - block_chance = 50 - -/obj/item/melee/transforming/energy/sword/cx/chaplain/Initialize() - . = ..() - AddComponent(/datum/component/anti_magic, TRUE, TRUE) - //OBLIGATORY TOY MEMES ///////////////////////////////////// /obj/item/toy/sword/cx @@ -271,6 +262,21 @@ spinnable = FALSE total_mass_on = 4 +/obj/item/twohanded/dualsaber/hypereutactic/chaplain + name = "\improper divine lightblade" + desc = "A giant blade of bright and holy light, said to cut down the wicked with ease." + force = 5 + force_unwielded = 5 + force_wielded = 20 + block_chance = 50 + armour_penetration = 0 + var/chaplain_spawnable = TRUE + obj_flags = UNIQUE_RENAME + +/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + /obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes altafterattack(A, user, TRUE, params) return TRUE @@ -380,4 +386,4 @@ /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander" desc = "A custom-built toy with fancy rainbow lights built-in." - hacked = TRUE \ No newline at end of file + hacked = TRUE diff --git a/modular_citadel/code/game/objects/items/melee/misc.dm b/modular_citadel/code/game/objects/items/melee/misc.dm index 6a53adcc1f..48c221696e 100644 --- a/modular_citadel/code/game/objects/items/melee/misc.dm +++ b/modular_citadel/code/game/objects/items/melee/misc.dm @@ -4,7 +4,7 @@ var/hardstun_ds = 1 var/softstun_ds = 0 var/stam_dmg = 30 - cooldown = 20 + cooldown = 0 total_mass = 3.75 /obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user) diff --git a/modular_citadel/code/modules/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/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm index 66147a41e7..de98f9685c 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm @@ -10,7 +10,7 @@ mob/living/silicon /mob/living/silicon/robot/update_canmove() ..() - if(client && stat != DEAD && dogborg == TRUE) + if(client && stat != DEAD && dogborg == FALSE) if(resting) cut_overlays() icon_state = "[module.cyborg_base_icon]-rest" @@ -18,6 +18,9 @@ mob/living/silicon icon_state = "[module.cyborg_base_icon]" update_icons() + + + /mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1) if(istype(cell)) cell.charge -= amount*5 diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index a0dbe3a02a..b16ac1d586 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -61,7 +61,7 @@ /obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/list/sechoundmodels = list("Default") + var/list/sechoundmodels = list("Default", "Dark", "Vale") if(R.client && R.client.ckey in list("nezuli")) sechoundmodels += "Alina" var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels @@ -70,11 +70,14 @@ switch(borg_icon) if("Default") cyborg_base_icon = "k9" - moduleselect_icon = "k9" if("Alina") cyborg_base_icon = "alina-sec" special_light_key = "alina" sleeper_overlay = "alinasleeper" + if("Dark") + cyborg_base_icon = "k9dark" + if("Vale") + cyborg_base_icon = "valesec" return ..() /obj/item/robot_module/medihound @@ -109,7 +112,7 @@ /obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/list/medhoundmodels = list("Default", "Dark") + var/list/medhoundmodels = list("Default", "Dark", "Vale") if(R.client && R.client.ckey in list("nezuli")) medhoundmodels += "Alina" var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels @@ -121,6 +124,9 @@ if("Dark") cyborg_base_icon = "medihounddark" sleeper_overlay = "mdsleeper" + if("Vale") + cyborg_base_icon = "valemed" + sleeper_overlay = "valemedsleeper" if("Alina") cyborg_base_icon = "alina-med" special_light_key = "alina" @@ -313,7 +319,7 @@ /obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro") + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "DarkK9", "Vale", "ValeDark") if(!borg_icon) return FALSE switch(borg_icon) @@ -339,11 +345,32 @@ cyborg_base_icon = "heavyserv" special_light_key = "heavyserv" cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("DarkK9") + cyborg_base_icon = "k50" + special_light_key = "k50" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + if("Vale") + cyborg_base_icon = "valeserv" + special_light_key = "valeserv" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 + if("ValeDark") + cyborg_base_icon = "valeservdark" + special_light_key = "valeservdark" + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 return ..() /obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module) var/mob/living/silicon/robot/R = loc - var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer") + var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale") if(R.client && R.client.ckey in list("nezuli")) engymodels += "Alina" var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels @@ -386,6 +413,14 @@ has_snowflake_deadsprite = TRUE dogborg = TRUE cyborg_pixel_offset = -16 + if("Vale") + cyborg_base_icon = "valeeng" + can_be_pushed = FALSE + hat_offset = INFINITY + cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + dogborg = TRUE + cyborg_pixel_offset = -16 if("Alina") cyborg_base_icon = "alina-eng" special_light_key = "alina" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 499510b5d4..8af3176746 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -81,9 +81,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING SM.real_name = M.real_name M.dna.transfer_identity(SM) SM.updateappearance(mutcolor_update=1) - var/mob/dead/observer/C = pick(candies) - message_admins("Ghost candidate found! [C] key [C.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)") - SM.key = C.key + + + candies = shuffle(candies)//Shake those ghosts up! + for(var/mob/dead/observer/C2 in candies) + if(C2.key && C2) + SM.key = C2.key + message_admins("Ghost candidate found! [C2] key [C2.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)") + log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]") + break + else + candies =- C2 + if(!SM.mind) //Something went wrong, use alt mechanics + return ..() SM.mind.enslave_mind_to_creator(M) //If they're a zombie, they can try to negate it with this. diff --git a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi index fa7285ae4c..7fbb26f1af 100644 Binary files a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi and b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi differ diff --git a/modular_citadel/icons/mob/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi index c730467e1d..19dd8dba86 100644 Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.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