From 49a0ea7bd2c0bcdf47366fb3764efc2894532075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Brammer?= Date: Sun, 15 Jul 2012 21:47:50 +0200 Subject: [PATCH] Support Decel for SCALE, HANGLE and FLIGHT, fall back to Accel All procedures now use the Accel value if the Decel value is nil, and also use the default Attach value if that is nil. --- src/object/C4Object.cpp | 60 +++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/src/object/C4Object.cpp b/src/object/C4Object.cpp index 2a3030a5f..2bf5f112a 100644 --- a/src/object/C4Object.cpp +++ b/src/object/C4Object.cpp @@ -3458,7 +3458,8 @@ void C4Object::ExecAction() { SetActionByName(pActionDef->GetPropertyStr(P_InLiquidAction)); return; } C4Value Attach; - if (pActionDef->GetProperty(P_Attach, &Attach)) + pActionDef->GetProperty(P_Attach, &Attach); + if (Attach.GetType() != C4V_Nil) { Action.t_attach = Attach.getInt(); } @@ -3494,12 +3495,15 @@ void C4Object::ExecAction() // Update xdir,ydir,Action.Dir,attachment,iPhaseAdvance int32_t dir = Action.Dir; C4Real accel = C4REAL100(pActionDef->GetPropertyInt(P_Accel)); - C4Real decel = C4REAL100(pActionDef->GetPropertyInt(P_Decel)); + C4Real decel = accel; + { + C4Value decel_val; + pActionDef->GetProperty(P_Decel, &decel_val); + if (decel_val.GetType() != C4V_Nil) + decel = C4REAL100(decel_val.getInt()); + } C4Real limit = C4REAL100(pActionDef->GetPropertyInt(P_Speed)); - C4Real lFlightAccel; - C4Real rFlightAccel; - switch (pActionDef->GetPropertyP(P_Procedure)) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3570,13 +3574,17 @@ void C4Object::ExecAction() switch (ComDir) { case COMD_Up: case COMD_UpRight: case COMD_UpLeft: - ydir-=accel; if (ydir<-limit) ydir=-limit; break; + if (ydir > 0) ydir -= decel; + else ydir -= accel; + if (ydir < -limit) ydir = -limit; break; case COMD_Down: case COMD_DownRight: case COMD_DownLeft: - ydir+=accel; if (ydir>+limit) ydir=+limit; break; + if (ydir < 0) ydir += decel; + else ydir += accel; + if (ydir > +limit) ydir = +limit; break; case COMD_Left: case COMD_Right: case COMD_Stop: - if (ydir<0) ydir+=accel; - if (ydir>0) ydir-=accel; - if ((ydir>-accel) && (ydir<+accel)) ydir=0; + if (ydir < 0) ydir += decel; + if (ydir > 0) ydir -= decel; + if ((ydir > -decel) && (ydir < +decel)) ydir = 0; break; } iPhaseAdvance=0; @@ -3591,20 +3599,29 @@ void C4Object::ExecAction() switch (Action.ComDir) { case COMD_Left: case COMD_UpLeft: case COMD_DownLeft: - xdir-=accel; if (xdir<-limit) xdir=-limit; + if (xdir > 0) xdir -= decel; + else xdir -= accel; + if (xdir < -limit) xdir = -limit; break; case COMD_Right: case COMD_UpRight: case COMD_DownRight: - xdir+=accel; if (xdir>+limit) xdir=+limit; + if (xdir < 0) xdir += decel; + else xdir += accel; + if (xdir > +limit) xdir = +limit; break; case COMD_Up: - xdir += (Action.Dir == DIR_Left) ? -accel : accel; - if (xdir<-limit) xdir=-limit; - if (xdir>+limit) xdir=+limit; + if (Action.Dir == DIR_Left) + if (xdir > 0) xdir -= decel; + else xdir -= accel; + else + if (xdir < 0) xdir += decel; + else xdir += accel; + if (xdir < -limit) xdir = -limit; + if (xdir > +limit) xdir = +limit; break; case COMD_Stop: case COMD_Down: - if (xdir<0) xdir+=accel; - if (xdir>0) xdir-=accel; - if ((xdir>-accel) && (xdir<+accel)) xdir=0; + if (xdir < 0) xdir += decel; + if (xdir > 0) xdir -= decel; + if ((xdir > -decel) && (xdir < +decel)) xdir = 0; break; } iPhaseAdvance=0; @@ -3623,16 +3640,13 @@ void C4Object::ExecAction() SetCommand(C4CMD_Exit); } - lFlightAccel = Max(Min(limit+xdir,accel),itofix(0)); - rFlightAccel = Max(Min(limit-xdir,accel),itofix(0)); - switch (Action.ComDir) { case COMD_Left: case COMD_UpLeft: case COMD_DownLeft: - xdir-=lFlightAccel; + xdir -= Max(Min(limit + xdir, xdir > 0 ? decel : accel), itofix(0)); break; case COMD_Right: case COMD_UpRight: case COMD_DownRight: - xdir+=rFlightAccel; + xdir += Max(Min(limit - xdir, xdir < 0 ? decel : accel), itofix(0)); break; }