#include "c_extern.h" #include #ifdef COMPILATOR extern UBYTE *PtrCompil ; extern WORD FlagCompilator ; #endif /*══════════════════════════════════════════════════════════════════════════* ██▀▀▀ █▀▀▀▀ █▀▀▀█ █ █▀▀▀█ ▀▀█▀▀ ▀▀▀▀█ ██ ██▀█▀ ██ ██▀▀▀ ██ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ WORD SearchBonusKey() ; UBYTE *SearchPtrAnimAction ; WORD M_Xmin = -32000 ; WORD M_Xmax, M_Ymin, M_Ymax, M_Zmin, M_Zmax ; UBYTE MagicHitForce[] = { 2, 3, 4, 6, 8 } ; #define BASE_STEP_SOUND 126 /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ void ThrowMagicBall( WORD x, WORD y, WORD z, WORD alpha, WORD beta, WORD vitesse, UBYTE poids ) { UBYTE sprite ; UBYTE force ; WORD search ; /* ici on determine le type de tir et la force */ switch( MagicLevel ) { case 0: case 1: sprite = 1 ; force = 4 ; break ; case 2: sprite = 42 ; force = 6 ; break ; case 3: sprite = 43 ; force = 8 ; break ; case 4: sprite = 13 ; force = 10 ; break ; } MagicBallType = ((MagicPoint-1) / 20) + 1 ; if( MagicPoint == 0 ) MagicBallType = 0 ; // si clef trouvée if( (search = SearchBonusKey()) != -1 ) { MagicBallType = 5 ; } switch( MagicBallType ) { case 0: // balle normale directe MagicBall = ThrowExtra( NUM_PERSO, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; break ; case 1: // balle qui rebondit MagicBallCount = 4 ; MagicBall = ThrowExtra( NUM_PERSO, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; break ; case 2: // balle qui rebondit MagicBallType = 1 ; MagicBallCount = 4 ; MagicBall = ThrowExtra( NUM_PERSO, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; break ; case 3: // balle qui rebondit MagicBallType = 1 ; MagicBallCount = 4 ; MagicBall = ThrowExtra( NUM_PERSO, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; break ; case 4: // balle qui rebondit MagicBallType = 1 ; MagicBallCount = 4 ; MagicBall = ThrowExtra( NUM_PERSO, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; break ; case 5: // cherche Key MagicBall = ExtraSearchKey( NUM_PERSO, x,y,z, sprite, search ) ; break ; } // la balle magique coute 1 point de magie if( MagicPoint > 0 ) MagicPoint-- ; } /*══════════════════════════════════════════════════════════════════════════*/ /*----------------------------------------------------------------------*/ /* recherche des options d'anims */ #define GET_BYTE (*ptrc++) #define GET_WORD (*(WORD*)ptrc) ; ptrc+=2 void GereAnimAction( T_OBJET *ptrobj, WORD numobj ) { WORD sample ; WORD decal ; WORD anim ; WORD point, x,y,z ; WORD sprite ; WORD alpha ; WORD beta ; WORD vitesse ; WORD poids ; WORD force ; WORD repeat ; WORD search ; WORD dist ; WORD balltype ; UBYTE *ptrc ; WORD n, nb ; anim = ptrobj->Anim ; ptrc = ptrobj->PtrAnimAction ; nb = *ptrc++ ; for( n=0; nFrame == *ptrc++ - 1 ) { ptrobj->HitForce = GET_BYTE ; ptrobj->WorkFlags |= OK_HIT ; } else ptrc++ ; break ; case 6: /* sample */ // Message( "Sample Action", FALSE ) ; if( ptrobj->Frame == *ptrc++ ) { HQ_3D_MixSample( *(WORD*)ptrc, 0x1000, 1, ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ; } ptrc += 2 ; break ; case 7: /* sample_rnd */ if( ptrobj->Frame == *ptrc++ ) { sample = GET_WORD ; decal = GET_WORD ; HQ_3D_MixSample( sample, 0x1000+Rnd(decal)-(decal/2), 1, ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ; } else ptrc += 4 ; break ; case 8: /* throw */ if( ptrobj->Frame == *ptrc++ ) { point = GET_WORD ; sprite = GET_BYTE ; alpha = GET_WORD ; beta = ptrobj->Beta + GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; force = GET_BYTE ; ThrowExtra( numobj, ptrobj->PosObjX,ptrobj->PosObjY+point,ptrobj->PosObjZ, sprite, alpha, beta, vitesse, poids, force ) ; } else ptrc += 11 ; break ; case 9: /* throw_magic */ if( MagicBall == -1 ) // pas de balle en cours { if( ptrobj->Frame == *ptrc++ ) // frame ok ? { point = GET_WORD ; alpha = GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; ThrowMagicBall( ptrobj->PosObjX, ptrobj->PosObjY + point, ptrobj->PosObjZ, alpha, ptrobj->Beta, vitesse, poids ) ; } else ptrc += 7 ; } else ptrc += 8 ; break ; case 10: /* sample_repeat */ if( ptrobj->Frame == *ptrc++ ) { sample = GET_WORD ; repeat = GET_WORD ; HQ_3D_MixSample( sample, 0x1000, repeat, ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ; } else ptrc += 4 ; break ; case 11: /* throw_search */ if( ptrobj->Frame == *ptrc++ ) { point = GET_WORD ; sprite = GET_BYTE ; search = GET_BYTE ; vitesse = GET_WORD ; force = GET_BYTE ; ExtraSearch( numobj, ptrobj->PosObjX,ptrobj->PosObjY+point,ptrobj->PosObjZ, sprite, search, vitesse, force ) ; } else ptrc += 6 ; break ; case 12: /* throw_alpha */ if( ptrobj->Frame == *ptrc++ ) { dist = Distance2D(ptrobj->PosObjX, ptrobj->PosObjZ, ListObjet[NUM_PERSO].PosObjX, ListObjet[NUM_PERSO].PosObjZ ) ; alpha = GetAngle(ptrobj->PosObjY,0, ListObjet[NUM_PERSO].PosObjY, dist ) ; point = GET_WORD ; sprite = GET_BYTE ; alpha += GET_WORD ; beta = ptrobj->Beta + GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; force = GET_BYTE ; ThrowExtra( numobj, ptrobj->PosObjX,ptrobj->PosObjY+point,ptrobj->PosObjZ, sprite, alpha, beta, vitesse, poids, force ) ; } else ptrc += 11 ; break ; case 13: /* sample_stop */ if( ptrobj->Frame == *ptrc++ ) { sample = GET_WORD ; HQ_StopOneSample( sample ) ; } else ptrc += 2 ; break ; case 15: // left_step if( ptrobj->Frame == *ptrc++ ) /* frame */ { /* sample = WorldCodeBrick( ptrobj->PosObjX, ptrobj->PosObjY-1, ptrobj->PosObjZ ) ; */ sample = ptrobj->CodeJeu ; if( sample != 0xF0 ) // rien { if( (sample & 0xF0) == 0xF0 ) // code jeu { } else { HQ_3D_MixSample( (sample>>4) + BASE_STEP_SOUND, 0x1000+Rnd(1000)-500, 1, ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ; } } } break ; case 16: // right_step if( ptrobj->Frame == *ptrc++ ) { /* sample = WorldCodeBrick( ptrobj->PosObjX, ptrobj->PosObjY-1, ptrobj->PosObjZ ) ; */ sample = ptrobj->CodeJeu ; if( sample != 0xF0 ) // rien { if( (sample & 0xF0) == 0xF0 ) // code jeu { } else { HQ_3D_MixSample( (sample&0x0F) + BASE_STEP_SOUND + 15, 0x1000+Rnd(1000)-500, 1, ptrobj->PosObjX, ptrobj->PosObjY, ptrobj->PosObjZ ) ; } } } break ; case 17: /* hit_twinkel */ if( ptrobj->Frame == *ptrc++ - 1 ) { ptrobj->HitForce = MagicHitForce[ MagicLevel ] ; ptrobj->WorkFlags |= OK_HIT ; } break ; case 18: /* throw_3D */ if( ptrobj->Frame == *ptrc++ ) { x = GET_WORD ; y = GET_WORD ; z = GET_WORD ; Rotate( x,z, ptrobj->Beta ) ; x = X0 + ptrobj->PosObjX ; y += ptrobj->PosObjY ; z = Y0 + ptrobj->PosObjZ ; sprite = GET_BYTE ; alpha = GET_WORD ; beta = ptrobj->Beta + GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; force = GET_BYTE ; ThrowExtra( numobj, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; } else ptrc += 15 ; break ; case 19: /* throw_3D_alpha */ if( ptrobj->Frame == *ptrc++ ) { dist = Distance2D(ptrobj->PosObjX, ptrobj->PosObjZ, ListObjet[NUM_PERSO].PosObjX, ListObjet[NUM_PERSO].PosObjZ ) ; alpha = GetAngle(ptrobj->PosObjY,0, ListObjet[NUM_PERSO].PosObjY, dist ) ; x = GET_WORD ; y = GET_WORD ; z = GET_WORD ; Rotate( x,z, ptrobj->Beta ) ; x = X0 + ptrobj->PosObjX ; y += ptrobj->PosObjY ; z = Y0 + ptrobj->PosObjZ ; sprite = GET_BYTE ; alpha += GET_WORD ; beta = ptrobj->Beta + GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; force = GET_BYTE ; ThrowExtra( numobj, x,y,z, sprite, alpha, beta, vitesse, poids, force ) ; } else ptrc += 15 ; break ; case 20: /* throw_3D_search */ if( ptrobj->Frame == *ptrc++ ) { x = GET_WORD ; y = GET_WORD ; z = GET_WORD ; Rotate( x,z, ptrobj->Beta ) ; x = X0 + ptrobj->PosObjX ; y += ptrobj->PosObjY ; z = Y0 + ptrobj->PosObjZ ; sprite = GET_BYTE ; search = GET_BYTE ; vitesse = GET_WORD ; force = GET_BYTE ; ExtraSearch( numobj, x,y,z, sprite, search, vitesse, force ) ; } else ptrc += 11 ; break ; case 21: /* throw_3D_magic */ if( MagicBall == -1 ) // pas de balle en cours { if( ptrobj->Frame == *ptrc++ ) { x = GET_WORD ; y = GET_WORD ; z = GET_WORD ; Rotate( x,z, ptrobj->Beta ) ; x = X0 + ptrobj->PosObjX ; y += ptrobj->PosObjY ; z = Y0 + ptrobj->PosObjZ ; alpha = GET_WORD ; vitesse = GET_WORD ; poids = GET_BYTE ; ThrowMagicBall( x,y,z, alpha, ptrobj->Beta, vitesse, poids ) ; } else ptrc += 11 ; } else ptrc += 12 ; break ; default: return ; } } } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ WORD SearchAnim( UBYTE numanim, WORD numobj ) { UBYTE command ; T_OBJET *ptrobj ; WORD hqranim ; UBYTE *ptrc ; UBYTE numgene ; ptrobj = &ListObjet[numobj] ; ptrc = ptrobj->PtrFile3D ; SearchPtrAnimAction = 0 ; while( (command = *ptrc++) != 255 ) { switch( command ) { case 3: /* ANIM */ numgene = *ptrc++ ; // lit num name generique if( numanim == numgene ) // ok trouve { ptrc++ ; // saute size anim hqranim = *(WORD*)ptrc ; /*if( numobj==2) { CoulText( 15, 0 ) ; Text( 10,110, "%FSearchAnim GenAnim:%d HqrAnim:%d ", numanim, hqranim ) ; }*/ ptrc += 2 ; if( *ptrc++ ) // anim possede action ? { SearchPtrAnimAction = ptrc-1 ; } return hqranim ; } else { ptrc += *ptrc ; // next anim } break ; default: ptrc++ ; // gen ptrc += *ptrc ; } } return -1 ; } /*══════════════════════════════════════════════════════════════════════════*/ WORD SearchBody( UBYTE numbody, WORD numobj ) { UBYTE command ; T_OBJET *ptrobj ; UWORD hqrbody ; UBYTE *ptrc ; UBYTE numgene ; ptrobj = &ListObjet[numobj] ; ptrc = ptrobj->PtrFile3D ; /* if( (numobj == NUM_PERSO) AND (numbody == GEN_BODY_NORMAL) AND (Weapon == 1) ) { numbody = GEN_BODY_SABRE ; } */ while( (command = *ptrc++) != 255 ) { switch( command ) { case 1: /* BODY */ numgene = *ptrc++ ; // lit num name generique if( numbody == numgene ) // ok trouve { ptrc++ ; // saute size body hqrbody = *(UWORD*)ptrc ; if( hqrbody & (1<<15) ) // already loaded { hqrbody &= ~(1<<15) ; //CoulText( 15, 0 ) ; //Text( 10,110, "%FSearchBody déjà chargé %d", hqrbody ) ; } else { //Text( 10,120, "%FSearchBody new %d", hqrbody ) ; HQRM_Load( PATH_RESSOURCE"body.hqr", hqrbody, &PtrBody[NbBodys] ) ; CHECK_MEMORY /* PtrBody[NbBodys] = LoadMalloc_HQR( PATH_RESSOURCE"body.hqr", hqrbody ) ; */ if( !PtrBody[NbBodys] ) TheEnd( NOT_ENOUGH_MEM, "Body.HQR in HQ_Mem" ) ; PatchObjet( PtrBody[NbBodys] ) ; hqrbody = NbBodys ; NbBodys++ ; //Text( 10,130, "%FNbBodys %d", NbBodys ) ; *(UWORD*)ptrc = hqrbody + (1<<15) ; } ptrc += 2 ; M_Xmin = -32000 ; if( *ptrc++ ) // body possede action ? { if( *ptrc++ == 14 ) // ZV { M_Xmin = *(WORD*)ptrc ; ptrc += 2 ; M_Ymin = *(WORD*)ptrc ; ptrc += 2 ; M_Zmin = *(WORD*)ptrc ; ptrc += 2 ; M_Xmax = *(WORD*)ptrc ; ptrc += 2 ; M_Ymax = *(WORD*)ptrc ; ptrc += 2 ; M_Zmax = *(WORD*)ptrc ; ptrc += 2 ; } } return hqrbody ; } else { ptrc += *ptrc ; // next body } break ; default: ptrc++ ; // gen ptrc += *ptrc ; } } return -1 ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /* void LoadFic( UBYTE indexfileobjet, WORD numobj ) { T_OBJET *ptrobj ; LONG size ; ptrobj = &ListObjet[numobj] ; ptrobj->PtrFile3D = LoadMalloc_HQR( PATH_RESSOURCE"FILE3D.HQR", indexfileobjet ) ; } */ /*══════════════════════════════════════════════════════════════════════════*/