📄 pnuc.c
字号:
}
/*====================[ Support Functions Start Here ]========================*/
void Create_Animations( void )
{
int i;
if ( make_cartoon(&Toon_Syringe,Syringe,GENERAL_IMAGE,NULL,20,0,NO_COLLISION,&Syringe_Morph,&Syringe_Mover) ||
make_cartoon(&Toon_Nucleus,&Nucleus_Logo,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,NULL) ||
make_cartoon(&Toon_Demo,Demo_Icons,GENERAL_IMAGE,NULL,2,30,NO_COLLISION,&Cycle_Morph,NULL) ||
make_cartoon(&Toon_Counter,Counter_Icons,GENERAL_IMAGE,NULL,20,0,NO_COLLISION,&Counter_Morph,&Counter_Mover ) ||
make_cartoon(&Toon_Shield,Shield_Icons,GENERAL_IMAGE,NULL,NUM_OF_SHIELDS,1,NO_COLLISION,&Shield_Morph,&Shield_Mover ) ||
make_cartoon(&Toon_PowerUp,PowerUps,GENERAL_IMAGE,NULL,NUM_OF_POWERUPS,0,NO_COLLISION,&PowerUp_Morph,&PowerUp_Mover ) ||
make_cartoon(&Toon_Beam,Beams,GENERAL_IMAGE,NULL,NUM_OF_BEAMS,1,NO_COLLISION,&Beam_Morph,&Beam_Mover ) ||
make_cartoon(&Toon_Rogue_Particle,RogueParticles,GENERAL_IMAGE,NULL,NUM_OF_ROGUE_PARTICLES,0,NO_COLLISION,&Rogue_Morph,&Rogue_Mover )
) Terminate( ERR_MALLOC );
for ( i=0; i<11; i++ )
if ( make_cartoon(Toon_Logo+i,LogoLetters+i,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,&Logo_Mover) )
Terminate( ERR_MALLOC );
for ( i=0; i<NUM_OF_PARTICLES; i++ )
if ( make_cartoon(Toon_Particle+i,SParticles+i,GENERAL_IMAGE,NULL,1,0,NO_COLLISION,&Static_Morph,&Particle_Mover) )
Terminate( ERR_MALLOC );
}
void Initialise_Level( void )
{
int i, j, c;
PARTICLE *p, *pp;
Lev = Levels + Cfg.level - 1;
Cfg.briefed = FALSE;
Cfg.rays = Lev->rays;
Cfg.shield_cnt = Lev->shields;
Cfg.time = Lev->time;
Cfg.power_up_timer = Lev->power_up_delay;
Cfg.beam_timer = Calculate_Rogue_Interval( Lev->min_beam_sep,Lev->max_beam_sep );
Cfg.rogue_timer = Calculate_Rogue_Interval( Lev->min_rogue_sep,Lev->max_rogue_sep );
ZERO( Cfg.particles );
ZERO( Cfg.nuclei );
ZERO( Cfg.shields );
ZERO( Cfg.timers );
ZERO( Cfg.beams );
ZERO( Cfg.rogues );
for ( i=Lev->count, p=Cfg.particles; i>0; i--, p++ )
{
p->type = (random()%NUM_OF_PARTICLES);
for ( c=0; c<40; c++ )
{
p->x = random()%(VX_MAX-VX_MIN+1) + VX_MIN;
p->y = random()%(VY_MAX-VY_MIN+1) + VY_MIN;
for ( j=0, pp=Cfg.particles; j<i; j++, pp++ )
if ( ABS(pp->x-p->x)<40 || ABS(pp->y-p->y)<40 ) break;
if ( j==i ) break;
}
p->vx = Set_Particle_Velocity( SPEED_MASK_1,1 );
p->vy = Set_Particle_Velocity( SPEED_MASK_1,1 );
}
}
void Load_Game_Data( void )
{
long id;
int handle, bytes;
if ( loadpals("SPRITES\\PARTICLE.PAL",&Pal) ||
loadspr(SFont,"SPRITES\\FONT.SPR")!=127 ||
loadspr(Panel,"SPRITES\\PANEL.SPR")!=14 ||
loadspr(Syringe,"SPRITES\\SYRINGE.SPR")!=20 ||
loadspr(&Nucleus_Logo,"SPRITES\\TITLE.SPR")!=1 ||
loadspr(&Fractal,"SPRITES\\FRACTAL.SPR")!=1 ||
loadspr(LogoLetters,"SPRITES\\BIGLET.SPR")!=11 ||
loadspr(&Pause_Icon,"SPRITES\\PAUSE.SPR")!=1 ||
loadspr(Demo_Icons,"SPRITES\\DEMO.SPR")!=2 ||
loadspr(Counter_Icons,"SPRITES\\COUNTER.SPR")!=20 ||
loadspr(&Option_Pointer,"SPRITES\\POINTER.SPR")!=1 ||
loadspr(SParticles,"SPRITES\\PARTICLE.SPR")!=NUM_OF_PARTICLES ||
loadspr(Shield_Icons,"SPRITES\\RINGS.SPR")!=NUM_OF_SHIELDS ||
loadspr(PowerUps,"SPRITES\\POWERUPS.SPR")!=NUM_OF_POWERUPS ||
loadspr(Beams,"SPRITES\\BEAM.SPR")!=NUM_OF_BEAMS ||
loadspr(RogueParticles,"SPRITES\\ROGUE.SPR")!=NUM_OF_ROGUE_PARTICLES
) Terminate( ERR_NODATA );
if ( Sound_Source==SOUND_BLASTER )
{
if ( SB_load_rsb_lib(&SB_Effects,"SOUNDS\\SOUNDS.RSL") ) Terminate( ERR_NODATA );
}
else
{
if ( load_sfx_lib(&SPK_Effects,"SOUNDS\\SOUNDS.SXL") ) Terminate( ERR_NODATA );
}
if ( opfile(&handle,LevelName,READ,NOT_WRITE) ||
rdfile(handle,sizeof(id),(char *)&id,&bytes) ||
id != NLD_ID ) Terminate( ERR_NLD );
Max_Levels = (int) ((filelen(handle)-sizeof(id))/sizeof(LEVEL_TYPE));
if ( (Levels=(LEVEL_TYPE *)malloc(Max_Levels*sizeof(LEVEL_TYPE)))==NULL ) Terminate( ERR_MALLOC );
if ( rdfile(handle,sizeof(LEVEL_TYPE)*Max_Levels,(char *)Levels,&bytes) ) Terminate( ERR_NLD );
clfile( handle );
}
int Load_Level_Data( char *name )
{
CONFIG *cfg;
int handle, bytes=0;
char path[GAME_NAME_SIZE+5];
ucase(strcat(strcpy(path,name),".SAV"));
if ( (cfg=(CONFIG *)malloc(sizeof(CONFIG)))==NULL ) Terminate( ERR_MALLOC );
if ( opfile(&handle,path,READ,NOT_WRITE)==0 )
{
rdfile( handle,sizeof(CONFIG),(char *)cfg,&bytes );
clfile( handle );
if ( bytes==sizeof(CONFIG) && cfg->id==0x504e )
memcpy( &Cfg,cfg,sizeof(CONFIG) );
else bytes=0;
}
free( cfg );
return( (bytes!=sizeof(CONFIG)) );
}
void MouseTrap( int event, int b, int x, int y, int mx, int my )
{
static int last_b=0;
if ( Demo_Mode )
{
if ( b&0x03 ) Demo_Exited=TRUE;
}
else
{
if ( (b&=0x03)!=last_b ) I_MouseB=last_b=b;
I_MouseX = x;
I_MouseY = y;
}
}
void interrupt NewINT9H( void )
{
static unsigned char scan, status;
status = ((scan=inp(0x60))&0x80)?FALSE:TRUE;
if ( status && Demo_Mode ) Demo_Exited=TRUE;
_chain_intr( OldINT9H );
}
int Save_Level_Data( char *name )
{
int handle, bytes, key;
char path[GAME_NAME_SIZE+5], *msgs[3]={"Game already exists!","Overwrite Y or N",NULL};
ucase(strcat(strcpy(path,name),".SAV"));
if ( chkfile(path,FILE_EXISTS)==0 )
{
key = Show_Error_Message( msgs,SFX_WARNING,0,0 );
if ( key!='y' && key!='Y' ) return( 0 );
}
if ( mkfile(&handle,path,NORMAL) ) return( TRUE );
Cfg.id = 0x504e;
wtfile( handle,sizeof(CONFIG),(char *)&Cfg,&bytes );
clfile( handle );
return( (bytes!=sizeof(CONFIG)) );
}
void Sfx( SFX_TYPE type )
{
if ( Effects_Flag && type>=0 && type<NUMBER_OF_SFX )
{
if ( Sound_Source==SOUND_BLASTER ) SB_play( SB_Effects.rsb+type ); else
{
flush_sounds();
sound_effect( SPK_Effects.lib[type].sfx,SPK_Effects.lib[type].num,1 );
}
}
}
void Slow_Timer_Hook( void )
{
static unsigned int *tab=Cfg.timers;
if ( !Game_Paused )
{
_asm
{
les bx, tab
mov cx, MAX_NUCLEI
Repeat:
cmp word ptr es:[bx], 0
je Not_Set
dec word ptr es:[bx]
Not_Set:
add bx, 2
loop Repeat
}
if ( Demo_Timer ) Demo_Timer--;
if ( Experiment_Timer ) Experiment_Timer--;
}
}
void Terminate( ERROR_TYPE errno )
{
int i;
disable_pseudo_mouse();
disable_sound();
SB_disable();
disable_timers();
if ( OldINT9H != NULL ) _dos_setvect(0x09,OldINT9H);
if ( errno==ERR_REGNAG )
{
setmode( 0x03 );
display_scr( "SPRITES\\REGISTER.SCR",0 );
Print_Banner( FALSE );
setpos( 0,23,0 );
prints( "Please wait...",L_GREY,0 );
for ( i=9; i>=0; i-- )
{
setpos( 15,23,0 );
printi( i,L_GREY,0 );
sleep( 1 );
while ( inkey(0) );
}
prints( "\r ",L_GREY,0 );
}
else
{
Print_Banner( TRUE );
if ( errno>=0 && errno<NUM_OF_ERRS ) prints( ErrorTab[errno],L_GREY,0 ); else
{
prints( "Abnormal Termination: Error=",L_GREY,0 );
printi( errno^0x8000,L_GREY,0 );
}
}
setpos( 0,23,0 );
exit( 1 );
}
void Wait_For_Event( int delay )
{
/* Waits for an event (key/mouse) or for time delay */
long timeout=timer() + (long)delay*18L;
int b, x, y;
while ( mstatus(&b,&x,&y) );
while ( timer()<timeout && !inkey(0) && !mstatus(&b,&x,&y) );
while ( mstatus(&b,&x,&y) );
}
/*========================[ End Of Program File ]=============================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -