📄 pnuc.c
字号:
/*============================================================================*/
/* PROJECT NUCLEUS. (c) RocSoft, 1995. */
/* v1.0 18 Jan 95. */
/*============================================================================*/
#include <dos.h>
#include <rgenrl.h>
#include <rgraph.h>
#include <rsprite.h>
#include <rinout.h>
#include <rfileio.h>
#include <rsound.h>
#include <rblast.h>
#include <rmem.h>
#include <rmath.h>
#include "\rocco\glib\games.h"
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#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<argc; i++ )
{
if ( stricmp(argv[i],"/SFX")==0 ) Check_Sfx=TRUE; else
if ( strnicmp(argv[i],"/LEV:",5)==0 ) Check_Level=atoi(argv[i]+5); else
if ( stricmp(argv[i],"/SCREENSHOT")==0 ) Screen_Shot=TRUE; else
if ( stricmp(argv[i],"/NOSOUND")==0 ) no_sound=TRUE; else
if ( stricmp(argv[i],"/SPK")==0 ) force_spk=TRUE; else
if ( strnicmp(argv[i],"/L:",3)==0 ) LevelName=argv[i]+3;
}
if ( (allocpal(&DefPal,VGA_PALETTE))==NULL ) Terminate( ERR_MALLOC );
getpals( &DefPal );
Game_Paused = TRUE;
OldINT9H = NULL;
PMousePtr.h = PMousePtr.w = 1;
PMousePtr.buff = NULL;
Max_Levels = 0;
randomize();
Print_Banner(TRUE);
OldINT9H = _dos_getvect(0x09);
_dos_setvect( 0x09,NewINT9H );
prints( "Timers :",L_GREY,0 );
prints( (enable_timers(SAMPLE_RATE)==0)?"ENABLED!":"NOT ENABLED!\a",WHITE,0 );
set_timer_hooks( NULL, &Slow_Timer_Hook );
prints( "\n\rSound Source :",L_GREY,0 );
if ( !force_spk && SB_enable()==0 )
{
prints( "SOUND BLASTER!",WHITE,0 );
Sound_Source = SOUND_BLASTER;
}
else
{
prints( (enable_sound(SOUND_QUEUE_SIZE,SAMPLE_RATE)==0)?"PC SPEAKER!":"NO SOUND!\a",WHITE,0 );
Sound_Source = PC_SPEAKER;
}
prints( "\n\rMouse :",L_GREY,0 );
prints( (MouseActive=chkmouse())?"ENABLED!":"NOT ENABLED!\a",WHITE,0 );
setpos( 0,21,0 );
prints( "Please wait...",L_GREY,0 );
if ( (RootTable=(int *)malloc(MAX_SQUARE*sizeof(int)))==NULL ) Terminate( ERR_MALLOC );
for ( i=0; i<MAX_SQUARE; i++ ) RootTable[i]=PseudoRoot(i);
if ( !MouseActive || enable_pseudo_mouse(&PMousePtr,&MouseTrap) ) Terminate( ERR_NOMOUSE );
No_Sound_Flag = FALSE;
Effects_Flag = Music_Flag = TRUE;
if ( no_sound )
{
No_Sound_Flag=TRUE;
Effects_Flag =Music_Flag=FALSE;
}
else
{
if ( !opfile(&handle,"OPTIONS.CFG",READ,NOT_WRITE) )
{
rdfile( handle,sizeof(int),(char *)&No_Sound_Flag,&bytes );
rdfile( handle,sizeof(int),(char *)&Effects_Flag,&bytes );
rdfile( handle,sizeof(int),(char *)&Music_Flag,&bytes );
clfile( handle );
}
}
if ( Sound_Source!=SOUND_BLASTER )
Music_Flag=GOptions.o[ MUSIC_OPTIONS_TOKEN ].active=FALSE;
else
if ( Music_Flag ) GOptions_Music( 0 );
if ( !opfile(&handle,"SAVENAME.TAB",READ,NOT_WRITE) )
{
rdfile( handle,sizeof(GSlots.name),(char *)&GSlots.name,&bytes );
clfile( handle );
}
if ( !opfile(&handle,"SCORES.TAB",READ,NOT_WRITE) )
{
rdfile( handle,sizeof(High_Scores.initials),(char *)&High_Scores.initials,&bytes );
rdfile( handle,sizeof(High_Scores.scores),(char *)&High_Scores.scores,&bytes );
clfile( handle );
}
Load_Game_Data();
Create_Animations();
if ( Check_Sfx )
{
setpos( 0,23,0 );
for ( i=0; i<NUMBER_OF_SFX; i++ )
{
printsi( "\rSound Effect: ",i,7,0 );
if ( getkey(0)==ESCAPEKEY ) break;
Sfx( i );
}
}
if ( Check_Level != 0 )
{
cls( ATTR(BLUE,L_YELLOW) );
setpos( 35,0,0 );
prints( "Cheat Mode",ATTR(BLUE,L_YELLOW),0 );
setpos( 10,10,0 );
prints( "Enter Password:",ATTR(BLUE,L_YELLOW),0 );
Sfx( SFX_WARNING );
*buff = '\0';
if ( getstr(26,10,buff,6,ATTR(RED,WHITE)) || strcmp(buff,Cheat_Password ) )
{
setpos( 0,23,0 );
prints( "Cheat Mode Failed!",ATTR(RED,WHITE),0 );
Check_Level=0;
Sfx( SFX_ERROR );
}
else
{
setpos( 0,23,0 );
prints( "Cheat Mode Verified!",ATTR(BLUE,WHITE),0 );
Sfx( SFX_BONUS_PICKUP );
}
sleep( 1 );
}
do
{
Menu_New_Game( 0 );
Demo_Exited = FALSE;
Demo_Mode = TRUE;
Display_Title_Screen();
if ( !Demo_Exited )
{
Play_Level();
if ( !Demo_Exited ) Hall_Of_Fame( &High_Scores,0L,1 );
}
if ( Demo_Exited )
{
Demo_Mode = FALSE;
do
{
switch( opt=Game_Menu(&GMenu,0) )
{
case NEW_GAME_OPTION:
case LOAD_GAME_OPTION:
case BACK_TO_GAME_OPTION:
if ( Check_Level!=0 && Check_Level<=Max_Levels && Cfg.level<Check_Level )
{
Cfg.level = Check_Level;
Initialise_Level();
}
Play_Level();
GMenu.m[ SAVE_GAME_OPTION].active = GMenu.m[ BACK_TO_GAME_OPTION ].active = (Meltdown || Cfg.level>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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -