From 97ea12df328582ed2e69ee23a76590c547716a53 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Wed, 16 Dec 2020 04:25:11 +0400
Subject: [PATCH] Consequences of disallowing 0 duration motion -_-

---
 circular_maze.cpp | 40 ++++++++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/circular_maze.cpp b/circular_maze.cpp
index b2eeb2a..e7f0072 100644
--- a/circular_maze.cpp
+++ b/circular_maze.cpp
@@ -392,7 +392,8 @@ using radial_motion_t = movement<float, motion::quadratic_curve>;
 using circular_motion_t = movement<float, motion::quadratic_curve>;
 
 melody<circular_motion_t, radial_motion_t>
-radial_motion;
+complex_radial_motion;
+radial_motion_t simple_radial_motion;
 
 struct radial_movement
 {
@@ -484,21 +485,28 @@ void start(Program& program)
 		if(diagram)
 			maze.diagram(frame);
 
-		if(!radial_motion.done())
+		if(!complex_radial_motion.done())
 		{
 			float unwrapped_angle = maze.current_angle;
-			auto result = radial_motion.move(std::forward_as_tuple(
+			auto result = complex_radial_motion.move(std::forward_as_tuple(
 				unwrapped_angle,
 				maze.player_level)
 			, delta);
 			maze.current_angle = wrap(unwrapped_angle, 1.f);
 
-			if(!result.success)
+			if(result.done)
 			{
 				radial_movements.pop();
 				circular_velocity = 0;
 			}
 		}
+		else if(!simple_radial_motion.done())
+		{
+			auto result = simple_radial_motion.move(maze.player_level, delta);
+
+			if(result.done)
+				radial_movements.pop();
+		}
 		else
 		{
 			if(!empty(radial_movements))
@@ -507,14 +515,22 @@ void start(Program& program)
 
 				auto circular_distance = mod_difference(maze.current_angle, wrap(3/4.f - movement.path, 1.f), 1.f);
 				auto radial_distance = movement.level - maze.player_level;
-				radial_motion = melody(
-					circular_motion_t{ abs(circular_distance) * 10s,
-						maze.current_angle,
-						maze.current_angle + circular_distance },
-					radial_motion_t{ abs(radial_distance) * 100ms,
-						maze.player_level,
-						movement.level }
-				);
+				auto radial_motion = radial_motion_t
+				{
+					abs(radial_distance) * 100ms,
+					maze.player_level, movement.level
+				};
+				if(abs(circular_distance) > 0)
+				{
+					complex_radial_motion = melody(
+						circular_motion_t{ abs(circular_distance) * 10s,
+							maze.current_angle,
+							maze.current_angle + circular_distance },
+						radial_motion
+					);
+				}
+				else
+					simple_radial_motion = radial_motion;
 			}
 
 			if(pressed(scancode::h) || pressed(scancode::left))
-- 
GitLab