📄 main.c
字号:
void cleartopline(void)
{
outtext(" ",0,0,3);
outtext(" ",308,0,3);
}
Sint4 levplan(void)
{
Sint4 l=levno();
if (l>8)
l=(l&3)+5; /* Level plan: 12345678, 678, (5678) 247 times, 5 forever */
return l;
}
Sint4 levof10(void)
{
if (gamedat[curplayer].level>10)
return 10;
return gamedat[curplayer].level;
}
Sint4 levno(void)
{
return gamedat[curplayer].level;
}
void setdead(bool df)
{
alldead=df;
}
void testpause(void)
{
int i;
if (pausef) {
#ifndef _WINDOWS
pausef=FALSE;
#endif
soundpause();
sett2val(40);
setsoundt2();
cleartopline();
outtext("PRESS ANY KEY",80,0,1);
getkey();
#ifdef _WINDOWS
pausef=FALSE;
#endif
cleartopline();
drawscores();
for (i=0;i<diggers;i++)
addscore(i,0);
drawlives();
if (!synchvid)
curtime=gethrt();
}
else
soundpauseoff();
}
void calibrate(void)
{
volume=(Sint4)(getkips()/291);
if (volume==0)
volume=1;
}
Uint4 sound_device,sound_port,sound_irq,sound_dma,sound_rate,sound_length;
void parsecmd(int argc,char *argv[])
{
char *word;
Sint4 arg,i,j,speedmul;
bool sf,gs=FALSE,norepf=FALSE;
FILE *levf;
for (arg=1;arg<argc;arg++) {
word=argv[arg];
if (word[0]=='/' || word[0]=='-') {
if (word[1]=='L' || word[1]=='l' || word[1]=='R' || word[1]=='r' ||
word[1]=='P' || word[1]=='p' || word[1]=='S' || word[1]=='s' ||
word[1]=='E' || word[1]=='e' || word[1]=='G' || word[1]=='g' ||
word[1]=='A' || word[1]=='a' || word[1]=='I' || word[1]=='i')
if (word[2]==':')
i=3;
else
i=2;
if (word[1]=='L' || word[1]=='l') {
j=0;
while (word[i]!=0)
levfname[j++]=word[i++];
levfname[j]=word[i];
levfflag=TRUE;
}
if (word[1]=='R' || word[1]=='r')
recname(word+i);
if (word[1]=='P' || word[1]=='p' || word[1]=='E' || word[1]=='e') {
openplay(word+i);
if (escape)
norepf=TRUE;
}
if (word[1]=='E' || word[1]=='e') {
finish();
if (escape)
exit(0);
exit(1);
}
if ((word[1]=='O' || word[1]=='o') && !norepf) {
arg=0;
continue;
}
if (word[1]=='S' || word[1]=='s') {
speedmul=0;
while (word[i]!=0)
speedmul=10*speedmul+word[i++]-'0';
ftime=speedmul*2000l;
gs=TRUE;
}
if (word[1]=='I' || word[1]=='i')
sscanf(word+i,"%u",&startlev);
if (word[1]=='U' || word[1]=='u')
unlimlives=TRUE;
#ifndef _WINDOWS
if (word[1]=='?' || word[1]=='h' || word[1]=='H') {
finish();
printf("DIGGER - Copyright (c) 1983 Windmill software\n"
"Restored 1998 by AJ Software\n"
#ifdef ARM
"Acorn port by Julian Brown\n"
#endif
"http://www.digger.org\n"
"Version: "DIGGER_VERSION"\n\n"
"Command line syntax:\n"
" DIGGER [[/S:]speed] [[/L:]level file] [/C] [/B] [/Q] [/M] "
"[/P:playback file]\n"
" [/E:playback file] [/R:record file] [/O] [/K[A]] "
"[/G[:time]] [/2]\n"
" [/A:device,port,irq,dma,rate,length] [/V] [/U] "
"[/I:level]\n\n"
"/C = Use CGA graphics\n"
"/B = Use BIOS palette functions for CGA (slow!)\n"
"/Q = Quiet mode (no sound at all) "
"/M = No music\n"
"/R = Record graphics to file\n"
"/P = Playback and restart program "
"/E = Playback and exit program\n"
"/O = Loop to beginning of command line\n"
"/K = Redefine keyboard\n"
"/G = Gauntlet mode\n"
"/2 = Two player simultaneous mode\n"
"/A = Use alternate sound device\n"
"/V = Synchronize timing to vertical retrace\n"
"/U = Allow unlimited lives\n"
"/I = Start on a level other than 1\n");
exit(1);
}
#endif
if (word[1]=='Q' || word[1]=='q')
soundflag=FALSE;
if (word[1]=='M' || word[1]=='m')
musicflag=FALSE;
if (word[1]=='2')
diggers=2;
#ifndef _WINDOWS
if (word[1]=='B' || word[1]=='b' || word[1]=='C' || word[1]=='c') {
ginit=cgainit;
gpal=cgapal;
ginten=cgainten;
gclear=cgaclear;
ggetpix=cgagetpix;
gputi=cgaputi;
ggeti=cgageti;
gputim=cgaputim;
gwrite=cgawrite;
gtitle=cgatitle;
if (word[1]=='B' || word[1]=='b')
biosflag=TRUE;
ginit();
gpal(0);
}
if (word[1]=='K' || word[1]=='k')
if (word[2]=='A' || word[2]=='a')
redefkeyb(TRUE);
else
redefkeyb(FALSE);
if (word[1]=='A' || word[1]=='a') {
sscanf(word+i,"%u,%x,%u,%u,%u,%u",&sound_device,&sound_port,&sound_irq,
&sound_dma,&sound_rate,&sound_length);
killsound();
if (sound_device>0) {
volume=1;
setupsound=s1setupsound;
killsound=s1killsound;
fillbuffer=s1fillbuffer;
initint8=s1initint8;
restoreint8=s1restoreint8;
if (sound_device==1) {
soundoff=s1soundoff;
setspkrt2=s1setspkrt2;
settimer0=s1settimer0;
timer0=s1timer0;
settimer2=s1settimer2;
timer2=s1timer2;
getsample=getsample1;
}
else {
soundoff=s2soundoff;
setspkrt2=s2setspkrt2;
settimer0=s2settimer0;
timer0=s2timer0;
settimer2=s2settimer2;
timer2=s2timer2;
getsample=getsample2;
}
soundinitglob(sound_port,sound_irq,sound_dma,sound_length,sound_rate);
}
initsound();
}
if (word[1]=='V' || word[1]=='v')
synchvid=TRUE;
#endif
if (word[1]=='G' || word[1]=='g') {
gtime=0;
while (word[i]!=0)
gtime=10*gtime+word[i++]-'0';
if (gtime>3599)
gtime=3599;
if (gtime==0)
gtime=120;
gauntlet=TRUE;
}
}
else {
i=strlen(word);
if (i<1)
continue;
sf=TRUE;
if (!gs)
for (j=0;j<i;j++)
if (word[j]<'0' || word[j]>'9') {
sf=FALSE;
break;
}
if (sf) {
speedmul=0;
j=0;
while (word[j]!=0)
speedmul=10*speedmul+word[j++]-'0';
gs=TRUE;
ftime=speedmul*2000l;
}
else {
j=0;
while (word[j]!=0) {
levfname[j]=word[j];
j++;
}
levfname[j]=word[j];
levfflag=TRUE;
}
}
}
if (levfflag) {
levf=fopen(levfname,"rb");
if (levf==NULL) {
strcat(levfname,".DLF");
levf=fopen(levfname,"rb");
}
if (levf==NULL)
levfflag=FALSE;
else {
fread(&bonusscore,2,1,levf);
fread(leveldat,1200,1,levf);
fclose(levf);
}
}
}
Sint5 randv;
Sint4 randno(Sint4 n)
{
randv=randv*0x15a4e35l+1;
return (Sint4)((randv&0x7fffffffl)%n);
}
char *keynames[]={"Right","Up","Left","Down","Fire",
"Right","Up","Left","Down","Fire",
"Cheat","Accel","Brake","Music","Sound","Exit","Pause"
#ifdef _WINDOWS
,"SaveDRF","NumPlayers"};
#else
};
#endif
#ifndef _WINDOWS
int dx_sound_volume;
bool g_bWindowed,use_640x480_fullscreen,use_async_screen_updates;
#endif
void inir(void)
{
char kbuf[80],vbuf[80];
int i,j,p;
bool cgaflag;
#ifdef _WINDOWS
int vidmode_w,vidmode_h,vidmode_bpp;
#endif
#ifdef _WINDOWS
for (i=0;i<19;i++) {
sprintf(kbuf,"%s%c",keynames[i],(i>=5 && i<10) ? '2' : 0);
sprintf(vbuf,"%i/%i/%i/%i/%i",keycodes[i][0],keycodes[i][1],
keycodes[i][2],keycodes[i][3],keycodes[i][4]);
GetINIString(INI_KEY_SETTINGS,kbuf,vbuf,vbuf,80,ININAME);
p=0;
while (vbuf[p]) {
add_mapped_key(i,atoi(vbuf+p));
while (vbuf[p]!='/' && vbuf[p]!=0)
p++;
if (vbuf[p]==0)
break;
p++;
}
}
#else
for (i=0;i<17;i++) {
sprintf(kbuf,"%s%c",keynames[i],(i>=5 && i<10) ? '2' : 0);
sprintf(vbuf,"%i/%i/%i/%i/%i",keycodes[i][0],keycodes[i][1],
keycodes[i][2],keycodes[i][3],keycodes[i][4]);
GetINIString(INI_KEY_SETTINGS,kbuf,vbuf,vbuf,80,ININAME);
krdf[i]=TRUE;
p=0;
for (j=0;j<5;j++) {
keycodes[i][j]=atoi(vbuf+p);
while (vbuf[p]!='/' && vbuf[p]!=0)
p++;
if (vbuf[p]==0)
break;
p++;
}
}
#endif
gtime=(int)GetINIInt(INI_GAME_SETTINGS,"GauntletTime",120,ININAME);
ftime=GetINIInt(INI_GAME_SETTINGS,"Speed",80000l,ININAME);
gauntlet=GetINIBool(INI_GAME_SETTINGS,"GauntletMode",FALSE,ININAME);
GetINIString(INI_GAME_SETTINGS,"Players","1",vbuf,80,ININAME);
strupr(vbuf);
if (vbuf[0]=='2' && vbuf[1]=='S') {
diggers=2;
nplayers=1;
}
else {
diggers=1;
nplayers=atoi(vbuf);
if (nplayers<1 || nplayers>2)
nplayers=1;
}
#ifdef _WINDOWS
sound_output_device=GetINIInt(INI_SOUND_SETTINGS,"WinSoundDevice",1,ININAME);
use_direct_draw=GetINIBool(INI_GRAPHICS_SETTINGS,"UseDirectDraw",TRUE,ININAME);
vidmode_w=GetINIInt(INI_GRAPHICS_SETTINGS,"FullscreenVideoModeWidth",640,ININAME);
vidmode_h=GetINIInt(INI_GRAPHICS_SETTINGS,"FullscreenVideoModeHeight",400,ININAME);
vidmode_bpp=GetINIInt(INI_GRAPHICS_SETTINGS,"FullscreenVideoModeBPP",8,ININAME);
set_preferred_vidmode(vidmode_w,vidmode_h,vidmode_bpp);
#endif
soundflag=GetINIBool(INI_SOUND_SETTINGS,"SoundOn",TRUE,ININAME);
musicflag=GetINIBool(INI_SOUND_SETTINGS,"MusicOn",TRUE,ININAME);
sound_device=(int)GetINIInt(INI_SOUND_SETTINGS,"Device",DEF_SND_DEV,ININAME);
sound_port=(int)GetINIInt(INI_SOUND_SETTINGS,"Port",544,ININAME);
sound_irq=(int)GetINIInt(INI_SOUND_SETTINGS,"Irq",5,ININAME);
sound_dma=(int)GetINIInt(INI_SOUND_SETTINGS,"DMA",1,ININAME);
sound_rate=(int)GetINIInt(INI_SOUND_SETTINGS,"Rate",22050,ININAME);
sound_length=(int)GetINIInt(INI_SOUND_SETTINGS,"BufferSize",DEFAULT_BUFFER,
ININAME);
if (sound_device>0) {
volume=1;
setupsound=s1setupsound;
killsound=s1killsound;
fillbuffer=s1fillbuffer;
initint8=s1initint8;
restoreint8=s1restoreint8;
if (sound_device==1) {
soundoff=s1soundoff;
setspkrt2=s1setspkrt2;
settimer0=s1settimer0;
timer0=s1timer0;
settimer2=s1settimer2;
timer2=s1timer2;
getsample=getsample1;
}
else {
soundoff=s2soundoff;
setspkrt2=s2setspkrt2;
settimer0=s2settimer0;
timer0=s2timer0;
settimer2=s2settimer2;
timer2=s2timer2;
getsample=getsample2;
}
soundinitglob(sound_port,sound_irq,sound_dma,sound_length,sound_rate);
}
#ifdef _WINDOWS
dx_sound_volume=(int)GetINIInt(INI_SOUND_SETTINGS,"SoundVolume",100,ININAME);
set_sound_volume(dx_sound_volume);
#else
dx_sound_volume=(int)GetINIInt(INI_SOUND_SETTINGS,"SoundVolume",0,ININAME);
#endif
g_bWindowed=!GetINIBool(INI_GRAPHICS_SETTINGS,"FullScreen",FALSE,ININAME);
use_640x480_fullscreen=GetINIBool(INI_GRAPHICS_SETTINGS,"640x480",FALSE,
ININAME);
if (!g_bWindowed)
ChangeCoopLevel();
use_async_screen_updates=GetINIBool(INI_GRAPHICS_SETTINGS,"Async",TRUE,
ININAME);
synchvid=GetINIBool(INI_GRAPHICS_SETTINGS,"Synch",FALSE,ININAME);
cgaflag=GetINIBool(INI_GRAPHICS_SETTINGS,"CGA",FALSE,ININAME);
biosflag=GetINIBool(INI_GRAPHICS_SETTINGS,"BIOSPalette",FALSE,ININAME);
if (cgaflag || biosflag) {
ginit=cgainit;
gpal=cgapal;
ginten=cgainten;
gclear=cgaclear;
ggetpix=cgagetpix;
gputi=cgaputi;
ggeti=cgageti;
gputim=cgaputim;
gwrite=cgawrite;
gtitle=cgatitle;
ginit();
gpal(0);
}
unlimlives=GetINIBool(INI_GAME_SETTINGS,"UnlimitedLives",FALSE,ININAME);
startlev=(int)GetINIInt(INI_GAME_SETTINGS,"StartLevel",5,ININAME);
#ifdef _WINDOWS
GetINIString(INI_GAME_SETTINGS,"LevelFile","",levfname,FILENAME_BUFFER_SIZE,ININAME);
levfflag=(levfname[0]!='\0'); /* TRUE; */
#endif
}
void redefkeyb(bool allf)
{
int i,j,k,l,z,y=0;
bool f;
char kbuf[80],vbuf[80];
if (diggers==2) {
outtext("PLAYER 1:",0,y,3);
y+=12;
}
outtext("PRESS NEW KEY FOR",0,y,3);
y+=12;
/* Step one: redefine keys that are always redefined. */
for (i=0;i<5;i++) {
outtext(keynames[i],0,y,2); /* Red first */
findkey(i);
outtext(keynames[i],0,y,1); /* Green once got */
y+=12;
for (j=0;j<i;j++) { /* Note: only check keys just pressed (I hate it when
this is done wrong, and it often is.) */
if (keycodes[i][0]==keycodes[j][0] && keycodes[i][0]!=0) {
i--;
y-=12;
break;
}
for (k=2;k<5;k++)
for (l=2;l<5;l++)
if (keycodes[i][k]==keycodes[j][l] && keycodes[i][k]!=-2) {
j=i;
k=5;
i--;
y-=12;
break; /* Try again if this key already used */
}
}
}
if (diggers==2) {
outtext("PLAYER 2:",0,y,3);
y+=12;
for (i=5;i<10;i++) {
outtext(keynames[i],0,y,2); /* Red first */
findkey(i);
outtext(keynames[i],0,y,1); /* Green once got */
y+=12;
for (j=0;j<i;j++) { /* Note: only check keys just pressed (I hate it when
this is done wrong, and it often is.) */
if (keycodes[i][0]==keycodes[j][0] && keycodes[i][0]!=0) {
i--;
y-=12;
break;
}
for (k=2;k<5;k++)
for (l=2;l<5;l++)
if (keycodes[i][k]==keycodes[j][l] && keycodes[i][k]!=-2) {
j=i;
k=5;
i--;
y-=12;
break; /* Try again if this key already used */
}
}
}
}
/* Step two: redefine other keys which step one has caused to conflict */
z=0;
y-=12;
for (i=10;i<17;i++) {
f=FALSE;
for (j=0;j<10;j++)
for (k=0;k<5;k++)
for (l=2;l<5;l++)
if (keycodes[i][k]==keycodes[j][l] && keycodes[i][k]!=-2)
f=TRUE;
for (j=10;j<i;j++)
for (k=0;k<5;k++)
for (l=0;l<5;l++)
if (keycodes[i][k]==keycodes[j][l] && keycodes[i][k]!=-2)
f=TRUE;
if (f || (allf && i!=z)) {
if (i!=z)
y+=12;
outtext(keynames[i],0,y,2); /* Red first */
findkey(i);
outtext(keynames[i],0,y,1); /* Green once got */
z=i;
i--;
}
}
/* Step three: save the INI file */
for (i=0;i<17;i++)
if (krdf[i]) {
sprintf(kbuf,"%s%c",keynames[i],(i>=5 && i<10) ? '2' : 0);
sprintf(vbuf,"%i/%i/%i/%i/%i",keycodes[i][0],keycodes[i][1],
keycodes[i][2],keycodes[i][3],keycodes[i][4]);
WriteINIString(INI_KEY_SETTINGS,kbuf,vbuf,ININAME);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -