📄 sound.c
字号:
/* 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 + -