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

📄 sound.c

📁 经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑灯夜战的时光
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Digger Remastered
   Copyright (c) Andrew Jenner 1998-2004 */

#include "def.h"
#include "sound.h"
#include "hardware.h"
#include "main.h"
#include "digger.h"
#include "input.h"

#ifdef _WINDOWS
#include "win_dig.h"
#include "win_snd.h"
#endif

Sint4 wavetype=0,musvol=0;
Sint4 spkrmode=0,timerrate=0x7d0;
Uint4 timercount=0,t2val=0,t0val=0;
Sint4 pulsewidth=1;
Sint4 volume=0;

Sint3 timerclock=0;

bool soundflag=TRUE,musicflag=TRUE;

void soundint(void);
void soundlevdoneoff(void);
void soundlevdoneupdate(void);
void soundfallupdate(void);
void soundbreakoff(void);
void soundbreakupdate(void);
void soundwobbleupdate(void);
void soundfireupdate(void);
void soundexplodeoff(int n);
void soundexplodeupdate(void);
void soundbonusupdate(void);
void soundemoff(void);
void soundemupdate(void);
void soundemeraldoff(void);
void soundemeraldupdate(void);
void soundgoldoff(void);
void soundgoldupdate(void);
void soundeatmoff(void);
void soundeatmupdate(void);
void soundddieoff(void);
void soundddieupdate(void);
void sound1upoff(void);
void sound1upupdate(void);
void musicupdate(void);
void sett0(void);
void setsoundmode(void);
void s0setupsound(void);
void s0killsound(void);
void s0fillbuffer(void);

void (*setupsound)(void)=s0setupsound;
void (*killsound)(void)=s0killsound;
void (*fillbuffer)(void)=s0fillbuffer;
void (*initint8)(void)=s0initint8;
void (*restoreint8)(void)=s0restoreint8;
void (*soundoff)(void)=s0soundoff;
void (*setspkrt2)(void)=s0setspkrt2;
void (*settimer0)(Uint4 t0v)=s0settimer0;
void (*timer0)(Uint4 t0v)=s0timer0;
void (*settimer2)(Uint4 t2v)=s0settimer2;
void (*timer2)(Uint4 t2v)=s0timer2;
void (*soundkillglob)(void)=s0soundkillglob;

bool sndflag=FALSE,soundpausedflag=FALSE;

Sint5 randvs;

Sint4 randnos(Sint4 n)
{
  randvs=randvs*0x15a4e35l+1;
  return (Sint4)((randvs&0x7fffffffl)%n);
}

void sett2val(Sint4 t2v)
{
  if (sndflag)
    timer2(t2v);
}

void soundint(void)
{
  timerclock++;
  if (soundflag && !sndflag)
    sndflag=musicflag=TRUE;
  if (!soundflag && sndflag) {
    sndflag=FALSE;
    timer2(40);
    setsoundt2();
    soundoff();
  }
  if (sndflag && !soundpausedflag) {
    t0val=0x7d00;
    t2val=40;
    if (musicflag)
      musicupdate();
#ifdef ARM
    else
      soundoff();
#endif
    soundemeraldupdate();
    soundwobbleupdate();
    soundddieupdate();
    soundbreakupdate();
    soundgoldupdate();
    soundemupdate();
    soundexplodeupdate();
    soundfireupdate();
    soundeatmupdate();
    soundfallupdate();
    sound1upupdate();
    soundbonusupdate();
    if (t0val==0x7d00 || t2val!=40)
      setsoundt2();
    else {
      setsoundmode();
      sett0();
    }
    sett2val(t2val);
  }
}

void soundstop(void)
{
  int i;
  soundfalloff();
  soundwobbleoff();
  for (i=0;i<FIREBALLS;i++)
    soundfireoff(i);
  musicoff();
  soundbonusoff();
  for (i=0;i<FIREBALLS;i++)
    soundexplodeoff(i);
  soundbreakoff();
  soundemoff();
  soundemeraldoff();
  soundgoldoff();
  soundeatmoff();
  soundddieoff();
  sound1upoff();
}


bool soundlevdoneflag=FALSE;
Sint4 nljpointer=0,nljnoteduration=0;

void soundlevdone(void)
{
  Sint4 timer=0;
  soundstop();
  nljpointer=0;
  nljnoteduration=20;
  soundlevdoneflag=soundpausedflag=TRUE;
  while (soundlevdoneflag && !escape) {
    fillbuffer();
#ifdef _WINDOWS
    do_windows_events();
    if (!wave_device_available)
      soundlevdoneflag=FALSE;
#endif
#ifdef ARM
    gretrace();
    soundint();
#else
    if (timerclock==timer)
      continue;
#endif
    soundlevdoneupdate();
    checkkeyb();
    timer=timerclock;
  }
  soundlevdoneoff();
}

void soundlevdoneoff(void)
{
  soundlevdoneflag=soundpausedflag=FALSE;
}

Sint4 newlevjingle[11]={0x8e8,0x712,0x5f2,0x7f0,0x6ac,0x54c,
                        0x712,0x5f2,0x4b8,0x474,0x474};

void soundlevdoneupdate(void)
{
  if (sndflag) {
    if (nljpointer<11)
      t2val=newlevjingle[nljpointer];
    t0val=t2val+35;
    musvol=50;
    setsoundmode();
    sett0();
    sett2val(t2val);
    if (nljnoteduration>0)
      nljnoteduration--;
    else {
      nljnoteduration=20;
      nljpointer++;
      if (nljpointer>10)
        soundlevdoneoff();
    }
  }
  else
    soundlevdoneflag=FALSE;
}


