/*********************************
  MadED.c von Roman Stumm in 1989
 (LevelEditor zu Mad Factory V3.0)
 UPDATE: 19/07/89
 Compilieren:
 cc MadED.c -S -E200 +idf1:MadED.PRE +L
 ln MadED.o -lc32 -ldf1:MadED +C
*********************************/

SHORT savegad(), saveinput(), drawlevel(); /* Routinen deklarieren */
UBYTE eingabe();
char *it[6];
SHORT teil=0; /* aktuelles Teil */

main() /* HAUPTPROGRAMM */
{
(void)openlib();
(void)neu();
x[0]=x[1]=y[0]=y[1]=2;
MoveSprite(vp,&pl2,(x[1]-1)*16,(y[1]-2)*16+11);
MoveSprite(vp,&pl1,(x[0]-1)*16,(y[0]-2)*16+11);
SetMenuStrip(win,&menu1);
for(;;) { /* MAINLOOP */
if(msg = (struct IntuiMessage *)GetMsg(win->UserPort)) {
	class = msg->Class;
	code = msg->Code;
	ReplyMsg(msg);
	switch(class) {
		case MENUPICK: /* Menuwahl */ 
		(void)menu();
		break;
		case MOUSEBUTTONS: /* Level zeichnen */
		(void)zeichne();
		} /* END switch(class) */
	} /* END if */
else if(code==SELECTDOWN) (void)zeichne();
if(art[0]!=5) /* Nur beim AMIGA 2000 notwendig */
MoveSprite(vp,&feind[0],(fx[0]-1)*16,(fy[0]-2)*16+11);
} /* END for(;;) */
} /* END main() */

UBYTE inkey()  /* returns RAWKEY-Code */
{
class=code=NULL;
if((msg =(struct IntuiMessage *) GetMsg(win->UserPort))) {
	code = msg->Code;
	class = msg->Class;
	ReplyMsg(msg);
	}
return((class==RAWKEY)?(UBYTE)code:NULL);
}

SHORT drawlevel() /* Läd u. zeichnet Level auf Screen */ 
{
SHORT nr, h, v, a;
UBYTE gel[10];
(void)neu();
nr = open(path,0);
(void)lseek(nr,348*levelnr,0);
for (h=0;h<=14;h++) {
	for (v=0;v<=19;v++) {
		a=read(nr,&gel,1); /* In Array eintragen */
                bild[v][h]=gel[0];
		if (a!=1) return(-1); /* EOF od. ERROR */	
		DrawImage(rp,&pic[bild[v][h]],v*16,h*16+11); /* Darstellen */
		} /* End for v */
	} /* End for h */
a=read(nr,&gel,1); /* Amöbe */
grow=gel[0];
a=read(nr,&gel,1); /* Frage */
frage=gel[0];
a=read(nr,&gel,1); /* Nächster Level bei Frage */
nextfrag=gel[0];
a=read(nr,&gel,1); /* Nächster Level bei Ausgang */
nextlev=gel[0];
a=read(nr,&gel,4); /* Player 1\2 x,y */
x[0]=gel[0];
y[0]=gel[1];
x[1]=gel[2];
y[1]=gel[3];
for(h=0;h<=4;h++) {
	a=read(nr,&gel,8);
	art[h]=gel[0]; /* Feindart */
 	/* gel[1] (Nummer) 1 BYTE noch unbelegt */
	fx[h]=gel[2]; /* x-Koord Feind */
	fy[h]=gel[3]; /* y-Koord Feind */
	sx[h]=gel[4]; /* Von X */
	sy[h]=gel[5]; /* Von Y */
	zx[h]=gel[6]; /* Bis X */
	zy[h]=gel[7]; /* Bis Y */
	} /* End for h */
a=close(nr); /* File schließen */
return(1); /* OK */
} /* End drawlevel() */

zeichne()
{
register SHORT mx=(scr->MouseX), my=(scr->MouseY);
register SHORT ax=(SHORT)(mx/16), ay=(SHORT)((my-11)/16);
if((my>10)&&(ay<15)) {
mx=ax*16;
my=ay*16+11;
DrawImage(rp,&pic[teil],mx,my);
bild[ax][ay]=teil;
} /* END if */
} /* END zeichne() */

