diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index fc007a5cef..3f4e4f5ba4 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -1000,7 +1000,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos)
"act" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"acu" = (
@@ -3552,7 +3552,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"agU" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"agV" = (
@@ -19907,7 +19907,6 @@
/turf/open/floor/plasteel,
/area/bridge)
"aVk" = (
-/obj/machinery/holopad,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -19917,6 +19916,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/holopad,
/turf/open/floor/plasteel,
/area/bridge)
"aVl" = (
@@ -22731,10 +22731,10 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"bcf" = (
-/obj/machinery/holopad,
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"bcg" = (
@@ -23327,10 +23327,10 @@
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/toilet/locker)
"bdK" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/holopad/secure,
/turf/open/floor/carpet,
/area/bridge/meeting_room)
"bdL" = (
@@ -24563,10 +24563,10 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/machinery/holopad/secure,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bgX" = (
@@ -28671,7 +28671,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hop)
"bqB" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
"bqC" = (
@@ -32055,7 +32055,7 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/hor)
"byr" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/hor)
"bys" = (
@@ -32145,13 +32145,13 @@
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"byC" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/brown{
dir = 1
},
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"byD" = (
@@ -35886,13 +35886,13 @@
/turf/open/floor/engine,
/area/science/storage)
"bGZ" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/cmo)
"bHa" = (
@@ -40820,8 +40820,8 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/engineering)
"bTI" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/tcommsat/computer)
"bTJ" = (
@@ -45398,7 +45398,6 @@
name = "Privacy Shutters Control";
pixel_y = 26
},
-/obj/machinery/holopad,
/obj/machinery/light{
dir = 1
},
@@ -45412,6 +45411,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/chief)
"cfI" = (
@@ -49642,12 +49642,12 @@
/turf/open/floor/plasteel/grimy,
/area/ai_monitored/turret_protected/aisat_interior)
"ctJ" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
icon_state = "2-8"
},
/obj/effect/landmark/start/cyborg,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/grimy,
/area/ai_monitored/turret_protected/aisat_interior)
"ctK" = (
@@ -50032,9 +50032,9 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/atmos)
"cuC" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/landmark/start/cyborg,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/atmos)
"cuD" = (
@@ -50089,12 +50089,12 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/landmark/start/cyborg,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"cuH" = (
@@ -50120,10 +50120,10 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/service)
"cuJ" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/service)
"cuK" = (
@@ -50690,8 +50690,8 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/hallway)
"cvU" = (
@@ -50946,10 +50946,10 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"cwB" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 8c03b77f67..ad82e25555 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -25905,7 +25905,6 @@
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aVU" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "4-8"
},
@@ -25913,6 +25912,7 @@
icon_state = "1-8"
},
/obj/effect/turf_decal/bot,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aVV" = (
@@ -36427,7 +36427,6 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"boh" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -36438,6 +36437,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/aisat)
"boi" = (
@@ -37174,13 +37174,13 @@
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hos)
"bpv" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hos)
"bpw" = (
@@ -46891,7 +46891,6 @@
/turf/open/floor/circuit/green,
/area/ai_monitored/turret_protected/ai)
"bEg" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -46902,6 +46901,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"bEh" = (
@@ -48322,12 +48322,12 @@
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bFZ" = (
-/obj/machinery/holopad,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
/obj/structure/cable/white{
icon_state = "4-8"
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bGa" = (
@@ -54066,10 +54066,10 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "2-8"
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bOL" = (
@@ -54128,7 +54128,6 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bOR" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "1-4"
},
@@ -54137,6 +54136,7 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
+/obj/machinery/holopad/secure,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bOS" = (
@@ -56083,8 +56083,8 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/chief)
"bRZ" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"bSa" = (
@@ -58465,7 +58465,6 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/holopad,
/obj/effect/landmark/start/cyborg,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -58477,6 +58476,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"bVy" = (
@@ -58809,7 +58809,6 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -58820,6 +58819,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/aisat)
"bVT" = (
@@ -64590,7 +64590,6 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"ceH" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "4-8"
},
@@ -64601,6 +64600,7 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
+/obj/machinery/holopad/secure,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"ceI" = (
@@ -66136,11 +66136,11 @@
/turf/open/floor/plasteel,
/area/security/brig)
"chd" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/effect/turf_decal/bot,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/security/brig)
"che" = (
@@ -66314,7 +66314,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -66328,6 +66327,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"cho" = (
@@ -67674,10 +67674,10 @@
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hop)
"cjC" = (
-/obj/machinery/holopad,
/obj/structure/cable/white{
icon_state = "1-2"
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/heads/hop)
"cjD" = (
@@ -102509,10 +102509,10 @@
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hor)
"drY" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/hor)
"drZ" = (
@@ -107085,7 +107085,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -107093,6 +107092,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/cmo)
"dAd" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 94c26c2a2b..5f751fff7f 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -3710,7 +3710,6 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"agS" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -3721,6 +3720,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"agT" = (
@@ -3795,11 +3795,11 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"agZ" = (
-/obj/machinery/holopad,
/obj/structure/chair{
dir = 1
},
/obj/effect/landmark/start/head_of_security,
+/obj/machinery/holopad/secure,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"aha" = (
@@ -9617,8 +9617,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
-/obj/machinery/holopad,
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"arR" = (
@@ -20565,7 +20565,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"aOc" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"aOd" = (
@@ -21690,7 +21690,7 @@
/area/quartermaster/qm)
"aQs" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aQt" = (
@@ -25568,7 +25568,7 @@
dir = 1;
pixel_y = 1
},
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/aisat)
"aYe" = (
@@ -27493,7 +27493,6 @@
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"bbv" = (
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -27504,6 +27503,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"bbw" = (
@@ -30688,7 +30688,6 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/machinery/holopad,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"bhz" = (
@@ -31151,8 +31150,8 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"bip" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"biq" = (
@@ -33889,12 +33888,12 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"bnC" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/landmark/start/cyborg,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"bnD" = (
@@ -34877,11 +34876,11 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"bpF" = (
-/obj/machinery/holopad,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/aisat)
"bpG" = (
@@ -34927,8 +34926,8 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/holopad,
/obj/item/beacon,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
"bpL" = (
@@ -37469,9 +37468,9 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"buG" = (
-/obj/machinery/holopad{
- pixel_x = 9;
- pixel_y = -9
+/obj/machinery/holopad/secure{
+ pixel_x = 15;
+ pixel_y = -15
},
/turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private)
@@ -39635,7 +39634,6 @@
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bzq" = (
-/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -39646,6 +39644,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/grimy,
/area/tcommsat/computer)
"bzr" = (
@@ -43400,13 +43399,13 @@
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
"bHE" = (
-/obj/machinery/holopad,
/obj/structure/cable/yellow{
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
"bHF" = (
@@ -58731,7 +58730,7 @@
/area/science/explab)
"cmX" = (
/obj/structure/window/reinforced,
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/aisat)
"cmY" = (
@@ -61195,13 +61194,13 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/holopad,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/cmo)
"crA" = (
@@ -63582,7 +63581,7 @@
},
/area/crew_quarters/heads/hor)
"cvU" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 502e722f47..d9c9774a06 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -3,9 +3,9 @@
/turf/open/space/basic,
/area/space)
"aab" = (
-/obj/machinery/holopad,
/obj/effect/landmark/start/cyborg,
/mob/living/simple_animal/bot/secbot/pingsky,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"aac" = (
@@ -999,7 +999,7 @@
/obj/machinery/power/terminal{
dir = 1
},
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/white,
/area/ai_monitored/turret_protected/ai)
"acs" = (
@@ -11793,7 +11793,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"aBn" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"aBo" = (
@@ -12592,7 +12592,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"aCR" = (
-/obj/machinery/holopad,
+/obj/machinery/holopad/secure,
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"aCS" = (
@@ -12995,7 +12995,6 @@
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
"aDM" = (
-/obj/machinery/holopad,
/obj/machinery/camera/motion{
c_tag = "AI Upload Center";
dir = 1;
@@ -13008,6 +13007,7 @@
name = "Station Intercom (AI Private)";
pixel_y = -28
},
+/obj/machinery/holopad/secure,
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
"aDN" = (
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 0a17fa013e..ad4088442d 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -90,12 +90,15 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 4096 //Citadel edit: What's the WORST that could happen?
-#define MAX_FLAVOR_LEN 4096
+#define MAX_FLAVOR_LEN 4096
#define MAX_TASTE_LEN 40 //lick... vore... ew...
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
+// Is something in the IC chat filter? This is config dependent.
+#define CHAT_FILTER_CHECK(T) (config.ic_filter_regex && findtext(T, config.ic_filter_regex))
+
// Audio/Visual Flags. Used to determine what sense are required to notice a message.
#define MSG_VISUAL (1<<0)
#define MSG_AUDIBLE (1<<1)
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 32da3b5938..5d7de05598 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -22,7 +22,7 @@
var/motd
// var/policy
- // var/static/regex/ic_filter_regex
+ var/static/regex/ic_filter_regex
/datum/controller/configuration/proc/admin_reload()
if(IsAdminAdvancedProcCall())
@@ -53,7 +53,7 @@
loadmaplist(CONFIG_MAPS_FILE)
LoadMOTD()
// LoadPolicy()
- // LoadChatFilter()
+ LoadChatFilter()
if (Master)
Master.OnConfigLoad()
@@ -486,7 +486,7 @@ Example config:
continue
runnable_modes[M] = probabilities[M.config_tag]
return runnable_modes
-/*
+
/datum/controller/configuration/proc/LoadChatFilter()
var/list/in_character_filter = list()
if(!fexists("[directory]/in_character_filter.txt"))
@@ -499,7 +499,7 @@ Example config:
continue
in_character_filter += REGEX_QUOTE(line)
ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null
-*/
+
//Message admins when you can.
/datum/controller/configuration/proc/DelayedMessageAdmins(text)
addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, text), 0)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 4a576c5a6e..853bd73eac 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
var/secure = FALSE
/// If we are currently calling another holopad
var/calling = FALSE
-/*
+
/obj/machinery/holopad/secure
name = "secure holopad"
desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls."
@@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
var/obj/item/circuitboard/machine/holopad/board = circuit
board.secure = TRUE
board.build_path = /obj/machinery/holopad/secure
-*/
+
/obj/machinery/holopad/tutorial
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags_1 = NODECONSTRUCT_1
@@ -372,7 +372,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2)))
HC.Answer(src)
break
- if(!secure) //HC.head_call &&
+ if(HC.head_call && !secure)
HC.Answer(src)
break
if(outgoing_call)
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index dcd0cda233..286506a7d1 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -472,7 +472,7 @@
build_path = /obj/machinery/holopad
secure = FALSE
else
- build_path = /obj/machinery/holopad //secure
+ build_path = /obj/machinery/holopad/secure //secure
secure = TRUE
to_chat(user, "You [secure? "en" : "dis"]able the security on the [src]")
. = ..()
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index fadf33cb85..b8d14a6555 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -676,7 +676,6 @@
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT)
ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups.
- ADD_TRAIT(new_spawn, TRAIT_PACIFISM, GHOSTROLE_TRAIT)
to_chat(new_spawn,"Ghosting is free!")
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
D.Grant(new_spawn)
diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm
index d54fc4dcd2..6b0a093440 100644
--- a/code/modules/events/supermatter_surge.dm
+++ b/code/modules/events/supermatter_surge.dm
@@ -13,11 +13,27 @@
var/power = 2000
/datum/round_event/supermatter_surge/setup()
- power = rand(200,4000)
+ if(prob(70))
+ power = rand(200,100000)
+ else
+ power = rand(200,200000)
/datum/round_event/supermatter_surge/announce()
- if(power > 800 || prob(round(power/8)))
- priority_announce("Class [round(power/500) + 1] supermatter surge detected. Intervention may be required.", "Anomaly Alert")
+ var/severity = ""
+ switch(power)
+ if(-INFINITY to 100000)
+ var/low_threat_perc = 100-round(100*((power-200)/(100000-200)))
+ if(prob(low_threat_perc))
+ if(prob(low_threat_perc))
+ severity = "low; the supermatter should return to normal operation shortly."
+ else
+ severity = "medium; the supermatter should return to normal operation, but check NT CIMS to ensure this."
+ else
+ severity = "high; if the supermatter's cooling is not fortified, coolant may need to be added."
+ if(100000 to INFINITY)
+ severity = "extreme; emergency action is likely to be required even if coolant loop is fine."
+ if(power > 20000 || prob(round(power/200)))
+ priority_announce("Supermatter surge detected. Estimated severity is [severity]", "Anomaly Alert")
/datum/round_event/supermatter_surge/start()
GLOB.main_supermatter_engine.matter_power += power
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index efab64fe3a..470c5368a5 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -1291,8 +1291,8 @@
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
chaser_timer = world.time + chaser_cooldown
var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
- C.damage = 30
- C.monster_damage_boost = FALSE
+ C.damage = 15
+ C.monster_damage_boost = TRUE
log_combat(user, target, "fired a chaser at", src)
else
INVOKE_ASYNC(src, .proc/cardinal_blasts, T, user) //otherwise, just do cardinal blast
@@ -1408,10 +1408,10 @@
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
- B.damage = 30
+ B.damage = 15
for(var/t in RANGE_TURFS(1, source))
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
- B.damage = 30
+ B.damage = 15
for(var/mob/living/L in range(1, source))
INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
sleep(6) //at this point the blasts detonate
@@ -1472,8 +1472,8 @@
if(!J)
return
var/obj/effect/temp_visual/hierophant/blast/B = new(J, user, friendly_fire_check)
- B.damage = 30
- B.monster_damage_boost = FALSE
+ B.damage = 15
+ B.monster_damage_boost = TRUE
previousturf = J
J = get_step(previousturf, dir)
@@ -1485,7 +1485,7 @@
sleep(2)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/temp_visual/hierophant/blast/B = new(t, user, friendly_fire_check)
- B.damage = 15 //keeps monster damage boost due to lower damage
+ B.damage = 15 //keeps monster damage boost due to lower damage (now added to all damage due to reduction to 15, 30dmg 50AP isn't cool)
//Just some minor stuff
diff --git a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm
index ed3c7e21d4..1aac2fd02e 100644
--- a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm
+++ b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm
@@ -37,11 +37,11 @@
to_chat(owner, "There's something stuck to your hand, stopping you from transforming!")
return
if(IsAvailable())
- transforming = TRUE
UpdateButtonIcon()
var/mutcolor = owner.get_ability_property(INNATE_ABILITY_SLIME_BLOBFORM, PROPERTY_BLOBFORM_COLOR) || ("#" + H.dna.features["mcolor"])
if(!is_puddle)
if(CHECK_MOBILITY(H, MOBILITY_USE)) //if we can use items, we can turn into a puddle
+ transforming = TRUE
is_puddle = TRUE //so we know which transformation to use when its used
ADD_TRAIT(H, TRAIT_HUMAN_NO_RENDER, SLIMEPUDDLE_TRAIT)
owner.cut_overlays() //we dont show our normal sprite, we show a puddle sprite
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 89b3d603ea..5dc33c3778 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -3,7 +3,7 @@
id = SPECIES_VAMPIRE
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD,HAS_FLESH,HAS_BONE)
- inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
+ inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH,TRAIT_NOMARROW)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutant_bodyparts = list("mcolor" = "FFFFFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None")
exotic_bloodtype = "U"
@@ -53,10 +53,11 @@
C.adjustOxyLoss(-4)
C.adjustCloneLoss(-4)
return
- C.blood_volume -= 0.75 //Will take roughly 19.5 minutes to die from standard blood volume, roughly 83 minutes to die from max blood volume.
- if(C.blood_volume <= (BLOOD_VOLUME_SURVIVE*C.blood_ratio))
- to_chat(C, "You ran out of blood!")
- C.dust()
+ if(C.blood_volume > 0.5)
+ C.blood_volume -= 0.5 //Will take roughly 19.5 minutes to die from standard blood volume, roughly 83 minutes to die from max blood volume.
+ else
+ C.dust(FALSE, TRUE)
+
var/area/A = get_area(C)
if(istype(A, /area/chapel) && C.mind?.assigned_role != "Chaplain")
to_chat(C, "You don't belong here!")
@@ -125,7 +126,7 @@
. = ..()
var/obj/item/organ/heart/vampire/darkheart = getorgan(/obj/item/organ/heart/vampire)
if(darkheart)
- . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]."
+ . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]."
/obj/item/organ/heart/vampire
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 7b05de2203..12654858a5 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -90,11 +90,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE, MODE_SING = TRUE)
var/ic_blocked = FALSE
- /*
- if(client && !forced && config.ic_filter_regex && findtext(message, config.ic_filter_regex))
+
+ if(client && !forced && CHAT_FILTER_CHECK(message))
//The filter doesn't act on the sanitized message, but the raw message.
ic_blocked = TRUE
- */
+
if(sanitize)
message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))
if(!message || message == "")
@@ -103,6 +103,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(ic_blocked)
//The filter warning message shows the sanitized message though.
to_chat(src, "That message contained a word prohibited in IC chat! Consider reviewing the server rules.\n\"[message]\"")
+ SSblackbox.record_feedback("tally", "ic_blocked_words", 1, lowertext(config.ic_filter_regex.match))
return
var/datum/saymode/saymode = SSradio.saymodes[talk_key]
@@ -344,7 +345,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/obj/item/bodypart/rightarm = get_bodypart(BODY_ZONE_R_ARM)
if(HAS_TRAIT(src, TRAIT_MUTE) && get_selected_language() != /datum/language/signlanguage)
return 0
-
+
if (get_selected_language() == /datum/language/signlanguage)
var/left_disabled = FALSE
var/right_disabled = FALSE
diff --git a/html/changelogs/AutoChangeLog-pr-14323.yml b/html/changelogs/AutoChangeLog-pr-14323.yml
new file mode 100644
index 0000000000..4a1fbcb14b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14323.yml
@@ -0,0 +1,4 @@
+author: "dzahlus"
+delete-after: True
+changes:
+ - balance: "rebalanced hierophant STAFF to do 15 damage on all attacks"
diff --git a/html/changelogs/AutoChangeLog-pr-14405.yml b/html/changelogs/AutoChangeLog-pr-14405.yml
new file mode 100644
index 0000000000..e7b92bdce5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14405.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Vampire statpanel no longer shows spans unnecesary"
diff --git a/html/changelogs/AutoChangeLog-pr-14436.yml b/html/changelogs/AutoChangeLog-pr-14436.yml
new file mode 100644
index 0000000000..5768d8dc16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14436.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - balance: "Buffed supermatter surge massively."
diff --git a/html/changelogs/AutoChangeLog-pr-14457.yml b/html/changelogs/AutoChangeLog-pr-14457.yml
new file mode 100644
index 0000000000..fce2e15ce2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14457.yml
@@ -0,0 +1,5 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - bugfix: "fixed the holopad autocall bug"
+ - bugfix: "properly incorporated the secure holopad that was commented out in the code."
diff --git a/html/changelogs/AutoChangeLog-pr-14458.yml b/html/changelogs/AutoChangeLog-pr-14458.yml
new file mode 100644
index 0000000000..79810f22e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14458.yml
@@ -0,0 +1,5 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - balance: "buffed particle defender disabler shots from 13->15 stamina (15*6=90)"
+ - balance: "buffed particle defender laser ammo to 4 shots"
diff --git a/html/changelogs/AutoChangeLog-pr-14461.yml b/html/changelogs/AutoChangeLog-pr-14461.yml
new file mode 100644
index 0000000000..29f326d24c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14461.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscdel: "removes pacifism from ghost cafe. have fun beating up your coworkers"
diff --git a/html/changelogs/AutoChangeLog-pr-14464.yml b/html/changelogs/AutoChangeLog-pr-14464.yml
new file mode 100644
index 0000000000..a6f9fe668b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14464.yml
@@ -0,0 +1,6 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - config: "the in_character_filter.txt is now usable"
+ - admin: "headmins should edit the in_character_filter.txt"
+ - server: "someone with box access should delete racism with the in_character_filter.txt"
diff --git a/html/changelogs/AutoChangeLog-pr-14469.yml b/html/changelogs/AutoChangeLog-pr-14469.yml
new file mode 100644
index 0000000000..71d16a17ee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14469.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "using the puddle ability when stunned wont break it"
diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
index d7212f61d2..e5b81806e6 100644
--- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
@@ -153,7 +153,7 @@
/obj/item/ammo_casing/energy/laser/pump
projectile_type = /obj/item/projectile/beam/pump
- e_cost = 350
+ e_cost = 300
select_name = "kill"
pellets = 6
variance = 15
@@ -189,5 +189,5 @@
name = "disabling blast"
icon_state = "disablerslug"
color = null
- stamina = 13
+ stamina = 15
range = 6