⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑灯夜战的时光
💻 C
📖 第 1 页 / 共 2 页
字号:

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 + -