Beispiel #1
0
/**
**  Init the move.
**
**  @param missile  missile to initialise for movement.
**
**  @return         1 if goal is reached, 0 else.
*/
static int MissileInitMove(Missile *missile)
{
	int dx;
	int dy;

	dx = missile->DX - missile->X;
	dy = missile->DY - missile->Y;
	MissileNewHeadingFromXY(missile, dx, dy);
	if (!(missile->State & 1)) {
		missile->CurrentStep = 0;
		missile->TotalStep = 0;
		if (dx == 0 && dy == 0) {
			return 1;
		}
		// initialize
		missile->TotalStep = MapDistance(missile->SourceX, missile->SourceY, missile->DX, missile->DY);
		missile->State++;
		return 0;
	}
	Assert(missile->TotalStep != 0);
	missile->CurrentStep += missile->Type->Speed;
	if (missile->CurrentStep >= missile->TotalStep) {
		missile->X = missile->DX;
		missile->Y = missile->DY;
		return 1;
	}
	return 0;
}
Beispiel #2
0
/**
**  Calculate parabolic trajectories.
**
**  @param missile  Missile pointer.
**
**  @return         1 if target is reached, 0 otherwise
**
**  @todo Find good values for ZprojToX and Y
*/
static int ParabolicMissile(Missile *missile)
{
	int orig_x;   // position before moving.
	int orig_y;   // position before moving.
	int xstep;
	int ystep;
	int k;        // Coefficient of the parabol.
	int zprojToX; // Projection of Z axis on axis X.
	int zprojToY; // Projection of Z axis on axis Y.
	int z;        // should be missile->Z later.
	int x;
	int y;

	k = -2048; //-1024; // Should be initialised by an other method (computed with distance...)
	zprojToX = 4;
	zprojToY = 1024;
	if (MissileInitMove(missile) == 1) {
		return 1;
	}
	Assert(missile->Type != NULL);
	orig_x = missile->X;
	orig_y = missile->Y;
	xstep = missile->DX - missile->SourceX;
	ystep = missile->DY - missile->SourceY;
	Assert(missile->TotalStep != 0);
	xstep = xstep * 1000 / missile->TotalStep;
	ystep = ystep * 1000 / missile->TotalStep;
	missile->X = missile->SourceX + xstep * missile->CurrentStep / 1000;
	missile->Y = missile->SourceY + ystep * missile->CurrentStep / 1000;
	Assert(k != 0);
	z = missile->CurrentStep * (missile->TotalStep - missile->CurrentStep) / k;
	// Until Z is used for drawing, modify X and Y.
	missile->X += z * zprojToX / 64;
	missile->Y += z * zprojToY / 64;
	MissileNewHeadingFromXY(missile, missile->X - orig_x, missile->Y - orig_y);
	if (missile->Type->SmokeMissile && missile->CurrentStep) {
		x = missile->X + missile->Type->Width / 2;
		y = missile->Y + missile->Type->Height / 2;
		MakeMissile(missile->Type->SmokeMissile, x, y, x, y);
	}
	return 0;
}
Beispiel #3
0
/**
**	Handle point to point missile.
*/
local int PointToPointMissile(int missile)
{
    int dx;
    int dy;
    int xstep;
    int ystep;
    int i;

    if( !(Missiles[missile].State&1) ) {
        // initialize
        dy=Missiles[missile].DY-Missiles[missile].Y;
        ystep=1;
        if( dy<0 ) {
            dy=-dy;
            ystep=-1;
        }
        dx=Missiles[missile].DX-Missiles[missile].X;
        xstep=1;
        if( dx<0 ) {
            dx=-dx;
            xstep=-1;
        }

        // FIXME: could be better written
        MissileNewHeadingFromXY(missile,dx*xstep,dy*ystep);

        if( dy==0 ) {		// horizontal line
            if( dx==0 ) {
                return 1;
            }
        } else if( dx==0 ) {	// vertical line
        } else if( dx<dy ) {	// step in vertical direction
            Missiles[missile].D=dy-1;
            dx+=dx;
            dy+=dy;
        } else if( dx>dy ) {	// step in horizontal direction
            Missiles[missile].D=dx-1;
            dx+=dx;
            dy+=dy;
        }

        Missiles[missile].Dx=dx;
        Missiles[missile].Dy=dy;
        Missiles[missile].Xstep=xstep;
        Missiles[missile].Ystep=ystep;
        ++Missiles[missile].State;
        DebugLevel3("Init: %d,%d, %d,%d, =%d\n"
                    ,dx,dy,xstep,ystep,Missiles[missile].D);
        return 0;
    } else {
        dx=Missiles[missile].Dx;
        dy=Missiles[missile].Dy;
        xstep=Missiles[missile].Xstep;
        ystep=Missiles[missile].Ystep;
    }


    //
    //	Move missile
    //
    if( dy==0 ) {		// horizontal line
        for( i=0; i<MISSILE_STEPS; ++i ) {
            if( Missiles[missile].X==Missiles[missile].DX ) {
                return 1;
            }
            Missiles[missile].X+=xstep;
        }
        return 0;
    }

    if( dx==0 ) {		// vertical line
        for( i=0; i<MISSILE_STEPS; ++i ) {
            if( Missiles[missile].Y==Missiles[missile].DY ) {
                return 1;
            }
            Missiles[missile].Y+=ystep;
        }
        return 0;
    }

    if( dx<dy ) {		// step in vertical direction
        for( i=0; i<MISSILE_STEPS; ++i ) {
            if( Missiles[missile].Y==Missiles[missile].DY ) {
                return 1;
            }
            Missiles[missile].Y+=ystep;
            Missiles[missile].D-=dx;
            if( Missiles[missile].D<0 ) {
                Missiles[missile].D+=dy;
                Missiles[missile].X+=xstep;
            }
        }
        return 0;
    }

    if( dx>dy ) {		// step in horizontal direction
        for( i=0; i<MISSILE_STEPS; ++i ) {
            if( Missiles[missile].X==Missiles[missile].DX ) {
                return 1;
            }
            Missiles[missile].X+=xstep;
            Missiles[missile].D-=dy;
            if( Missiles[missile].D<0 ) {
                Missiles[missile].D+=dx;
                Missiles[missile].Y+=ystep;
            }
        }
        return 0;
    }
    // diagonal line
    for( i=0; i<MISSILE_STEPS; ++i ) {
        if( Missiles[missile].Y==Missiles[missile].DY ) {
            return 1;
        }
        Missiles[missile].X+=xstep;
        Missiles[missile].Y+=ystep;
    }
    return 0;
}