home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff343.lzh
/
SnakePit
/
SnakePitSrc.lzh
/
Snake_Edit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-07-04
|
5KB
|
203 lines
/*
* 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) );
}