menu() 
{
if(MENUNUM(code)!=MENUNULL)
  switch(MENUNUM(code)) { /* Which Menu */
	case 0: /* Project */
	 switch(ITEMNUM(code)) {
		case 0: /* Load */
		(void)laden();
		break;
		case 1: /* Save */
		(void)saven();
		break;
		case 2: /* New */
		levelnr=nextfrag=nextlev=grow=0;
		(void)neu();
		x[0]=x[1]=y[0]=y[1]=2;
		MoveSprite(vp,&pl2,(x[1]-1)*16,(y[1]-2)*16+11);
		MoveSprite(vp,&pl1,(x[0]-1)*16,(y[0]-2)*16+11);
		break;
		case 3: /* Info */
		(void)info();
		break;
		case 4: /* Quit*/
		(void)closelib();
		} /* End switch ITEMNUM */
	 break;
	case 1: /* Objects */
	teil=(SHORT)ITEMNUM(code);
	break;
	case 2: /* Sprites */
	switch(ITEMNUM(code)) {
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		switch(SUBNUM(code)) {
			case 0: /* Kind */
			(void)kind(ITEMNUM(code));
			break;
			case 1: /* Set Position */
			(void)setposition(ITEMNUM(code));
			break;
			case 2: /* Set Move */
			(void)setmove(ITEMNUM(code));
		} /* END switch SUBNUM */
		break;
		case 5: /* Player 1 */
		(void)setplayer(0);
		break;
		case 6: /* Player 2 */
		(void)setplayer(1);
	}
	break;
	case 3: /* Specials */
	switch(ITEMNUM(code)) {	
		case 0: /* File */
		(void)newfile();
		break;
		case 1: /* Test */
		(void)testlevel();
		break;
		case 2: /* growing */
		(void)growing();
		break;
		case 3: /* 1st ?? */
		frage=SUBNUM(code);
		break;
		} /* END switch ITEMNUM */
	break;
	}; /* End switch MENUNUM */
} /* END menu() */

testlevel() /* Mad aufrufen */
{
SHORT a;
char txt[20];
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,1);
SetBPen(rp2,0);
SetDrMd(rp2,JAM2);
AddGadget(win2,&igad,-1);
ModifyIDCMP(win2,CLOSEWINDOW|GADGETUP);
spinfo.LongInt=(LONG)levelnr;
sprintf(buffer,"%d",levelnr);
(void)neu();
a=(SHORT)eingabe("Test Level:");
CloseWindow(win2);
CloseWindow(win);
CloseScreen(scr);
/* printf("%c[8m\n",27); Fehlerausgabe im CLI abschalten */
sprintf(txt,"Mad %d ",a);
a=Execute(txt,0L,0L);
/* printf("%c[0m\n",27); Fehlerausgabe wieder einschalten */
if(!(scr = (struct Screen *)OpenScreen(&ns)))
(void)closelib();
nw.Screen = scr;
if(!(win = (struct Window *)OpenWindow(&nw)))
(void)closelib();
rp=win->RPort;
vp=ViewPortAddress(win);
SetRGB4(vp,0,0,0,0);
SetRGB4(vp,5,15,4,15);
SetRGB4(vp,12,15,15,0);
SetRGB4(vp,10,0,15,0);
SetRGB4(vp,13,9,2,0);
SetRGB4(vp,15,10,10,10);
SetRGB4(vp,8,8,5,0);
SetRGB4(vp,21,15,3,3);
SetRGB4(vp,22,14,12,12);
SetRGB4(vp,23,0,5,15);
SetRGB4(vp,17,15,1,0);
SetRGB4(vp,18,14,12,0);
SetRGB4(vp,19,8,8,8);
SetRGB4(vp,25,15,1,0);
SetRGB4(vp,26,14,12,0);
SetRGB4(vp,27,8,8,8);
SetRGB4(vp,29,15,1,0);
SetRGB4(vp,30,14,12,0);
SetRGB4(vp,31,8,8,8);
if(a==FALSE) (void)err("Can't execute Mad!");
for(a=1;a<8;a++)
  FreeSprite(a);
