diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e0e05e761a5..edee542f09c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -206,9 +206,6 @@ var/global/list/ghdel_profiling = list()
if(T)
T.densityChanged()
-/atom/proc/bumped_by_firebird(var/obj/structure/bed/chair/vehicle/firebird/F)
- return Bumped(F)
-
// Convenience proc to see if a container is open for chemistry handling
// returns true if open
// false if closed
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index bf6e600e4a7..984750c83f7 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1193,3 +1193,13 @@
target = get_turf(target_loc)
current_tick = 1
+
+
+/atom/movable/proc/speen(times = 4)
+ set waitfor = FALSE
+ var/prev_dir = dir
+ for(var/i in 1 to times)
+ for(var/new_dir in cardinal)
+ change_dir(new_dir)
+ sleep(1)
+ change_dir(prev_dir)
diff --git a/code/game/objects/items/stacks/tiles/mineral.dm b/code/game/objects/items/stacks/tiles/mineral.dm
index 5fed09494f3..3a294a009e7 100644
--- a/code/game/objects/items/stacks/tiles/mineral.dm
+++ b/code/game/objects/items/stacks/tiles/mineral.dm
@@ -141,7 +141,7 @@
/obj/item/stack/tile/mineral/phazon/adjust_slowdown(mob/living/L, current_slowdown)
current_slowdown *= 0.75
- ..()
+ return ..()
/obj/item/stack/tile/mineral/brass
name = "brass tile"
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index dacfde9d575..7fbb0271d96 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -13,6 +13,16 @@
if(slip_n_slide(M))
M.simple_message("You slipped on the [name]!",
"Something is scratching at your feet! Oh god!")
+ if(istype(AM, /obj/structure/bed/chair/vehicle/gokart))
+ var/obj/structure/bed/chair/vehicle/gokart/kart = AM
+ var/left_or_right = prob(50) ? turn(kart.dir, 90) : turn(kart.dir, -90)
+ var/tiles_to_slip = rand(round(potency/20, 1), round(potency/10, 1))
+ kart.speen()
+ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
+ spawn()
+ for(var/i in 1 to tiles_to_slip)
+ step(kart, left_or_right)
+ sleep(1)
/datum/locking_category/banana_peel
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 2587915918b..986cc0dd232 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -320,8 +320,10 @@
return 1
return 0
-/obj/structure/table/bumped_by_firebird(obj/structure/bed/chair/vehicle/firebird/F)
- destroy()
+/obj/structure/table/Bumped(atom/movable/AM)
+ ..()
+ if(istype(AM, /obj/structure/bed/chair/vehicle/firebird))
+ destroy()
//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops.
/obj/structure/table/proc/check_cover(obj/item/projectile/P, turf/from)
@@ -778,8 +780,10 @@ obj/structure/table/plastic
return 1
return !density
-/obj/structure/rack/bumped_by_firebird(obj/structure/bed/chair/vehicle/firebird/F)
- destroy()
+/obj/structure/rack/Bumped(atom/movable/AM)
+ ..()
+ if(istype(AM, /obj/structure/bed/chair/vehicle/firebird))
+ destroy()
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.is_wrench(user) && can_disassemble())
diff --git a/code/game/objects/structures/vehicles/firebird.dm b/code/game/objects/structures/vehicles/firebird.dm
index 9c39e775db9..4fbe046abeb 100644
--- a/code/game/objects/structures/vehicles/firebird.dm
+++ b/code/game/objects/structures/vehicles/firebird.dm
@@ -29,7 +29,7 @@
plane = ABOVE_HUMAN_PLANE
pass_flags = PASSMOB|PASSDOOR
wreckage_type = /obj/effect/decal/mecha_wreckage/vehicle/firebird
-
+ explodes_fueltanks = TRUE
var/datum/effect/effect/system/trail/firebird/ion_trail
/obj/structure/bed/chair/vehicle/firebird/New()
@@ -61,12 +61,6 @@
/obj/structure/bed/chair/vehicle/firebird/handle_layer()
return
-/obj/structure/bed/chair/vehicle/firebird/to_bump(var/atom/obstacle)
- if(throwing)
- return ..()
- else
- return obstacle.bumped_by_firebird(src) //Yep
-
/obj/structure/bed/chair/vehicle/firebird/santa
name = "magic snowmobile"
desc = "After a complaint from space PETA, santa's been forced to take a less elegant ride."
diff --git a/code/game/objects/structures/vehicles/gokart.dm b/code/game/objects/structures/vehicles/gokart.dm
index 05b81c2ff02..f22ad63c441 100644
--- a/code/game/objects/structures/vehicles/gokart.dm
+++ b/code/game/objects/structures/vehicles/gokart.dm
@@ -12,6 +12,13 @@
noghostspin = 0
can_have_carts = FALSE
wreckage_type = /obj/effect/decal/mecha_wreckage/vehicle/gokart
+ explodes_fueltanks = TRUE
+
+/obj/structure/bed/chair/vehicle/gokart/getMovementDelay()
+ . = ..()
+ var/turf/here = get_turf(src)
+ if(here)
+ return here.adjust_slowdown(src, .)
/obj/structure/bed/chair/vehicle/gokart/unlock_atom(var/atom/movable/AM)
. = ..()
diff --git a/code/game/objects/structures/vehicles/vehicle.dm b/code/game/objects/structures/vehicles/vehicle.dm
index ce4b6ca3d2e..cf0fbc1f554 100644
--- a/code/game/objects/structures/vehicles/vehicle.dm
+++ b/code/game/objects/structures/vehicles/vehicle.dm
@@ -60,6 +60,7 @@
var/list/datum/action/vehicle_actions = list()
var/headlights = FALSE
+ var/explodes_fueltanks = FALSE
/obj/structure/bed/chair/vehicle/proc/getMovementDelay()
return movement_delay
@@ -421,8 +422,8 @@
if(!.)
return
- AM.pixel_x -= offsets["[dir]"]["x"]
- AM.pixel_y -= offsets["[dir]"]["y"]
+ AM.pixel_x = initial(AM.pixel_x)
+ AM.pixel_y = initial(AM.pixel_y)
last_dir = null
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 1908d336825..93dddb4efeb 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -42,11 +42,7 @@
/datum/emote/spin/run_emote(mob/user)
. = ..()
if(.)
- var/prev_dir = user.dir
- for(var/i in list(1, 4, 2, 8, 1, 4, 2, 8, 1, 4, 2, 8, 1, 4, 2, 8))
- user.dir = i
- sleep(1)
- user.dir = prev_dir
+ user.speen()
/datum/emote/me
key = "me"
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 8a5831c99ce..4fe1fe07c40 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -194,9 +194,13 @@
if(exposed_temperature >= AUTOIGNITION_WELDERFUEL)
explode()
-/obj/structure/reagent_dispensers/fueltank/bumped_by_firebird(var/obj/structure/bed/chair/vehicle/firebird/F)
- visible_message("\the [F] crashes into \the [src]!")
- explode()
+/obj/structure/reagent_dispensers/fueltank/Bumped(atom/movable/AM)
+ ..()
+ if(istype(AM, /obj/structure/bed/chair/vehicle))
+ var/obj/structure/bed/chair/vehicle/car = AM
+ if(car.explodes_fueltanks)
+ visible_message("\The [car] crashes into \the [src]!")
+ explode()
/obj/structure/reagent_dispensers/fueltank/proc/explode()
if (reagents.total_volume > 500)