Files
lba1-classic/SOURCES/HOLOMAP.C

1076 lines
27 KiB
C

#include "c_extern.h"
#define STEP_ANGLE 32
#define SLIG (((1024/STEP_ANGLE)+1) * 4)
#define SIZE_TEXT_GLOBE (((1024/STEP_ANGLE)+1) * ((512/STEP_ANGLE)+1) * 4 * 2)
#define SIZE_COOR_GLOBE (((1024/STEP_ANGLE)+1) * ((512/STEP_ANGLE)+1) * 3 * 2)
#define SIZE_MAP_ALT ( (1024/STEP_ANGLE) * ((512/STEP_ANGLE)+1) )
#define X_CENTRE_BIG_HOLO 320
#define Y_CENTRE_BIG_HOLO 190
#define LARGEUR_BIG_HOLO 300
#define HAUTEUR_BIG_HOLO 280
#define ZOOM_BIG_HOLO 9500
#define X_CENTRE_TRAJ_HOLO 320+80
#define Y_CENTRE_TRAJ_HOLO 240
extern WORD NbPolyPoints ;
extern T_REAL_VALUE RealRot ;
extern LONG LYmin, LYmax ;
UBYTE *PtrHoloBody ;
UBYTE *PtrHoloFleche ;
UBYTE *PtrHoloBodyFleche ;
UBYTE *PtrCone ;
UBYTE *LastPtr ;
WORD CamAlpha, CamBeta, CamGamma ;
/*══════════════════════════════════════════════════════════════════════════*
█ █ █▀▀▀█ █ █▀▀▀█ █▄ ▄█ █▀▀▀█ █▀▀▀█
██▀▀█ ██ █ ██ ██ █ ██▀ █ ██▀▀█ ██▀▀▀
▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀
*══════════════════════════════════════════════════════════════════════════*/
/*──────────────────────────────────────────────────────────────────────────*/
// calcule coor mapping. 256*256 -> polys
/* ptrglobe WORD Xp
WORD Yp
WORD Xt
WORD Yt */
UBYTE *ListTraj ;
UWORD *PtrGlobe ;
UWORD *PtrCoorGlobe ;
UBYTE *PtrAlt ;
UBYTE *PtrMap ;
UWORD *PtrTri ;
UBYTE RotPal[(32+31)*3] ;
WORD RotPalPos = 0 ;
void ComputeCoorMapping()
{
WORD alpha, beta ;
UWORD *ptr ;
ptr = PtrGlobe ;
for( alpha = -256; alpha <= 256; alpha += STEP_ANGLE )
{
for( beta = 0; beta < 1024; beta += STEP_ANGLE )
{
ptr += 2 ; /* Xp Yp */
*ptr++ = (UWORD)RegleTrois32( 0,255*256+255, 1023, beta ) ;
if( alpha == 256 )
*ptr++ = 256*255 + 255 ;
else
*ptr++ = (UWORD) ( ((alpha+256) * 256) / 2) ;
}
ptr += 2 ; /* Xp Yp */
*ptr++ = 255*256 + 255 ;
if( alpha == 256 )
*ptr++ = 256*255 + 255 ;
else
*ptr++ = (UWORD) ( ((alpha+256) * 256) / 2) ;
}
}
/*──────────────────────────────────────────────────────────────────────────*/
void ComputeCoorGlobe()
{
WORD alpha, beta ;
UWORD *ptrc ;
UBYTE *mptrv, *ptrv ;
WORD x, y ;
WORD normal ;
// precalcul coor globe avec coor polaires
ptrc = PtrCoorGlobe ;
ptrv = PtrAlt ;
SetAngleCamera( 0,0,0 ) ;
for( alpha = -256; alpha <= 256; alpha += STEP_ANGLE )
{
mptrv = ptrv ; // memo 0
for( beta = 0; beta < 1024; beta += STEP_ANGLE )
{
normal = 1000 + *ptrv++ * 2 ;
Rotate( normal , 0, alpha ) ;
x = X0 ;
y = Y0 ;
Rotate( x, 0, beta ) ;
WorldRotatePoint( X0, y, Y0 ) ;
*ptrc++ = X0 ;
*ptrc++ = Y0 ;
*ptrc++ = Z0 ;
}
Rotate( 1000 + *mptrv * 2 , 0, alpha ) ;
x = X0 ;
y = Y0 ;
Rotate( x, 0, 0 ) ; //...
WorldRotatePoint( X0, y, Y0 ) ;
*ptrc++ = X0 ;
*ptrc++ = Y0 ;
*ptrc++ = Z0 ;
}
}
/*──────────────────────────────────────────────────────────────────────────*/
// compute projection sphere
int z_sort( WORD *a, WORD *b)
{
return( *a - *b ) ;
}
void ComputeGlobeProj()
{
UWORD *ptr, *ptrt ;
WORD *ptrc ;
WORD alpha, beta ;
ptr = PtrGlobe ;
ptrc = (UWORD*)PtrCoorGlobe ;
ptrt = PtrTri ;
for( alpha = -256; alpha <= 256; alpha += STEP_ANGLE )
{
for( beta = 0; beta < 1024; beta += STEP_ANGLE )
{
X0 = *ptrc++ ;
Y0 = *ptrc++ ;
Z0 = *ptrc++ ;
WorldRotatePoint( X0, Y0, Z0 ) ;
if( alpha != 256 )
{
*ptrt++ = Z0 ;
*ptrt++ = ptr-PtrGlobe ;
}
ProjettePoint( X0, Y0, Z0 ) ;
*ptr++ = Xp ;
*ptr++ = Yp ;
ptr += 2 ; // coor text
}
X0 = *ptrc++ ;
Y0 = *ptrc++ ;
Z0 = *ptrc++ ;
WorldRotatePoint( X0, Y0, Z0 ) ;
ProjettePoint( X0, Y0, Z0 ) ;
*ptr++ = Xp ;
*ptr++ = Yp ;
ptr += 2 ; // coor text
}
qsort( PtrTri, 512, 4, z_sort ) ;
}
/*══════════════════════════════════════════════════════════════════════════*/
void DrawHoloMap( WORD calpha, WORD cbeta, WORD cgamma )
{
WORD alpha, beta, gamma ;
LONG offsetalpha ;
UWORD *ptr ;
LONG n ;
ComputeGlobeProj() ;
for( n=0; n<16*32; n++ )
{
ptr = PtrGlobe + PtrTri[n*2+1] ;
TabPoly[1] = ptr[0] ;
TabPoly[2] = ptr[1] ;
TabPoly[4] = ptr[0+SLIG] ;
TabPoly[5] = ptr[1+SLIG] ;
TabPoly[7] = ptr[4] ;
TabPoly[8] = ptr[5] ;
if( TestVuePoly( TabPoly ) )
{
TabText[1] = ptr[2] ;
TabText[2] = ptr[3] ;
TabText[4] = ptr[2+SLIG] ;
TabText[5] = ptr[3+SLIG] ;
TabText[7] = ptr[6] ;
TabText[8] = ptr[7] ;
AsmTexturedTriangleNoClip() ;
FillTextPolyNoClip( LYmin, LYmax, PtrMap ) ;
}
TabPoly[1] = ptr[0+SLIG] ;
TabPoly[2] = ptr[1+SLIG] ;
TabPoly[4] = ptr[4+SLIG] ;
TabPoly[5] = ptr[5+SLIG] ;
TabPoly[7] = ptr[4] ;
TabPoly[8] = ptr[5] ;
if( TestVuePoly( TabPoly ) )
{
TabText[1] = ptr[2+SLIG] ;
TabText[2] = ptr[3+SLIG] ;
TabText[4] = ptr[6+SLIG] ;
TabText[5] = ptr[7+SLIG] ;
TabText[7] = ptr[6] ;
TabText[8] = ptr[7] ;
AsmTexturedTriangleNoClip() ;
FillTextPolyNoClip( LYmin, LYmax, PtrMap ) ;
}
}
}
/*══════════════════════════════════════════════════════════════════════════*
█ █ █▀▀▀█ █ █▀▀▀█ █▀▀▀█ █▀▀█ █
██▀▀█ ██ █ ██ ██ █ ██ █ ██▀▀█ ▄▄ █
▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀
*══════════════════════════════════════════════════════════════════════════*/
/*──────────────────────────────────────────────────────────────────────────*/
void DrawListPos( WORD calpha, WORD cbeta, WORD cgamma, WORD pos )
{
T_HOLO_POS *ptrpos ;
WORD n, x,y,z ;
WORD x1,y1,z1 ;
WORD xm,ym,zm ;
WORD xm1,ym1,zm1 ;
WORD xp, yp ;
WORD normal ;
UBYTE *ptr3do ;
UBYTE t ;
LONG i, nbobjets ;
ptrpos = ListHoloPos ;
nbobjets = 0 ;
for( n=0; n<MAX_HOLO_POS; n++, ptrpos++ )
{
// calcul Z vecteur pour savoir devant derriere
if( !(TabHoloPos[n]&128)
AND (NumCube != n)) continue ;
SetAngleCamera( ptrpos->Alpha, ptrpos->Beta, 0 ) ;
WorldRotatePoint( 0,0, 1000+ptrpos->Size ) ;
xm = X0 ;
ym = Y0 ;
zm = Z0 ;
WorldRotatePoint( 0,0, 1500 ) ;
xm1 = X0 ;
ym1 = Y0 ;
zm1 = Z0 ;
// SetFollowCamera( 0,0,0, calpha,cbeta,cgamma, ZOOM_BIG_HOLO ) ;
SetInverseAngleCamera( calpha,cbeta,cgamma ) ;
CameraXr = 0 ;
CameraYr = 0 ;
CameraZr = ZOOM_BIG_HOLO ;
WorldRotatePoint( xm, ym, zm ) ;
x1 = X0 ;
y1 = Y0 ;
z1 = Z0 ;
WorldRotatePoint( xm1, ym1, zm1 ) ;
if( !pos )
{
if( Z0 > z1 ) continue ;
}
else
{
if( Z0 < z1 ) continue ;
}
// draw obj
t = TabHoloPos[n] & 1 ;
//t = 1 ;
if( NumCube == n ) t |= 2 ;
ListTri[nbobjets].Z = z1 ;
ListTri[nbobjets].NumObj = n ;
ListTri[nbobjets].Num = t ;
ListTri[nbobjets].Xw = xm ;
ListTri[nbobjets].Yw = ym ;
ListTri[nbobjets].Zw = zm ;
nbobjets++ ;
}
SmallSort( ListTri, nbobjets, sizeof( T_SORT ) ) ;
for( n=0; n<nbobjets; n++ )
{
i = ListTri[n].NumObj ;
ptr3do = 0 ;
switch( ListTri[n].Num )
{
case 1:
ptr3do = PtrHoloFleche ;
break;
case 2:
ptr3do = PtrHoloBody ;
break ;
case 3:
ptr3do = PtrHoloBodyFleche ;
break ;
}
if( ptr3do )
{
AffObjetIso( ListTri[n].Xw, ListTri[n].Yw, ListTri[n].Zw,
ListHoloPos[i].Alpha,ListHoloPos[i].Beta , 0,
ptr3do ) ;
}
}
}
/*──────────────────────────────────────────────────────────────────────────*/
LONG SearchNextArrow( LONG num )
{
LONG n ;
for( n=num+1; n<MAX_HOLO_POS; n++ )
{
if( TabHoloPos[n] & (128+1) )
{
return n ;
}
}
return -1 ;
}
/*──────────────────────────────────────────────────────────────────────────*/
LONG SearchPrevArrow( LONG num )
{
LONG n ;
if( num == -1 ) num = MAX_HOLO_POS ;
for( n=num-1; n>=0; n-- )
{
if( TabHoloPos[n] & (128+1) )
{
return n ;
}
}
return -1 ;
}
/*──────────────────────────────────────────────────────────────────────────*/
void SetHoloPos( UBYTE num )
{
// if( !(TabHoloPos[num] & 64) ) // déjà visité
{
TabHoloPos[num] = 1 + 128 ;
}
}
/*──────────────────────────────────────────────────────────────────────────*/
void ClrHoloPos( UBYTE num )
{
TabHoloPos[num] &= ~(1+128) ;
TabHoloPos[num] |= 64 ; // cube done
}
/*──────────────────────────────────────────────────────────────────────────*/
void DrawTitle( WORD x, WORD y, WORD num )
{
WORD x2, x0,y0,x1,y1 ;
UBYTE string[256] ;
x0 = x - 630/2 ;
x1 = x + 630/2 ;
y0 = y - 40/2 ;
y1 = y + 40/2 ;
// Box( x0, y0, x1, y1, COUL_SELECT_MENU ) ;
// DrawFire( x0, y0, x1, y1, COUL_SELECT_MENU&0xF0 ) ;
// CopyBlock( x0, y0, x1, y1, Screen, x0, y0, Log ) ;
// ShadeBox( x0, y0, x1, y1, 4 ) ;
// cadre
// DrawCadre( x0, y0, x1, y1 ) ;
// text
// GetMultiText( num, string ) ;
strcpy( string, "HoloMap" ) ;
x -= SizeFont( string )/2 ;
y -= 18 ;
CoulFont( 12*16+10 ) ;
Font( x-1, y-1, string ) ;
Font( x , y-1, string ) ;
Font( x+1, y-1, string ) ;
Font( x-1, y+1, string ) ;
Font( x , y+1, string ) ;
Font( x+1, y+1, string ) ;
Font( x-1, y , string ) ;
Font( x+1, y , string ) ;
CoulFont( 15 ) ;
Font( x , y, string ) ;
// flip
CopyBlockPhys( x0,y0, x1,y1 ) ;
}
/*──────────────────────────────────────────────────────────────────────────*/
#define SIZE_CURSOR 20
void DrawCurseur()
{
Rect( X_CENTRE_BIG_HOLO - SIZE_CURSOR,
Y_CENTRE_BIG_HOLO - SIZE_CURSOR,
X_CENTRE_BIG_HOLO + SIZE_CURSOR,
Y_CENTRE_BIG_HOLO + SIZE_CURSOR,
15 ) ;
}
/*──────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────────────────────────────────────────────*/
void InitHoloDatas()
{
LONG n ;
// inits pointeurs
PtrGlobe = (UWORD*)Screen ;
PtrCoorGlobe = (UWORD*)(Screen + SIZE_TEXT_GLOBE) ;
PtrAlt = Screen
+ SIZE_TEXT_GLOBE
+ SIZE_COOR_GLOBE ;
PtrMap = Screen
+ SIZE_TEXT_GLOBE
+ SIZE_COOR_GLOBE
+ SIZE_MAP_ALT ;
PtrHoloBody = Screen
+ SIZE_TEXT_GLOBE
+ SIZE_COOR_GLOBE
+ SIZE_MAP_ALT
+ 65536 ;
// chargements
Load_HQR( PATH_RESSOURCE"ress.hqr", PtrAlt, RESS_HOLOMAP_HMT ) ;
Load_HQR( PATH_RESSOURCE"ress.hqr", PtrMap, RESS_HOLOMAP_HMG ) ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", PtrHoloBody, RESS_HOLO_TWINKEL ) ;
PtrHoloFleche = PtrHoloBody + n ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", PtrHoloFleche, RESS_HOLO_FLECHE ) ;
PtrHoloBodyFleche = PtrHoloFleche + n ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", PtrHoloBodyFleche, RESS_HOLO_BODYFLECHE ) ;
PtrCone = PtrHoloBodyFleche + n ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", PtrCone, RESS_HOLO_CONE ) ;
PatchObjet( PtrHoloBody ) ;
PatchObjet( PtrHoloFleche ) ;
PatchObjet( PtrHoloBodyFleche ) ;
PatchObjet( PtrCone ) ;
PtrTri = (UWORD*)(PtrCone + n) ;
ListHoloPos = (T_HOLO_POS*)( PtrTri + (17*33*4) ) ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", ListHoloPos, RESS_HOLOMAP_POS ) ;
//Load( "F:\\PROJET\\LBA\\DATAS\\HOLOMAP.POS", ListHoloPos ) ;
ListTraj = (UBYTE*)(ListHoloPos) + n ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr", ListTraj, RESS_HOLOMAP_TRAJ ) ;
//Load( "f:\\projet\\lba\\datas\\holotraj.pos", ListTraj ) ;
LastPtr = (UBYTE*)(ListTraj) + n ;
// recup couls flotte bank 12 et 13 32 couleurs
Load_HQR( PATH_RESSOURCE"ress.hqr", PalettePcx, RESS_HOLOMAP_PAL ) ;
for( n=0; n<32; n++ )
{
RotPal[n*3 + 0] = PalettePcx[(12*16+n)*3 + 0] ;
RotPal[n*3 + 1] = PalettePcx[(12*16+n)*3 + 1] ;
RotPal[n*3 + 2] = PalettePcx[(12*16+n)*3 + 2] ;
}
for( n=0; n<31; n++ )
{
RotPal[(32+n)*3 + 0] = PalettePcx[(12*16+n)*3 + 0] ;
RotPal[(32+n)*3 + 1] = PalettePcx[(12*16+n)*3 + 1] ;
RotPal[(32+n)*3 + 2] = PalettePcx[(12*16+n)*3 + 2] ;
}
// precalcul coordonnées diverses (stock dans screen)
ComputeCoorMapping() ;
ComputeCoorGlobe() ;
RotPalPos = 0 ;
}
/*──────────────────────────────────────────────────────────────────────────*/
/*══════════════════════════════════════════════════════════════════════════*
█ █ █▀▀▀█ █ █▀▀▀█ █▄ ▄█ █▀▀▀█ █▀▀▀█
██▀▀█ ██ █ ██ ██ █ ██▀ █ ██▀▀█ ██▀▀▀
▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀
*══════════════════════════════════════════════════════════════════════════*/
/*──────────────────────────────────────────────────────────────────────────*/
void HoloMap()
{
WORD calpha=-256, cbeta=0, cgamma=0 ;
WORD zoom = 22000 ;
LONG y, x = 15 ;
UWORD *ptr, *ptrc ;
UBYTE *mptrv, *ptrv ;
WORD c, n ;
WORD flagredraw ;
WORD flagpal = TRUE ;
WORD dialstat = 3 ;
WORD menumode = 0 ;
WORD flagrebond = FALSE ;
WORD redrawmenu = TRUE ;
LONG automove = FALSE ;
LONG otimer ;
WORD oalpha, obeta ;
WORD dalpha, dbeta ;
LONG current = -1 ;
LONG dialmess = -1 ;
LONG alphalight, betalight ;
LONG memoflagspeak ;
UBYTE savepalette[768] ;
SaveTimer() ;
for(n=0; n<768; n++) savepalette[n] = PalettePcx[n] ;
alphalight = AlphaLight ;
betalight = BetaLight ;
FadeToBlack( PtrPal ) ;
HQ_StopSample() ;
UnSetClip() ;
Cls() ;
Flip() ;
CopyScreen( Log, Screen ) ;
InitHoloDatas() ;
DrawTitle( 320, 25, 0 ) ;
SetProjection( X_CENTRE_BIG_HOLO,
Y_CENTRE_BIG_HOLO,
128,1024,1024 ) ;
// boucle aff
memoflagspeak = FlagSpeak ;
FlagSpeak = FALSE ;
InitDial( 2 ) ;
TestCoulDial( 9 ) ;
dialmess = ListHoloPos[NumCube].Mess ;
// FlagMessageShade = FALSE ;
flagredraw = TRUE ;
otimer = TimerRef ;
dalpha = ListHoloPos[NumCube].Alpha & 1023 ;
dbeta = ListHoloPos[NumCube].Beta & 1023 ;
calpha = oalpha = dalpha ;
cbeta = obeta = dbeta ;
automove = 0 ;
current = NumCube ;
while( (Key != K_ESC) AND (Key != K_H) AND !(Fire&F_RETURN) )
{
if( flagrebond )
{
if( !Joy AND !Fire ) flagrebond = FALSE ;
}
else
{
MyKey = Key ;
MyFire = Fire ;
MyJoy = Joy ;
if( MyFire & F_CTRL )
{
if( (dialstat != 1) AND (!automove) )
{
if( MyJoy & J_UP ) calpha-=8 ;
if( MyJoy & J_DOWN ) calpha+=8 ;
if( MyJoy & J_LEFT ) cbeta-=8 ;
if( MyJoy & J_RIGHT ) cbeta+=8 ;
}
calpha &= 1023 ;
cbeta &= 1023 ;
}
else
{
// search & goto next arrow
if( MyJoy & J_RIGHT )
{
current = SearchNextArrow( current ) ;
if( current == -1 )
{
oalpha = calpha ;
obeta = cbeta ;
otimer = TimerRef ;
dalpha = ListHoloPos[NumCube].Alpha & 1023 ;
dbeta = ListHoloPos[NumCube].Beta & 1023 ;
dialstat = 3 ;
dialmess = ListHoloPos[NumCube].Mess ;
}
else
{
oalpha = calpha ;
obeta = cbeta ;
otimer = TimerRef ;
dalpha = ListHoloPos[current].Alpha & 1023 ;
dbeta = ListHoloPos[current].Beta & 1023 ;
dialstat = 3 ;
dialmess = ListHoloPos[current].Mess ;
}
automove = TRUE ;
flagrebond = TRUE ;
}
if( MyJoy & J_LEFT )
{
current = SearchPrevArrow( current ) ;
if( current == -1 )
{
oalpha = calpha ;
obeta = cbeta ;
otimer = TimerRef ;
dalpha = ListHoloPos[NumCube].Alpha & 1023 ;
dbeta = ListHoloPos[NumCube].Beta & 1023 ;
dialstat = 3 ;
dialmess = ListHoloPos[NumCube].Mess ;
}
else
{
oalpha = calpha ;
obeta = cbeta ;
otimer = TimerRef ;
dalpha = ListHoloPos[current].Alpha & 1023 ;
dbeta = ListHoloPos[current].Beta & 1023 ;
dialstat = 3 ;
dialmess = ListHoloPos[current].Mess ;
}
automove = TRUE ;
flagrebond = TRUE ;
}
}
/* if( MyJoy & J_UP ) menumode++, flagrebond = TRUE, redrawmenu = TRUE ;
if( menumode > 3 ) menumode = 0 ;
if( MyJoy & J_DOWN ) menumode--, flagrebond = TRUE, redrawmenu = TRUE ;
if( menumode < 0 ) menumode = 3 ;
*/
} // flagrebond
if( automove )
{
calpha = BoundRegleTrois( oalpha, dalpha, 75, TimerRef-otimer ) ;
cbeta = BoundRegleTrois( obeta, dbeta, 75, TimerRef-otimer ) ;
flagredraw = TRUE ;
}
// calpha &= 1023 ;
// cbeta &= 1023 ;
/*
CoulText( 15, 0 ) ;
Text( 0,0, "%Falpha:%d beta:%d ", calpha, cbeta ) ;
Text( 0,10, "%Foalpha:%d obeta:%d ", oalpha, obeta ) ;
Text( 0,20, "%Fdalpha:%d dbeta:%d ", dalpha, dbeta ) ;
Text( 0,30, "%Fcurrent:%d mess:%d ", current, ListHoloPos[current].Mess ) ;
*/
// cycle palette flotte
if( !flagpal )
{
PalMulti( 12*16, 32, RotPal+(RotPalPos*3) ) ;
RotPalPos++ ;
if( RotPalPos == 32 ) RotPalPos = 0 ;
}
// affiche big holo
if( dialstat != 1 ) flagredraw = TRUE ;
if( flagredraw == TRUE )
{
flagredraw = FALSE ;
Box( X_CENTRE_BIG_HOLO-LARGEUR_BIG_HOLO/2,
Y_CENTRE_BIG_HOLO-HAUTEUR_BIG_HOLO/2,
X_CENTRE_BIG_HOLO+LARGEUR_BIG_HOLO/2,
Y_CENTRE_BIG_HOLO+HAUTEUR_BIG_HOLO/2, 0 ) ;
SetInverseAngleCamera( calpha,cbeta,cgamma ) ;
SetLightVector( calpha, cbeta, 0 ) ;
// aff obj derriere
DrawListPos( calpha, cbeta, cgamma, 0 ) ;
// draw sphère
// SetFollowCamera( 0,0,0, calpha,cbeta,cgamma, ZOOM_BIG_HOLO ) ;
SetInverseAngleCamera( calpha,cbeta,cgamma ) ;
CameraXr = 0 ;
CameraYr = 0 ;
CameraZr = ZOOM_BIG_HOLO ;
DrawHoloMap( calpha, -cbeta, cgamma ) ;
// aff obj devant
DrawListPos( calpha, cbeta, cgamma, 1 ) ;
if( automove ) DrawCurseur() ;
CopyBlockPhys( X_CENTRE_BIG_HOLO-LARGEUR_BIG_HOLO/2,
Y_CENTRE_BIG_HOLO-HAUTEUR_BIG_HOLO/2,
X_CENTRE_BIG_HOLO+LARGEUR_BIG_HOLO/2,
Y_CENTRE_BIG_HOLO+HAUTEUR_BIG_HOLO/2 ) ;
}
if( automove )
{
if( (dalpha == calpha)
AND (dbeta == cbeta) )
{
automove = FALSE ;
}
}
// affiche message
if( dialstat == 3 )
{
OpenDial( dialmess ) ;
dialstat = 0 ;
}
if( dialstat != 2 )
{
dialstat = NextDialCar() ;
}
if( MyFire & F_SPACE )
{
if( dialstat == 2 )
{
dialstat = 0 ;
}
else
{
OpenDial( dialmess ) ;
}
}
// Text( 0,0, "Xmin: %d Ymin: %d Xmax: %d Ymax: %d Zoom: %d", ScreenXmin,ScreenYmin,ScreenXmax,ScreenYmax,zoom ) ;
// fade in 1ere fois
if( flagpal )
{
flagpal = FALSE ;
FadeToPal( PalettePcx ) ;
}
}
FlagMessageShade = TRUE ;
FadeToBlack( PalettePcx ) ;
/* Cls() ;
Flip() ;
*/
AlphaLight = alphalight ;
BetaLight = betalight ;
Init3DGame() ;
FlagSpeak = memoflagspeak ;
InitDial( START_FILE_ISLAND+Island ) ;
for(n=0; n<768; n++) PalettePcx[n] = savepalette[n] ;
RestoreTimer() ;
}
/*══════════════════════════════════════════════════════════════════════════*
█ █ █▀▀▀█ █ █▀▀▀█ ▀▀█▀▀ █▀▀▀█ █▀▀▀█ █
██▀▀█ ██ █ ██ ██ █ ██ ██▀█▀ ██▀▀█ ▄▄ █
▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀
*══════════════════════════════════════════════════════════════════════════*/
/*──────────────────────────────────────────────────────────────────────────*/
// 0 cube source
// 1 cube dest
// 2 vehicule
// 3 alpha
// 4 beta
// 5 gamma
// 6 nbpoints
// {
// alpha
// beta
// }
/*──────────────────────────────────────────────────────────────────────────*/
void DrawHoloObj( UBYTE *ptr3do, WORD alpha, WORD beta, WORD size )
{
LONG xm, ym, zm ;
LONG x1, y1, z1 ;
SetAngleCamera( alpha, beta, 0 ) ;
WorldRotatePoint( 0,0, 1000 + size ) ;
xm = X0 ;
ym = Y0 ;
zm = Z0 ;
SetFollowCamera( 0,0,0, CamAlpha,CamBeta,CamGamma, 5300 ) ;
WorldRotatePoint( xm, ym, zm ) ;
x1 = X0 ;
y1 = Y0 ;
z1 = Z0 ;
UnSetClip() ;
AffObjetIso( xm,ym,zm,
alpha, beta, 0,
ptr3do ) ;
CopyBlockPhys( ScreenXmin, ScreenYmin, ScreenXmax, ScreenYmax ) ;
}
/*──────────────────────────────────────────────────────────────────────────*/
WORD *GiveTrajPtr( LONG numtraj )
{
WORD *ptr ;
LONG n ;
WORD nbp ;
ptr = (WORD*)ListTraj ;
for( n=0; n!=numtraj; n++ )
{
ptr += 6 ;
nbp = *ptr++ ;
ptr += nbp*2 ;
}
return ptr ;
}
/*──────────────────────────────────────────────────────────────────────────*/
/*──────────────────────────────────────────────────────────────────────────*/
void HoloTraj( WORD numtraj )
{
WORD alpha=-256, beta=0, gamma=0 ;
WORD zoom = 22000 ;
LONG y, x = 15 ;
UWORD *ptr, *ptrc ;
UBYTE *mptrv, *ptrv ;
WORD c, n ;
WORD flagredraw ;
WORD flagpal = TRUE ;
WORD *ptrtraj, nbpoints, vehicule, cubestart, cubeend ;
UBYTE *ptranim, *ptr3do ;
WORD frameanim, vbeta ;
LONG alphalight, betalight ;
ULONG memotimer ;
#ifndef DEMO
// inits
SaveTimer() ;
alphalight = AlphaLight ;
betalight = BetaLight ;
if( FlagPalettePcx ) FadeToBlack( PalettePcx ) ;
else FadeToBlack( PtrPal ) ;
UnSetClip() ;
Cls() ;
Flip() ;
InitHoloDatas() ;
// recup infos traj
ptrtraj = GiveTrajPtr( numtraj ) ;
cubestart = ptrtraj[0] ;
cubeend = ptrtraj[1] ;
vehicule = ptrtraj[2] ;
CamAlpha = ptrtraj[3] ;
CamBeta = ptrtraj[4] ;
CamGamma = ptrtraj[5] ;
nbpoints = ptrtraj[6] ;
// vehicule
ptr3do = LastPtr ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr",
ptr3do,
RESS_HOLO_VEHICULE+vehicule*2 ) ;
PatchObjet( ptr3do ) ;
ptranim = ptr3do + n ;
n = Load_HQR( PATH_RESSOURCE"ress.hqr",
ptranim,
RESS_HOLO_VEHICULE+vehicule*2+1 ) ;
frameanim = 0 ;
// vbeta = rand()&1023 ;
// draw holo
SetProjection( X_CENTRE_TRAJ_HOLO,
Y_CENTRE_TRAJ_HOLO,
128,1024,1024 ) ;
SetFollowCamera( 0,0,0, CamAlpha,CamBeta,CamGamma, 5300 ) ;
DrawHoloMap( CamAlpha, CamBeta, CamGamma ) ;
Flip() ;
// premier point
DrawHoloObj( PtrCone,
ListHoloPos[cubestart].Alpha,
ListHoloPos[cubestart].Beta,
0 ) ;
// boucle aff
n = 0 ;
memotimer = TimerRef ;
while( Key != K_ESC )
{
// cycle palette flotte
Vsync() ;
if( !flagpal )
{
PalMulti( 12*16, 32, RotPal+(RotPalPos*3) ) ;
RotPalPos++ ;
if( RotPalPos == 32 ) RotPalPos = 0 ;
}
// animation vehicule
vbeta = GetRealAngle( &RealRot ) ;
if( RealRot.TimeValue == 0 )
{
InitRealAngle( vbeta, vbeta-256, 500, &RealRot ) ;
}
if( SetInterAnimObjet( frameanim, ptranim, ptr3do ) )
{
frameanim++ ;
if( frameanim == GetNbFramesAnim( ptranim ) )
{
frameanim = GetBouclageAnim( ptranim ) ;
}
}
SetProjection( 100, 100+300, 128,900,900 ) ;
SetFollowCamera( 0,0,0, 60,128,0, 30000 ) ;
SetLightVector( -60, 128, 0 ) ;
Box( 0,0+300,199,179+300, 0 ) ;
AffObjetIso( 0,0,0, 0,vbeta,0, ptr3do ) ;
CopyBlockPhys( 0,0+300,199,179+300 ) ;
SetProjection( X_CENTRE_TRAJ_HOLO,
Y_CENTRE_TRAJ_HOLO,
128,1024,1024 ) ;
SetFollowCamera( 0,0,0, CamAlpha,CamBeta,CamGamma, 5300 ) ;
SetLightVector( CamAlpha, CamBeta, 0 ) ;
// points de trajectoire
if( TimerRef >= memotimer+40 )
{
memotimer = TimerRef ;
if( n < nbpoints )
{
alpha = ptrtraj[7+n*2] ;
beta = ptrtraj[8+n*2] ;
}
else
{
if( n > nbpoints ) break ; // c'est fini
alpha = ListHoloPos[cubeend].Alpha ;
beta = ListHoloPos[cubeend].Beta ;
}
DrawHoloObj( PtrCone,alpha,beta,0 ) ;
n++ ;
}
// fade intro
if( flagpal )
{
flagpal = FALSE ;
FadeToPal( PalettePcx ) ;
}
}
FadeToBlack( PalettePcx ) ;
Cls() ;
Flip() ;
AlphaLight = alphalight ;
BetaLight = betalight ;
Init3DGame() ;
RestoreTimer() ;
#endif
}