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; i Max_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; i 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; 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