(void)GetSprite(&feind[0],1);
(void)GetSprite(&pl1,2);
(void)GetSprite(&pl2,3);
for(a=1;a<5;a++) 
  (void)GetSprite(&feind[a],a+3);
SetMenuStrip(win,&menu1);
x[0]=x[1]=y[0]=y[1]=2;
MoveSprite(vp,&pl2,(x[1]-1)*16,(y[1]-2)*16+11);
MoveSprite(vp,&pl1,(x[0]-1)*16,(y[0]-2)*16+11);
} /* END testlevel() */
 
setplayer(nr)
SHORT nr;
{
UBYTE ret=NULL;
char txt[33];
sprintf(txt,"Set position of Player %d!",nr+1);
SetWindowTitles(win,&txt,NULL);
while(ret!=0x44) {
do {
ret=inkey();
} while(ret==NULL);
switch(ret) {
	case 0x4C: /* hoch */
	if(y[nr]>2) y[nr]--;
	break;
	case 0x4D: /* runter */
	if(y[nr]<16) y[nr]++;
	break;
	case 0x4E: /* rechts */
	if(x[nr]<20) x[nr]++;
	break;
	case 0x4F: /* links */
	if(x[nr]>1) x[nr]--;
} /* switch(ret) */
switch(nr) {
case 0:
MoveSprite(vp,&pl1,(x[0]-1)*16,(y[0]-2)*16+11);
break;
case 1:
MoveSprite(vp,&pl2,(x[1]-1)*16,(y[1]-2)*16+11);
} /* END switch */
} /* END while */
SetWindowTitles(win," Mad Factory V3.0 Level Editor by R.S.",NULL);
} /* END setplayer() */

setposition(nr)
SHORT nr;
{
UBYTE ret=NULL;
char txt[33];
sprintf(txt,"Set position of Enemy %d!",nr+1);
SetWindowTitles(win,&txt,NULL);
while(ret!=0x44) {
ret=inkey();
switch(ret) {
	case 0x4C: /* hoch */
	if(fy[nr]>0) fy[nr]--;
	break;
	case 0x4D: /* runter */
	if(fy[nr]<17) fy[nr]++;
	break;
	case 0x4E: /* rechts */
	if(fx[nr]<21) fx[nr]++;
	break;
	case 0x4F: /* links */
	if(fx[nr]>0) fx[nr]--;
} /* switch(ret) */
if(art[nr]!=5) MoveSprite(vp,&feind[nr],(fx[nr]-1)*16,(fy[nr]-2)*16+11);
} /* END while */
SetWindowTitles(win," Mad Factory V3.0 Level Editor by R.S.",NULL);
} /* END setposition() */

setmove(nr)
SHORT nr;
{
UBYTE ret=NULL;
char txt[33];
SetDrMd(rp,JAM2|COMPLEMENT);
SetAPen(rp,1);
SetBPen(rp,0);
sprintf(txt,"START: Move of Enemy %d!",nr+1);
SetWindowTitles(win,&txt,NULL);
RectFill(rp,(fx[nr]-1)*16,(fy[nr]-2)*16+11,fx[nr]*16-1,(fy[nr]-1)*16+10);
while(ret!=0x44) {
ret=inkey();
switch(ret) {
	case 0x4C: /* hoch */
	if(sy[nr]>0) sy[nr]--;
	break;
	case 0x4D: /* runter */
	if(sy[nr]<17) sy[nr]++;
	break;
	case 0x4E: /* rechts */
	if(sx[nr]<21) sx[nr]++;
	break;
	case 0x4F: /* links */
	if(sx[nr]>0) sx[nr]--;
} /* switch(ret) */
if(art[nr]!=5) MoveSprite(vp,&feind[nr],(sx[nr]-1)*16,(sy[nr]-2)*16+11);
} /* END while */
sprintf(txt,"END: Move of Enemy %d!",nr+1);
SetWindowTitles(win,&txt,NULL);
do {
ret=inkey();
} while(ret!=NULL);
RectFill(rp,(fx[nr]-1)*16,(fy[nr]-2)*16+11,fx[nr]*16-1,(fy[nr]-1)*16+10);
RectFill(rp,(sx[nr]-1)*16,(sy[nr]-2)*16+11,sx[nr]*16-1,(sy[nr]-1)*16+10);
while(ret!=0x44) {
ret=inkey();
switch(ret) {
	case 0x4C: /* hoch */
	if(zy[nr]>0) zy[nr]--;
	break;
	case 0x4D: /* runter */
	if(zy[nr]<17) zy[nr]++;
	break;
	case 0x4E: /* rechts */
	if(zx[nr]<21) zx[nr]++;
	break;
	case 0x4F: /* links */
	if(zx[nr]>0) zx[nr]--;
} /* switch(ret) */
if(art[nr]!=5) MoveSprite(vp,&feind[nr],(zx[nr]-1)*16,(zy[nr]-2)*16+11);
} /* END while */
SetWindowTitles(win," Mad Factory V3.0 Level Editor by R.S.",NULL);
RectFill(rp,(sx[nr]-1)*16,(sy[nr]-2)*16+11,sx[nr]*16-1,(sy[nr]-1)*16+10);
SetDrMd(rp,JAM2);
if(art[nr]!=5) MoveSprite(vp,&feind[nr],(fx[nr]-1)*16,(fy[nr]-2)*16+11);
} /* END setmove() */

