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

📄 input.c

📁 经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑灯夜战的时光
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (command_buffer!=19)   // the check for this is currently done in mainprog(), so don't clear command_buffer if command_buffer==19
    {
      command_buffer=0;
    }
#endif
    switch (k) {
      case 10: /* Cheat! */
        if (playing) {      /* Why was this "!gauntlet"? */
          playing=FALSE;
          drfvalid=FALSE;
        }
        break;
      case 11: /* Increase speed */
        if (ftime>10000l)
          ftime-=10000l;
        break;
      case 12: /* Decrease speed */
        ftime+=10000l;
        break;
      case 13: /* Toggle music */
        musicflag=!musicflag;
        break;
      case 14: /* Toggle sound */
        soundflag=!soundflag;
        break;
      case 15: /* Exit */
        escape=TRUE;
        break;
      case 16: /* Pause */
        pausef=TRUE;
        break;
#ifdef _WINDOWS
      case 17:
        savedrf=TRUE;
        break;
    }
#else
    }
    if (akeypressed==ASCIIF8) /* Save DRF */
      savedrf=TRUE;
    if (akeypressed!=27 && akeypressed!='n' && akeypressed!='N')
      start=TRUE;                                /* Change number of players */
#endif
  }
}

/* Joystick not yet implemented. It will be, though, using gethrt on platform
   DOSPC. */
void readjoy(void)
{
#ifdef _WINDOWS
  JOYINFO ji;
  if (joyGetPos(0,&ji)==JOYERR_NOERROR)
  {
    joyx=(Sint4) (ji.wXpos / 655);
    joyy=(Sint4) (ji.wYpos / 655);
    joybut1=ji.wButtons & JOY_BUTTON1;
    joybut2=ji.wButtons & JOY_BUTTON2;
  }
#endif
}

void detectjoy(void)
{
#ifdef _WINDOWS
  init_joystick();
#else
  joyflag=FALSE;
#endif
  staticdir=dynamicdir=DIR_NONE;
}

/* Contrary to some beliefs, you don't need a separate OS call to flush the
   keyboard buffer. */
void flushkeybuf(void)
{
  while (kbhit())
    getkey();
  aleftpressed=arightpressed=auppressed=adownpressed=af1pressed=FALSE;
  aleft2pressed=aright2pressed=aup2pressed=adown2pressed=af12pressed=FALSE;
}

void clearfire(int n)
{
  if (n==0)
    af1pressed=FALSE;
  else
    af12pressed=FALSE;
}

bool oupressed=FALSE,odpressed=FALSE,olpressed=FALSE,orpressed=FALSE;
bool ou2pressed=FALSE,od2pressed=FALSE,ol2pressed=FALSE,or2pressed=FALSE;

