diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 2dc73e09440..f9d06892425 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -594,6 +594,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/old_icon1 = T.icon
var/old_overlays = T.overlays.Copy()
var/old_underlays = T.underlays.Copy()
+ var/old_decals = T.decals?.Copy()
if(platingRequired)
if(istype(B, get_base_turf_by_area(B)))
@@ -604,8 +605,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
+ X.decals = old_decals
X.overlays = old_overlays
X.underlays = old_underlays
+ X.update_icon() // necessary to update decals properly
var/list/objs = new/list()
var/list/newobjs = new/list()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index b7d4763ef1d..c4c175de982 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -17,6 +17,7 @@
pry_mod = 0.5
base_type = /obj/machinery/door/window
frame_type = /obj/structure/windoor_assembly
+ set_dir_on_update = FALSE // these can properly face all 4 directions! don't force us into just 2!
var/base_state = "left"
/obj/machinery/door/window/get_auto_access()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index adc95f1f1b7..a66c7356191 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -654,12 +654,6 @@
if(usr == loc)
toggle_safety(usr)
-/obj/item/gun/CtrlClick(var/mob/user)
- if(loc == user)
- toggle_safety(user)
- return TRUE
- . = ..()
-
/obj/item/gun/proc/safety()
return has_safety && safety_state
@@ -718,4 +712,16 @@
return FALSE
if(get_active_hand() != autofiring || incapacitated())
return FALSE
- return TRUE
\ No newline at end of file
+ return TRUE
+
+/obj/item/gun/get_alt_interactions(mob/user)
+ . = ..()
+ LAZYADD(., /decl/interaction_handler/toggle_safety)
+
+/decl/interaction_handler/toggle_safety
+ name = "Toggle Gun Safety"
+ expected_target_type = /obj/item/gun
+
+/decl/interaction_handler/toggle_safety/invoked(atom/target, mob/user, obj/item/prop)
+ var/obj/item/gun/gun = target
+ gun.toggle_safety(user)
diff --git a/code/modules/projectiles/guns/projectile/bolt_action.dm b/code/modules/projectiles/guns/projectile/bolt_action.dm
index 52d46d77d45..0647f000429 100644
--- a/code/modules/projectiles/guns/projectile/bolt_action.dm
+++ b/code/modules/projectiles/guns/projectile/bolt_action.dm
@@ -11,7 +11,7 @@
handle_casings = HOLD_CASINGS
load_method = SINGLE_CASING
max_shells = 1
- ammo_type = /obj/item/ammo_casing/shell
+ ammo_type = /obj/item/ammo_casing/rifle
one_hand_penalty = 2
load_sound = 'sound/weapons/guns/interaction/rifle_load.ogg'
fire_delay = 8
@@ -49,6 +49,7 @@
unload_shell()
else
to_chat(user, "You work the bolt open.")
+ playsound(src.loc, 'sound/weapons/guns/interaction/rifle_boltback.ogg', 50, 1)
else
to_chat(user, "You work the bolt closed.")
playsound(src.loc, 'sound/weapons/guns/interaction/rifle_boltforward.ogg', 50, 1)
@@ -85,4 +86,5 @@
bulk = 8
scoped_accuracy = 8 //increased accuracy over the LWAP because only one shot
scope_zoom = 2
- fire_delay = 12
\ No newline at end of file
+ fire_delay = 12
+ ammo_type = /obj/item/ammo_casing/shell
diff --git a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm
index e180625b9ea..6e3f14c984c 100644
--- a/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm
+++ b/code/modules/reagents/reagent_containers/drinkingglass/shaker.dm
@@ -25,6 +25,18 @@
/obj/item/chems/drinks/glass2/fitnessflask/proteinshake
name = "protein shake"
+// This exists to let the name auto-set properly.
+/decl/cocktail/proteinshake
+ name = "protein shake"
+ description = "A revolting slurry of protein and water, fortified with iron."
+ hidden_from_codex = TRUE
+ ratios = list(
+ /decl/material/liquid/nutriment = 2,
+ /decl/material/liquid/nutriment/protein = 1,
+ /decl/material/liquid/water = 3,
+ /decl/material/solid/metal/iron
+ )
+
/obj/item/chems/drinks/glass2/fitnessflask/proteinshake/populate_reagents()
reagents.add_reagent(/decl/material/liquid/nutriment, 30)
reagents.add_reagent(/decl/material/solid/metal/iron, 10)
diff --git a/icons/obj/guns/bolt_action.dmi b/icons/obj/guns/bolt_action.dmi
index 75979dec624..54b224bd7ca 100644
Binary files a/icons/obj/guns/bolt_action.dmi and b/icons/obj/guns/bolt_action.dmi differ