605 lines
14 KiB
C
605 lines
14 KiB
C
#include "c_extern.h"
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*
|
|
█▀▀▀▀ █▀▀▀▀ █▀▀▀█ █▀▀▀▀ ▀▀█▀▀ █▀▀▀█ █▀▀▀█ █▀▀▀▀ █ ▄▀
|
|
██ ▀█ ██▀▀ ██▀█▀ ██▀▀ ██ ██▀█▀ ██▀▀█ ██ ██▀▄
|
|
▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀
|
|
*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
WORD BigSampleRepeat = 1 ;
|
|
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void DoTrack( WORD numobj )
|
|
{
|
|
T_OBJET *ptrobj ;
|
|
WORD flag ;
|
|
UBYTE macro ;
|
|
UBYTE string[256] ;
|
|
WORD angle ;
|
|
LONG dist, y ;
|
|
UBYTE *ptrtrack;
|
|
UBYTE memooffsettrack;
|
|
WORD overflow = 0 ;
|
|
UBYTE *ptr ;
|
|
UBYTE n, c ;
|
|
|
|
ptrobj = &ListObjet[numobj] ;
|
|
|
|
flag = TRUE ;
|
|
while( flag )
|
|
{
|
|
memooffsettrack = ptrobj->OffsetTrack ;
|
|
|
|
ptrtrack = ptrobj->PtrTrack ;
|
|
ptrtrack += ptrobj->OffsetTrack ; /* offset macro en cours */
|
|
|
|
macro = *ptrtrack++ ;
|
|
ptrobj->OffsetTrack++ ;
|
|
|
|
switch( macro )
|
|
{
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_SAMPLE:
|
|
HQ_3D_MixSample( *(WORD*)ptrtrack, 0x1000, 1,
|
|
ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
case TM_SAMPLE_RND:
|
|
HQ_3D_MixSample( *(WORD*)ptrtrack, 0x800+Rnd(0x800), 1,
|
|
ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
case TM_SAMPLE_ALWAYS:
|
|
HQ_3D_MixSample( *(WORD*)ptrtrack, 0x1000, 0,
|
|
ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
case TM_SAMPLE_STOP:
|
|
HQ_StopOneSample( *(WORD*)ptrtrack ) ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
case TM_REPEAT_SAMPLE:
|
|
BigSampleRepeat = *(WORD*)ptrtrack ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
case TM_SIMPLE_SAMPLE:
|
|
HQ_MixSample( *(WORD*)ptrtrack, 0x1000, BigSampleRepeat, 128, 128 ) ;
|
|
BigSampleRepeat = 1 ;
|
|
ptrobj->OffsetTrack += 2 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_PLAY_FLA:
|
|
ptr = string ;
|
|
n = 0 ;
|
|
do { c = *ptrtrack++ ;
|
|
*ptr++ = c ;
|
|
n++ ;
|
|
} while( c != 0 ) ;
|
|
|
|
ptrobj->OffsetTrack += n ;
|
|
|
|
SaveTimer() ;
|
|
FadeToBlack( PtrPal ) ;
|
|
PlayAnimFla( string ) ;
|
|
FlagFade = TRUE ;
|
|
RestoreTimer() ;
|
|
AffScene( TRUE ) ;
|
|
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_BODY:
|
|
InitBody( *ptrtrack++, numobj ) ;
|
|
ptrobj->OffsetTrack ++ ;
|
|
break ;
|
|
|
|
case TM_NO_BODY:
|
|
InitBody( NO_BODY, numobj ) ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_ANIM:
|
|
if( !InitAnim( *ptrtrack++, ANIM_REPEAT, 0, numobj ) )
|
|
{
|
|
|
|
ptrobj->OffsetTrack = memooffsettrack ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
ptrobj->OffsetTrack++ ;
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_WAIT_ANIM:
|
|
if( !(ptrobj->WorkFlags & ANIM_END) )
|
|
{
|
|
ptrobj->OffsetTrack-- ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
flag = FALSE ;
|
|
/* attention si autre utilisation ANIM_END */
|
|
/* ptrobj->Flags &= ~ANIM_END ; */
|
|
|
|
/* sup. ce clear si pb obj avec track pendant
|
|
follow ... */
|
|
ClearRealAngle( ptrobj ) ;
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_WAIT_NB_ANIM:/* LORAN */
|
|
ptrobj->OffsetTrack += 2 ;
|
|
if( !(ptrobj->WorkFlags & ANIM_END) )
|
|
{
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
ptrtrack[1]++ ; // nb anim +=
|
|
|
|
if ( *(ptrtrack+1) == *ptrtrack )
|
|
{
|
|
*(ptrtrack+1) = 0 ;/* Cpt */
|
|
}
|
|
else flag = FALSE ;
|
|
|
|
}
|
|
if ( flag == FALSE ) ptrobj->OffsetTrack -= 3 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_WAIT_NB_SECOND:
|
|
ptrobj->OffsetTrack += 5 ;
|
|
|
|
if( *(ULONG*)(ptrtrack+1) == 0 )
|
|
{
|
|
*(ULONG*)(ptrtrack+1) = TimerRef + ( *ptrtrack * 50 ) ;
|
|
}
|
|
|
|
if ( TimerRef < *(ULONG*)(ptrtrack+1) )
|
|
{
|
|
ptrobj->OffsetTrack -= 6 ;
|
|
flag = FALSE ;
|
|
}
|
|
else *(ULONG*)(ptrtrack+1) = 0 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_GOTO_POINT:
|
|
ptrobj->OffsetTrack++ ;
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
Value = *ptrtrack ; // index point
|
|
X0 = ListBrickTrack[Value].X ;
|
|
Y0 = ListBrickTrack[Value].Y ;
|
|
Z0 = ListBrickTrack[Value].Z ;
|
|
|
|
angle = GetAngle( ptrobj->PosObjX,
|
|
ptrobj->PosObjZ,
|
|
X0, Z0 ) ;
|
|
|
|
if( ptrobj->Flags & SPRITE_3D )
|
|
{
|
|
ptrobj->Beta = angle ;
|
|
}
|
|
else
|
|
{
|
|
if( Distance < 4000 )
|
|
{
|
|
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
angle,
|
|
ptrobj->SRot/**Distance/4000*/ ,
|
|
&ptrobj->RealAngle ) ;
|
|
}
|
|
else
|
|
{
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
angle,
|
|
ptrobj->SRot,
|
|
&ptrobj->RealAngle ) ;
|
|
}
|
|
}
|
|
if( Distance > 500 )
|
|
{
|
|
ptrobj->OffsetTrack -= 2 ;
|
|
flag = FALSE ;
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
ptrobj->OffsetTrack -= 2 ;
|
|
flag = FALSE ;
|
|
}
|
|
*/
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_GOTO_POINT_3D:
|
|
ptrobj->OffsetTrack++ ;
|
|
if( ptrobj->Flags & SPRITE_3D )
|
|
{
|
|
Value = *ptrtrack ; // index point
|
|
X0 = ListBrickTrack[Value].X ;
|
|
Y0 = ListBrickTrack[Value].Y ;
|
|
Z0 = ListBrickTrack[Value].Z ;
|
|
|
|
ptrobj->Beta =
|
|
GetAngle( ptrobj->PosObjX,
|
|
ptrobj->PosObjZ,
|
|
X0, Z0 ) ;
|
|
|
|
ptrobj->FlagAnim = /* alpha */
|
|
GetAngle( ptrobj->PosObjY,0,
|
|
Y0,Distance ) ;
|
|
/* OpenWindow( &DWin, 10,200, 20,5 ) ;
|
|
WinText( &DWin, "Dist: ", Distance ) ;
|
|
WinText( &DWin, "Flag Y: ", Y0 ) ;
|
|
WinText( &DWin, "Obj Y: ", ptrobj->PosObjY ) ;
|
|
FlipWindow( &DWin ) ;
|
|
*/
|
|
if( Distance > 100 )
|
|
{
|
|
ptrobj->OffsetTrack -= 2 ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
/* find_me */
|
|
|
|
ptrobj->PosObjX = X0 ;
|
|
ptrobj->PosObjY = Y0 ;
|
|
ptrobj->PosObjZ = Z0 ;
|
|
}
|
|
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_GOTO_SYM_POINT:
|
|
ptrobj->OffsetTrack++ ;
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
Value = *ptrtrack ; // index point
|
|
X0 = ListBrickTrack[Value].X ;
|
|
Y0 = ListBrickTrack[Value].Y ;
|
|
Z0 = ListBrickTrack[Value].Z ;
|
|
|
|
angle = 512 + GetAngle( ptrobj->PosObjX,
|
|
ptrobj->PosObjZ,
|
|
X0, Z0 ) ;
|
|
|
|
if( ptrobj->Flags & SPRITE_3D )
|
|
{
|
|
ptrobj->Beta = angle ;
|
|
}
|
|
else
|
|
{
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
/* sym */ angle,
|
|
ptrobj->SRot,
|
|
&ptrobj->RealAngle ) ;
|
|
}
|
|
|
|
if( Distance > 500 )
|
|
{
|
|
ptrobj->OffsetTrack -= 2 ;
|
|
flag = FALSE ;
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
ptrobj->OffsetTrack -= 2 ;
|
|
flag = FALSE ;
|
|
}
|
|
*/
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_ANGLE:
|
|
ptrobj->OffsetTrack += 2 ;
|
|
|
|
if( !(ptrobj->Flags & SPRITE_3D) )
|
|
{
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
Value = *(WORD*)ptrtrack ;
|
|
|
|
if( !ptrobj->RealAngle.TimeValue )
|
|
{
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
Value,
|
|
ptrobj->SRot,
|
|
&ptrobj->RealAngle ) ;
|
|
}
|
|
|
|
if( ptrobj->Beta != Value )
|
|
{
|
|
ptrobj->OffsetTrack -= 3 ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
ClearRealAngle( ptrobj ) ;
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
ptrobj->OffsetTrack -= 3 ;
|
|
flag = FALSE ;
|
|
}
|
|
*/
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_FACE_TWINKEL:
|
|
ptrobj->OffsetTrack+=2 ;
|
|
if( !(ptrobj->Flags & SPRITE_3D) )
|
|
{
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
Value = *(WORD*)ptrtrack ;
|
|
|
|
if( Value == -1 )
|
|
{
|
|
if( !ptrobj->RealAngle.TimeValue )
|
|
{
|
|
Value = GetAngle(ptrobj->PosObjX,
|
|
ptrobj->PosObjZ,
|
|
ListObjet[NUM_PERSO].PosObjX,
|
|
ListObjet[NUM_PERSO].PosObjZ );
|
|
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
Value,
|
|
ptrobj->SRot,
|
|
&ptrobj->RealAngle ) ;
|
|
*(WORD*)ptrtrack = Value ;
|
|
}
|
|
}
|
|
|
|
if( ptrobj->Beta != Value )
|
|
{
|
|
ptrobj->OffsetTrack-=3 ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
ClearRealAngle( ptrobj ) ;
|
|
*(WORD*)ptrtrack = -1 ;
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
ptrobj->OffsetTrack-=3 ;
|
|
flag = FALSE ;
|
|
}
|
|
*/
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_ANGLE_RND:
|
|
ptrobj->OffsetTrack += 4 ;
|
|
|
|
if( !(ptrobj->Flags & SPRITE_3D) )
|
|
{
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
Value = *(WORD*)(ptrtrack+2) ;
|
|
|
|
if( Value == -1 )
|
|
{
|
|
if( !ptrobj->RealAngle.TimeValue )
|
|
{
|
|
if( rand()&1 )
|
|
{
|
|
Value = *(WORD*)ptrtrack ;
|
|
Value = (ptrobj->Beta + 256 + Value/2 - Rnd( Value ))&1023 ;
|
|
}
|
|
else
|
|
{
|
|
Value = *(WORD*)ptrtrack ;
|
|
Value = (ptrobj->Beta - 256 - Value/2 + Rnd( Value ))&1023 ;
|
|
}
|
|
InitRealAngleConst( ptrobj->Beta,
|
|
Value,
|
|
ptrobj->SRot,
|
|
&ptrobj->RealAngle ) ;
|
|
*(WORD*)(ptrtrack+2) = Value ;
|
|
}
|
|
}
|
|
if( ptrobj->Beta != Value )
|
|
{
|
|
ptrobj->OffsetTrack -= 5 ;
|
|
flag = FALSE ;
|
|
}
|
|
else
|
|
{
|
|
ClearRealAngle( ptrobj ) ;
|
|
*(WORD*)(ptrtrack+2) = -1 ;
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
ptrobj->OffsetTrack -= 5 ;
|
|
flag = FALSE ;
|
|
}
|
|
*/
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
/* spécifique porte: SPRITE_3D + SPRITE_CLIP */
|
|
|
|
case TM_OPEN_LEFT:
|
|
case TM_OPEN_RIGHT:
|
|
case TM_OPEN_UP:
|
|
case TM_OPEN_DOWN:
|
|
ptrobj->OffsetTrack += 2 ;
|
|
if( (ptrobj->Flags & (SPRITE_3D+SPRITE_CLIP)) == SPRITE_3D+SPRITE_CLIP )
|
|
{
|
|
switch( macro )
|
|
{
|
|
case TM_OPEN_LEFT:
|
|
ptrobj->Beta = 768 ;
|
|
break ;
|
|
case TM_OPEN_RIGHT:
|
|
ptrobj->Beta = 256 ;
|
|
break ;
|
|
case TM_OPEN_UP:
|
|
ptrobj->Beta = 512 ;
|
|
break ;
|
|
case TM_OPEN_DOWN:
|
|
ptrobj->Beta = 0 ;
|
|
break ;
|
|
}
|
|
ptrobj->DoorWidth = *(WORD*)ptrtrack ;
|
|
ptrobj->WorkFlags |= AUTO_STOP_DOOR ;
|
|
//speed porte
|
|
ptrobj->SRot = 1000 ; /* reglage global 8( */
|
|
InitRealValue( 0, 1000, 50, &ptrobj->RealAngle ) ;
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
/* spécifique porte: SPRITE_3D + SPRITE_CLIP */
|
|
case TM_CLOSE:
|
|
if( (ptrobj->Flags & (SPRITE_3D+SPRITE_CLIP)) == SPRITE_3D+SPRITE_CLIP )
|
|
{
|
|
ptrobj->WorkFlags |= AUTO_STOP_DOOR ;
|
|
ptrobj->DoorWidth = 0 ;
|
|
//speed porte
|
|
ptrobj->SRot = -1000 ; /* reglage global 8( */
|
|
InitRealValue( 0, -1000, 50, &ptrobj->RealAngle ) ;
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
/* spécifique porte: SPRITE_3D + SPRITE_CLIP */
|
|
case TM_WAIT_DOOR:
|
|
if( (ptrobj->Flags & (SPRITE_3D+SPRITE_CLIP)) == SPRITE_3D+SPRITE_CLIP )
|
|
{
|
|
if( ptrobj->SRot != 0 )
|
|
{
|
|
ptrobj->OffsetTrack-- ;
|
|
flag = FALSE ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_BETA:
|
|
ptrobj->OffsetTrack += 2 ;
|
|
// if( !(ptrobj->WorkFlags & ANIM_MASTER_ROT) )
|
|
{
|
|
ptrobj->Beta = *(WORD*)ptrtrack ;
|
|
if( !(ptrobj->Flags & SPRITE_3D) )
|
|
{
|
|
ClearRealAngle( ptrobj ) ;
|
|
}
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_POS_POINT:
|
|
|
|
ptrobj->OffsetTrack ++ ;
|
|
Value = *ptrtrack ; // index point
|
|
X0 = ListBrickTrack[Value].X ;
|
|
Y0 = ListBrickTrack[Value].Y ;
|
|
Z0 = ListBrickTrack[Value].Z ;
|
|
|
|
if( ptrobj->Flags & SPRITE_3D )
|
|
{
|
|
ptrobj->SRot = 0 ; //arrete deplacement !!!
|
|
}
|
|
ptrobj->PosObjX = X0 ;
|
|
ptrobj->PosObjY = Y0 ;
|
|
ptrobj->PosObjZ = Z0 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_LABEL:
|
|
ptrobj->LabelTrack = *ptrtrack ; /* label */
|
|
ptrobj->OffsetTrack++ ;
|
|
ptrobj->OffsetLabelTrack = ptrobj->OffsetTrack - 2 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_GOTO:
|
|
ptrobj->OffsetTrack = *(WORD*)ptrtrack ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_LOOP:
|
|
/* mettre recherche label */
|
|
ptrobj->OffsetTrack = 0 ;
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_SPEED:
|
|
ptrobj->OffsetTrack += 2 ;
|
|
ptrobj->SRot = *(WORD*)ptrtrack ;
|
|
if( ptrobj->Flags & SPRITE_3D )
|
|
{ /* voir pour les 2 types ? */
|
|
InitRealValue( 0, ptrobj->SRot,
|
|
50, &ptrobj->RealAngle ) ;
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_BACKGROUND:
|
|
ptrobj->OffsetTrack ++ ;
|
|
if( *ptrtrack ) /* ON */
|
|
{
|
|
if( !(ptrobj->Flags & OBJ_BACKGROUND) )
|
|
{
|
|
ptrobj->Flags |= OBJ_BACKGROUND ;
|
|
if( ptrobj->WorkFlags & WAS_DRAWN )
|
|
{
|
|
FirstTime = TRUE ; /* :-( */
|
|
}
|
|
}
|
|
}
|
|
else /* OFF */
|
|
{
|
|
if( ptrobj->Flags & OBJ_BACKGROUND )
|
|
{
|
|
ptrobj->Flags &= ~OBJ_BACKGROUND ;
|
|
if( ptrobj->WorkFlags & WAS_DRAWN )
|
|
{
|
|
FirstTime = TRUE ; /* :-( */
|
|
}
|
|
}
|
|
}
|
|
break ;
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
case TM_END:
|
|
// ptrobj->Move = NO_MOVE ;
|
|
ptrobj->OffsetTrack = -1 ;
|
|
flag = FALSE ;
|
|
break ;
|
|
|
|
case TM_STOP:
|
|
ptrobj->OffsetTrack = -1 ;
|
|
flag = FALSE ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
|