#include <cube2.h>

feed(process)
 char *process;
{
 static int side=6,direc=0,ori=0;

   do{
      switch(*process){
	 case 'o' :ori=1;
		   break;
	 case '2' :direc=2;
		   break;
	 case 'a' :if(ori==1)
		      side=3;
		   else
		      direc=1;
		   break;
	 case 'u' :if(ori==1)
		      side=4;
		   else
		      side=0;
		   break;
	 case 'f' :side=1;
		   break;
	 case 'l' :if(ori==1)
		      side=0;
		   else
		      side=2;
		   break;
	 case 'b' :side=3;
		   break;
	 case 'r' :if(ori==1)
		     side=5;
		   else
		     side=4;
		   break;
	 case 'd' :if(ori==1)
		     side=2;
		   else
		     side=5;
		   break;
	 case 'c' :if(ori==1)
		     side=1;
		   break;
	 default  :break;
	 }
	 Write(process);

	 if(ori==1 && side<6){
	     orient(side);
	     if(single && !best)
		Keywait();
	     ori=0;
	     side=6;
	     direc=0;
	 }
	 if(ori==0 && side<6){
	    rotate(side,direc);
	    side=6;
	    direc=0;
	    ori=0;
	    if(single && !best)
	      Keywait();
	    total++;
	 }
   }while(*process++);
   if(wait && !best)
      Keywait();
}

Keywait()
{
 ULONG class,menunum,menuitem;	/* copying 20 bytes. IntuiMessage is 52  */
 USHORT code,id;		/* It looks about the same.  If you copy */
 SHORT mousex,mousey;		/* the whole message, you still have to  */
 struct Gadget *addr;		/* recopy part of the copy */

   buffer=0;
   Wait(1<<Wdw->UserPort->mp_SigBit);

   while(msg=(struct IntuiMessage*)GetMsg(Wdw->UserPort))
   {
      class=msg->Class;
      code=msg->Code;
      mousex=msg->MouseX;
      mousey=msg->MouseY;
      addr=(struct Gadget*)msg->IAddress;

      ReplyMsg((struct IntuiMessage*)msg);

	 switch(class){
	    case VANILLAKEY  :buffer++;
			      if(buffer>BUFSIZE-1)
				 buffer=BUFSIZE-1;
			      key[buffer]=code;
			      break;
	    case MENUPICK    :menunum=MENUNUM(code);
			      menuitem=ITEMNUM(code);
			      if(menunum==0)
				 DoMenu(menuitem);
			      break;
	   case MOUSEBUTTONS :ProcMouse(mousex,mousey);
			      break;
	   case GADGETDOWN   :procgads(addr);
			      break;
	   default	     :break;
	 }
   }
}

Write(letter)
 char *letter;
{
   if(best) return;

   if(*letter){
      Text(rp2,letter,1);
      if(rp2->cp_x>620){
	 yp+=9;
	 if(yp>61){
	    yp=61;
	    ScrollRaster(rp2,0,9,0,0,640,80);
	  }
	 Move(rp2,15,yp);
      }
   }
}

rotate(side,direction)
 int side,direction;
{
 int j,i;
 char *source,*dest;

   if(direction==2){
      direction=0;
      rotate(side,direction);
   }
   if(!best)
      (*pf[side])(direction);

   for(j=0;j<4;j++){        /* move 3 pieces per side over to next side */
      source=arr1_pointer+pointer_arr[side][j];

      if(!direction){
	 if(j<3)
	    dest=arr2_pointer+pointer_arr[side][j+1];
	 else
	    dest=arr2_pointer+pointer_arr[side][j-3];
      }
      else{
	 if(j<1)
	    dest=arr2_pointer+pointer_arr[side][j+3];
	 else
	    dest=arr2_pointer+pointer_arr[side][j-1];
      }
      for(i=0;i<3;i++){
	 *dest++=*source++;
	 if(*source>15)
	    source-=8;
	 if(*dest>15)
	    dest-=8;
      }
   }
   if(!direction){            /* do surface move 8 pieces */
      for(j=1;j<3;j++)
	 arr2[side][j]=arr1[side][j+6];
      for(;j<9;j++)
	 arr2[side][j]=arr1[side][j-2];
   }
   else{
      for(j=1;j<7;j++)
	 arr2[side][j]=arr1[side][j+2];
      for(;j<9;j++)
	 arr2[side][j]=arr1[side][j-6];
   }
   update(0);
}

update(gadget)
 int gadget;
{
 char *p1=&arr1[0][0];
 char *p2=&arr2[0][0];
 char j=0;

   if(!best && hesitate && !gadget)
      Delay(hesitate);

   while(j++<60)
      *p1++=*p2++;

   if(!best)
      DrawHome();
   if(!best && hesitate && !gadget)
      Delay(hesitate);

}

orient(who)               /* if who is between 0 and 5 direction has */
 int who;		  /* already been selected else goto keyboard */
{
 int j,i,x;
 char *source,*dest;
 char opp,a,b,c,d,side;

      if(who>5){
	 do
	 {
	    if(buffer==0)
	       Keywait();
	    for(x=0;x<buffer;x++)
	       key[x]=key[x+1];
	    if(buffer>0)
	       buffer--;
	    switch(key[0]){
	       case'l':side=0;
		       break;
	       case'c':side=1;
		       break;
	       case'd':side=2;
		       break;
	       case'a':side=3;
		       break;
	       case'u':side=4;
		       break;
	       case'r':side=5;
		       break;
	       default:side=6;
		       break;
	    }
	 }while(side>5);
      Write(key);
      }
      else
	 side=(char)who;

      if(!best)
	 (*op[side])(side);

      for(j=0;j<4;j++){               /* rotate sides all eight pieces */
       source=arr1_pointer+pointer_arr[side][j];

       if(j<3)
	 dest=arr2_pointer+pointer_arr[side][j+1];
       else
	 dest=arr2_pointer+pointer_arr[side][j-3];

       for(i=0;i<8;i++){
	  *dest++=*source++;
	  if(*source>15)
	     source-=8;
	  if(*dest>15)
	     dest-=8;
	}
      }
      for(j=1;j<3;j++)                /* rotate one side clockwise */
	 arr2[side][j]=arr1[side][j+6];
      for(;j<9;j++)
	 arr2[side][j]=arr1[side][j-2];

      opp=opposite[side];

      for(j=1;j<7;j++)                /* rotate the opposite anticlockwise */
	 arr2[opp][j]=arr1[opp][j+2];
      for(;j<9;j++)
	 arr2[opp][j]=arr1[opp][j-6];

      a=orient_ptrs[side][0];	      /* rotate center spots */
      b=orient_ptrs[side][1];
      c=orient_ptrs[side][2];
      d=orient_ptrs[side][3];

      arr2[0][a]=arr1[0][d];
      arr2[0][b]=arr1[0][a];
      arr2[0][c]=arr1[0][b];
      arr2[0][d]=arr1[0][c];

      Write(" ");
      update(0);
      if(dided)
	 ColorGads();
}

