[MIRROR] Smooth Movement: Resurrection: Resurgence: Revengeance 4: The Return of Smooth Movement: Smooth Edition Director's Cut (#550)

* Smooth Movement: Resurrection: Resurgence: Revengeance 4: The Return of Smooth Movement: Smooth Edition Director's Cut (#52515)

Automatic glide size adjustment based on move delay.
Essentially a port of https://github.com/yogstation13/Yogstation/pull/8132 but that was mostly my code with some fixes.

Why again? well it turns out the recent byond fixes to glide size actually worked and solved the issues that were unsolvable.
https://file.house/0B3u.mp4
Glide size no longer incorrectly scales at fps, so it works as intended at any framerate with the only stuttering being normal byond suck stuttering.

* Smooth Movement: Resurrection: Resurgence: Revengeance 4: The Return of Smooth Movement: Smooth Edition Director's Cut

Co-authored-by: Rob Bailey <actioninja@gmail.com>
This commit is contained in:
SkyratBot
2020-08-29 20:27:18 +01:00
committed by GitHub
co-authored by Rob Bailey
parent f212762e84
commit 0a2d016002
23 changed files with 120 additions and 37 deletions
+21
View File
@@ -58,6 +58,8 @@
orbiters[orbiter] = TRUE
orbiter.orbiting = src
RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, .proc/orbiter_move_react)
RegisterSignal(parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, .proc/orbiter_glide_size_update)
SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter)
var/matrix/initial_transform = matrix(orbiter.transform)
@@ -78,6 +80,13 @@
orbiter.SpinAnimation(rotation_speed, -1, clockwise, rotation_segments, parallel = FALSE)
if(ismob(orbiter))
var/mob/orbiter_mob = orbiter
orbiter_mob.updating_glide_size = FALSE
if(ismovable(parent))
var/atom/movable/movable_parent = parent
orbiter.glide_size = movable_parent.glide_size
orbiter.forceMove(get_turf(parent))
to_chat(orbiter, "<span class='notice'>Now orbiting [parent].</span>")
@@ -85,6 +94,7 @@
if(!orbiters[orbiter])
return
UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED)
UnregisterSignal(parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE)
SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_STOP, orbiter)
orbiter.SpinAnimation(0, 0)
if(istype(orbiters[orbiter],/matrix)) //This is ugly.
@@ -92,6 +102,12 @@
orbiters -= orbiter
orbiter.stop_orbit(src)
orbiter.orbiting = null
if(ismob(orbiter))
var/mob/orbiter_mob = orbiter
orbiter_mob.updating_glide_size = TRUE
orbiter_mob.glide_size = 8
if(!refreshing && !length(orbiters) && !QDELING(src))
qdel(src)
@@ -124,6 +140,11 @@
return
end_orbit(orbiter)
/datum/component/orbiter/proc/orbiter_glide_size_update(datum/source, target)
for(var/orbiter in orbiters)
var/atom/movable/movable_orbiter = orbiter
movable_orbiter.glide_size = target
/////////////////////
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE)
+8 -2
View File
@@ -39,6 +39,7 @@
var/atom/movable/AM = parent
restore_position(M)
unequip_buckle_inhands(M)
M.updating_glide_size = TRUE
if(del_on_unbuckle_all && !AM.has_buckled_mobs())
qdel(src)
@@ -46,6 +47,8 @@
SIGNAL_HANDLER
var/atom/movable/movable_parent = parent
M.set_glide_size(movable_parent.glide_size)
M.updating_glide_size = FALSE
handle_vehicle_offsets(movable_parent.dir)
/datum/component/riding/proc/handle_vehicle_layer(dir)
@@ -67,8 +70,11 @@
var/atom/movable/movable_parent = parent
if (isnull(dir))
dir = movable_parent.dir
for (var/buckled_mob in movable_parent.buckled_mobs)
ride_check(buckled_mob)
movable_parent.set_glide_size(DELAY_TO_GLIDE_SIZE(vehicle_move_delay))
for (var/m in movable_parent.buckled_mobs)
ride_check(m)
var/mob/buckled_mob = m
buckled_mob.set_glide_size(movable_parent.glide_size)
handle_vehicle_offsets(dir)
handle_vehicle_layer(dir)