home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD2.img
/
d4xx
/
d481
/
wavemaker
/
guts.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-09
|
8KB
|
351 lines
#include <math.h>
#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <devices/audio.h>
#include <proto/intuition.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Window *Window;
extern struct Screen *Screen;
extern struct ViewPort *ViewPort;
extern struct RastPort *rport;
extern struct IOAudio *ioa,*audio,*finish[4],*audchan[4];
extern struct IntuiText About1;
extern struct Gadget propor8;
extern struct Gadget propor7;
extern struct Gadget propor6;
extern struct Gadget propor5;
extern struct Gadget propor4;
extern struct Gadget propor3;
extern struct Gadget propor2;
extern struct Gadget propor1;
extern struct IntuiText textamp;
extern struct IntuiText OK;
extern struct IntuiText Answer1;
extern struct Border RWave_brd5;
extern struct Border UWave_brd5;
extern struct Border SWave_brd5;
extern SHORT sinewave[8][513];
extern BYTE *usersound,*refsound;
extern char textbuf[6];
extern LONG amps[8],refamps[8];
extern USHORT userwave[513][2],refwave[513][2],selwave[513][2];
extern UBYTE selflag;
extern SHORT waiting[5];
#define YES 1
#define NO 0
extern LONG maxuser,maxref;
extern LONG maxamp;
extern BYTE waveform[514],refform[514],selform[514];
extern BYTE *usersound,*refsound;
extern SHORT gameon;
extern char Answers[80];
/********************************************************************/
VOID Update(USHORT gadno)
/* Update the amplitudes and screen when one amplitude has been changed */
{
VOID AmpsUpdate(),DrawUser();
LONG MakeWave();
if (amps[gadno]>127) amps[gadno]=127;
if (amps[gadno]<-127) amps[gadno]=-127;
maxuser=MakeWave(amps,waveform,usersound);
AmpsUpdate();
DrawUser();
}
/*************************************************************/
VOID DoMenu(USHORT mcode)
/* Does the right thing when a menu option is chosen */
{
#define PROJECT_MENU 0
#define WAVE_MENU 1
#define GAME_MENU 2
#define ABOUT 0
#define FULLSCALE 1
#define SCREENBACK 2
#define SCREENFRONT 3
#define QUIT 4
#define START_EASY 0
#define START_HARD 1
#define STOP 2
switch(MENUNUM(mcode))
{
LONG peak,retval;
SHORT i,item,scale;
LONG temp,AddWaves(),randamp(),checkval(),MakeWave(),AutoRequest();
VOID AmpsUpdate(),PropUpdate(),DrawUser(),WaveCleanup(),rescale();
static SHORT canned[4][8]={{ 0, 0, 0, 0, 0, 0, 0, 0},
{108, 0,-12, 0, 4, 0, -2, 0},
{ 74,-38, 24,-20, 14,-12, 10, -9},
{124, 0, 41, 0, 25, 0, 18, 0}};
case PROJECT_MENU:
switch (ITEMNUM(mcode))
{
case ABOUT:
{
retval=AutoRequest(Window,&About1,&OK,&OK,
NULL,NULL,500,130);
break;
}
case FULLSCALE:
{
if ((peak=checkval(maxuser,amps))!=0)
rescale(peak,amps);
maxuser=AddWaves(amps,0xFF,waveform,
usersound)>>15;
AmpsUpdate();
PropUpdate();
DrawUser();
break;
}
case SCREENBACK:
{
ScreenToBack(Screen);
break;
}
case SCREENFRONT:
{
ScreenToFront(Screen);
break;
}
case QUIT:
{
WaveCleanup();
Exit(TRUE);
}
}
break;
case WAVE_MENU:
item = ITEMNUM(mcode);
for (i=0; i<8; ++i)
{
amps[i] = canned[item][i];
}
if (item == 0)
{
for (i=0; i<4; i++)
{
BeginIO(finish[i]);
WaitIO(finish[i]);
waiting[i]=NO;
}
}
AmpsUpdate();
PropUpdate();
maxuser=MakeWave(amps,waveform,usersound);
DrawUser();
break;
case GAME_MENU:
switch (ITEMNUM(mcode))
{
case START_EASY:
gameon = YES;
for (i=0; i<4; i++)
{
refamps[i] = randamp();
}
for (i=4;i<8;i++) refamps[i]=0;
maxref=MakeWave(refamps,refform,refsound);
if (maxref==0) maxref=1;
scale=maxamp/maxref;
for (i=0;i<4;++i)
{
temp=refamps[i]*scale;
refamps[i]=temp>>7;
}
maxref=AddWaves(refamps,0x0F,refform,
NULL)>>15;
for (i=0; i<513; ++i)
{
refwave[i][1]=((129-refform[i])*48)>>7;
}
DrawUser();
break;
case START_HARD:
gameon = YES;
for (i=0; i<8; i++)
{
refamps[i] = randamp();
}
maxref=MakeWave(refamps,refform,refsound);
if (maxref==0) maxref=1;
scale=maxamp/maxref;
for (i=0;i<8;++i)
{
temp=refamps[i]*scale;
refamps[i]=temp>>7;
}
maxref=AddWaves(refamps,0xFF,refform,
NULL)>>15;
for (i=0; i<513; ++i)
{
refwave[i][1]=((129-refform[i])*48)>>7;
}
DrawUser();
break;
case STOP:
gameon = NO;
sprintf(Answers,
"%6d %6d %6d %6d %6d %6d %6d %6d",
refamps[0],refamps[1],refamps[2],
refamps[3],refamps[4],refamps[5],
refamps[6],refamps[7]);
retval=AutoRequest(Window,&Answer1,&OK,&OK,
NULL,NULL,620,80);
DrawUser();
break;
}
break;
}
}
/****************************************************************/
VOID AmpsUpdate()
/* Update the numerical amplitude displays */
{
SHORT i;
SHORT boxx[8]={34,108,182,256,330,404,478,552};
for (i=0;i<8;i++)
{
sprintf(textbuf,"%5d",amps[i]);
PrintIText(rport,&textamp,boxx[i],188);
}
}
/****************************************************************/
VOID PropUpdate()
/* Update the proportional gadgets after a rescaling */
{
USHORT temp;
temp=amptopot(amps[7]);
ModifyProp(&propor8,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[6]);
ModifyProp(&propor7,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[5]);
ModifyProp(&propor6,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[4]);
ModifyProp(&propor5,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[3]);
ModifyProp(&propor4,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[2]);
ModifyProp(&propor3,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[1]);
ModifyProp(&propor2,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
temp=amptopot(amps[0]);
ModifyProp(&propor1,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF,
temp,0x0800,0x0800);
}
/*****************************************************************/
LONG MakeWave(LONG ampl[],BYTE wf[],UBYTE *ws)
/* Makes the compound waveform (via AddWaves) and checks that it */
/* is not off scale. If it is, it rescales. */
{
LONG peak;
LONG maxnow;
LONG AddWaves();
LONG checkval();
VOID rescale();
maxnow=AddWaves(ampl,0xFF,wf,ws)>>15;
if ((peak=checkval(maxnow,ampl))>127)
{
rescale(peak,ampl);
maxnow=AddWaves(ampl,0xFF,wf,ws)>>15;
PropUpdate();
}
return(maxnow);
}
/******************************************************************/
LONG checkval(LONG maxval,LONG ampl[])
/* Checks maxval, and all of the amps[i] to find the largest */
/* in absolute value. */
{
SHORT i;
LONG temp;
temp = maxval;
for (i=0; i<8; ++i)
{
if (abs(ampl[i])>temp) temp=abs(ampl[i]);
}
return(temp);
}
/******************************************************************/
VOID rescale(LONG peak,LONG ampl[])
/* rescale to make the amplitude a high as possible without having */
/* any ampltiude or the compound wave exceed 127 in absolute value */
{
extern LONG maxamp;
SHORT scale,i;
LONG temp;
scale=maxamp/peak;
for (i=0;i<8;++i) /* Be careful not to lose bits */
{
temp=ampl[i]*scale;
ampl[i]=temp>>7;
}
}
/***********************************************************************/
VOID DrawUser()
/* Draws the compound waveform in the display area. */
{
SHORT i;
LONG maxsel;
for (i=0;i<513;++i) userwave[i][1]=((129-waveform[i])*48)>>7;
SetAPen(rport,1);
RectFill(rport,64,14,577,109);
SetAPen(rport,3);
RectFill(rport,64,61,577,61);
if (selflag)
{
maxsel=AddWaves(amps,selflag,selform,NULL);
for (i=0; i<513; i++) selwave[i][1]=((129-selform[i])*48)>>7;
DrawBorder(rport,&SWave_brd5,0,0);
}
if (gameon) DrawBorder(rport,&RWave_brd5,0,0);
DrawBorder(rport,&UWave_brd5,0,0);
}