info() 
{
register SHORT a, ffx[5], ffy[5];
char txt[30];
for(a=0;a<5;a++) {
ffx[a]=fx[a];
ffy[a]=fy[a];
rfx[a]=rfy[a]=1;
} /* END for */ 
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,17);
SetBPen(rp2,1);
SetDrMd(rp2,JAM2);
SetRast(rp2,1L);
ModifyIDCMP(win2,CLOSEWINDOW);
SetWindowTitles(win2,"Information:",NULL);
RefreshWindowFrame(win2);
Move(rp2,5,20);
sprintf(txt,"LevelNr.: %d",levelnr);
Text(rp2,&txt[0],strlen(&txt));
Move(rp2,5,30);
sprintf(txt,"NextLevel: %d",nextlev);
Text(rp2,&txt[0],strlen(&txt));
Move(rp2,5,50);
Text(rp2,"Meaning of 1st ? :",18);
if(frage!=1) PrintIText(rp2,&text5[frage],5,65);
else {
Move(rp2,5,70);
sprintf(txt,"Exit to Level: %d",nextfrag);
Text(rp2,&txt[0],strlen(&txt));
}
Move(rp2,5,90);
sprintf(txt,"Speed of amorph: %d",grow);
Text(rp2,&txt[0],strlen(&txt));
for(;;) {
if(msg=(struct IntuiMessage *)GetMsg(win2->UserPort)) {
	class=msg->Class;
	ReplyMsg(msg);
	}
if(class==CLOSEWINDOW) { CloseWindow(win2); break; }
}
SetWindowTitles(win,"      Press any key to continue",NULL);
while(inkey()==NULL) {
for(a=0;a<5;a++) if(art[a]<5)(void)feindmove(a);
Delay(8L);
} /* End while */
SetWindowTitles(win," Mad Factory V3.0 Level Editor by R.S.",NULL);
for(a=0;a<5;a++) { 
fx[a]=ffx[a];
fy[a]=ffy[a];
if(art[a]<5) MoveSprite(vp,&feind[a],(fx[a]-1)*16,(fy[a]-2)*16+11);
} /* END for */
} /* End info() */

neu()
{
register SHORT a, b;
SetRast(rp,0L);
RefreshWindowFrame(win);
for(b=0;b<17;b++) for(a=0;a<21;a++) bild[a][b]=0;
for(a=0;a<5;a++) {
art[a]=5;
rfx[a]=rfy[a]=1;
fx[a]=fy[a]=sx[a]=sy[a]=zx[a]=zy[a]=0;
}
for(a=1;a<8;a++) FreeSprite(a);
} /* END neu */

