From 8bbad46ff8d2e22489698d501c2ebd613129b01b Mon Sep 17 00:00:00 2001
From: Mircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Date: Thu, 24 May 2012 15:23:13 +0300
Subject: [PATCH] Turn self.platmovetype into a string so it can accept either
 two values or one. Partly get path_corner to override train movement this
 way. Not ready yet.

---
 qcsrc/server/defs.qh    |  3 ++-
 qcsrc/server/g_subs.qc  | 18 ++++++++----------
 qcsrc/server/t_plats.qc | 31 ++++++++++++++++++-------------
 3 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh
index de814316c..71620c9dc 100644
--- a/qcsrc/server/defs.qh
+++ b/qcsrc/server/defs.qh
@@ -78,7 +78,8 @@ float maxclients;
 //.float	style;
 //.float	skill;
 .float	sounds;
-.float  platmovetype;
+.string  platmovetype;
+.float platmovetype_start, platmovetype_end;
 
 .string killtarget;
 
diff --git a/qcsrc/server/g_subs.qc b/qcsrc/server/g_subs.qc
index 4b8ca48b3..6ce77d5f5 100644
--- a/qcsrc/server/g_subs.qc
+++ b/qcsrc/server/g_subs.qc
@@ -188,21 +188,16 @@ void SUB_CalcMove_controller_think (void)
 
 		traveltime = self.animstate_endtime - self.animstate_starttime;
 		phasepos = (nexttick - self.animstate_starttime) / traveltime; // range: [0, 1]
-		if(!self.platmovetype)
-			self.platmovetype = 2; // default
+
+		//phasepos = cubic_speedfunc(self.platmovetype_start, self.platmovetype_end, phasepos);
+
+/*
 		switch(self.platmovetype)
 		{
 			case 1: // linear
 				break;
 				// phasepos = cubic_speedfunc(1, 1, phasepos); // identity
 			case 2: // cosine
-				/* old version, good for mathematical reference
-				phasepos = 3.14159265 + (phasepos * 3.14159265); // range: [pi, 2pi]
-				phasepos = cos(phasepos); // cos [pi, 2pi] is in [-1, 1]
-				phasepos = phasepos + 1; // correct range to [0, 2]
-				phasepos = phasepos / 2; // correct range to [0, 1]
-				*/
-
 				// phasepos = (1 - cos(phasepos * 3.14159265)) / 2;
 				phasepos = cubic_speedfunc(0, 0, phasepos);
 				break;
@@ -219,6 +214,7 @@ void SUB_CalcMove_controller_think (void)
 				phasepos = cubic_speedfunc(1.5, 0, phasepos);
 				break;
 		}
+*/
 		nextpos = self.origin + (delta * phasepos) + (delta2 * phasepos * phasepos);
 		// derivative: delta + 2 * delta2 * phasepos (e.g. for angle positioning)
 
@@ -323,6 +319,8 @@ void SUB_CalcMove_Bezier (vector tcontrol, vector tdest, float tspeedtype, float
 	controller.classname = "SUB_CalcMove_controller";
 	controller.owner = self;
 	controller.platmovetype = self.platmovetype;
+	controller.platmovetype_start = self.platmovetype_start;
+	controller.platmovetype_end = self.platmovetype_end;
 	SUB_CalcMove_controller_setbezier(controller, self.origin, tcontrol, tdest);
 	controller.finaldest = (tdest + '0 0 0.125'); // where do we want to end? Offset to overshoot a bit.
 	controller.animstate_starttime = time;
@@ -378,7 +376,7 @@ void SUB_CalcMove (vector tdest, float tspeedtype, float tspeed, void() func)
 	// of controlled animation, so let's just use linear movement.
 	// Alternatively entities can choose to specify non-controlled movement.
         // The only currently implemented alternative movement is linear (value 1)
-	if (traveltime < 0.15 || self.platmovetype < 2)
+	if (traveltime < 0.15 || self.platmovetype_start || self.platmovetype_end) // is this correct?
 	{
 		self.velocity = delta * (1/traveltime);	// QuakeC doesn't allow vector/float division
 		self.nextthink = self.ltime + traveltime;
diff --git a/qcsrc/server/t_plats.qc b/qcsrc/server/t_plats.qc
index 753ab02fa..bf8ee01ee 100644
--- a/qcsrc/server/t_plats.qc
+++ b/qcsrc/server/t_plats.qc
@@ -182,7 +182,20 @@ void plat_reset()
 	}
 }
 
-void spawnfunc_path_corner() { }
+void spawnfunc_path_corner()
+{
+	if(self.platmovetype && self.platmovetype != "")
+	{
+		// setup values for overriding train movement
+		// if a second value does not exist, both start and end speeds are the single value specified
+		float n;
+		n = tokenize_console(self.platmovetype);
+		self.platmovetype_start = stof(argv(0));
+		self.platmovetype_end = stof(argv(0));
+		if(n > 1)
+			self.platmovetype_end = stof(argv(1));
+	}
+}
 void spawnfunc_func_plat()
 {
 	if (self.sounds == 0)
@@ -252,7 +265,6 @@ void spawnfunc_func_plat()
 }
 
 .float train_wait_turning;
-.float platmovetype_default;
 void() train_next;
 void train_wait()
 {
@@ -313,17 +325,11 @@ void train_next()
 	if (!self.wait)
 		self.wait = 0.1;
 
-	switch(targ.platmovetype)
+	if(targ.platmovetype_start || targ.platmovetype_end)
 	{
-		case 0: // no override
-			self.platmovetype = self.platmovetype_default;
-			break;
-		case 1: // linear
-			self.platmovetype = 0;
-			break;
-		case 2: // cosine
-			self.platmovetype = 1;
-			break;
+		// override train movement type
+		self.platmovetype_start = targ.platmovetype_start;
+		self.platmovetype_end = targ.platmovetype_end;
 	}
 
 	if (targ.speed)
@@ -389,7 +395,6 @@ void spawnfunc_func_train()
 	if(self.dmg && (!self.dmgtime))
 		self.dmgtime = 0.25;
 	self.dmgtime2 = time;
-	self.platmovetype_default = self.platmovetype; // used for path_corner overrides
 
 	// TODO make a reset function for this one
 }
-- 
2.39.5