
 /***************************************************************************
 *Rolf Schneider | Am Birkenwaeldchen 16/18 | 58 Hagen 7 | Tel.: 02331/45569*
 *                                                                          *
 *                      First Amiga Artists Program:                        *
 *                                                                          *
 *                          -- Artist's Copy I --                           *
 *AC1                                                                       *
 ***************************************************************************/


 /***************************************************************************
 *            IncludeFiles...                                               *
 ***************************************************************************/

#include "exec/types.h"
#include "exec/io.h"
#include "exec/memory.h"

#include "lattice/math.h"

#include "graphics/gfx.h"
#include "hardware/dmabits.h"
#include "hardware/custom.h"
#include "hardware/blit.h"
#include "graphics/gfxmacros.h"
#include "graphics/copper.h"
#include "graphics/view.h"
#include "graphics/gels.h"
#include "graphics/regions.h"
#include "graphics/clip.h"
#include "exec/exec.h"
#include "graphics/text.h"
#include "graphics/gfxbase.h"

#include "devices/console.h"
#include "devices/keymap.h"

#include "libraries/dos.h"
#include "graphics/text.h"
#include "libraries/diskfont.h"
#include "intuition/intuition.h"

extern struct Window *OpenWindow();

 /***************************************************************************
 *            Globals...                                                    *
 ***************************************************************************/

UBYTE *BB,buf[11264];

typedef char FName[32]; 
FName Src[200],Dst[200],*pSrc,*pDst,help;
char NSrc[108],NDst[108];
UBYTE stSrc[200],stDst[200];
short zSrc,zDst;
int couDR;

struct Window *Wini;
struct RastPort *RaPort;
struct IntuiMessage *meldung;

 /****** Externals... *************************************************/

extern struct Menu MA; 

extern struct Gadget GInput;

extern struct Gadget GSup;
extern struct Gadget GSdup;
extern struct Gadget GSdisk;
extern struct Gadget GSundo;
extern struct Gadget GSdown;

extern struct Gadget GDup;
extern struct Gadget GDdup;
extern struct Gadget GDdisk;
extern struct Gadget GDundo;
extern struct Gadget GDdown;



USHORT DataCHMark [] = {
	0x0f00,0x0dc0,0x0670,0x031c,0x0670,0x0dc0,0x0f00,0x0000,
	0xf0ff,0xf23f,0xf98f,0xfce3,0xf98f,0xf23f,0xf0ff,0xffff };

struct Image CHMark = {
	0,0,16,8,2,
	&DataCHMark[0],
	0x3,0x0,NULL };

struct NewWindow NW = {
	0,0,640,200,
	1,2,
	DISKREMOVED|DISKINSERTED|GADGETUP|GADGETDOWN|MOUSEBUTTONS|MENUPICK,
	ACTIVATE|GIMMEZEROZERO|SMART_REFRESH,
	&GInput,
	&CHMark,
	" Artist's Copy I, created 1987 by The Amiga Artists!",
	NULL,
	NULL,
	0,0,0,0,
	WBENCHSCREEN  };

 /****** Zeiger fuer Librarys *****************************************/

long IntuitionBase = 0;
long GfxBase = 0;

 /****** Globals fuer Kontrolle ***************************************/

APTR Adress;
ULONG Class;
USHORT Code;
SHORT Mx,My,QST=0,SDfn=0,DDfn=4;

 /***************************************************************************
 *            SubPrograms...                                                *
 ***************************************************************************/


Box (x1,y1,x2,y2)
short x1,y1,x2,y2;
{
Move (RaPort,x1,y1);
Draw (RaPort,x1,y2);
Draw (RaPort,x2,y2);
Draw (RaPort,x2,y1);
Draw (RaPort,x1,y1);
}

Line (x1,y1,x2,y2)
short x1,y1,x2,y2;
{
Move (RaPort,x1,y1);
Draw (RaPort,x2,y2);
}


 /***************************************************************************
 *            MainRoutine...                                                *
 ***************************************************************************/