UBYTE eingabe(titel) /* Gibt eingegebene Zahl zurück */
STRPTR titel;
{
RefreshGadgets(&igad,win2,NULL);
Move(rp2,20,35);
Text(rp2,titel,strlen(titel));
for(;;) {
if(msg=(struct IntuiMessage *)GetMsg(win2->UserPort)) {
	class=msg->Class;
	ReplyMsg(msg);
	} /* END if */
else class=NULL;
if(class==CLOSEWINDOW) return(spinfo.LongInt);
else if(class==GADGETUP) (void)integergad();
} /* END for */
} /* End eingabe() */

integergad()
{
spinfo.LongInt=(UBYTE)spinfo.LongInt;
sprintf(buffer,"%d",spinfo.LongInt);
RefreshGadgets(&igad,win2,NULL);
}

saven()
{
struct FileHandle *file, *back;
UBYTE daten[350], backup[36];
int pos;
SHORT a, mode=saveinput(); /* APPEND=0 REWRITE=1 CANCEL=2 DELETE=3 INSERT=4 */
switch(mode) { /* Savemodes */
case 0: /* APPEND */
	file=Open(path,MODE_OLDFILE);
	if(file==NULL) file=Open(path,MODE_NEWFILE);
	if(file==NULL) {
		(void)err("Can't create FILE!");
		return();
		}
	pos=Seek(file,0,OFFSET_END);
	(void)writedata(file);
	Close(file);
	break;
case 1: /* REWRITE */
	file=Open(path,MODE_OLDFILE);
	if(file==NULL) {
		(void)err("Can't open FILE!");
		return();
		}
	pos=Seek(file,levelnr*348,OFFSET_BEGINNING);
	(void)writedata(file);
	Close(file);
	break;
case 2: /* CANCEL */
	return();
	break;
case 3: /* DELETE */
case 4: /* INSERT */
	strcpy(backup,path);
	strcat(backup,".Backup"); 
	back=Open(backup,MODE_NEWFILE);
	if(back==NULL) {
		(void)err("Can't create FILE!");
		return();
		}
	file=Open(path,MODE_OLDFILE);
	if(file==NULL) {
		(void)err("Can't open FILE!");
		return();
		}
	for(a=0;a<levelnr;a++) {
		pos=Read(file,&daten[0],348);
		pos=Write(back,&daten[0],348);
	} /* END for */
	if(mode==3) pos=Read(file,&daten[0],348);
	if(mode==4) (void)writedata(back);
	do {
	pos=Read(file,&daten[0],348);
	if(pos==348) pos=Write(back,&daten[0],348);
	} while(pos==348); /* END DO-WHILE */
	Close(file);
	Close(back);
	pos=DeleteFile(path);
	pos=Rename(backup,path);
} /* END switch */
} /* END saven() */

writedata(file)
struct FileHandle *file;
{
int a;
UBYTE daten[350];
SHORT b, stell=0;
for(a=0;a<15;a++) for(b=0;b<20;b++) daten[stell++]=(UBYTE)bild[b][a];
daten[stell++]=(UBYTE)grow;
daten[stell++]=(UBYTE)frage;
daten[stell++]=(UBYTE)nextfrag;
daten[stell++]=(UBYTE)nextlev;
daten[stell++]=(UBYTE)x[0];
daten[stell++]=(UBYTE)y[0];
daten[stell++]=(UBYTE)x[1];
daten[stell++]=(UBYTE)y[1];
for(a=0;a<5;a++) {
	daten[stell++]=(UBYTE)art[a];
	daten[stell++]=(UBYTE)0; /* Ohne Bedeutung */
	daten[stell++]=(UBYTE)fx[a];
	daten[stell++]=(UBYTE)fy[a];
	daten[stell++]=(UBYTE)sx[a];
	daten[stell++]=(UBYTE)sy[a];
	daten[stell++]=(UBYTE)zx[a];
	daten[stell++]=(UBYTE)zy[a];
	} /* END for */
a=Write(file,&daten[0],348);
} /* END writedata() */

growing()
{
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,1);
SetBPen(rp2,0);
SetDrMd(rp2,JAM2);
AddGadget(win2,&igad,-1);
ModifyIDCMP(win2,CLOSEWINDOW|GADGETUP);
spinfo.LongInt=(LONG)grow;
sprintf(buffer,"%d",grow);
grow=(SHORT)eingabe("Speed of amorph:");
CloseWindow(win2);
} /* END growing() */