void readdir(int n)
{
  Sint4 j;
  bool u=FALSE,d=FALSE,l=FALSE,r=FALSE;
  bool u2=FALSE,d2=FALSE,l2=FALSE,r2=FALSE;

  if (n==0) {
    if (auppressed || uppressed) { u=TRUE; auppressed=FALSE; }
    if (adownpressed || downpressed) { d=TRUE; adownpressed=FALSE; }
    if (aleftpressed || leftpressed) { l=TRUE; aleftpressed=FALSE; }
    if (arightpressed || rightpressed) { r=TRUE; arightpressed=FALSE; }
    if (f1pressed || af1pressed) {
      firepflag=TRUE;
      af1pressed=FALSE;
    }
    else
      firepflag=FALSE;

    if (u && !oupressed)
      staticdir=dynamicdir=DIR_UP;
    if (d && !odpressed)
      staticdir=dynamicdir=DIR_DOWN;
    if (l && !olpressed)
      staticdir=dynamicdir=DIR_LEFT;
    if (r && !orpressed)
      staticdir=dynamicdir=DIR_RIGHT;
    if ((oupressed && !u && dynamicdir==DIR_UP) ||
        (odpressed && !d && dynamicdir==DIR_DOWN) ||
        (olpressed && !l && dynamicdir==DIR_LEFT) ||
        (orpressed && !r && dynamicdir==DIR_RIGHT)) {
      dynamicdir=DIR_NONE;
      if (u) dynamicdir=staticdir=2;
      if (d) dynamicdir=staticdir=6;
      if (l) dynamicdir=staticdir=4;
      if (r) dynamicdir=staticdir=0;
    }
    oupressed=u;
    odpressed=d;
    olpressed=l;
    orpressed=r;
    keydir=staticdir;
    if (dynamicdir!=DIR_NONE)
      keydir=dynamicdir;
    staticdir=DIR_NONE;
  }
  else {
    if (aup2pressed || up2pressed) { u2=TRUE; aup2pressed=FALSE; }
    if (adown2pressed || down2pressed) { d2=TRUE; adown2pressed=FALSE; }
    if (aleft2pressed || left2pressed) { l2=TRUE; aleft2pressed=FALSE; }
    if (aright2pressed || right2pressed) { r2=TRUE; aright2pressed=FALSE; }
    if (f12pressed || af12pressed) {
      fire2pflag=TRUE;
      af12pressed=FALSE;
    }
    else
      fire2pflag=FALSE;
    if (u2 && !ou2pressed)
      staticdir2=dynamicdir2=DIR_UP;
    if (d2 && !od2pressed)
      staticdir2=dynamicdir2=DIR_DOWN;
    if (l2 && !ol2pressed)
      staticdir2=dynamicdir2=DIR_LEFT;
    if (r2 && !or2pressed)
      staticdir2=dynamicdir2=DIR_RIGHT;
    if ((ou2pressed && !u2 && dynamicdir2==DIR_UP) ||
        (od2pressed && !d2 && dynamicdir2==DIR_DOWN) ||
        (ol2pressed && !l2 && dynamicdir2==DIR_LEFT) ||
        (or2pressed && !r2 && dynamicdir2==DIR_RIGHT)) {
      dynamicdir2=DIR_NONE;
      if (u2) dynamicdir2=staticdir2=2;
      if (d2) dynamicdir2=staticdir2=6;
      if (l2) dynamicdir2=staticdir2=4;
      if (r2) dynamicdir2=staticdir2=0;
    }
    ou2pressed=u2;
    od2pressed=d2;
    ol2pressed=l2;
    or2pressed=r2;
    keydir2=staticdir2;
    if (dynamicdir2!=DIR_NONE)
      keydir2=dynamicdir2;
    staticdir2=DIR_NONE;
  }
#ifdef _WINDOWS
  readjoy();
  if (joybut1)
    firepflag=TRUE;
#else
  if (joyflag) {
    incpenalty();
    incpenalty();
    joyanay=0;
    joyanax=0;
    for (j=0;j<4;j++) {
      readjoy();
      joyanax+=joyx;
      joyanay+=joyy;
    }
    joyx=joyanax>>2;
    joyy=joyanay>>2;
    if (joybut1)
      firepflag=TRUE;
    else
      firepflag=FALSE;
  }
#endif
}

/* Calibrate joystick while waiting at title screen. This works more
   effectively if the user waggles the joystick in the title screen. */
bool teststart(void)
{
  Sint4 j;
  bool startf=FALSE;
  if (joyflag) {
    readjoy();
    if (joybut1)
      startf=TRUE;
  }
  if (start) {
    start=FALSE;
    startf=TRUE;
#ifndef _WINDOWS
    joyflag=FALSE;
#endif
  }
  if (!startf)
    return FALSE;
  if (joyflag) {
    joyanay=0;
    joyanax=0;
    for (j=0;j<50;j++) {
      readjoy();
      joyanax+=joyx;
      joyanay+=joyy;
    }
    joyx=joyanax/50;
    joyy=joyanay/50;
    jleftthresh=joyx-35;
    if (jleftthresh<0)
      jleftthresh=0;
    jleftthresh+=10;
    jupthresh=joyy-35;
    if (jupthresh<0)
      jupthresh=0;
    jupthresh+=10;
    jrightthresh=joyx+35;
    if (jrightthresh>255)
      jrightthresh=255;
    jrightthresh-=10;
    jdownthresh=joyy+35;
    if (jdownthresh>255)
      jdownthresh=255;
    jdownthresh-=10;
    joyanax=joyx;
    joyanay=joyy;
  }
  return TRUE;
}

/* Why the joystick reading is split between readdir and getdir like this is a
   mystery to me. */
Sint4 getdir(int n)
{
  Sint4 dir=((n==0) ? keydir : keydir2);
  if (joyflag) {
#ifdef _WINDOWS
  if (abs(joyx-50) > abs(joyy-50)) {
    if (joyx<jleftthresh)
      dir=DIR_LEFT;
    if (joyx>jrightthresh)
      dir=DIR_RIGHT;
  }
  else {
    if (joyy<jupthresh)
      dir=DIR_UP;
    if (joyy>jdownthresh)
      dir=DIR_DOWN;
  }
#else
    dir=DIR_NONE;
    if (joyx<jleftthresh)
      dir=DIR_LEFT;
    if (joyx>jrightthresh)
      dir=DIR_RIGHT;
    if (joyx>=jleftthresh && joyx<=jrightthresh) {
      if (joyy<jupthresh)
        dir=DIR_UP;
      if (joyy>jdownthresh)
        dir=DIR_DOWN;
    }
#endif
  }
  if (n==0) {
    if (playing)
      playgetdir(&dir,&firepflag);
    recputdir(dir,firepflag);
  }
  else {
    if (playing)
      playgetdir(&dir,&fire2pflag);
    recputdir(dir,fire2pflag);
  }
  return dir;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -