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

690 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"
#include <dos.h>
#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 trouve
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; n<nb; n++ )
{
switch( *ptrc++ )
{
case 5: /* hit */
if( ptrobj->Frame == *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 dj… 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 ) ;
}
*/
/*ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ*/