laden()
{
SHORT a;
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,1);
SetBPen(rp2,0);
SetDrMd(rp2,JAM2);
AddGadget(win2,&igad,-1);
ModifyIDCMP(win2,CLOSEWINDOW|GADGETUP);
spinfo.LongInt=(LONG)levelnr;
sprintf(buffer,"%d",levelnr);
levelnr=(SHORT)eingabe("Load > Level:");
CloseWindow(win2);
if(drawlevel()==-1) {
	(void)err("Can't load Level!");
	return();
	}
for(a=0;a<5;a++) { /* Sprites einsetzen und darstellen */
	rfx[a]=rfy[a]=1;
	(void)changefeind(a); 
	if(art[a]<5) MoveSprite(vp,&feind[a],(fx[a]-1)*16,(fy[a]-2)*16+11);
	} /* End for a */
MoveSprite(vp,&pl2,(x[1]-1)*16,(y[1]-2)*16+11);
MoveSprite(vp,&pl1,(x[0]-1)*16,(y[0]-2)*16+11);
} /* END laden() */

kind(nr)
SHORT nr; 
{
char boolsatz[30];
SHORT a;
it[0]="Stamper";
it[1]="Waggon";
it[2]="Robot";
it[3]="Borer";
it[4]="Hammer";
it[5]="Nothing";
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,17);
SetBPen(rp2,1);
SetDrMd(rp2,JAM2);
for (a=5;a>=0;a--) AddGadget(win2,&boolgad[a],-1);
ModifyIDCMP(win2,CLOSEWINDOW|GADGETUP);
RefreshGadgets(&boolgad[5],win2,NULL);
sprintf(boolsatz,"Enemy %d: %s",nr+1,it[art[nr]]);
SetWindowTitles(win2,&boolsatz,NULL);
for(;;) {
if(msg=(struct IntuiMessage *)GetMsg(win2->UserPort)) {
	class=msg->Class;
	ReplyMsg(msg);
	}
else class=NULL;
if(class==CLOSEWINDOW) {
	CloseWindow(win2);
	return();
	}
else if(class==GADGETUP) (void)gad(nr);
}
} /* End kind() */

gad(nr)
SHORT nr;
{
char boolsatz[20];
int id=(msg->IAddress->GadgetID)-1;
sprintf(boolsatz,"Enemy %d: %s",nr+1,it[id]);
SetWindowTitles(win2,&boolsatz,NULL);
art[nr]=id;
MoveSprite(vp,&feind[nr],(fx[nr]-1)*16,(fy[nr]-2)*16+11);
(void)changefeind(nr);
}

changefeind(a)
SHORT a;
{
switch(art[a]) {
	 case 0:
	 ChangeSprite(vp,&feind[a],&stamper[a][0]);
	 break;
	 case 1:
	 ChangeSprite(vp,&feind[a],&wagen[a][0]);
	 break;
	 case 2:
	 ChangeSprite(vp,&feind[a],&robot[a][0]);
	 break;
	 case 3:
	 ChangeSprite(vp,&feind[a],&bohrer[a][0]);
	 break;
	 case 4:
	 ChangeSprite(vp,&feind[a],&hammer[a][0]);
	 break;
	 default:
	 FreeSprite(feind[a].num);
	 } /* End switch art[a] */
}