StartScreens()
{
 int i;

   HBM=&hbm;
   HRP=&hrp;

   if(!(IntuitionBase=(struct IntuitionBase*)
		    OpenLibrary("intuition.library",0)))   finish();
   if(!(GfxBase=(struct GfxBase*)OpenLibrary("graphics.library",0)))
	 finish();
   if(!(NewWdw.Screen=CustScr=(struct Screen*)OpenScreen(&NewCustScr)))
	 finish();
   if(!(Wdw=(struct Window*)OpenWindow(&NewWdw)))
	 finish();
   if(!(PrintWdw.Screen=PrtScr=(struct Screen*)OpenScreen(&PrintScr)))
	 finish();
   if(!(Wdw2=(struct Window*)OpenWindow(&PrintWdw)))
	 finish();

   if(!(FontPtr=(struct TextFont*)OpenFont(&SysFont)))
	 finish();
   SetFont(rp2,FontPtr);
   SetFont(rp,FontPtr);

   SetMenuStrip(Wdw,FirstMenu);

   WVP=(struct ViewPort*)ViewPortAddress(Wdw);
   LoadRGB4(WVP,colorcode,8);
   WVP2=(struct ViewPort*)ViewPortAddress(Wdw2);
   LoadRGB4(WVP2,colormap2,4);

   InitBitMap(HBM,DEPTH,WIDTH,HEIGHT);

   InitRastPort(HRP);

   HRP->BitMap=HBM;

   for(i=0;i<DEPTH;i++){
      HBM->Planes[i]=NULL;
   }
   for(i=0;i<DEPTH;i++){
      HBM->Planes[i]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
	  if(HBM->Planes[i]==NULL)
	     finish();
   }
   SetRast(HRP,0);
   SetAPen(rp,7);
   SetOPen(rp,7);
   SetAPen(HRP,7);
   SetOPen(HRP,7);
   SetAPen(rp2,2);
   SetOPen(rp2,2);

   Move(rp,0,0);      /* draw border */
   Draw(rp,319,0);
   Draw(rp,319,139);
   Draw(rp,0,139);
   Draw(rp,0,0);
   Move(rp,2,2);
   Draw(rp,317,2);
   Draw(rp,317,137);
   Draw(rp,2,137);
   Draw(rp,2,2);
}

