/*
 * MKSoft SnakePit  Copyright (c) 1988  by Michael Sinz
 *
 * Screen Edit Part program...
 */

#include	"Snake.h"

static	Pit_Screen	Edit_Screen;
static	BYTE		tool=NORMAL_BRICK;
static	short		Edit_Level=-1;

#define	EDIT_POINTER_X	-9L
#define	EDIT_POINTER_Y	-8L
#define	EDIT_POINTER_H	16L
#define	EDIT_POINTER_W	16L
static	short	Edit_Pointer[] =
{
	0x0000,0x0000,
	0xFFFF,0xFFFF,	/* 3333 3333 3333 3333	*/
	0xFFFF,0xFFFF,	/* 3333 3333 3333 3333	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xC003,0xC003,	/* 3300 0000 0000 0033	*/
	0xFFFF,0xFFFF,	/* 3333 3333 3333 3333	*/
	0xFFFF,0xFFFF,	/* 3333 3333 3333 3333	*/
	0x0000,0x0000
};

static	VOID	ShowEdit()
{
	SetPointer(MyWindow,Edit_Pointer,EDIT_POINTER_H,EDIT_POINTER_W,EDIT_POINTER_X,EDIT_POINTER_Y);
}

static	VOID	Display_At(x,y,p)	register	short	x;
					register	short	y;
					register	short	p;
{
register	struct	Image	*i;

	i=&Empty;
	switch (p)
	{
	case NORMAL_BRICK:	i=&Brick;	break;
	case MOVING_BRICK:	i=&MoveBrick;	break;
	case DROP_BRICK:	i=&DropBrick;	break;
	case POPUP_BRICK:	i=&PopUpBrick;	break;
	case GROW_FOOD:		i=&GrowFood;	break;
	case SHRINK_FOOD:	i=&ShrinkFood;	break;
	}
	DrawImage(MyWindow->RPort,i,((long)x<<3L),((long)y<<3L));
}

static	VOID	Pick_Edit_Level()
{
register	short	x;
register	short	y;

	ClearPointer(MyWindow);
	Edit_Level++;
	Edit_Level=Request_SelectLevel(Edit_Level);
	ShowWait();
	SetRast(MyWindow->RPort,0L);
	UpDate_Status(Edit_Level,0L,0);
	Edit_Level--;
	for (x=0;x<NUM_COL;x++) for (y=0;y<NUM_ROW;y++) Display_At(x,y,Edit_Screen[x][y]=All_Pit_Screens[Edit_Level][x][y]);
	ShowEdit();
}

static	VOID	Save_Edit_Level()
{
register	short	x;
register	short	y;

	ClearPointer(MyWindow);
	Edit_Level++;
	Edit_Level=Request_SelectLevel(Edit_Level);
	ShowWait();
	UpDate_Status(Edit_Level,0L,0);
	Edit_Level--;
	for (x=0;x<NUM_COL;x++) for (y=0;y<NUM_ROW;y++) All_Pit_Screens[Edit_Level][x][y]=Edit_Screen[x][y];
	ShowEdit();
}

static	VOID	Clear_Edit_Screen()
{
register	short	x;
register	short	y;

	ShowWait();
	for(x=0;x<NUM_COL;x++)
	  for(y=0;y<NUM_ROW;y++)
	    Display_At(x,y,Edit_Screen[x][y]=((x==0)||(y==0)||(y==(NUM_ROW-1))||(x==(NUM_COL-1)))?(((x==1)&&(y==0))?DROP_BRICK:(((x==NUM_COL-2)&&(y!=0))?POPUP_BRICK:NORMAL_BRICK)):(((x==3)&&(y==3))?GROW_FOOD:EMPTY_SQUARE));
	UpDate_Status(Edit_Level+1,0L,0);
	ShowEdit();
}

static	VOID	Do_Edit()
{
		struct	IntuiMessage	*msg;
register		short		lastx=0;
register		short		lasty=0;
register		short		x;
register		short		y;
			USHORT		menu;
		struct	MenuItem	*TEMP;
			short		EXIT=TRUE;

	while (EXIT)
	{
		WaitPort(MyWindow->UserPort);
		while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
		{
			switch (msg->Class)
			{
			case MOUSEBUTTONS:
					if (msg->Code==SELECTDOWN) Display_At(lastx,lasty,Edit_Screen[lastx][lasty]=(Edit_Screen[lastx][lasty] ? EMPTY_SQUARE : tool));
					break;
			case MOUSEMOVE:	x=(msg->MouseX)>>3;
					y=(msg->MouseY)>>3;
					if (x<0) x=0;
					if (y<0) y=0;
					if (!(x<NUM_COL)) x=NUM_COL-1;
					if (!(y<NUM_ROW)) y=NUM_ROW-1;
					if ((x!=lastx)||(y!=lasty))
					{
						Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
						lastx=x;
						lasty=y;
						Display_At(lastx,lasty,tool);
						if (IEQUALIFIER_LEFTBUTTON & msg->Qualifier) Edit_Screen[lastx][lasty]=tool;
					}
					break;
			case MENUPICK:	menu=msg->Code;
					while(menu!=MENUNULL)
					{
						if (MENUNUM(menu)==2) switch (ITEMNUM(menu))
						{
						case 0:	switch (SUBNUM(menu))
							{
							case 0:	Pick_Edit_Level();
								break;
							case 1:	Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
								Save_Edit_Level();
								break;
							case 2:	Clear_Edit_Screen();
								break;
							}
							break;
						case 1:	/* These are the	*/
						case 2:	/* various editing	*/
						case 3:	/* tools.  Their	*/
						case 4:	/* Menu number is	*/
						case 5:	/* the Tool Number	*/
						case 6:	tool=ITEMNUM(menu);
							break;
						case 7:	tool=EMPTY_SQUARE;
							break;
						case 8:	EXIT=FALSE;
							Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
							break;
						}
						if (TEMP=ItemAddress(MyWindow->MenuStrip,(long)menu)) menu=TEMP->NextSelect;
					}
					break;
			}
			ReplyMsg(msg);
		}
	}
}

VOID	Edit_Screens()
{
register		ULONG		tmpIDCMP;

	OffMenu(MyWindow,SHIFTMENU(0)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
	OffMenu(MyWindow,SHIFTMENU(1)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
	OnMenu (MyWindow,SHIFTMENU(2)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );

	tmpIDCMP=MyWindow->IDCMPFlags;
	ModifyIDCMP(MyWindow,MENUPICK | MOUSEBUTTONS | MOUSEMOVE);

	Pick_Edit_Level();
	Sound_Play(4,1,0);
	Do_Edit();
	ShowWait();

	ModifyIDCMP(MyWindow,tmpIDCMP);

	OffMenu(MyWindow,SHIFTMENU(2)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
	OnMenu (MyWindow,SHIFTMENU(1)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
	OnMenu (MyWindow,SHIFTMENU(0)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
}
