diff --git a/code/citadel/cit_screenshake.dm b/code/citadel/cit_screenshake.dm
deleted file mode 100644
index 5bcfac8428..0000000000
--- a/code/citadel/cit_screenshake.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-//we vlambeer now
-
-/obj/item/gun/energy
- ..()
- recoil = 0.1
-
-/obj/item/gun/energy/kinetic_accelerator
- ..()
- recoil = 0.8
-
-/obj/item/gun/ballistic
- ..()
- recoil = 0.25
-
-/obj/item/gun/ballistic/shotgun
- ..()
- recoil = 1
-
-/obj/item/gun/ballistic/revolver
- ..()
- recoil = 0.5
-
-/obj/item/gun/ballistic/revolver/doublebarrel
- ..()
- recoil = 1
-
-/obj/item/gun/syringe
- ..()
- recoil = 0.1
-
-/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user)
- . = ..()
- shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75))
-
-/obj/item/attack(mob/living/M, mob/living/user)
- . = ..()
- if(force && force >=11)
- shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
- shake_camera(M, ((force - 10) * 0.02 + 1), ((force - 10) * 0.02))
-
-/obj/item/attack_obj(obj/O, mob/living/user)
- . = ..()
- if(force && force >= 20)
- shake_camera(user, ((force - 15) * 0.02 + 1), ((force - 15) * 0.02))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1df28192db..bec543b0f6 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -46,6 +46,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/preferred_map = null
var/uses_glasses_colour = 0
+
+ var/screenshake = TRUE
//character preferences
var/real_name //our character's name
@@ -361,8 +363,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Disabled"
else
dat += "High"
+
dat += "
"
+ dat += "Screen shake: [(screenshake) ? "Full" : "None"]
"
+
dat += "
"
dat += "Special Role Settings"
@@ -1486,6 +1491,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["exhibitionist"] = TRUE
else
features["exhibitionist"] = FALSE
+ if("screenshake")
+ screenshake = !screenshake
if("publicity")
if(unlock_content)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index a04a34cf00..5e1357288d 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -190,6 +190,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["menuoptions"] >> menuoptions
//citadel code
S["arousable"] >> arousable
+ S["screenshake"] >> screenshake
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -214,6 +215,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION)
menuoptions = SANITIZE_LIST(menuoptions)
be_special = SANITIZE_LIST(be_special)
+ screenshake = sanitize_integer(screenshake, 0, 1, initial(screenshake))
return 1
@@ -256,6 +258,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["tip_delay"], tip_delay)
//citadel code
S["arousable"] << arousable
+ WRITE_FILE(S["screenshake"], screenshake)
return 1
diff --git a/modular_citadel/README.md b/modular_citadel/README.md
new file mode 100644
index 0000000000..dfae177607
--- /dev/null
+++ b/modular_citadel/README.md
@@ -0,0 +1,3 @@
+Hooray modularity!
+Things that modify core files without directly touching said core files go here. This is similar to how Hippie handles things.
+This stops dreammaker from throwing errors and warnings if you try to compile these files while they're inside code/citadel/.
diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm
new file mode 100644
index 0000000000..64418f2c55
--- /dev/null
+++ b/modular_citadel/cit_screenshake.dm
@@ -0,0 +1,62 @@
+//we vlambeer now
+
+/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit
+ if(!M || !M.client || duration <= 0)
+ return
+ var/client/C = M.client
+ if(!C.prefs.screenshake)//possible todo: implement a reduced screenshake setting that cuts screenshake to a quarter of its normal amount? this works perfectly for now, though.
+ return
+ var/oldx = C.pixel_x
+ var/oldy = C.pixel_y
+ var/max = strength*world.icon_size
+ var/min = -(strength*world.icon_size)
+
+ for(var/i in 0 to duration-1)
+ if (i == 0)
+ animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
+ else
+ animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
+ animate(pixel_x=oldx, pixel_y=oldy, time=1)
+
+/obj/item/gun/energy
+ ..()
+ recoil = 0.1
+
+/obj/item/gun/energy/kinetic_accelerator
+ ..()
+ recoil = 0.5
+
+/obj/item/gun/ballistic
+ ..()
+ recoil = 0.25
+
+/obj/item/gun/ballistic/shotgun
+ ..()
+ recoil = 1
+
+/obj/item/gun/ballistic/revolver
+ ..()
+ recoil = 0.5
+
+/obj/item/gun/ballistic/revolver/doublebarrel
+ ..()
+ recoil = 1
+
+/obj/item/gun/syringe
+ ..()
+ recoil = 0.1
+
+/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user)
+ . = ..()
+ shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75))
+
+/obj/item/attack(mob/living/M, mob/living/user)
+ . = ..()
+ if(force && force >=11)
+ shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01))
+ shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
+
+/obj/item/attack_obj(obj/O, mob/living/user)
+ . = ..()
+ if(force && force >= 20)
+ shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01))
diff --git a/tgstation.dme b/tgstation.dme
index cf4d73304e..9cede06a91 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2263,7 +2263,7 @@
#include "code\modules\VR\vr_sleeper.dm"
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
-#include "code\citadel\cit_screenshake.dm"
+#include "modular_citadel\cit_screenshake.dm"
#include "interface\interface.dm"
#include "interface\menu.dm"
#include "interface\stylesheet.dm"
|