From 8bbad46ff8d2e22489698d501c2ebd613129b01b Mon Sep 17 00:00:00 2001 From: Mircea Kitsune 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.2