Files
lba1-classic/SOURCES/GERETRAK.C
Gwen Gourevich c5f4f6ba25 Initial commit
2021-10-27 10:34:18 +02:00

605 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 ;
/*-------------------------------------------------------------------------*/
/* spcifique 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 ;
/*-------------------------------------------------------------------------*/
/* spcifique 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 ;
/*-------------------------------------------------------------------------*/
/* spcifique 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 ;
}
}
}