diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index 928f364a81..a0db416fa6 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -65,6 +65,7 @@
#define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange
#define FREQ_SECURITY 1359 // Security comms frequency, red
+#define FREQ_HOLOGRID_SOLUTION 1433
#define FREQ_STATUS_DISPLAYS 1435
#define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers
#define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers
diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm
new file mode 100644
index 0000000000..0e322c7c9d
--- /dev/null
+++ b/code/datums/elements/snail_crawl.dm
@@ -0,0 +1,31 @@
+/datum/element/snailcrawl
+ element_flags = ELEMENT_DETACH
+
+/datum/element/snailcrawl/Attach(datum/target)
+ . = ..()
+ if(!ismovable(target))
+ return ELEMENT_INCOMPATIBLE
+ var/P
+ if(iscarbon(target))
+ P = .proc/snail_crawl
+ else
+ P = .proc/lubricate
+ RegisterSignal(target, COMSIG_MOVABLE_MOVED, P)
+
+/datum/element/snailcrawl/Detach(mob/living/carbon/target)
+ . = ..()
+ UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
+ if(istype(target))
+ target.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+
+/datum/element/snailcrawl/proc/snail_crawl(mob/living/carbon/snail)
+ if(snail.resting && !snail.buckled && lubricate(snail))
+ snail.add_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+ else
+ snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+
+/datum/element/snailcrawl/proc/lubricate(atom/movable/snail)
+ var/turf/open/OT = get_turf(snail)
+ if(istype(OT))
+ OT.MakeSlippery(TURF_WET_LUBE, 20)
+ return TRUE
diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm
index 8520571d22..2b5c8d873b 100644
--- a/code/game/objects/items/devices/pressureplates.dm
+++ b/code/game/objects/items/devices/pressureplates.dm
@@ -8,6 +8,7 @@
level = 1
var/trigger_mob = TRUE
var/trigger_item = FALSE
+ var/specific_item = null
var/trigger_silent = FALSE
var/sound/trigger_sound = 'sound/effects/pressureplate.ogg'
var/obj/item/assembly/signaler/sigdev = null
@@ -35,6 +36,8 @@
. = ..()
if(!can_trigger || !active)
return
+ if(trigger_item && !istype(AM, specific_item))
+ return
if(trigger_mob && isliving(AM))
var/mob/living/L = AM
to_chat(L, "You feel something click beneath you!")
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 96256ccaa5..648ba27897 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -115,7 +115,6 @@
roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however.
active = TRUE
trigger_delay = 10
- protected = TRUE
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
var/reward = /obj/item/reagent_containers/food/snacks/cookie
var/claimed = FALSE
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index 67ab6b0c88..75701991fc 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -398,9 +398,6 @@
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
return
var/randumb = pickweight(terrain_spawn_list)
- for(var/obj/structure/geyser/F in range(7, T))
- if(istype(F, randumb))
- return
new randumb(T)
/turf/open/floor/plating/asteroid/snow
diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm
index edd011098b..b9347750cf 100644
--- a/code/modules/ruins/icemoonruin_code/hotsprings.dm
+++ b/code/modules/ruins/icemoonruin_code/hotsprings.dm
@@ -27,22 +27,7 @@ GLOBAL_LIST_EMPTY(cursed_minds)
return
GLOB.cursed_minds[L.mind] = TRUE
RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, .proc/remove_from_cursed)
- var/random_choice = pick("Mob", "Appearance")
- switch(random_choice)
- if("Mob")
- L = wabbajack(L, "animal")
- if("Appearance")
- var/mob/living/carbon/human/H = wabbajack(L, "humanoid")
- randomize_human(H)
- var/list/all_species = list()
- for(var/stype in subtypesof(/datum/species))
- var/datum/species/S = stype
- if(initial(S.changesource_flags) & RACE_SWAP)
- all_species += stype
- var/random_race = pick(all_species)
- H.set_species(random_race)
- H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
- L = H
+ L = wabbajack(L, "animal") // Appearance randomization removed so citadel players don't get randomized into some ungodly ugly creature and complain
var/turf/T = find_safe_turf()
L.forceMove(T)
to_chat(L, "You blink and find yourself in [get_area_name(T)].")
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index e8971154f0..69eb4a6be4 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -13,6 +13,7 @@
var/view_range = 7
var/x_offset = 0
var/y_offset = 0
+ var/list/whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava)
var/space_turfs_only = TRUE
var/see_hidden = FALSE
var/designate_time = 0
@@ -22,6 +23,7 @@
/obj/machinery/computer/camera_advanced/shuttle_docker/Initialize()
. = ..()
GLOB.navigation_computers += src
+ whitelist_turfs = typecacheof(whitelist_turfs)
/obj/machinery/computer/camera_advanced/shuttle_docker/Destroy()
. = ..()
@@ -226,6 +228,11 @@
if(!ispath(turf_type, /turf/open/space))
return SHUTTLE_DOCKER_BLOCKED
+ if(length(whitelist_turfs))
+ var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type
+ if(!is_type_in_typecache(turf_type, whitelist_turfs))
+ return SHUTTLE_DOCKER_BLOCKED
+
// Checking for overlapping dock boundaries
for(var/i in 1 to overlappers.len)
var/obj/docking_port/port = overlappers[i]
diff --git a/sound/effects/gravhit.ogg b/sound/effects/gravhit.ogg
new file mode 100644
index 0000000000..524ddf733f
Binary files /dev/null and b/sound/effects/gravhit.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index b7849d8bda..1a596ae31c 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -522,6 +522,7 @@
#include "code\datums\elements\ghost_role_eligibility.dm"
#include "code\datums\elements\mob_holder.dm"
#include "code\datums\elements\polychromic.dm"
+#include "code\datums\elements\snail_crawl.dm"
#include "code\datums\elements\spellcasting.dm"
#include "code\datums\elements\squish.dm"
#include "code\datums\elements\swimming.dm"