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 >
C/C++ Source or Header  |  1988-07-04  |  5KB  |  203 lines

  1. /*
  2.  * MKSoft SnakePit  Copyright (c) 1988  by Michael Sinz
  3.  *
  4.  * Screen Edit Part program...
  5.  */
  6.  
  7. #include    "Snake.h"
  8.  
  9. static    Pit_Screen    Edit_Screen;
  10. static    BYTE        tool=NORMAL_BRICK;
  11. static    short        Edit_Level=-1;
  12.  
  13. #define    EDIT_POINTER_X    -9L
  14. #define    EDIT_POINTER_Y    -8L
  15. #define    EDIT_POINTER_H    16L
  16. #define    EDIT_POINTER_W    16L
  17. static    short    Edit_Pointer[] =
  18. {
  19.     0x0000,0x0000,
  20.     0xFFFF,0xFFFF,    /* 3333 3333 3333 3333    */
  21.     0xFFFF,0xFFFF,    /* 3333 3333 3333 3333    */
  22.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  23.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  24.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  25.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  26.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  27.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  28.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  29.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  30.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  31.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  32.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  33.     0xC003,0xC003,    /* 3300 0000 0000 0033    */
  34.     0xFFFF,0xFFFF,    /* 3333 3333 3333 3333    */
  35.     0xFFFF,0xFFFF,    /* 3333 3333 3333 3333    */
  36.     0x0000,0x0000
  37. };
  38.  
  39. static    VOID    ShowEdit()
  40. {
  41.     SetPointer(MyWindow,Edit_Pointer,EDIT_POINTER_H,EDIT_POINTER_W,EDIT_POINTER_X,EDIT_POINTER_Y);
  42. }
  43.  
  44. static    VOID    Display_At(x,y,p)    register    short    x;
  45.                     register    short    y;
  46.                     register    short    p;
  47. {
  48. register    struct    Image    *i;
  49.  
  50.     i=&Empty;
  51.     switch (p)
  52.     {
  53.     case NORMAL_BRICK:    i=&Brick;    break;
  54.     case MOVING_BRICK:    i=&MoveBrick;    break;
  55.     case DROP_BRICK:    i=&DropBrick;    break;
  56.     case POPUP_BRICK:    i=&PopUpBrick;    break;
  57.     case GROW_FOOD:        i=&GrowFood;    break;
  58.     case SHRINK_FOOD:    i=&ShrinkFood;    break;
  59.     }
  60.     DrawImage(MyWindow->RPort,i,((long)x<<3L),((long)y<<3L));
  61. }
  62.  
  63. static    VOID    Pick_Edit_Level()
  64. {
  65. register    short    x;
  66. register    short    y;
  67.  
  68.     ClearPointer(MyWindow);
  69.     Edit_Level++;
  70.     Edit_Level=Request_SelectLevel(Edit_Level);
  71.     ShowWait();
  72.     SetRast(MyWindow->RPort,0L);
  73.     UpDate_Status(Edit_Level,0L,0);
  74.     Edit_Level--;
  75.     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]);
  76.     ShowEdit();
  77. }
  78.  
  79. static    VOID    Save_Edit_Level()
  80. {
  81. register    short    x;
  82. register    short    y;
  83.  
  84.     ClearPointer(MyWindow);
  85.     Edit_Level++;
  86.     Edit_Level=Request_SelectLevel(Edit_Level);
  87.     ShowWait();
  88.     UpDate_Status(Edit_Level,0L,0);
  89.     Edit_Level--;
  90.     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];
  91.     ShowEdit();
  92. }
  93.  
  94. static    VOID    Clear_Edit_Screen()
  95. {
  96. register    short    x;
  97. register    short    y;
  98.  
  99.     ShowWait();
  100.     for(x=0;x<NUM_COL;x++)
  101.       for(y=0;y<NUM_ROW;y++)
  102.         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));
  103.     UpDate_Status(Edit_Level+1,0L,0);
  104.     ShowEdit();
  105. }
  106.  
  107. static    VOID    Do_Edit()
  108. {
  109.         struct    IntuiMessage    *msg;
  110. register        short        lastx=0;
  111. register        short        lasty=0;
  112. register        short        x;
  113. register        short        y;
  114.             USHORT        menu;
  115.         struct    MenuItem    *TEMP;
  116.             short        EXIT=TRUE;
  117.  
  118.     while (EXIT)
  119.     {
  120.         WaitPort(MyWindow->UserPort);
  121.         while (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
  122.         {
  123.             switch (msg->Class)
  124.             {
  125.             case MOUSEBUTTONS:
  126.                     if (msg->Code==SELECTDOWN) Display_At(lastx,lasty,Edit_Screen[lastx][lasty]=(Edit_Screen[lastx][lasty] ? EMPTY_SQUARE : tool));
  127.                     break;
  128.             case MOUSEMOVE:    x=(msg->MouseX)>>3;
  129.                     y=(msg->MouseY)>>3;
  130.                     if (x<0) x=0;
  131.                     if (y<0) y=0;
  132.                     if (!(x<NUM_COL)) x=NUM_COL-1;
  133.                     if (!(y<NUM_ROW)) y=NUM_ROW-1;
  134.                     if ((x!=lastx)||(y!=lasty))
  135.                     {
  136.                         Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
  137.                         lastx=x;
  138.                         lasty=y;
  139.                         Display_At(lastx,lasty,tool);
  140.                         if (IEQUALIFIER_LEFTBUTTON & msg->Qualifier) Edit_Screen[lastx][lasty]=tool;
  141.                     }
  142.                     break;
  143.             case MENUPICK:    menu=msg->Code;
  144.                     while(menu!=MENUNULL)
  145.                     {
  146.                         if (MENUNUM(menu)==2) switch (ITEMNUM(menu))
  147.                         {
  148.                         case 0:    switch (SUBNUM(menu))
  149.                             {
  150.                             case 0:    Pick_Edit_Level();
  151.                                 break;
  152.                             case 1:    Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
  153.                                 Save_Edit_Level();
  154.                                 break;
  155.                             case 2:    Clear_Edit_Screen();
  156.                                 break;
  157.                             }
  158.                             break;
  159.                         case 1:    /* These are the    */
  160.                         case 2:    /* various editing    */
  161.                         case 3:    /* tools.  Their    */
  162.                         case 4:    /* Menu number is    */
  163.                         case 5:    /* the Tool Number    */
  164.                         case 6:    tool=ITEMNUM(menu);
  165.                             break;
  166.                         case 7:    tool=EMPTY_SQUARE;
  167.                             break;
  168.                         case 8:    EXIT=FALSE;
  169.                             Display_At(lastx,lasty,Edit_Screen[lastx][lasty]);
  170.                             break;
  171.                         }
  172.                         if (TEMP=ItemAddress(MyWindow->MenuStrip,(long)menu)) menu=TEMP->NextSelect;
  173.                     }
  174.                     break;
  175.             }
  176.             ReplyMsg(msg);
  177.         }
  178.     }
  179. }
  180.  
  181. VOID    Edit_Screens()
  182. {
  183. register        ULONG        tmpIDCMP;
  184.  
  185.     OffMenu(MyWindow,SHIFTMENU(0)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  186.     OffMenu(MyWindow,SHIFTMENU(1)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  187.     OnMenu (MyWindow,SHIFTMENU(2)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  188.  
  189.     tmpIDCMP=MyWindow->IDCMPFlags;
  190.     ModifyIDCMP(MyWindow,MENUPICK | MOUSEBUTTONS | MOUSEMOVE);
  191.  
  192.     Pick_Edit_Level();
  193.     Sound_Play(4,1,0);
  194.     Do_Edit();
  195.     ShowWait();
  196.  
  197.     ModifyIDCMP(MyWindow,tmpIDCMP);
  198.  
  199.     OffMenu(MyWindow,SHIFTMENU(2)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  200.     OnMenu (MyWindow,SHIFTMENU(1)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  201.     OnMenu (MyWindow,SHIFTMENU(0)|SHIFTITEM(NOITEM)|SHIFTSUB(NOSUB) );
  202. }
  203.