www.pudn.com > nucsrc > PNUC.C


/*============================================================================*/ 
/*   PROJECT NUCLEUS.      (c) RocSoft, 1995.                                 */ 
/*   v1.0  18 Jan 95.                                                         */ 
/*============================================================================*/ 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include "\rocco\glib\games.h" 
 
#include  
#include  
#include  
#include  
#include  
 
#include "defines.h" 
#include "prototyp.h" 
#include "globals.h" 
 
int           WPage=0; 
 
char          *Banner="Project Nucleus  v1.0  Shareware Version  (c) RocSoft, 1995"; 
char          *ErrorTab[]={ "Memory Allocation Error!", 
                             "", 
                             "No mouse driver present!", 
                             "Game data missing!", 
                             "Failure loading Nucleus Level Data (NLD) file!", 
                             "" }; 
char          *LevelName="NUCLEUS.NLD"; 
char          Demo_Exited, Demo_Mode; 
 
unsigned int  Demo_Timer=0, Experiment_Timer=0; 
int           *RootTable; 
 
int           LogoIndex1[]={ 0,1,2,3,4,5,6 }; 
int           LogoIndex2[]={ 7,8,5,9,4,8,10 }; 
int           Logo_Control[14]; 
int           ParticleMass[NUM_OF_PARTICLES]={ 1,2,4 }; 
 
/*     Debug Flags     */ 
 
BYTE          Check_Sfx=FALSE; 
BYTE          Screen_Shot=FALSE; 
int           Check_Level=0; 
char          *Cheat_Password="13crZ9"; 
 
/*=====================[ External Variable Definitions ]======================*/ 
 
extern GAME_MENU        GMenu; 
extern GAME_OPTIONS     GOptions; 
extern HIGH_SCORE_TABLE High_Scores; 
extern GAME_SLOTS       GSlots; 
 
extern int              No_Sound_Flag, Effects_Flag, Music_Flag; 
 
/*==========================[ The Main Program ]==============================*/ 
 
void main( int argc, char *argv[] ) 
{ 
    int    handle, bytes, opt, i; 
    char   quit_flag=FALSE, buff[8], no_sound=FALSE, force_spk=FALSE; 
 
    for ( i=1; iMax_Levels)?FALSE:TRUE; 
                        break; 
                    case EXIT_OPTION: 
                        quit_flag=TRUE; 
                        break; 
                } 
            } 
            while ( !quit_flag && opt!=DEMO_OPTION ); 
        } 
    } 
    while ( !quit_flag ); 
 
    if ( !mkfile(&handle,"SCORES.TAB",NORMAL) ) 
    { 
        wtfile( handle,sizeof(High_Scores.initials),(char *)&High_Scores.initials,&bytes ); 
        wtfile( handle,sizeof(High_Scores.scores),(char *)&High_Scores.scores,&bytes ); 
        clfile( handle ); 
    } 
 
    if ( !mkfile(&handle,"SAVENAME.TAB",NORMAL) ) 
    { 
        wtfile( handle,sizeof(GSlots.name),(char *)&GSlots.name,&bytes ); 
        clfile( handle ); 
    } 
 
    if ( !mkfile(&handle,"OPTIONS.CFG",NORMAL) ) 
    { 
        wtfile( handle,sizeof(int),(char *)&No_Sound_Flag,&bytes ); 
        wtfile( handle,sizeof(int),(char *)&Effects_Flag,&bytes ); 
        wtfile( handle,sizeof(int),(char *)&Music_Flag,&bytes ); 
        clfile( handle ); 
    } 
 
    fadeout( &Pal,0 ); 
    Terminate( ERR_REGNAG ); 
} 
 
/*====================[ 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; irays; 
    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; jx-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=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