DrawHome()
{
 int a,b,x,y;

   SetRast(HRP,0);
   for(x=0;x<9;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }

   DrawBord.Count=32;
   DrawBord.XY=HDraw;
   DrawBorder(HRP,&DrawBord,40,17);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawR(direction)
 int direction;
{
 int x,y,a,b;

   SetRast(HRP,0);
   for(x=4;x<9;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }

   SetAPen(HRP,arr1[0][0]);
   a=Homeblit[0][0];
   b=Homeblit[1][0];
   BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
   SetAPen(HRP,arr1[1][0]);
   a=Homeblit[2][0];
   b=Homeblit[3][0];
   BltPattern(HRP,PaintF,a,b,a+32,b+23,4);

   if(direction==1){
      SetAPen(HRP,arr1[0][1]);
      BltPattern(HRP,PaintLRUpper,88,15,126,36,6);
      SetAPen(HRP,arr1[0][3]);
	 BltPattern(HRP,PaintLRUpper,78,61,116,82,6);
      SetAPen(HRP,arr1[0][2]);
      BltPattern(HRP,PaintLRUpper,83,38,121,59,6);
      SetAPen(HRP,arr1[1][1]);
      BltPattern(HRP,PaintLRLower,78,84,116,94,6);
      SetAPen(HRP,arr1[1][2]);
      BltPattern(HRP,PaintLRLower,84,96,122,106,6);
      SetAPen(HRP,arr1[1][3]);
      BltPattern(HRP,PaintLRLower,90,108,128,118,6);
  }
  else{
      SetAPen(HRP,arr1[1][1]);
      BltPattern(HRP,PaintLRUpper,88,15,126,36,6);
      SetAPen(HRP,arr1[1][2]);
	 BltPattern(HRP,PaintLRUpper,83,38,121,59,6);
      SetAPen(HRP,arr1[1][3]);
      BltPattern(HRP,PaintLRUpper,78,61,116,82,6);
      SetAPen(HRP,arr1[5][1]);
      BltPattern(HRP,PaintLRLower,78,84,116,94,6);
      SetAPen(HRP,arr1[5][2]);
      BltPattern(HRP,PaintLRLower,84,96,122,106,6);
      SetAPen(HRP,arr1[5][3]);
      BltPattern(HRP,PaintLRLower,90,108,128,118,6);
   }
   for(x=0;x<9;x++){             /* do rh surface */
      SetAPen(HRP,arr1[4][x]);
      if(direction==1){
	 a=RSurfaceAnti[0][x];
	 b=RSurfaceAnti[1][x];
      }
      else{
	 a=RSurfaceClock[0][x];
	 b=RSurfaceClock[1][x];
      }
      BltPattern(HRP,PaintRSurface,a,b,a+10,b+33,2);
   }
   SetAPen(HRP,7);
   x=40;
   y=17;
   Move(HRP,x,y);
   Draw(HRP,x-24,y+24);
   Draw(HRP,x-24,y+99);
   Draw(HRP,x+8,y+99);
   Draw(HRP,x+8,y+24);
   Draw(HRP,x+32,y);
   Draw(HRP,x,y);
   Move(HRP,x-8,y+8);
   Draw(HRP,x+50,y+8);
   Move(HRP,x-16,y+16);
   Draw(HRP,x+48,y+16);
   Move(HRP,x-24,y+24);
   Draw(HRP,x+40,y+24);
   Move(HRP,x+32,y);
   Draw(HRP,x+50,y);
   Move(HRP,x+47,y+17);
   Draw(HRP,x+40,y+24);
   Draw(HRP,x+40,y+50);
   Move(HRP,x+40,y+72);
   Draw(HRP,x+40,y+99);
   Draw(HRP,x+8,y+99);
   Move(HRP,x-24,y+49);
   Draw(HRP,x+40,y+49);
   Move(HRP,x-24,y+74);
   Draw(HRP,x+40,y+74);
   Move(HRP,x+40,y+99);
   Draw(HRP,x+49,y+90);
		   /* end of stationary part */
   Move(HRP,x+37,y+66);
   Draw(HRP,x+69,y+66);
   Draw(HRP,x+84,y-3);
   Draw(HRP,x+52,y-3);
   Draw(HRP,x+37,y+66);
   Draw(HRP,x+55,y+102);
   Draw(HRP,x+87,y+102);
   Draw(HRP,x+69,y+66);
   Move(HRP,x+87,y+102);
   Draw(HRP,x+102,y+33);
   Draw(HRP,x+84,y-3);
   Move(HRP,x+47,y+20);
   Draw(HRP,x+79,y+20);
   Draw(HRP,x+97,y+56);
   Move(HRP,x+42,y+43);
   Draw(HRP,x+74,y+43);
   Draw(HRP,x+92,y+79);
   Move(HRP,x+43,y+78);
   Draw(HRP,x+75,y+78);
   Draw(HRP,x+90,y+9);
   Move(HRP,x+49,y+90);
   Draw(HRP,x+81,y+90);
   Draw(HRP,x+96,y+21);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawL(direction)
 int direction;
{
 int x,y,a,b;

   SetRast(HRP,0);

   if(direction==1){
      SetAPen(HRP,arr1[1][7]);
      BltPattern(HRP,PaintLRUpper,24,15,62,36,6);
      SetAPen(HRP,arr1[1][6]);
      BltPattern(HRP,PaintLRUpper,19,38,57,59,6);
      SetAPen(HRP,arr1[1][5]);
      BltPattern(HRP,PaintLRUpper,14,61,49,82,6);
      SetAPen(HRP,arr1[5][7]);
      BltPattern(HRP,PaintLRLower,14,84,52,94,6);
      SetAPen(HRP,arr1[5][6]);
      BltPattern(HRP,PaintLRLower,20,96,58,106,6);
      SetAPen(HRP,arr1[5][5]);
      BltPattern(HRP,PaintLRLower,26,108,64,118,6);
   }
   else{
      SetAPen(HRP,arr1[0][7]);
      BltPattern(HRP,PaintLRUpper,24,15,62,36,6);
      SetAPen(HRP,arr1[0][6]);
      BltPattern(HRP,PaintLRUpper,19,38,57,59,6);
      SetAPen(HRP,arr1[0][5]);
      BltPattern(HRP,PaintLRUpper,14,61,49,82,6);
      SetAPen(HRP,arr1[1][7]);
      BltPattern(HRP,PaintLRLower,14,84,52,94,6);
      SetAPen(HRP,arr1[1][6]);
      BltPattern(HRP,PaintLRLower,20,96,58,106,6);
      SetAPen(HRP,arr1[1][5]);
      BltPattern(HRP,PaintLRLower,26,108,64,118,6);
   }
   for(x=0;x<5;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }
   SetAPen(HRP,arr1[0][8]);
   a=Homeblit[0][8];
   b=Homeblit[1][8];
   BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
   SetAPen(HRP,arr1[1][8]);
   a=Homeblit[2][8];
   b=Homeblit[3][8];
   BltPattern(HRP,PaintF,a,b,a+32,b+23,4);

   for(x=0;x<9;x++){
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   x=40;
   y=17;
   SetAPen(HRP,7);
   Move(HRP,x+8,y+99);
   Draw(HRP,x+8,y+24);
   Draw(HRP,x+32,y);
   Draw(HRP,x+96,y);
   Draw(HRP,x+72,y+24);
   Draw(HRP,x+72,y+99);
   Draw(HRP,x+8,y+99);
   Move(HRP,x+96,y);
   Draw(HRP,x+96,y+75);
   Draw(HRP,x+72,y+99);
   Move(HRP,x+64,y);
   Draw(HRP,x+40,y+24);
   Draw(HRP,x+40,y+99);
   Move(HRP,x+8,y+49);
   Draw(HRP,x+72,y+49);
   Draw(HRP,x+96,y+25);
   Move(HRP,x+8,y+74);
   Draw(HRP,x+72,y+74);
   Draw(HRP,x+96,y+50);
   Move(HRP,x+16,y+16);
   Draw(HRP,x+80,y+16);
   Draw(HRP,x+80,y+91);
   Move(HRP,x+24,y+8);
   Draw(HRP,x+88,y+8);
   Draw(HRP,x+88,y+82);
   Move(HRP,x+8,y+24);
   Draw(HRP,x+72,y+24);
   /* end of stationary part */
   Move(HRP,x-27,y+66);
   Draw(HRP,x+5,y+66);
   Draw(HRP,x+8,y+52);
   Move(HRP,x+16,y+15);
   Draw(HRP,x+20,y-3);
   Draw(HRP,x-12,y-3);
   Draw(HRP,x-27,y+66);
   Draw(HRP,x-9,y+102);
   Draw(HRP,x+23,y+102);
   Draw(HRP,x+20,y+99);
   Move(HRP,x+5,y+66);
   Draw(HRP,x+8,y+72);
   Move(HRP,x+20,y-3);
   Draw(HRP,x+25,y+6);
   Move(HRP,x-15,y+90);
   Draw(HRP,x+8,y+90);
   Move(HRP,x-21,y+78);
   Draw(HRP,x+8,y+78);
   Move(HRP,x-22,y+43);
   Draw(HRP,x+8,y+43);
   Move(HRP,x-17,y+20);
   Draw(HRP,x+11,y+20);
   Move(HRP,x+23,y+102);
   Draw(HRP,x+25,y+99);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawF(direction)
 int direction;
{
 int x,y,a,b;

   SetRast(HRP,0);

   for(x=6;x<9;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   for(x=0;x<3;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   for(x=0;x<9;x++){
      SetAPen(HRP,arr1[1][x]);
      if(direction==1){
	 a=FSurfaceAnti[0][x];
	 b=FSurfaceAnti[1][x];
      }
      else{
	 a=FSurfaceClock[0][x];
	 b=FSurfaceClock[1][x];
      }
      BltPattern(HRP,PaintFSurface,a,b,a+42,b+34,6);
   }
   if(direction==1){
      SetAPen(HRP,arr1[4][5]);
      BltPattern(HRP,PaintFUpper,68,17,96,41,4);
      SetAPen(HRP,arr1[4][4]);
      BltPattern(HRP,PaintFUpper,90,35,118,59,4);
      SetAPen(HRP,arr1[4][3]);
      BltPattern(HRP,PaintFUpper,112,53,140,77,4);
   }
   else{
      SetAPen(HRP,arr1[0][5]);
      BltPattern(HRP,PaintFUpper,68,17,96,41,4);
      SetAPen(HRP,arr1[0][4]);
      BltPattern(HRP,PaintFUpper,90,35,118,59,4);
      SetAPen(HRP,arr1[0][3]);
      BltPattern(HRP,PaintFUpper,112,53,140,77,4);
   }
   x=40;
   y=17;

   SetAPen(HRP,7);
   Move(HRP,x-16,y+16);
   Draw(HRP,x,y);
   Draw(HRP,x+96,y);
   Draw(HRP,x+80,y+16);
   Draw(HRP,x+55,y+16);
   Move(HRP,x+80,y+73);
   Draw(HRP,x+80,y+91);
   Draw(HRP,x+96,y+75);
   Draw(HRP,x+96,y+59);
   Move(HRP,x+96,y+48);
   Draw(HRP,x+96,y);
   Move(HRP,x-8,y+8);
   Draw(HRP,x+25,y+8);
   Move(HRP,x+46,y+8);
   Draw(HRP,x+88,y+8);
   Draw(HRP,x+88,y+42);
   Move(HRP,x+88,y+65);
   Draw(HRP,x+88,y+82);
   Move(HRP,x+96,y+25);
   Draw(HRP,x+83,y+38);
   Move(HRP,x+64,y);
   Draw(HRP,x+52,y+12);
   Move(HRP,x+80,y+91);
   Draw(HRP,x+56,y+91);
   Move(HRP,x-2,y+91);
   Draw(HRP,x-16,y+91);
   Draw(HRP,x-16,y+80);
   Move(HRP,x-16,y+42);
   Draw(HRP,x-16,y+16);
   Draw(HRP,x+16,y+16);
   Draw(HRP,x+32,y);
   Move(HRP,x+80,y+16);
   Draw(HRP,x+80,y+35);

   Move(HRP,x-39,y+61);
   Draw(HRP,x+27,y+7);
   Draw(HRP,x+93,y+61);
   Draw(HRP,x+27,y+115);
   Draw(HRP,x-39,y+61);
   Move(HRP,x+27,y+7);
   Draw(HRP,x+35,y-1);
   Draw(HRP,x+101,y+53);
   Draw(HRP,x+93,y+61);
   Move(HRP,x-17,y+43);
   Draw(HRP,x+49,y+97);
   Move(HRP,x+5,y+25);
   Draw(HRP,x+71,y+79);
   Move(HRP,x-17,y+79);
   Draw(HRP,x+49,y+25);
   Draw(HRP,x+57,y+17);
   Move(HRP,x+5,y+97);
   Draw(HRP,x+71,y+43);
   Draw(HRP,x+79,y+35);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawB(direction)
 int direction;
{
 int x,y,a,b;

   SetRast(HRP,0);

   if(direction==1){
      SetAPen(HRP,arr1[0][7]);
      BltPattern(HRP,PaintFUpper,80,3,108,27,4);
      SetAPen(HRP,arr1[0][8]);
      BltPattern(HRP,PaintFUpper,102,21,130,45,4);
      SetAPen(HRP,arr1[0][1]);
      BltPattern(HRP,PaintFUpper,124,39,152,63,4);
   }
   else{
      SetAPen(HRP,arr1[4][7]);
      BltPattern(HRP,PaintFUpper,80,3,108,27,4);
      SetAPen(HRP,arr1[4][8]);
      BltPattern(HRP,PaintFUpper,102,21,130,45,4);
      SetAPen(HRP,arr1[4][1]);
      BltPattern(HRP,PaintFUpper,124,39,152,63,4);
   }
   for(x=2;x<7;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);

      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   SetAPen(HRP,arr1[0][0]);
   a=Homeblit[0][0];
   b=Homeblit[1][0];
   BltPattern(HRP,PaintU,a,b,a+48,b+6,6);

   for(x=0;x<9;x++){
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }
   SetAPen(HRP,arr1[4][0]);
   a=Homeblit[4][0];
   b=Homeblit[5][0];
   BltPattern(HRP,PaintR,a,b,a+7,b+29,2);

   x=40;
   y=17;
   SetAPen(HRP,7);
   Move(HRP,x-8,y+8);
   Draw(HRP,x+88,y+8);
   Draw(HRP,x+88,y+83);
   Draw(HRP,x+72,y+99);
   Draw(HRP,x-24,y+99);
   Draw(HRP,x-24,y+24);
   Draw(HRP,x-8,y+8);
   Move(HRP,x-16,y+16);
   Draw(HRP,x+80,y+16);
   Draw(HRP,x+80,y+91);
   Move(HRP,x-24,y+24);
   Draw(HRP,x+72,y+24);
   Draw(HRP,x+72,y+99);
   Move(HRP,x+24,y+8);
   Draw(HRP,x+8,y+24);
   Draw(HRP,x+8,y+99);
   Move(HRP,x+56,y+8);
   Draw(HRP,x+40,y+24);
   Draw(HRP,x+40,y+99);
   Move(HRP,x-24,y+49);
   Draw(HRP,x+72,y+49);
   Draw(HRP,x+88,y+33);
   Move(HRP,x-24,y+74);
   Draw(HRP,x+72,y+74);
   Draw(HRP,x+88,y+58);
   Move(HRP,x+72,y+24);
   Draw(HRP,x+88,y+8);
      /* end of stationary */
   Move(HRP,x+21,y+8);
   Draw(HRP,x+39,y-7);
   Draw(HRP,x+57,y+8);
   Move(HRP,x+88,y+33);
   Draw(HRP,x+105,y+47);
   Draw(HRP,x+88,y+63);
   Move(HRP,x+39,y-7);
   Draw(HRP,x+47,y-15);
   Draw(HRP,x+75,y+8);
   Move(HRP,x+88,y+19);
   Draw(HRP,x+113,y+39);
   Draw(HRP,x+105,y+47);
   Move(HRP,x+64,y+8);
   Draw(HRP,x+69,y+3);
   Move(HRP,x+88,y+24);
   Draw(HRP,x+91,y+21);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawU(direction)
 int direction;
{
 int x,y,a,b;

   SetRast(HRP,0);

   for(x=2;x<7;x++){
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }
   SetAPen(HRP,arr1[1][0]);
   a=Homeblit[2][0];
   b=Homeblit[3][0];
   BltPattern(HRP,PaintF,a,b,a+32,b+23,4);

   for(x=1;x<5;x++){
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   SetAPen(HRP,arr1[4][0]);
   a=Homeblit[4][0];
   b=Homeblit[5][0];
   BltPattern(HRP,PaintR,a,b,a+7,b+29,2);

   SetAPen(HRP,arr1[4][8]);
   a=Homeblit[4][8];
   b=Homeblit[5][8];
   BltPattern(HRP,PaintR,a,b,a+7,b+29,2);

   if(direction==1){
      for(x=0;x<9;x++){
	 SetAPen(HRP,arr1[0][x]);
	 a=USurfaceAnti[0][x];
	 b=USurfaceAnti[1][x];
	 BltPattern(HRP,PaintUSurface,a,b,a+40,b+11,6);
      }
      SetAPen(HRP,arr1[2][1]);
      BltPattern(HRP,PaintULeft,13,30,28,59,2);
      SetAPen(HRP,arr1[2][2]);
      BltPattern(HRP,PaintULeft,30,36,45,65,2);
      SetAPen(HRP,arr1[2][3]);
      BltPattern(HRP,PaintULeft,47,42,62,71,2);

      SetAPen(HRP,arr1[1][7]);
      BltPattern(HRP,PaintURight,64,42,88,71,4);
      SetAPen(HRP,arr1[1][8]);
      BltPattern(HRP,PaintURight,90,36,114,65,4);
      SetAPen(HRP,arr1[1][1]);
      BltPattern(HRP,PaintURight,116,30,140,59,4);
   }
   else{
      for(x=0;x<9;x++){
	a=USurfaceClock[0][x];
	b=USurfaceClock[1][x];
	SetAPen(HRP,arr1[0][x]);
	BltPattern(HRP,PaintUSurface,a,b,a+40,b+11,6);
      }
      SetAPen(HRP,arr1[1][7]);
      BltPattern(HRP,PaintULeft,13,30,28,59,2);
      SetAPen(HRP,arr1[1][8]);
      BltPattern(HRP,PaintULeft,30,36,45,65,2);
      SetAPen(HRP,arr1[1][1]);
      BltPattern(HRP,PaintULeft,47,42,62,71,2);

      SetAPen(HRP,arr1[4][5]);
      BltPattern(HRP,PaintURight,64,42,88,71,4);
      SetAPen(HRP,arr1[4][6]);
      BltPattern(HRP,PaintURight,90,36,114,65,4);
      SetAPen(HRP,arr1[4][7]);
      BltPattern(HRP,PaintURight,116,30,140,59,4);
   }
   x=40;
   y=17;
   SetAPen(HRP,7);
   Move(HRP,x+96,y+39);
   Draw(HRP,x+96,y+75);
   Draw(HRP,x+72,y+99);
   Draw(HRP,x-24,y+99);
   Draw(HRP,x-24,y+49);
   Draw(HRP,x+8,y+49);
   Move(HRP,x+47,y+49);
   Draw(HRP,x+72,y+49);
   Draw(HRP,x+80,y+41);
   Move(HRP,x-16,y+41);
   Draw(HRP,x-24,y+49);
   Move(HRP,x-24,y+74);
   Draw(HRP,x+72,y+74);
   Draw(HRP,x+96,y+50);
   Move(HRP,x+8,y+49);
   Draw(HRP,x+8,y+99);
   Move(HRP,x+40,y+52);
   Draw(HRP,x+40,y+99);
   Move(HRP,x+72,y+49);
   Draw(HRP,x+72,y+99);
   Move(HRP,x+80,y+41);
   Draw(HRP,x+80,y+91);
   Move(HRP,x+88,y+40);
   Draw(HRP,x+88,y+83);
   /* end of stationary */
   Move(HRP,x+50,y-6);
   Draw(HRP,x+101,y+12);
   Draw(HRP,x+23,y+30);
   Draw(HRP,x-28,y+12);
   Draw(HRP,x+50,y-6);
   Move(HRP,x-28,y+12);
   Draw(HRP,x-28,y+37);
   Draw(HRP,x+23,y+55);
   Draw(HRP,x+101,y+37);
   Draw(HRP,x+101,y+12);
   Move(HRP,x+23,y+30);
   Draw(HRP,x+23,y+55);
	      /* inside lines */
   Move(HRP,x-11,y+43);
   Draw(HRP,x-11,y+18);
   Draw(HRP,x+67,y);
   Move(HRP,x+6,y+49);
   Draw(HRP,x+6,y+24);
   Draw(HRP,x+84,y+6);
   Move(HRP,x+49,y+49);
   Draw(HRP,x+49,y+24);
   Draw(HRP,x-2,y+6);
   Move(HRP,x+75,y+43);
   Draw(HRP,x+75,y+18);
   Draw(HRP,x+24,y);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

DrawD(direction)
 int direction;
{
 int a,b,x,y;

   SetRast(HRP,0);

   if(direction==1){
      SetAPen(HRP,arr1[1][5]);
      BltPattern(HRP,PaintULeft,13,80,28,109,2);
      SetAPen(HRP,arr1[1][4]);
      BltPattern(HRP,PaintULeft,30,86,45,115,2);
      SetAPen(HRP,arr1[1][3]);
      BltPattern(HRP,PaintULeft,47,92,62,121,2);

      SetAPen(HRP,arr1[4][3]);
      BltPattern(HRP,PaintURight,64,92,88,121,4);
      SetAPen(HRP,arr1[4][2]);
      BltPattern(HRP,PaintURight,90,86,114,115,4);
      SetAPen(HRP,arr1[4][1]);
      BltPattern(HRP,PaintURight,116,80,140,109,4);
   }
   else{
      SetAPen(HRP,arr1[2][7]);
      BltPattern(HRP,PaintULeft,13,80,28,110,2);
      SetAPen(HRP,arr1[2][6]);
      BltPattern(HRP,PaintULeft,30,86,45,115,2);
      SetAPen(HRP,arr1[2][5]);
      BltPattern(HRP,PaintULeft,47,92,62,121,2);

      SetAPen(HRP,arr1[1][5]);
      BltPattern(HRP,PaintURight,64,92,88,121,4);
      SetAPen(HRP,arr1[1][4]);
      BltPattern(HRP,PaintURight,90,86,114,115,4);
      SetAPen(HRP,arr1[1][3]);
      BltPattern(HRP,PaintURight,116,80,140,109,4);
   }

   for(x=0;x<9;x++){
      SetAPen(HRP,arr1[0][x]);
      a=Homeblit[0][x];
      b=Homeblit[1][x];
      BltPattern(HRP,PaintU,a,b,a+48,b+6,6);
   }
   for(x=0;x<3;x++){
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }
   for(x=6;x<9;x++){
      SetAPen(HRP,arr1[1][x]);
      a=Homeblit[2][x];
      b=Homeblit[3][x];
      BltPattern(HRP,PaintF,a,b,a+32,b+23,4);
   }
   for(x=4;x<9;x++){
      SetAPen(HRP,arr1[4][x]);
      a=Homeblit[4][x];
      b=Homeblit[5][x];
      BltPattern(HRP,PaintR,a,b,a+7,b+29,2);
   }
   SetAPen(HRP,arr1[4][0]);
   a=Homeblit[4][0];
   b=Homeblit[5][0];
   BltPattern(HRP,PaintR,a,b,a+7,b+29,2);

   DrawBord.Count=53;
   DrawBord.XY=DDraw;

   DrawBorder(HRP,&DrawBord,40,17);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

Larry(direction)
 int direction;
{
 int a,b,x,y;

   SetRast(HRP,0);

   if(direction==5){
      for(x=0;x<9;x++){
	 SetAPen(HRP,arr1[0][x]);
	 a=USurfaceAnti[0][x];
	 b=USurfaceAnti[1][x];
	 BltPattern(HRP,PaintUSurface,a,b,a+40,b+11,6);
	 a=LarryR[0][x];
	 b=LarryR[1][x];
	 SetAPen(HRP,arr1[2][x]);
	 BltPattern(HRP,PaintULeft,a,b,a+15,b+29,2);
	 a=LarryR[2][x];
	 b=LarryR[3][x];
	 SetAPen(HRP,arr1[1][x]);
	 BltPattern(HRP,PaintURight,a,b,a+25,b+29,4);
      }
   }
   else{
      for(x=0;x<9;x++){
	 a=USurfaceClock[0][x];
	 b=USurfaceClock[1][x];
	 SetAPen(HRP,arr1[0][x]);
	 BltPattern(HRP,PaintUSurface,a,b,a+40,b+11,6);

	 a=LarryL[0][x];
	 b=LarryL[1][x];
	 SetAPen(HRP,arr1[1][x]);
	 BltPattern(HRP,PaintULeft,a,b,a+15,b+29,2);
	 a=LarryL[2][x];
	 b=LarryL[3][x];
	 SetAPen(HRP,arr1[4][x]);
	 BltPattern(HRP,PaintURight,a,b,a+25,b+29,4);
      }
   }
   SetAPen(HRP,7);
   DrawBord.Count=31;
   DrawBord.XY=OLRDraw;
   DrawBorder(HRP,&DrawBord,40,17);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}
Dura(direction)
 int direction;
{
 int a,b,x,y;

   SetRast(HRP,0);

   if(direction==2){
      for(x=0;x<9;x++){
	 SetAPen(HRP,arr1[4][x]);
	 a=RSurfaceAnti[0][x];
	 b=RSurfaceAnti[1][x];
	 BltPattern(HRP,PaintRSurface,a,b,a+10,b+33,2);
	 a=DuraA[0][x];
	 b=DuraA[1][x];
	 SetAPen(HRP,arr1[0][x]);
	 BltPattern(HRP,PaintLRUpper,a,b,a+37,b+21,6);
	 a=DuraA[2][x];
	 b=DuraA[3][x];
	 SetAPen(HRP,arr1[1][x]);
	 BltPattern(HRP,PaintLRLower,a,b,a+38,b+10,6);
      }
   }
   else{
      for(x=0;x<9;x++){
	 a=RSurfaceClock[0][x];
	 b=RSurfaceClock[1][x];
	 SetAPen(HRP,arr1[4][x]);
	 BltPattern(HRP,PaintRSurface,a,b,a+10,b+33,2);
	 a=DuraA[0][x];
	 b=DuraA[1][x];
	 SetAPen(HRP,arr1[1][x]);
	 BltPattern(HRP,PaintLRUpper,a,b,a+38,b+21,6);
	 a=DuraA[2][x];
	 b=DuraA[3][x];
	 SetAPen(HRP,arr1[5][x]);
	 BltPattern(HRP,PaintLRLower,a,b,a+38,b+10,6);
      }
   }
   SetAPen(HRP,7);
   DrawBord.Count=17;
   DrawBord.XY=OUDDraw;
   DrawBorder(HRP,&DrawBord,40,17);

   Move(HRP,23,37);
   Draw(HRP,119,37);
   Draw(HRP,137,73);

   Move(HRP,18,60);
   Draw(HRP,114,60);
   Draw(HRP,132,96);

   Move(HRP,19,95);
   Draw(HRP,115,95);
   Draw(HRP,130,26);

   Move(HRP,25,107);
   Draw(HRP,121,107);
   Draw(HRP,136,38);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

Cathy(direction)
 int direction;
{
 int a,b,x,y;

   SetRast(HRP,0);

   if(direction==3){
      for(x=0;x<9;x++){
	 SetAPen(HRP,arr1[1][x]);
	 a=FSurfaceAnti[0][x];
	 b=FSurfaceAnti[1][x];
	 BltPattern(HRP,PaintFSurface,a,b,a+42,b+34,6);
	 a=CathyA[0][x];
	 b=CathyA[1][x];
	 SetAPen(HRP,arr1[4][x]);
	 BltPattern(HRP,PaintFUpper,a,b,a+29,b+24,4);
      }
   }
   else{
      for(x=0;x<9;x++){
	 a=FSurfaceClock[0][x];
	 b=FSurfaceClock[1][x];
	 SetAPen(HRP,arr1[1][x]);
	 BltPattern(HRP,PaintFSurface,a,b,a+42,b+34,6);
	 a=CathyA[0][x];
	 b=CathyA[1][x];
	 SetAPen(HRP,arr1[0][x]);
	 BltPattern(HRP,PaintFUpper,a,b,a+29,b+24,4);
      }
   }

   SetAPen(HRP,7);
   DrawBord.Count=25;
   DrawBord.XY=OCADraw;
   DrawBorder(HRP,&DrawBord,0,0);

   WaitTOF();
   BltBitMapRastPort(HBM,0,0,rp,82,3,WIDTH,HEIGHT,0xc0);
}

finish()
{
 int i;

   LoadRGB4(WVP2,colormap3,4);
   MoveScreen(Wdw2->WScreen,0,-144);

   for(i=0;i<DEPTH;i++){
      if(HBM->Planes[i])
	 FreeRaster(HBM->Planes[i],WIDTH,HEIGHT);
   }
   if(Wdw)
      {
       if(Wdw->MenuStrip)
	  ClearMenuStrip(Wdw);
       CloseWindow(Wdw);
      }
   if(Wdw2)          CloseWindow(Wdw2);
   if(CustScr)       CloseScreen(CustScr);
   if(PrtScr)        CloseScreen(PrtScr);
   if(GfxBase)       CloseLibrary((struct Library*)GfxBase);
   if(IntuitionBase) CloseLibrary((struct Library*)IntuitionBase);
   if(FontPtr)       CloseFont(FontPtr);

   exit();
}

InitGadgets()
{
 struct Gadget *g;
 UWORD visiblelines,totallines,overlap,topline,hidden;
 UWORD value;
 char Red,Green,Blue;

   if(done)
      return;
   if(dided)
      CloseSelect();


   SetAPen(rp,1);
   SetOPen(rp,1);
   RectFill(rp,8,40,28,50);
   SetAPen(rp,2);
   SetOPen(rp,2);
   RectFill(rp,30,40,50,50);
   SetAPen(rp,3);
   SetOPen(rp,3);
   RectFill(rp,52,40,72,50);
   SetAPen(rp,4);
   SetOPen(rp,4);
   RectFill(rp,8,55,28,65);
   SetAPen(rp,5);
   SetOPen(rp,5);
   RectFill(rp,30,55,50,65);
   SetAPen(rp,6);
   SetOPen(rp,6);
   RectFill(rp,52,55,72,65);

   SetAPen(rp,0);
   SetBPen(rp,7);
   Move(rp,11,98);
   Text(rp," Close ",7);
   Move(rp,19,85);
   SetAPen(rp,7);
   SetBPen(rp,0);
   Text(rp,"Delay",5);

	SetAPen(rp,7);
	BltPattern(rp,Box,hor[1],vert[1],hor[1]+22,vert[1]+12,4);
      col=1;

      value=GetRGB4(WVP->ColorMap,1);
      Blue=value&0xf;
      Green=(value >>4) &0xf;
      Red=(value >>8) &0xf;

      NewModifyProp(&RedGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Red<<12,
	  NULL,0x1111,NULL,1L);
      NewModifyProp(&BlueGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Blue<<12,
	  NULL,0x1111,NULL,1L);
      NewModifyProp(&GreenGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Green<<12,
	  NULL,0x1111,NULL,1L);
      NewModifyProp(&delaygad,Wdw,NULL,AUTOKNOB|FREEHORIZ,hesitate<<10,
	  NULL,0x1800,NULL,1L);

   AddGList(Wdw,&Gad1,(SHORT)~0,31,NULL);
   RefreshGList(&Gad1,Wdw,NULL,-1);
   PrintRGB(Red,Green,Blue);
   done=1;
}

DoMenu(item)
 ULONG	item;
{
   switch(item){
      case 0   :InitMouseMen();    /*mouse select */
		break;
      case 1   :InitGadgets();     /* palette */
		break;
      case 2   :clear();
		break;
      case 3   :clear();
		solve();
		break;
      case 4   :quick=1;	   /* quicksolve */
		clear();
		solve();
		quick=0;
		break;
      case 5   :savecube();        /* best of 24 */
		best=quick=1;
		clear();
		Best();
		best=quick=0;
		break;
      case 6   :recall();
		break;
      case 7   :break;		   /*info*/
      case 8   :finish();
		break;
      default  :break;
   }
}

ClosePal()
{
   RemoveGList(Wdw,&Gad1,-1);
   SetAPen(rp,0);
   SetOPen(rp,0);
   RectFill(rp,6,10,75,105);
   done=0;
   old=0;
}

CloseSelect()
{
   RemoveGList(Wdw,&Arrow1,-1);
   SetAPen(rp,0);
   SetOPen(rp,0);
   RectFill(rp,245,4,310,133);
   dided=0;
}

ProcMouse(mousex,mousey)
 SHORT mousex,mousey;
{
 char Red,Green,Blue;
 UWORD value;

   if(mousex>11 && mousex<68 && mousey>91 && mousey<101)  /* close palette*/
      ClosePal();
   if(mousex>245 && mousex<302 && mousey>124 && mousey<134)  /*close rotate*/
       CloseSelect();

   if(done){
      if(mousey>40 && mousey<51){     /* pick up color */
	 if(mousex>8 && mousex<28)
	    col=1;
	 if(mousex>30 && mousex<50)
	    col=2;
	 if(mousex>52 && mousex<72)
	    col=3;
	 }
      if(mousey>55 && mousey<66){
	 if(mousex>8 && mousex<28)
	    col=4;
	 if(mousex>30 && mousex<50)
	    col=5;
	 if(mousex>52 && mousex<72)
	    col=6;
	 }
     if(col!=old){
	SetAPen(rp,0);
	BltPattern(rp,Box,hor[old],vert[old],hor[old]+22,vert[old]+12,4);
	SetAPen(rp,7);
	BltPattern(rp,Box,hor[col],vert[col],hor[col]+22,vert[col]+12,4);
      }
      old=col;

      value=GetRGB4(WVP->ColorMap,col);
      Blue=value&0xf;
      Green=(value >>4) &0xf;
      Red=(value >>8) &0xf;

      NewModifyProp(&RedGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Red<<12,
	  NULL,0x1111,NULL,1L);
      NewModifyProp(&BlueGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Blue<<12,
	  NULL,0x1111,NULL,1L);
      NewModifyProp(&GreenGad,Wdw,NULL,AUTOKNOB|FREEHORIZ,Green<<12,
	  NULL,0x1111,NULL,1L);

      PrintRGB(Red,Green,Blue);
   }
}

PrintRGB(Red,Green,Blue)
 char Red,Green,Blue;
{
 char buffy[4];

   SetAPen(rp,7);
   SetBPen(rp,0);
   itoa(Red,buffy,16);
   Move(rp,68,19);
   Text(rp,buffy,1);
   itoa(Green,buffy,16);
   Move(rp,68,27);
   Text(rp,buffy,1);
   itoa(Blue,buffy,16);
   Move(rp,68,35);
   Text(rp,buffy,1);
   Move(rp,58,75);
   itoa(hesitate,buffy,10);
   Text(rp,buffy,strlen(buffy));
   Text(rp," ",1);
}

procgads(add)
 struct Gadget *add;
{
 USHORT id;
 UBYTE,r,g,b;
 ULONG class;

   id=add->GadgetID;

      switch(id){
      case 1   :arr2[0][7]=col;
		break;
      case 2   :arr2[0][8]=col;
		break;
      case 3   :arr2[0][1]=col;
		break;
      case 4   :arr2[0][6]=col;
		break;
      case 5   :arr2[0][0]=col;
		break;
      case 6   :arr2[0][2]=col;
		break;
      case 7   :arr2[0][5]=col;
		break;
      case 8   :arr2[0][4]=col;
		break;
      case 9   :arr2[0][3]=col;
		break;
      case 10  :arr2[1][7]=col;
		break;
      case 11  :arr2[1][8]=col;
		break;
      case 12  :arr2[1][1]=col;
		break;
      case 13  :arr2[1][6]=col;
		break;
      case 14  :arr2[1][0]=col;
		break;
      case 15  :arr2[1][2]=col;
		break;
      case 16  :arr2[1][5]=col;
		break;
      case 17  :arr2[1][4]=col;
		break;
      case 18  :arr2[1][3]=col;
		break;
      case 19  :arr2[4][5]=col;
		break;
      case 20  :arr2[4][6]=col;
		break;
      case 21  :arr2[4][7]=col;
		break;
      case 22  :arr2[4][4]=col;
		break;
      case 23  :arr2[4][0]=col;
		break;
      case 24  :arr2[4][8]=col;
		break;
      case 25  :arr2[4][3]=col;
		break;
      case 26  :arr2[4][2]=col;
		break;
      case 27  :arr2[4][1]=col;
		break;
      case 28  :
      case 29  :
      case 30  :
      case 31  :do{
		    if(msg=(struct IntuiMessage*)GetMsg(Wdw->UserPort)){
		       class=msg->Class;
		       ReplyMsg((struct Message*)msg);
		    }
		   r=RedStruct.HorizPot>>12;
		   g=GreenStruct.HorizPot>>12;
		   b=BlueStruct.HorizPot>>12;
		   hesitate=delaystruct.HorizPot>>10;
		   SetRGB4CM(colorcode,col,r,g,b);
		   SetRGB4(WVP,col,r,g,b);
		   PrintRGB(r,g,b);
		  }while(class!=GADGETUP);
		break;
      case 32  :feed("f");
		break;
      case 33  :feed("af");
		break;
      case 34  :feed("2f");
		break;
      case 35  :feed("b");
		break;
      case 36  :feed("ab");
		break;
      case 37  :feed("2b");
		break;
      case 38  :feed("l");
		break;
      case 39  :feed("al");
		break;
      case 40  :feed("2l");
		break;
      case 41  :feed("r");
		break;
      case 42  :feed("ar");
		break;
      case 43  :feed("2r");
		break;
      case 44  :feed("u");
		break;
      case 45  :feed("au");
		break;
      case 46  :feed("2u");
		break;
      case 47  :feed("d");
		break;
      case 48  :feed("ad");
		break;
      case 49  :feed("2d");
		break;
      case 50  :Write(" ");
		feed("oc");
		break;
      case 51  :Write(" ");
		feed("oa");
		break;
      case 52  :Write(" ");
		feed("ou");
		break;
      case 53  :Write(" ");
		feed("od");
		break;
      case 54  :Write(" ");
		feed("or");
		break;
      case 55  :Write(" ");
		feed("ol");
		break;
      default  :break;
      }
   if(id<28)
      update(1);
}

InitMouseMen()
{
   if(dided)
      return;
   if(done)
      ClosePal();

      SetAPen(rp,7);
      SetBPen(rp,0);
      Move(rp,266,15);
      Text(rp,"TURN",4);
      Move(rp,259,96);
      SetAPen(rp,7);
      Text(rp,"ORIENT",6);
      SetAPen(rp,0);
      SetBPen(rp,7);
      Move(rp,255,131);
      Text(rp," Close ",7);

      AddGList(Wdw,&Arrow1,(SHORT)~0,-1,NULL);
      ColorGads();
      dided=1;
}

ColorGads()
{
      SetBPen(rp,0);
      Move(rp,246,25);
      SetAPen(rp,arr1[1][0]);
      Text(rp,"F",1);
      Move(rp,246,36);
      SetAPen(rp,arr1[3][0]);
      Text(rp,"B",1);
      Move(rp,246,47);
      SetAPen(rp,arr1[2][0]);
      Text(rp,"L",1);
      Move(rp,246,58);
      SetAPen(rp,arr1[4][0]);
      Text(rp,"R",1);
      Move(rp,246,69);
      SetAPen(rp,arr1[0][0]);
      Text(rp,"U",1);
      Move(rp,246,80);
      SetAPen(rp,arr1[5][0]);
      Text(rp,"D",1);

      DImageB.PlanePick=arr1[3][0];
      LtImageB.PlanePick=arr1[3][0];
      RtImageB.PlanePick=arr1[3][0];

      DImageF.PlanePick=arr1[1][0];
      LtImageF.PlanePick=arr1[1][0];
      RtImageF.PlanePick=arr1[1][0];

      DImageL.PlanePick=arr1[2][0];
      LtImageL.PlanePick=arr1[2][0];
      RtImageL.PlanePick=arr1[2][0];

      DImageR.PlanePick=arr1[4][0];
      LtImageR.PlanePick=arr1[4][0];
      RtImageR.PlanePick=arr1[4][0];

      DImageU.PlanePick=arr1[0][0];
      LtImageU.PlanePick=arr1[0][0];
      RtImageU.PlanePick=arr1[0][0];

      DImageD.PlanePick=arr1[5][0];
      LtImageD.PlanePick=arr1[5][0];
      RtImageD.PlanePick=arr1[5][0];

      RefreshGList(&Arrow1,Wdw,NULL,-1);
}

main()
{
 static char side;
 int direction,x;

   FirstMenu=&Menus;

   FuncItem[0].NextItem=&FuncItem[1];
   FuncItem[1].NextItem=&FuncItem[2];
   FuncItem[2].NextItem=&FuncItem[3];
   FuncItem[3].NextItem=&FuncItem[4];
   FuncItem[4].NextItem=&FuncItem[5];
   FuncItem[5].NextItem=&FuncItem[6];
   FuncItem[6].NextItem=&FuncItem[7];
   FuncItem[7].NextItem=&FuncItem[8];

   KeysItem[0].NextItem=&KeysItem[1];
   KeysItem[1].NextItem=&KeysItem[2];
   KeysItem[2].NextItem=&KeysItem[3];
   KeysItem[3].NextItem=&KeysItem[4];
   KeysItem[4].NextItem=&KeysItem[5];
   KeysItem[5].NextItem=&KeysItem[6];
   KeysItem[6].NextItem=&KeysItem[7];

   arr1_pointer=&arr1[0][0];
   arr2_pointer=&arr2[0][0];

   DrawBord.FrontPen=7;
   DrawBord.DrawMode=JAM1;

   pf[0]=(void*)DrawU;
   pf[1]=(void*)DrawF;
   pf[2]=(void*)DrawL;
   pf[3]=(void*)DrawB;
   pf[4]=(void*)DrawR;
   pf[5]=(void*)DrawD;
   op[0]=(void*)Larry;
   op[1]=(void*)Cathy;
   op[2]=(void*)Dura;
   op[3]=(void*)Cathy;
   op[4]=(void*)Dura;
   op[5]=(void*)Larry;

   StartScreens();
   DrawHome();

   Move(rp2,15,yp);
   direction=0;
   side=6;

   while(1)
   {
      Keywait();
      do
      {
       for(x=0;x<buffer;x++)
	   key[x]=key[x+1];
	 switch(key[0]){
	    case 'u':side=UP;
		     Write(key);
		     break;
	    case 'd':side=DOWN;
		     Write(key);
		     break;
	    case 'l':side=LEFT;
		     Write(key);
		     break;
	    case 'r':side=RIGHT;
		     Write(key);
		     break;
	    case 'f':side=FRONT;
		     Write(key);
		     break;
	    case 'b':side=BACK;
		     Write(key);
		     break;
	    case 'o':Write(" ");
		     Text(rp2,key,1);
		     orient(6);
		     break;
	    case '2':direction=2;
		     Write(key);
		     break;
	    case 'a':direction=1;
		     Write(key);
		     break;
	    case 'w':wait=1;
		     break;
	    case '1':single=1;
		     break;
	    case 'p':find();
		     break;
	    case '5':
		     best=quick=1;
		     savecube();
		     clear();
		     Worst();
		     best=quick=0;
		     break;
	    default :break;
	    }
	 if(side!=6)
	    {
	       rotate(side,direction);
	       direction=0;
	       side=6;
	    }
      key[0]=0;
      }while(--buffer>0);
   }

}