main()
{
Init();

for (;QST!=1;) 
	{
	Wait (1<<Wini->UserPort->mp_SigBit);
	while (meldung = (struct IntuiMessage *) GetMsg(Wini->UserPort))
	{
	Class = meldung->Class;
	Code  = meldung->Code;
	Adress= meldung->IAddress;
	Mx    = meldung->MouseX;
	My    = meldung->MouseY;
	ReplyMsg (meldung);

	switch (Class)
		{
		case MOUSEBUTTONS: Leftest();
		                   break;

		case GADGETDOWN  : GGtest();
		                   break;

		case MENUPICK    : Menutest();
				   Attack (NSrc,NDst);
		                   break;

		case DISKREMOVED : Mx = TDcheck();
				   if (Mx == 0) break;

				   SetAPen (RaPort,1);
				   if ((Mx & 1) != 0) { RectFill(RaPort,5,11,312,18);
							RectFill(RaPort,8,22,279,173); }
				   if ((Mx & 2) != 0) { RectFill(RaPort,321,11,628,18);
							RectFill(RaPort,324,22,595,173); }

				   for (;QST!=1;) {
				   meldung = (struct IntuiMessage *) GetMsg(Wini->UserPort);
				   if (meldung->Class == DISKINSERTED) {
					if ((Mx & 1) != 0) { NSrc[4]=0;
							     zSrc = Dir (NSrc,&Src[0],stSrc,0,help); }
					if ((Mx & 2) != 0) { NDst[4]=0;
							     zDst = Dir (NDst,&Dst[0],stDst,1,help); }
					QST=1;
								       }

					          }
				   QST=0;
				   Attack (NSrc,NDst);
				   break;
		}
	}
	}

AntiInit();
}

 /***************************************************************************
 *            SubRoutines...                                                *
 ***************************************************************************/

Init()
{
int i,j,x=0,y=0,c=100;

AllImage ();

BB   = (UBYTE *) AllocMem (sizeof(buf),MEMF_CHIP);

pSrc = (FName *) AllocMem (sizeof(Src),MEMF_CHIP);
pDst = (FName *) AllocMem (sizeof(Dst),MEMF_CHIP);

GfxBase  = OpenLibrary ("graphics.library",0);
IntuitionBase = OpenLibrary ("intuition.library",0);

Wini = OpenWindow (&NW);
RaPort = Wini -> RPort;

InitAC2 (Wini);

couDR = TDinit();

SetMenuStrip (Wini,&MA);
for (i=1;i<=2;++i)
	{
	for (j=couDR;j<=3;++j)
		{
		OffMenu (Wini,SHIFTMENU(i)+SHIFTITEM(j));
		}
	}

SetAPen (RaPort,3);
RectFill (RaPort,0,0,631,186);
Delay (10);

SetAPen (RaPort,1);
for (i=0;i<=28;++i)
	{
	x+=537;
	y+=300;
	RectFill (RaPort,158-x/c,88-y/c,158+x/c,88+y/c);
	RectFill (RaPort,473-x/c,88-y/c,473+x/c,88+y/c);
	}

SetAPen (RaPort,2);
Box (2,1,315,176);
Box (318,1,629,176);

SetDrMd (RaPort,JAM2);
SetAPen (RaPort,2);
SetBPen (RaPort,1);
Move (RaPort,130,9);
Text (RaPort,"Source:",7);
Line (114,10,202,10);
Move (RaPort,426,9);
Text (RaPort,"Destination:",12);
Line (410,10,538,10);

Line (5,19,312,19);
Line (321,19,628,19);

Box (7,21,280,174);
Box (323,21,596,174);
RefreshGadgets (&GInput,Wini,NULL);

namcpy ("df0:",NSrc);
namcpy ("ram:",NDst);
zSrc = Dir (NSrc,&Src[0],stSrc,0,help);
zDst = Dir (NDst,&Dst[0],stDst,1,help);

Attack (NSrc,NDst);
}


AntiInit()
{
FreeImage ();
FreeMem (BB  ,sizeof(buf),MEMF_CHIP);
FreeMem (pSrc,sizeof(Src),MEMF_CHIP);
FreeMem (pDst,sizeof(Dst),MEMF_CHIP);
AntiInitAC2 ();
KillTD ();
ClearMenuStrip (Wini);
CloseWindow (Wini);
CloseLibrary (GfxBase);
CloseLibrary (IntuitionBase);
}