bool soundfallflag=FALSE,soundfallf=FALSE;
Sint4 soundfallvalue,soundfalln=0;

void soundfall(void)
{
  soundfallvalue=1000;
  soundfallflag=TRUE;
}

void soundfalloff(void)
{
  soundfallflag=FALSE;
  soundfalln=0;
}

void soundfallupdate(void)
{
  if (soundfallflag)
    if (soundfalln<1) {
      soundfalln++;
      if (soundfallf)
        t2val=soundfallvalue;
    }
    else {
      soundfalln=0;
      if (soundfallf) {
        soundfallvalue+=50;
        soundfallf=FALSE;
      }
      else
        soundfallf=TRUE;
    }
}


bool soundbreakflag=FALSE;
Sint4 soundbreakduration=0,soundbreakvalue=0;

void soundbreak(void)
{
  soundbreakduration=3;
  if (soundbreakvalue<15000)
    soundbreakvalue=15000;
  soundbreakflag=TRUE;
}

void soundbreakoff(void)
{
  soundbreakflag=FALSE;
}

void soundbreakupdate(void)
{
  if (soundbreakflag)
    if (soundbreakduration!=0) {
      soundbreakduration--;
      t2val=soundbreakvalue;
    }
    else
      soundbreakflag=FALSE;
}


bool soundwobbleflag=FALSE;
Sint4 soundwobblen=0;

void soundwobble(void)
{
  soundwobbleflag=TRUE;
}

void soundwobbleoff(void)
{
  soundwobbleflag=FALSE;
  soundwobblen=0;
}

void soundwobbleupdate(void)
{
  if (soundwobbleflag) {
    soundwobblen++;
    if (soundwobblen>63)
      soundwobblen=0;
    switch (soundwobblen) {
      case 0:
        t2val=0x7d0;
        break;
      case 16:
      case 48:
        t2val=0x9c4;
        break;
      case 32:
        t2val=0xbb8;
        break;
    }
  }
}


bool soundfireflag[FIREBALLS]={FALSE,FALSE},sff[FIREBALLS];
Sint4 soundfirevalue[FIREBALLS],soundfiren[FIREBALLS]={0,0};
int soundfirew=0;

void soundfire(int n)
{
  soundfirevalue[n]=500;
  soundfireflag[n]=TRUE;
}

void soundfireoff(int n)
{
  soundfireflag[n]=FALSE;
  soundfiren[n]=0;
}

void soundfireupdate(void)
{
  int n;
  bool f=FALSE;
  for (n=0;n<FIREBALLS;n++) {
    sff[n]=FALSE;
    if (soundfireflag[n])
      if (soundfiren[n]==1) {
        soundfiren[n]=0;
        soundfirevalue[n]+=soundfirevalue[n]/55;
        sff[n]=TRUE;
        f=TRUE;
        if (soundfirevalue[n]>30000)
          soundfireoff(n);
      }
      else
        soundfiren[n]++;
  }
  if (f) {
    do {
      n=soundfirew++;
      if (soundfirew==FIREBALLS)
        soundfirew=0;
    } while (!sff[n]);
    t2val=soundfirevalue[n]+randnos(soundfirevalue[n]>>3);
  }
}


bool soundexplodeflag[FIREBALLS]={FALSE,FALSE},sef[FIREBALLS];
Sint4 soundexplodevalue[FIREBALLS],soundexplodeduration[FIREBALLS];
int soundexplodew=0;

void soundexplode(int n)
{
  soundexplodevalue[n]=1500;
  soundexplodeduration[n]=10;
  soundexplodeflag[n]=TRUE;
  soundfireoff(n);
}

void soundexplodeoff(int n)
{
  soundexplodeflag[n]=FALSE;
}

void soundexplodeupdate(void)
{
  int n;
  bool f=FALSE;
  for (n=0;n<FIREBALLS;n++) {
    sef[n]=FALSE;
    if (soundexplodeflag[n])
      if (soundexplodeduration[n]!=0) {
        soundexplodevalue[n]=soundexplodevalue[n]-(soundexplodevalue[n]>>3);
        soundexplodeduration[n]--;
        sef[n]=TRUE;
        f=TRUE;
      }
      else
        soundexplodeflag[n]=FALSE;
  }
  if (f) {
    do {
      n=soundexplodew++;
      if (soundexplodew==FIREBALLS)
        soundexplodew=0;
    } while (!sef[n]);
    t2val=soundexplodevalue[n];
  }
}


bool soundbonusflag=FALSE;
Sint4 soundbonusn=0;

void soundbonus(void)
{
  soundbonusflag=TRUE;
}

void soundbonusoff(void)
{
  soundbonusflag=FALSE;
  soundbonusn=0;
}

void soundbonusupdate(void)
{
  if (soundbonusflag) {
    soundbonusn++;
    if (soundbonusn>15)
      soundbonusn=0;
    if (soundbonusn>=0 && soundbonusn<6)
      t2val=0x4ce;
    if (soundbonusn>=8 && soundbonusn<14)
      t2val=0x5e9;
  }
}


bool soundemflag=FALSE;

void soundem(void)
{
  soundemflag=TRUE;
}

void soundemoff(void)
{
  soundemflag=FALSE;
}

void soundemupdate(void)
{
  if (soundemflag) {
    t2val=1000;
    soundemoff();
  }
}


⌨️ 快捷键说明

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