SHORT saveinput() 
{
UBYTE levelanz[20];
SHORT mode=2, a; /* 0=APPEND 1=REWRITE 2=CANCEL 3=DELETE 4=INSERT */
LONG size=0;
struct FileInfoBlock *eintrag;
struct FileLock *lock;
nw2.Screen=scr;
if((win2=OpenWindow(&nw2))==NULL) closelib();
rp2=win2->RPort;
SetAPen(rp2,17);
SetBPen(rp2,1);
SetDrMd(rp2,JAM2);
ModifyIDCMP(win2,CLOSEWINDOW|GADGETUP);
for(a=2;a>=0;a--) AddGadget(win2,&intgad[a],-1);
AddGadget(win2,&modegad,-1);
RefreshGadgets(&intgad[2],win2,NULL);
SetWindowTitles(win2,"Savemode: CANCEL",NULL);
intinfo[0].LongInt=(LONG)levelnr;
sprintf(speich[0],"%d",levelnr);
intinfo[1].LongInt=(LONG)nextlev;
sprintf(speich[1],"%d",nextlev);
intinfo[2].LongInt=(LONG)nextfrag;
sprintf(speich[2],"%d",nextfrag);
RefreshGadgets(&intgad[2],win2,NULL);
if(lock=(struct FileLock *)Lock(path,ACCESS_READ)){
if(eintrag=(struct FileInfoBlock *)
	AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)) {
	if(Examine(lock,eintrag)) size=eintrag->fib_Size;
	FreeMem(eintrag,sizeof(struct FileInfoBlock));
	}
UnLock(lock);
}
if(lock==NULL) (void)err("Can't find MadDATA!");
SetAPen(rp2,17);
SetDrMd(rp2,JAM1);
Move(rp2,10,90);
Text(rp2,path,strlen(path));
Move(rp2,10,100);
Text(rp2,"includes:",9);
Move(rp2,10,110);
sprintf(levelanz,"%ld Level",size/348);
Text(rp2,levelanz,strlen(levelanz));
for(;;) {
if(msg=(struct IntuiMessage *)GetMsg(win2->UserPort)) {
	class=msg->Class;
	ReplyMsg(msg);
	}
if(class==CLOSEWINDOW) {
	CloseWindow(win2);
	return(mode);
	}
else if(class==GADGETUP) mode=savegad(mode);
class=NULL;
} /* END for(;;) */
} /* End saveinput() */

SHORT savegad(mode)
SHORT mode;
{
int id;
id=msg->IAddress->GadgetID;
switch(id) {
	case 1: /* BoolGadget Mode */
	if(mode<4) mode++;
	else mode=0;
	switch(mode) {
		case 0:
		SetWindowTitles(win2,"Savemode: APPEND",NULL);
		break;
		case 1:
		SetWindowTitles(win2,"Savemode: REWRITE",NULL);
		break;
		case 2:
		SetWindowTitles(win2,"Savemode: CANCEL",NULL);
		break;
		case 3:
		SetWindowTitles(win2,"Savemode: DELETE",NULL);
		break;
		default:
		SetWindowTitles(win2,"Savemode: INSERT",NULL);
		} /* END switch(mode) */
	break;
	case 2: /* IntGadget Level */
	case 3: /* IntGadget NextLev */
	case 4: /* IntGadget NextFrag */
	intinfo[id-2].LongInt=(UBYTE)intinfo[id-2].LongInt;
	sprintf(speich[id-2],"%d",intinfo[id-2].LongInt);
	levelnr=(SHORT)intinfo[0].LongInt;
	nextlev=(SHORT)intinfo[1].LongInt;
	nextfrag=(SHORT)intinfo[2].LongInt;
	RefreshGadgets(&intgad[2],win2,NULL);
	} /* END switch(id) */
return(mode);
} /* END savegad() */

newfile()
{
nw2.Screen=scr;
win2=(struct Window *)OpenWindow(&nw2);
if(win2==NULL) (void)closelib();
ModifyIDCMP(win2,CLOSEWINDOW);
AddGadget(win2,&pathgad,-1);
RefreshGadgets(win2->FirstGadget,win2,NULL);
for(;;) {
if(msg=(struct IntuiMessage *)GetMsg(win2->UserPort)) {
	class=msg->Class;
	ReplyMsg(msg);
	if(class==CLOSEWINDOW) {
		CloseWindow(win2);
		(void)testfile();
		return();
		} /* END if class */
	} /* END if msg */
} /* END for(;;) */
} /* END newfile() */

testfile() /* Testet, ob Datei gefunden wird */ 
{
struct FileHandle *file;
file=Open(path,MODE_OLDFILE);
if(file==NULL) {
	(void)err("Can't find File!");
	return();
	}
Close(file);
} /* END testfile() */