Leftest ()
{
FName *F;
UBYTE *St;
short Dr=2,h;

SetAPen (RaPort,2);
if (Code != SELECTDOWN) return(0);
if ((Mx < 280)&&(Mx > 7)) { Dr = 0; h=zSrc; }
if ((Mx < 596)&&(Mx > 324)) { Dr = 1; h=zDst; }
if (Dr == 2) return (0);
if ((My < 30)||(My > (30+ ((h > 18) ? 152 : h*8) ))) return(0);
if (Dr == 0) {
	     F = &Src[0];
	     St= stSrc;
	     }
else         {
	     F = &Dst[0];
	     St= stDst;
	     }
My = (My-31)/8;
F += (My+Fuck(Dr));
St+= (My+Fuck(Dr));
if ((*St & 1) == 1) {
		    SetAPen (RaPort,1);
		    SetBPen (RaPort,2);
		    Move (RaPort,24+Dr*316,My*8+28);
		    Text (RaPort,F,namlen(F));
		    SetAPen (RaPort,2);
		    SetBPen (RaPort,1);
		    if (Dr == 0) {
				 if (namlen(NSrc) > 4) namcat (NSrc,"/");
				 namcat (NSrc,F);
				 zSrc = Dir (NSrc,&Src[0],stSrc,Dr,help);
				 }
		    else         {
				 if (namlen(NDst) > 4) namcat (NDst,"/");
				 namcat (NDst,F);
				 zDst = Dir (NDst,&Dst[0],stDst,Dr,help);
				 }
		    return(0);
		    }
*St ^=128;
if ((*St & 128) == 128) {
			SetAPen (RaPort,1);
			SetBPen (RaPort,2);
			}
Move (RaPort,24+Dr*316,My*8+28);
Text (RaPort,F,namlen(F));
SetAPen (RaPort,2);
SetBPen (RaPort,1);
}

GGtest ()
{
short i;

 /**** Source... *****************************************************/

if (Adress == (APTR)&GSup) {
			   Scroll (&Src[0],stSrc,zSrc,0,-1);
			   return(0);
			   }

if (Adress == (APTR)&GSdup) {
			    if (namcut (NSrc)==1) zSrc = Dir (NSrc,&Src[0],stSrc,0,help);
			    return(0);
			    }

if (Adress == (APTR)&GSdisk) {
			     NSrc[4] = 0;
			     zSrc    = Dir (NSrc,&Src[0],stSrc,0,help);
			     return(0);
			     }

if (Adress == (APTR)&GSundo) {
			     for (i=0;i<=zSrc;++i) stSrc[i]&=127;
			     Puti (&Src[0],stSrc,Fuck(0),zSrc,0);
			     return(0);
			     }

if (Adress == (APTR)&GSdown) {
			     Scroll (&Src[0],stSrc,zSrc,0,1);
			     return(0);
			     }

 /**** Destination... ************************************************/

if (Adress == (APTR)&GDup) {
			   Scroll (&Dst[0],stDst,zDst,1,-1);
			   return(0);
			   }

if (Adress == (APTR)&GDdup) {
			    if (namcut (NDst)==1) zDst = Dir (NDst,&Dst[0],stDst,1,help);
			    return(0);
			    }

if (Adress == (APTR)&GDdisk) {
			     NDst[4] = 0;
			     zDst    = Dir (NDst,&Dst[0],stDst,1,help);
			     return(0);
			     }

if (Adress == (APTR)&GDundo) {
			     for (i=0;i<=zDst;++i) stDst[i]&=127;
			     Puti (&Dst[0],stDst,Fuck(1),zDst,1);
			     return(0);
			     }

if (Adress == (APTR)&GDdown) {
			     Scroll (&Dst[0],stDst,zDst,1,1);
			     return(0);
			     }


}


Menutest ()
{
int Menu,Item;
if (Code == MENUNULL) return(0);
Menu = MENUNUM (Code);
Item = ITEMNUM (Code);

switch (Menu)
	{
	case 0: switch (Item)
		{
		case 0: Copy();
		        break;

		case 1: Delete();
		        break;

		case 2: Makedir();
		        break;

		case 3: rename();
		        break;

		case 4: DiskCopy();
		        break;

		case 5: KillDir();
		        break;

		case 6: QST = 1;
		        break;

		}
	break;

	case 1: SDfn = Item;
		if (Item == 4) { namcpy ("ram:",NSrc); goto yeah1; }
		namcpy ("dfn:",NSrc);
		NSrc[2] = 48 + SDfn;
yeah1:		zSrc = Dir (NSrc,&Src[0],stSrc,0,help);
	        break;

	case 2: DDfn = Item;
		if (Item == 4) { namcpy ("ram:",NDst); goto yeah2; }
		namcpy ("dfn:",NDst);
		NDst[2] = 48 + DDfn;
yeah2:		zDst = Dir (NDst,&Dst[0],stDst,1,help);
	        break;

	case 3: TAA();
	        break;

	}
}

