#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; nAlpha, 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=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 }