home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
097.lha
/
Ic.Source
/
menu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-11-20
|
15KB
|
632 lines
/*
InvaderCraft von J.Hertel
(C) CW-Publikationen
"menu.c"
Kompilieren mit Aztec C Version 3.20a.
Im Include-Directory muss sich das Header-File "invadercraft1.h" befinden!
Aufruf: cc menu -a
as menu
Linken: siehe invadercraft.c
*/
#include <exec/types.h>
#include <exec/interrupts.h>
#include <graphics/gfx.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <graphics/gfxmacros.h>
#include <hardware/intbits.h>
#include <hardware/dmabits.h>
#include <hardware/custom.h>
#include <hardware/cia.h>
/* Vor Compiler-Aufruf unbedingt "invadercraft1.h" in include/ - Directory
kopieren! */
#include <invadercraft1.h>
extern char *versstr[];
extern int _Dorg,player,anzplay,ship[],version,demo,kick;
extern struct Custom *custom;
extern struct CIA *ciaa;
extern struct RastPort rp,rp2;
extern struct ViewPort vp,vphi;
extern struct BitMap bm,bm2,ab1;
extern UWORD colorhi[],color1[],color2[],color3[];
extern long YA[];
long MITTE[]={87,110};
struct Interrupt VertBIntr;
struct liste slots[MAXVERSIONS][SLOTS];
#define ANZSTR1 6 /* Hauptmenu */
char *textstr[ANZSTR1]={
"Choose Version",
"One Player Game",
"Two Player Game",
"Hall of Fame",
"About",
"Exit"
};
#define ANZSTR3 7 /* About */
char *aboutstr[ANZSTR3]={
"InvaderCraft",
"written by",
"J. Hertel",
"Version 2.0",
"Copyright",
"1987 by",
"CW-Publikationen",
};
#define ANZSTERN 35
UBYTE vstern[ANZSTERN];
USHORT xstern[ANZSTERN],ystern[ANZSTERN];
long zufall=523476729;
USHORT rnd;
VertBServer()
/* Interface zwischen C-Code und Interrupt-Handler */
{
#asm
movem.l d2-d7/a2-a4,-(sp)
move.l a1,a4
#endasm
hinter();
#asm
MOVEQ.L #0,D0
movem.l (sp)+,d2-d7/a2-a4
#endasm
}
/* Zufallszahlen-Routine, Aufruf: rnd1(), Resultat in rnd */
#asm
cseg
_rnd1:
public _rnd1
movem.l d0-d3,-(sp)
move.l _zufall,d0
move.w #7,d3
label:
move.b d0,d1
move.b d0,d2
lsr.b #3,d1
lsr.b #1,d2
eor.b d1,d2
lsr.b #1,d2
roxr.l #1,d0
move.l d0,_zufall
dbra d3,label
move.w d0,_rnd
movem.l (sp)+,d0-d3
rts
cseg
#endasm
interein()
/* Vertical-Blank-Interrupt einschalten fuer die Bewegung der Sterne im
Hintergrund */
{
VertBIntr.is_Node.ln_Type=NT_INTERRUPT;
VertBIntr.is_Node.ln_Pri=-60;
VertBIntr.is_Node.ln_Name="InvaderCraft!";
VertBIntr.is_Data=(APTR)((BYTE *)&_Dorg+32766);
VertBIntr.is_Code=(void (*)())VertBServer;
AddIntServer(INTB_VERTB,&VertBIntr);
}
interaus()
/* Ausschalten des Vertical-Blank-Interrupts */
{
RemIntServer(INTB_VERTB,&VertBIntr);
}
hauptmenu()
/* Hauptmenue (Choose Version/One Player Game/Two Player Game/Hall of Fame/
About/Exit) anzeigen, Joystick abfragen und entsprechende Routinen
aufrufen */
{
int i,item=1;
do {
player=0; anzplay=1; ship[0]=0; ship[1]=0;
titrest();
sync();
if(item==1||item==2)
demorot();
SetRast(&rp2,0L); SetRast(&rp,0L);
auswahlanz(0,1,ANZSTR1,textstr[0]);
for(i=1;i<ANZSTR1;i++)
auswahlanz(i,3,ANZSTR1,textstr[i]);
interein();
if(item==2||item==1) {
sound(15,0,3);
sound(15,0,4);
einblenden(color1,1);
}
else
einblenden(color1,0);
item=0;
do {
for(i=0;i<5;i++) {
sync();
SetRGB4(&vp,10L,(long)(i%5+5),(long)((i+3)%5+6),
(long)((i+6)%6+5));
}
auswahlanz(item,3,ANZSTR1,textstr[item]);
if((custom->joy1dat>>1 ^ custom->joy1dat)&1)
item=(item+1)%6;
else if((custom->joy1dat>>1 ^ custom->joy1dat)&0x100)
item=(item+5)%6;
auswahlanz(item,1,ANZSTR1,textstr[item]);
} while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0) ;
if(item==1||item==2) { /* One/Two Player Game */
ausblenden(1);
interaus();
spiel(item-1);
}
else if(item==3) { /* Hall of Fame */
ausblenden(0);
interaus();
showhi();
while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0) ;
ausblenden(0);
interaus();
}
else if(item==0)
otherversion(); /* Choose Version */
else if(item==4) {
ausblenden(0); /* About */
about1();
einblenden(color3,0);
while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0);
ausblenden(0);
about();
einblenden(color1,0);
while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0);
ausblenden(0);
interaus();
}
else {
ausblenden(1); /* Exit */
interaus();
}
} while(item!=5);
}
otherversion()
/* Menue zur Auswahl der verschiedenen Versionen anzeigen und gewuenschte
Version einschalten */
{
int i;
ausblenden(0);
SetRast(&rp2,0L);
auswahlanz(version,1,MAXVERSIONS,versstr[version]);
for(i=0;i<MAXVERSIONS;i++) {
if(i!=version)
auswahlanz(i,3,MAXVERSIONS,versstr[i]);
}
einblenden(color1,0);
do {
for(i=0;i<5;i++) {
sync();
SetRGB4(&vp,10L,(long)(i%5+5),(long)((i+3)%5+6),(long)((i+6)%6+5));
}
auswahlanz(version,3,MAXVERSIONS,versstr[version]);
if((custom->joy1dat>>1 ^ custom->joy1dat)&1)
version=(version+1)%MAXVERSIONS;
else if((custom->joy1dat>>1 ^ custom->joy1dat)&0x100)
version=(version+MAXVERSIONS-1)%MAXVERSIONS;
auswahlanz(version,1,MAXVERSIONS,versstr[version]);
} while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0);
ausblenden(0);
interaus();
}
demorot()
/* Demo-Modus - Computer spielt nun Invadercraft bis Joystick-Knopf (oder
ausnahmsweise linke Maustaste) betaetigt wird */
{
int demozeiger=0,flg=1;
SetRast(&rp,0L); SetRast(&rp2,0L);
sound(15,0,3);
sound(15,0,4);
demo=1;
for(;;demozeiger=(demozeiger+1)%4) {
/* Auswahl aller Hauptmenuepunkte */
switch(demozeiger) {
case 0:
ausblenden(0);
interein();
about1();
einblenden(color3,flg);
if(sleep()) {
ausblenden(1);
interaus();
goto enddemo1;
}
flg=0;
break;
case 1:
ausblenden(0);
about();
einblenden(color1,0);
if(sleep()) {
ausblenden(1);
interaus();
goto enddemo1;
}
break;
case 2:
ausblenden(0);
interaus();
showhi();
if(sleep()) {
ausblenden(1);
interaus();
goto enddemo1;
}
ausblenden(0);
interaus();
break;
case 3:
SetRast(&rp,0L); SetRast(&rp2,0L);
SetAPen(&rp,0L); SetAPen(&rp2,0L);
if(spiel(0))
goto enddemo;
SetRast(&rp,0L);
break;
}
}
enddemo:
ausblenden(1);
enddemo1:
demo=0;
}
sleep()
/* Joystick und linke Maustaste abfragen; wenn gedrueckt, dann sleep()==1 */
{
int i;
for(i=0;i<300;i++) {
sync();
if((ciaa->ciapra&0x80)==0) {
while ((ciaa->ciapra&0x80)==0);
return(1);
}
if((ciaa->ciapra&0x40)==0) {
while ((ciaa->ciapra&0x40)==0);
return(1);
}
}
return(0);
}
about()
/* Copyright-Hinweis und Name des Programmierers zeigen */
{
int i,j;
SetRast(&rp2,0L);
for(i=0;i<ANZSTR3;i++) {
auswahlanz(i,1,ANZSTR3,aboutstr[i]);
}
}
about1()
/* IFF-Brush ("ic.data:about") mit dem Titel des Programms anzeigen */
{
SetRast(&rp2,0L);
BltBitMap(&ab1,0L,0L,&bm2,VX,VY+MITTE[kick]-ABOUTHEIGHT/2,ABOUTWIDTH,
ABOUTHEIGHT,0xc0L,0xffL);
}
hinter()
/* Sterne im Hintergrund bewegen (einfach, da Dual-Playfield) */
{
int addr1,i;
long addr;
BYTE xz;
OFF_SPRITE
for(i=0;i<ANZSTERN;i++) {
if(xstern[i]< VX-1) {
xstern[i]=XA+VX;
}
addr=ystern[i]*bm.BytesPerRow; addr1=xstern[i]>>3;
if(i&1)
*(bm.Planes[0]+addr+addr1)=0;
if(i&2)
*(bm.Planes[1]+addr+addr1)=0;
if(i&4)
*(bm.Planes[2]+addr+addr1)=0;
xstern[i]-=vstern[i]; addr1=xstern[i]>>3; xz=128>>(xstern[i]&7);
if(i&1) /* Einfaerben der Sterne */
*(bm.Planes[0]+addr+addr1)=xz;
if(i&2)
*(bm.Planes[1]+addr+addr1)=xz;
if(i&4)
*(bm.Planes[2]+addr+addr1)=xz;
}
}
sternsetz()
/* Stern-Koordinaten und Geschwindigkeiten festsetzen */
{
int i;
for(i=0;i<ANZSTERN;i++) {
rnd1();
ystern[i]=(long)YA[kick]*(long)rnd/0x10000L+VY;
rnd1();
vstern[i]=10L*(long)rnd/0x10000L+1;
rnd1();
xstern[i]=(long)XA*(long)rnd/0x10000L+VX;
}
}
auswahlanz(i,j,anzstring,string)
int i,j,anzstring;
char *string;
/* Zeile zweifarbigen Textes anzeigen (automatisch zentrierend)
i Zeilennummer ( Zeilenhoehe = 20 Pixels )
j Farbe (bzw.j+1)
anzstring Anzahl an Zeilen insgesamt (fuer Zentrierung)
string Zeiger auf auszudruckenden String */
{
SetAPen(&rp2,(long)j);
Move(&rp2,XA/2+VX-5L*strlen(string),VY+MITTE[kick]+6L+20L*i-
anzstring*10L+5L);
Text(&rp2,string,(long)strlen(string));
SetAPen(&rp2,(long)j+1L);
Move(&rp2,XA/2+VX-5L*strlen(string)+1L,VY+MITTE[kick]+6L+20L*i-
anzstring*10L+5L);
Text(&rp2,string,(long)strlen(string));
}
showhi()
/* Highscore-Tabelle zeigen */
{
int i,y;
char str[6];
ULONG z;
SetRast(&rp,0L); SetRast(&rp2,0L);
for(y=0;y<SLOTS;y++) {
for(i=0;i<6;i++)
str[i]=' ';
z=slots[version][y].score;
for(i=5;i>=0;i--) {
str[i]= z % 10 + 48;
z/=10;
if(z==0)
break;
}
SetAPen(&rp2,1L);
Move(&rp2,125L,y*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,slots[version][y].who,8L);
Move(&rp2,220L,y*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,str,6L);
SetAPen(&rp2,2L);
Move(&rp2,126L,y*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,slots[version][y].who,8L);
Move(&rp2,221L,y*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,str,6L);
}
interein();
einblenden(color2,0);
}
ausblenden(nichtstill)
int nichtstill;
/* Ausblenden von Grafik und, wenn 'nichtstill' ungleich Null, von Sound
(Soundfile 15) */
{
int i,j;
UWORD zcol;
for(j=0;j<16;j++) {
sync();
if(nichtstill) {
soundvol(15,60-j*4,3);
soundvol(15,60-j*4,4);
}
for(i=0;i<AC;i++) {
zcol=*((UWORD *)vp.ColorMap->ColorTable+i);
if(zcol&0xf00)
zcol-=0x100;
if(zcol&0x0f0)
zcol-=0x010;
if(zcol&0x00f)
zcol-=0x001;
SetRGB4(&vp,(long)i,(long)zcol/256,(long)(zcol/16)%16,
(long)zcol%16);
}
for(i=0;i<HIAC;i++) {
zcol=*((UWORD *)vphi.ColorMap->ColorTable+i);
if(zcol&0xf00)
zcol-=0x100;
if(zcol&0x0f0)
zcol-=0x010;
if(zcol&0x00f)
zcol-=0x001;
SetRGB4(&vphi,(long)i,(long)zcol/256,(long)(zcol/16)%16,
(long)zcol%16);
}
}
}
einblenden(table,nichtstill)
UWORD table[];
int nichtstill;
/* Einblenden von Grafik mit Farbtabelle, die durch table[] festgelegt
wird, und, wenn 'nichtstill' ungleich Null, von Sound (Nr.15) */
{
int i,j;
UWORD zcol;
for(j=0;j<16;j++) {
sync();
if(nichtstill) {
soundvol(15,j*4+4,3);
soundvol(15,j*4+4,4);
}
for(i=0;i<AC;i++) {
zcol=*((UWORD *)vp.ColorMap->ColorTable+i);
if((zcol&0xf00) < (table[i]&0xf00))
zcol+=0x100;
if((zcol&0x0f0) < (table[i]&0x0f0))
zcol+=0x010;
if((zcol&0x00f) < (table[i]&0x00f))
zcol+=0x001;
SetRGB4(&vp,(long)i,(long)zcol/256,(long)(zcol/16)%16,
(long)zcol%16);
}
for(i=0;i<HIAC;i++) {
zcol=*((UWORD *)vphi.ColorMap->ColorTable+i);
if((zcol&0xf00) < (colorhi[i]&0xf00))
zcol+=0x100;
if((zcol&0x0f0) < (colorhi[i]&0x0f0))
zcol+=0x010;
if((zcol&0x00f) < (colorhi[i]&0x00f))
zcol+=0x001;
SetRGB4(&vphi,(long)i,(long)zcol/256,(long)(zcol/16)%16,
(long)zcol%16);
}
}
}
eintrag(wieviel)
ULONG wieviel;
/* Eintragen in die Highscore-Liste (Joystick rechts/links = Cursor steuern,
nach oben/unten = Buchstaben wechseln, Feuerknopf = Beenden) */
{
int i,j,k;
char z,c;
for(i=0;i<SLOTS;i++) {
if(slots[version][i].score<wieviel)
break;
}
if(i==SLOTS)
return();
for(j=SLOTS-1;j>i;j--)
slots[version][j]=slots[version][j-1];
slots[version][i].score=wieviel;
for(j=0;j<8;j++)
slots[version][i].who[j]=' ';
showhi();
z=1; j=0;
do {
if((custom->joy1dat>>1 ^ custom->joy1dat)&1)
z=(z+27)%28;
else if((custom->joy1dat>>1 ^ custom->joy1dat)&0x100)
z=(z+1)%28;
else if(custom->joy1dat & 0x200) {
if(j) {
j--; z=slots[version][i].who[j]-'?';
}
}
else if(custom->joy1dat & 2) {
if(j<7) {
j++; z=slots[version][i].who[j]-'?';
}
}
if(z<0)
if(z==' '-'?')
z=1;
else
z=0;
if(z==1)
c=' ';
else if(z==0)
c='.';
else
c=z+'?';
slots[version][i].who[j]=c;
for(k=0;k<7;k++) {
SetAPen(&rp2,(long)2*(k%2));
Move(&rp2,125L+10L*j,i*10L+MITTE[kick]+VY-SLOTS*5L+2L+6L+3L);
Draw(&rp2,125L+10L*j+10L,i*10L+MITTE[kick]+VY-SLOTS*5L+2L+6L+3L);
sync();
}
SetDrMd(&rp2,JAM2);
Move(&rp2,125L+10L*j,i*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2," ",1L);
Move(&rp2,126L+10L*j,i*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2," ",1L);
SetDrMd(&rp2,JAM1); SetAPen(&rp2,1L);
Move(&rp2,125L+10L*j,i*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,&c,1L);
SetAPen(&rp2,2L);
Move(&rp2,126L+10L*j,i*10L+MITTE[kick]+VY-SLOTS*5L+6L+3L);
Text(&rp2,&c,1L);
} while(ciaa->ciapra&0x80);
while ((ciaa->ciapra&0x80)==0) ;
}
sync()
/* Bildschirmzeile abwarten ( VBeamPos() wird an Stelle von WaitTOF() oder
WaitBOVP() verwendet, da diese Forbid() wieder desaktivieren ) */
{
while(VBeamPos()<240||VBeamPos()>249);
while(VBeamPos()<250);
}