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;
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)
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;
// 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;
}
}
-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)
}
.float train_wait_turning;
-.float platmovetype_default;
void() train_next;
void train_wait()
{
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)
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
}