/************************************************* /* /* This code © 1989 by W. Roger uzun /* This code is for Lattice 5.0X /* compile using - lc -v -cf -L -O Rubik (for 68000 version) /* or lc -v -cf -L -m2 -O -dCPU020 Rubik (for 68020 version) /* /*************************************************/ #include #include #ifdef CPU020 #include #endif #include #include #include #include #include #include #include #define WINDOWSIGNAL (1L<<(wG->UserPort->mp_SigBit)) /* data for cube */ int aborted=0; char q[50]; BPTR fh; int PlotOn=1; ULONG speed=0L; ULONG *xchg1,*xchg2; ULONG upperface[9],leftface[9],frontface[9],rightface[9],backface[9]; ULONG downface[9],x[9],y[9]; int onepoint=0; int a,c,e,k; UWORD chip PickPtr[]={ 0x0000,0x0000, /* Position pad bytes */ 0x0000,0x7090,0x0000,0x4810,0x0000,0x4892,0x0000,0x7094, 0x0000,0x4098,0x0000,0x4094,0x0000,0x4092,0x0000,0x0000, 0x0000,0x0000, /* Linkage pad bytes */ }; /* sizebody= 0x20 HEX ....32 decimal */ /* width= 0x10 HEX ....16 decimal */ /* Width in WORDS= 0x1 HEX ....1 decimal */ /* height= 0x8 HEX ....8 decimal */ /* number of planes= 0x2 HEX */ ULONG __regargs *MatchBox(int,int); void DoALayer(void); void SolveCorners(void); void Parse(void); void DoVertical(void); void DoHorizontal(void); void Space2(void); void FinishLayers(void); void FaceRotate(void); void Plot(void); void __regargs PrintText(int,int,char *); void Init(void); void main(void); void __regargs HandleEvent(APTR); void DoQuit(void); void DoSolve(void); void DoRight(void); void ClearUpperCorners(void); void DoLeft(void); void DoUp(void); void DoDown(void); void DoAbout(void); void DoForward(void); void DoBack(void); int done=0; struct RastPort *rpG; struct TextFont *myTextFont; struct Screen *sC; struct Window *wG; struct TextAttr TOPAZ80 = { (STRPTR)"topaz.font", TOPAZ_EIGHTY,0,0 }; struct NewScreen NewScreenStructure = { 0,0, /* screen XY origin relative to View */ 320,200, /* screen width and height */ 3, /* screen depth (number of bitplanes) */ 0,1, /* detail and block pens */ NULL, /* display modes for this screen */ CUSTOMSCREEN, /* screen type */ &TOPAZ80, /* pointer to default screen font */ "Rubiks Cube", /* screen title */ NULL, /* first in list of custom screen gadgets */ NULL /* pointer to custom BitMap structure */ }; #define NEWSCREENSTRUCTURE NewScreenStructure USHORT Palette[] = { 0x0777, /* color #0 */ 0x0000, /* color #1 */ 0x00B0, /* color #2 */ 0x0F82, /* color #3 */ 0x0FFF, /* color #4 */ 0x006F, /* color #5 */ 0x0F33, /* color #6 */ 0x0FF0 /* color #7 */ #define PaletteColorCount 8 }; #define PALETTE Palette UBYTE MyMyGadget3SIBuff[20]={'2','5','5','\0'}; struct StringInfo MyMyGadget3SInfo = { MyMyGadget3SIBuff, /* buffer where text will be edited */ NULL, /* optional undo buffer */ 0, /* character position in buffer */ 4, /* maximum number of characters to allow */ 0, /* first displayed character buffer position */ 0,0,0,0,0, /* Intuition initialized and maintained variables */ 0, /* Rastport of gadget */ 0, /* initial value for integer gadgets */ NULL /* alternate keymap (fill in if you set the flag) */ }; SHORT MyBorderVectors1[] = { 0,0, 71,0, 71,13, 0,13, 0,0 }; struct Border MyBorder1 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ MyBorderVectors1, /* pointer to XY vectors */ NULL /* next border in list */ }; struct Gadget MyGadget3 = { NULL, /* next gadget */ 42,65, /* origin XY of hit box relative to window TopLeft */ 70,12, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ STRGADGET, /* gadget type flags */ (APTR)&MyBorder1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ NULL, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&MyMyGadget3SInfo, /* SpecialInfo structure */ NULL, /* user-definable data */ NULL /* pointer to user-definable data */ }; UBYTE MyMyGadget2SIBuff[20]; struct StringInfo MyMyGadget2SInfo = { MyMyGadget2SIBuff, /* buffer where text will be edited */ NULL, /* optional undo buffer */ 0, /* character position in buffer */ 20, /* maximum number of characters to allow */ 0, /* first displayed character buffer position */ 0,0,0,0,0, /* Intuition initialized and maintained variables */ 0, /* Rastport of gadget */ 0, /* initial value for integer gadgets */ NULL /* alternate keymap (fill in if you set the flag) */ }; SHORT MyBorderVectors2[] = { 0,0, 147,0, 147,13, 0,13, 0,0 }; struct Border MyBorder2 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ MyBorderVectors2, /* pointer to XY vectors */ NULL /* next border in list */ }; struct Gadget MyGadget2 = { &MyGadget3, /* next gadget */ 8,33, /* origin XY of hit box relative to window TopLeft */ 146,12, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ STRGADGET, /* gadget type flags */ (APTR)&MyBorder2, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ NULL, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&MyMyGadget2SInfo, /* SpecialInfo structure */ NULL, /* user-definable data */ NULL /* pointer to user-definable data */ }; SHORT MyBorderVectors3[] = { 0,0, 46,0, 46,22, 0,22, 0,0 }; struct Border MyBorder3 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ MyBorderVectors3, /* pointer to XY vectors */ NULL /* next border in list */ }; struct IntuiText MyIText1 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 14,7, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "OK", /* pointer to text */ NULL /* next IntuiText structure */ }; struct Gadget MyGadget1 = { &MyGadget2, /* next gadget */ 53,106, /* origin XY of hit box relative to window TopLeft */ 45,21, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&MyBorder3, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &MyIText1, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ NULL, /* user-definable data */ NULL /* pointer to user-definable data */ }; #define MyGadgetList1 MyGadget1 struct IntuiText MyIText3 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 56,54, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Speed", /* pointer to text */ NULL /* next IntuiText structure */ }; struct IntuiText MyIText2 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 41,17, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "File Name", /* pointer to text */ &MyIText3 /* next IntuiText structure */ }; #define MyIntuiTextList1 MyIText2 struct NewWindow MyNewWindowStructure1 = { 80,30, /* window XY origin relative to TopLeft of screen */ 160,135, /* window width and height */ 0,1, /* detail and block pens */ GADGETUP, /* IDCMP flags */ ACTIVATE+NOCAREREFRESH, /* other window flags */ &MyGadget1, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ "Solve The Cube!", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 5,5, /* minimum width and height */ -1,-1, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; struct IntuiText IText1 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Quit", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem MenuItem4 = { NULL, /* next MenuItem structure */ 0,24, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 80,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText1, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'Q', /* alternate command-key */ NULL, /* SubItem list */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText2 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Solve", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem MenuItem3 = { &MenuItem4, /* next MenuItem structure */ 0,16, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 80,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText2, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'S', /* alternate command-key */ NULL, /* SubItem list */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText3b = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Vert", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem8 = { NULL, /* next SubItem structure */ 65,48, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText3b, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'C', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText3a = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Horiz", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem7 = { &SubItem8, /* next SubItem structure */ 65,40, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText3a, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'H', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText3 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Back", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem6 = { &SubItem7, /* next SubItem structure */ 65,32, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText3, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'B', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText4 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Forward", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem5 = { &SubItem6, /* next SubItem structure */ 65,24, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText4, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'F', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText5 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Down", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem4 = { &SubItem5, /* next SubItem structure */ 65,16, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText5, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'D', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText6 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Up", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem3 = { &SubItem4, /* next SubItem structure */ 65,8, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText6, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'U', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText7 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Left", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem2 = { &SubItem3, /* next SubItem structure */ 65,0, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText7, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'L', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText8 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Right", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem SubItem1 = { &SubItem2, /* next SubItem structure */ 65,-8, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 96,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText8, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'R', /* alternate command-key */ NULL, /* no SubItem list for SubItems */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText9 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "Move", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem MenuItem2 = { &MenuItem3, /* next MenuItem structure */ 0,8, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 80,8, /* hit box width and height */ ITEMTEXT+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText9, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ NULL, /* alternate command-key */ &SubItem1, /* SubItem list */ MENUNULL /* filled in by Intuition for drag selections */ }; struct IntuiText IText10 = { 3,1,COMPLEMENT, /* front and back text pens, drawmode and fill byte */ 0,0, /* XY origin relative to container TopLeft */ &TOPAZ80, /* font pointer or NULL for default */ "About", /* pointer to text */ NULL /* next IntuiText structure */ }; struct MenuItem MenuItem1 = { &MenuItem2, /* next MenuItem structure */ 0,0, /* XY of Item hitbox relative to TopLeft of parent hitbox */ 80,8, /* hit box width and height */ ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP, /* Item flags */ 0, /* each bit mutually-excludes a same-level Item */ (APTR)&IText10, /* Item render (IntuiText or Image or NULL) */ NULL, /* Select render */ 'A', /* alternate command-key */ NULL, /* SubItem list */ MENUNULL /* filled in by Intuition for drag selections */ }; struct Menu Menu1 = { NULL, /* next Menu structure */ 0,0, /* XY origin of Menu hit box relative to screen TopLeft */ 63,0, /* Menu hit box width and height */ MENUENABLED, /* Menu flags */ "Project", /* text of Menu name */ &MenuItem1 /* MenuItem linked list pointer */ }; #define MenuList1 Menu1 struct NewWindow NewWindowStructure1 = { 0,0, /* window XY origin relative to TopLeft of screen */ 320,200, /* window width and height */ 0,1, /* detail and block pens */ MOUSEBUTTONS|MENUPICK, /* IDCMP flags */ BACKDROP+BORDERLESS+ACTIVATE+NOCAREREFRESH, /* other window flags */ NULL, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ "Rubiks Cube", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 320,200, /* minimum width and height */ -1,-1, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; SHORT BorderVectors1[] = { 0,0, 51,0, 51,25, 0,25, 0,0 }; struct Border Border1 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ BorderVectors1, /* pointer to XY vectors */ NULL /* next border in list */ }; struct IntuiText IText11 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 16,10, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "OK", /* pointer to text */ NULL /* next IntuiText structure */ }; struct Gadget Gadget1 = { NULL, /* next gadget */ 54,101, /* origin XY of hit box relative to window TopLeft */ 50,24, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&Border1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &IText11, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ NULL, /* user-definable data */ NULL /* pointer to user-definable data */ }; #define GadgetList2 Gadget1 struct IntuiText IText14 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 33,40, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Version 0.0", /* pointer to text */ NULL /* next IntuiText structure */ }; struct IntuiText IText13 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 19,61, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "By W. Roger Uzun", /* pointer to text */ &IText14 /* next IntuiText structure */ }; struct IntuiText IText12 = { 3,0,JAM2, /* front and back text pens, drawmode and fill byte */ 31,15, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Rubiks Solve", /* pointer to text */ &IText13 /* next IntuiText structure */ }; #define IntuiTextList2 IText12 struct NewWindow NewWindowStructure2 = { 80,30, /* window XY origin relative to TopLeft of screen */ 160,135, /* window width and height */ 0,1, /* detail and block pens */ GADGETUP, /* IDCMP flags */ ACTIVATE+NOCAREREFRESH, /* other window flags */ &Gadget1, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ "About Rubiks Solve", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 160,135, /* minimum width and height */ -1,-1, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; void __regargs HandleEvent(object) APTR object; { if (object == (APTR)&MenuItem1) { DoAbout(); return; } if (object == (APTR)&SubItem1) { DoRight(); return; } if (object == (APTR)&SubItem2) { DoLeft(); return; } if (object == (APTR)&SubItem3) { DoUp(); return; } if (object == (APTR)&SubItem4) { DoDown(); return; } if (object == (APTR)&SubItem5) { DoForward(); return; } if (object == (APTR)&SubItem6) { DoBack(); return; } if (object == (APTR)&SubItem7) { DoHorizontal(); return; } if (object == (APTR)&SubItem8) { DoVertical(); return; } if (object == (APTR)&MenuItem3) { DoSolve(); return; } if (object == (APTR)&MenuItem4) { DoQuit(); return; } } #define HANDLEEVENT HandleEvent /* end of PowerWindows source generation */ ULONG __regargs *MatchBox(x,y) int x,y; { ULONG *temp; if ((x >= 90)&&(x <= 109)&&(y >= 16)&&(y <= 32)) temp = &upperface[0]; else if ((x >= 111)&&(x <= 130)&&(y >= 16)&&(y <= 32)) temp = &upperface[1]; else if ((x >= 132)&&(x <= 151)&&(y >= 16)&&(y <= 32)) temp = &upperface[2]; else if ((x >= 90)&&(x <= 109)&&(y >= 34)&&(y <= 50)) temp = &upperface[3]; else if ((x >= 111)&&(x <= 130)&&(y >= 34)&&(y <= 50)) temp = &upperface[4]; else if ((x >= 132)&&(x <= 151)&&(y >= 34)&&(y <= 50)) temp = &upperface[5]; else if ((x >= 90)&&(x <= 109)&&(y >= 52)&&(y <= 68)) temp = &upperface[6]; else if ((x >= 111)&&(x <= 130)&&(y >= 52)&&(y <= 68)) temp = &upperface[7]; else if ((x >= 132)&&(x <= 151)&&(y >= 52)&&(y <= 68)) temp = &upperface[8]; else if ((x >= 20)&&(x <= 39)&&(y >= 76)&&(y <= 92)) temp = &leftface[0]; else if ((x >= 41)&&(x <= 60)&&(y >= 76)&&(y <= 92)) temp = &leftface[1]; else if ((x >= 62)&&(x <= 81)&&(y >= 76)&&(y <= 92)) temp = &leftface[2]; else if ((x >= 20)&&(x <= 39)&&(y >= 94)&&(y <= 110)) temp = &leftface[3]; else if ((x >= 41)&&(x <= 60)&&(y >= 94)&&(y <= 110)) temp = &leftface[4]; else if ((x >= 62)&&(x <= 81)&&(y >= 94)&&(y <= 110)) temp = &leftface[5]; else if ((x >= 20)&&(x <= 39)&&(y >= 112)&&(y <= 128)) temp = &leftface[6]; else if ((x >= 41)&&(x <= 60)&&(y >= 112)&&(y <= 128)) temp = &leftface[7]; else if ((x >= 62)&&(x <= 81)&&(y >= 112)&&(y <= 128)) temp = &leftface[8]; else if ((x >= 90)&&(x <= 109)&&(y >= 76)&&(y <= 92)) temp = &frontface[0]; else if ((x >= 111)&&(x <= 130)&&(y >= 76)&&(y <= 92)) temp = &frontface[1]; else if ((x >= 132)&&(x <= 151)&&(y >= 76)&&(y <= 92)) temp = &frontface[2]; else if ((x >= 90)&&(x <= 109)&&(y >= 94)&&(y <= 110)) temp = &frontface[3]; else if ((x >= 111)&&(x <= 130)&&(y >= 94)&&(y <= 110)) temp = &frontface[4]; else if ((x >= 132)&&(x <= 151)&&(y >= 94)&&(y <= 110)) temp = &frontface[5]; else if ((x >= 90)&&(x <= 109)&&(y >= 112)&&(y <= 128)) temp = &frontface[6]; else if ((x >= 111)&&(x <= 130)&&(y >= 112)&&(y <= 128)) temp = &frontface[7]; else if ((x >= 132)&&(x <= 151)&&(y >= 112)&&(y <= 128)) temp = &frontface[8]; else if ((x >= 160)&&(x <= 179)&&(y >= 76)&&(y <= 92)) temp = &rightface[0]; else if ((x >= 181)&&(x <= 200)&&(y >= 76)&&(y <= 92)) temp = &rightface[1]; else if ((x >= 202)&&(x <= 221)&&(y >= 76)&&(y <= 92)) temp = &rightface[2]; else if ((x >= 160)&&(x <= 179)&&(y >= 94)&&(y <= 110)) temp = &rightface[3]; else if ((x >= 181)&&(x <= 200)&&(y >= 94)&&(y <= 110)) temp = &rightface[4]; else if ((x >= 202)&&(x <= 221)&&(y >= 94)&&(y <= 110)) temp = &rightface[5]; else if ((x >= 160)&&(x <= 179)&&(y >= 112)&&(y <= 128)) temp = &rightface[6]; else if ((x >= 181)&&(x <= 200)&&(y >= 112)&&(y <= 128)) temp = &rightface[7]; else if ((x >= 202)&&(x <= 221)&&(y >= 112)&&(y <= 128)) temp = &rightface[8]; else if ((x >= 230)&&(x <= 249)&&(y >= 76)&&(y <= 92)) temp = &backface[0]; else if ((x >= 251)&&(x <= 270)&&(y >= 76)&&(y <= 92)) temp = &backface[1]; else if ((x >= 272)&&(x <= 291)&&(y >= 76)&&(y <= 92)) temp = &backface[2]; else if ((x >= 230)&&(x <= 249)&&(y >= 94)&&(y <= 110)) temp = &backface[3]; else if ((x >= 251)&&(x <= 270)&&(y >= 94)&&(y <= 110)) temp = &backface[4]; else if ((x >= 272)&&(x <= 291)&&(y >= 94)&&(y <= 110)) temp = &backface[5]; else if ((x >= 230)&&(x <= 249)&&(y >= 112)&&(y <= 128)) temp = &backface[6]; else if ((x >= 251)&&(x <= 270)&&(y >= 112)&&(y <= 128)) temp = &backface[7]; else if ((x >= 272)&&(x <= 291)&&(y >= 112)&&(y <= 128)) temp = &backface[8]; else if ((x >= 90)&&(x <= 109)&&(y >= 136)&&(y <= 152)) temp = &downface[0]; else if ((x >= 111)&&(x <= 130)&&(y >= 136)&&(y <= 152)) temp = &downface[1]; else if ((x >= 132)&&(x <= 151)&&(y >= 136)&&(y <= 152)) temp = &downface[2]; else if ((x >= 90)&&(x <= 109)&&(y >= 154)&&(y <= 170)) temp = &downface[3]; else if ((x >= 111)&&(x <= 130)&&(y >= 154)&&(y <= 170)) temp = &downface[4]; else if ((x >= 132)&&(x <= 151)&&(y >= 154)&&(y <= 170)) temp = &downface[5]; else if ((x >= 90)&&(x <= 109)&&(y >= 172)&&(y <= 188)) temp = &downface[6]; else if ((x >= 111)&&(x <= 130)&&(y >= 172)&&(y <= 188)) temp = &downface[7]; else if ((x >= 132)&&(x <= 151)&&(y >= 172)&&(y <= 188)) temp = &downface[8]; else temp = 0L; return(temp); } void DoQuit() { done = 1; } void Space2() { SetAPen(rpG,0L); RectFill(rpG,0L,190L,319L,199L); Move(rpG,0L,197L); SetAPen(rpG,1L); } void Parse() { int i; int j,count; char c; PlotOn = 0; for(i=0;i 15L) Delay((speed/4L)); } void ClearUpperCorners() { char str[80]; Space2(); strcpy(str,"No Solved Sides - clear upper corners"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); for(k=0;k<4;k++) { a1660: if ((upperface[8] != a)&&(frontface[2] != a)&&(rightface[0] != a)) { strcat(q,"c\n"); if (fh) Write(fh,q,strlen(q)); goto a1820; } else {/* Move out of top layer */ a1720: q[0] = '\0'; if ((frontface[8] == a)||(rightface[6] == a)||(downface[2] == a)) { strcpy(q,"d"); } if (q[0] != '\0') { if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a1720; } a1790: strcpy(q,"r'd'rd"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a1660; } a1820: Parse();if (aborted) return; q[0] = '\0'; } } void SolveCorners() { int temp; k = 0; a1850: temp = 0; a = upperface[4]; c = frontface[4]; e = rightface[4]; if ((downface[2] == e)&&(frontface[8] == c)) strcpy(q,"dfd'f'"); else if ((frontface[8] == e)&&(rightface[6] == c)) strcpy(q,"r'drfddf'"); else if ((rightface[6] == e)&&(downface[2] == c)) strcpy(q,"d'r'dr"); if (q[0] != '\0') k++; else { temp = 1; strcpy(q,"d'"); } if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; if (!(temp)) { strcpy(q,"c"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; if (k == 4) { return; } } q[0] = '\0'; goto a1850; } void DoALayer() { /* 2340 stuff here */ char str[80]; int l; strcpy(str,"Layer unfinished, Clear edges"); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"begin by removing centers from upper layer\n"); if (fh) Write(fh,str,strlen(str)); q[0] = '\0'; for(l=1;l<5;l++) { a2390: if ((upperface[4] == upperface[7])||(upperface[4] == frontface[1])) strcpy(q,"f'u'dcf"); if (q[0] == '\0') { strcpy(q,"c"); } else { if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a2390; } if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; } strcpy(str,"\nNow replace centers from center layer\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"Edges Cleared - Solve Edges"); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); q[0] = '\0'; for(l=1;l<5;l++) { if ((upperface[4] == upperface[7])&&(frontface[1] == frontface[0])) { goto a2600; } a2520: if ((upperface[4] == leftface[5])&&(frontface[3] == frontface[0])) strcpy(q,"u'r'ud'f"); if ((upperface[4] == frontface[3])&&(leftface[5] == frontface[0])) strcpy(q,"u'ruuddl'u'"); if ((upperface[4] == downface[1])&&(frontface[7] == frontface[0])) strcpy(q,"rl'fflr'"); if ((upperface[4] == frontface[7])&&(downface[1] == frontface[0])) strcpy(q,"drl'f'lr'"); if (q[0] != '\0') goto a2590; strcpy(q,"cu'"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a2520; a2590: if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; a2600: strcpy(q,"c"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; } } void FinishLayers() { char str[80]; int i,temp,l; temp = 0; for(i=0;i<9;i++) { if (upperface[i] != upperface[4]) temp = 1; } if (temp) DoALayer(); /* this is 2340 */ else { for(i=0;i<3;i++) if ((leftface[i] != leftface[0])||(rightface[i] != rightface[0])|| (backface[i] != backface[0])) { temp = 1; } if (temp) DoALayer(); } if (!temp) { strcpy(str,"Top Layer Finished - Go to Middle Layer\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"Go To Middle Layer"); Space2(); Text(rpG,str,strlen(str)); } /* 2630 stuff goes here */ /* missing a4070 and a4080 routines! */ Space2(); strcpy(str,"\n"); if (fh) Write(fh,str,1L); strcpy(str,"First Layer Complete"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"Color align cubes of middle layer with top layer\n"); if (fh) Write(fh,str,strlen(str)); q[0] = '\0'; a2660: if (frontface[0] != frontface[4]) { strcpy(q,"cu'"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a2660; } Space2(); strcpy(str,"\nTop and Middle Layers aligned - is middle layer finished?\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"- is middle layer finished?"); Text(rpG,str,strlen(str)); for(l=3;l<6;l++) { if ((leftface[l] != leftface[4])||(frontface[l] != frontface[4])|| (rightface[l] != rightface[4])||(backface[l] != backface[4])) { goto a2790; } } goto a3120; a2790: strcpy(str,"Middle Layer Unfinished - clear middle layer edge cubes\n"); if (fh) Write(fh,str,strlen(str)); Space2(); strcpy(str,"- clear middle layer edge cubes"); Text(rpG,str,strlen(str)); q[0] = '\0'; for(k=1;k<5;k++) { a2830: if ((frontface[3] == downface[4])||(leftface[5] == downface[4])) goto a2900; if ((downface[5] == downface[4])||(rightface[7] == downface[4])) strcpy(q,"ldl'd'f'd'f"); else { strcpy(q,"d"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a2830; } if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; a2900: q[1] = '\0'; q[0] = 'c'; if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; } /* Middle Layer Edge Destoryed */ Space2(); strcpy(str,"Edge Cubes Cleared - replace them"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); for(l=1;l<5;l++) { q[0] = '\0'; a2960: if ((downface[5] == leftface[4])&&(rightface[7] == frontface[4])) strcpy(q,"ldl'd'f'd'f"); if ((downface[5] == frontface[4])&&(rightface[7] == leftface[4])) strcpy(q,"ldl'd'f'd'f"); if (q[0] == '\0') { strcpy(q,"d"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; goto a2960; } if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; } /* Top and Middle layers are complete */ strcpy(str,"\nTop and Middle Layers are complete\n"); if (fh) Write(fh,str,strlen(str)); Space2(); strcpy(str,"Color Align edge cubes"); Text(rpG,str,strlen(str)); strcpy(str,"edge cubes replaced - color align them\n"); if (fh) Write(fh,str,strlen(str)); for(k=1;k<5;k++) { q[0] = '\0'; if ((leftface[5] == leftface[4])&&(frontface[3] == frontface[4])) strcpy(q,"c"); else { strcpy(q,"drdu'rdu'bdu'lld'ubd'urd'uffr'd'"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"c"); } if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; q[0] = '\0'; } /* Middle Layer finished */ a3120: Space2(); strcpy(str,"- place corners in bottom layer"); Text(rpG,str,strlen(str)); strcpy(str,"\nMiddle Layer finished - place corners in bottom layer\n"); a3140: if ((downface[2] == rightface[4])&&(rightface[6] == frontface[4])) goto a3180; if ((rightface[6] == rightface[4])&&(frontface[8] == frontface[4])) goto a3180; if ((frontface[8] == rightface[4])&&(downface[2] == frontface[4])) goto a3180; q[0] = 'd'; q[1] = '\0'; if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3140; a3180: if ((downface[0] == frontface[4])&&(frontface[6] == leftface[4])) goto a3300; if ((frontface[6] == frontface[4])&&(leftface[8] == leftface[4])) goto a3300; if ((leftface[8] == frontface[4])&&(downface[0] == leftface[4])) goto a3300; if ((downface[6] == leftface[4])&&(leftface[6] == backface[4])) goto a3340; if ((leftface[6] == leftface[4])&&(backface[8] == backface[4])) goto a3340; if ((backface[8] == leftface[4])&&(downface[6] == backface[4])) goto a3340; if ((downface[8] == rightface[4])&&(rightface[8] == backface[4])) goto a3350; if ((rightface[8] == rightface[4])&&(backface[6] == backface[4])) goto a3350; if ((backface[6] == rightface[4])&&(downface[8] == backface[4])) goto a3350; strcpy(q,"dfd'b'df'd'b"); a3290: if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3180; a3300: if ((downface[6] == leftface[4])&&(leftface[6] == backface[4])) goto a3360; if ((leftface[6] == leftface[4])&&(backface[8] == backface[4])) goto a3360; if ((backface[8] == leftface[4])&&(downface[6] == backface[4])) goto a3360; strcpy(q,"fd'b'df'd'bdd"); goto a3290; a3340: strcpy(q,"dldbd'b'l'"); goto a3290; a3350: strcpy(q,"rd'l'dr'd'ldd"); goto a3290; a3360: /* corners are in place */ strcpy(str,"Corners in place align corner colors"); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,"\n",1L); if (fh) Write(fh,str,strlen(str)); a3380: a = 0; if (downface[0] == downface[4]) a++; if (downface[2] == downface[4]) a++; if (downface[6] == downface[4]) a++; if (downface[8] == downface[4]) a++; if (a==1) goto a3500; if (a != 0) goto a3530; a3450: if (downface[4] != backface[8]) { q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,1L); Parse();if (aborted) return; goto a3450; } a3480: strcpy(q,"ldl'dlddl'dd"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3380; a3500: if (downface[2] == downface[4]) goto a3480; strcpy(q,"c"); if (fh) Write(fh,q,1L); Parse();if (aborted) return; goto a3500; a3530: if (a==4) goto a3610; if (a==2) goto a3570; if (downface[0] != downface[4]) goto a3480; goto a3590; a3570: if ((downface[6] == downface[4])&&(downface[8] == downface[4])) goto a3480; if ((downface[2] == downface[4])&&(downface[6] == downface[4])) goto a3480; a3590: q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,1L); Parse();if (aborted) return; goto a3380; a3610: strcpy(str,"- color align bottom face"); Space2(); Text(rpG,str,strlen(str)); strcpy(str,"\nCorners are now aligned - color align bottom face\n"); if (fh) Write(fh,str,strlen(str)); for(k=1;k<5;k++) { if (downface[1] != downface[7]) goto a3750; a3650: if (downface[1] != downface[3]) goto a3830; a3660: q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; } strcpy(str,"- check edges for color alignment"); Space2(); Text(rpG,str,strlen(str)); strcpy(str,"\nBottom face aligned - check edges for color alignment\n"); if (fh) Write(fh,str,strlen(str)); a3680: if ((frontface[7] != frontface[4])) goto a3870; if (leftface[7] != leftface[4]) goto a4030; if (rightface[7] != rightface[4]) goto a4070; if (backface[7] != backface[4]) goto a4080; strcpy(str,"\n- - Edges OK!\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"Solution to Rubiks Cube completed\n"); if (fh) Write(fh,str,strlen(str)); Space2(); strcpy(str,"Cube Solved!"); Text(rpG,str,strlen(str)); return; a3750: if ((downface[1] != downface[4])&&(downface[7] != downface[4])) goto a3770; goto a3650; a3770: q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,1L); Parse();if (aborted) return; strcpy(q,"hdu'rdu'bdu'lld'ubd'urd'uffh'"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"c'"); if (fh) Write(fh,q,2L); Parse();if (aborted) return; goto a3650; a3830: if ((downface[1] != downface[4])&&(downface[3] != downface[4])) goto a3850; goto a3660; a3850: strcpy(q,"f'r'hdu'rdu'bdu'lld'ubd'urd'uffh'rf"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3660; a3870: if (leftface[7] == leftface[4]) goto a3920; if (rightface[7] == rightface[4]) goto a3930; if (backface[7] == backface[4]) goto a3970; q[0] = 'c'; q[1] = '\0'; if (fh) Write(fh,q,1L); Parse();if (aborted) return; strcpy(q,"rrdbf'rrfb'drr"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3680; a3920: strcpy(q,"rrdbf'rrfb'drr"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3680; a3930: strcpy(q,"cc"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"rrdbf'rrfb'drr"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"cc"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; goto a3680; a3970: strcpy(q,"c'"); if (fh) Write(fh,q,2L); Parse();if (aborted) return; strcpy(q,"rrdbf'rrfb'drr"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"c"); if (fh) Write(fh,q,1L); Parse();if (aborted) return; goto a3680; a4030: strcpy(q,"c"); if (fh) Write(fh,q,1L); Parse();if (aborted) return; strcpy(q,"rrdbf'rrfb'drr"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; strcpy(q,"c'"); if (fh) Write(fh,q,2L); Parse();if (aborted) return; goto a3680; a4070: a4080: strcpy(str,"Cannot Solve Cube"); Space2(); Text(rpG,str,strlen(str)); strcpy(str,"\nCannot solve cube because of its structure!\n"); if (fh) Write(fh,str,strlen(str)); } void DoSolve() { register int i; struct Window *wG3; struct IntuiMessage *message; int done2=0; UWORD code; ULONG class,s1,s2,m1,m2; APTR object; char str[80]; aborted = 0; i = 255 - speed; sprintf(MyMyGadget3SIBuff,"%d",i); if (!(wG3 = OpenWindow(&MyNewWindowStructure1))) return; PrintIText(wG3->RPort,&MyIntuiTextList1,0L,0L); Delay(10L); ActivateGadget(&MyGadget2,wG3,NULL); while (!done2) { WaitPort(wG3->UserPort); while(message = (struct IntuiMessage *)GetMsg(wG3->UserPort)) { class = message->Class; code = message->Code; object = message->IAddress; ReplyMsg((struct Message *)message); if (object == (APTR)&MyGadget1) done2 = 1; else if (object == (APTR)&MyGadget2) ActivateGadget(&MyGadget3,wG3,NULL); else if (object == (APTR)&MyGadget3) ActivateGadget(&MyGadget2,wG3,NULL); } } CloseWindow(wG3); speed = atol(MyMyGadget3SIBuff); for(done2=0;done2 '9')||(MyMyGadget3SIBuff[done2] < '0')) { speed = 255L; } } if (speed > 255L) speed = 255L; speed = 255L - speed; /* speed is the delay factor from 0 - 255 */ fh = 0L; if (strlen(MyMyGadget2SIBuff) > 0) { if (!(fh = Open(MyMyGadget2SIBuff,MODE_NEWFILE))) { DisplayBeep(0L); Delay(30L); DisplayBeep(0L); } } CurrentTime(&s1,&m1); /* solve cube goes here */ SetAPen(rpG,1L); /* Black */ Space2(); strcpy(str,"check for one side solved"); Text(rpG,str,strlen(str)); if (fh) { strcat(str,"\n"); Write(fh,str,strlen(str)); } done2 = 1; for(i=0;i<9;i++) if (upperface[i] != upperface[4]) done2 = 0; if (!done2) { done2 = 2; for(i=0;i<9;i++) if (leftface[i] != leftface[4]) done2 = 0; } if (!done2) { done2 = 3; for(i=0;i<9;i++) if (frontface[i] != frontface[4]) done2 = 0; } if (!done2) { done2 = 4; for(i=0;i<9;i++) if (rightface[i] != rightface[4]) done2 = 0; } if (!done2) { done2 = 5; for(i=0;i<9;i++) if (backface[i] != backface[4]) done2 = 0; } if (!done2) { done2 = 6; for(i=0;i<9;i++) if (downface[i] != downface[4]) done2 = 0; } if (done2) {/* a side is done */ switch(done2) { case 1 : Space2(); strcpy(str,"Upper Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); break; case 2 : Space2(); strcpy(str,"Left Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(q,"c'h"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; if (aborted) return; break; case 3 : Space2(); strcpy(str,"Front Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(q,"h"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; break; case 4 : Space2(); strcpy(str,"Right Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(q,"ch"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; break; case 5 : Space2(); strcpy(str,"Back Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(q,"h'"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; break; case 6 : Space2(); strcpy(str,"Down Side Solved"); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); strcpy(q,"hh"); if (fh) Write(fh,q,strlen(q)); Parse();if (aborted) return; break; } } else { q[0] = '\0'; a = upperface[4]; c = frontface[4]; e = rightface[4]; ClearUpperCorners(); strcpy(str,"Corners are Cleared, solve Corners"); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); SolveCorners(); strcpy(str,"\nCorners Finished\n"); if (fh) Write(fh,str,strlen(str)); strcpy(str,"Check For Finished Layers"); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); } strcpy(str,"Now finish Centers of Upper layer\n"); if (fh) Write(fh,str,strlen(str)); FinishLayers(); /* this is sub 2240 */ CurrentTime(&s2,&m2); s2 -= s1; sprintf(str,"Cube solved in %d secs.",s2); Space2(); Text(rpG,str,strlen(str)); strcat(str,"\n"); if (fh) Write(fh,str,strlen(str)); if (fh) Close(fh); fh = 0L; } void DoHorizontal() { int i; DoRight(); DoLeft(); DoLeft(); DoLeft(); for(i=0;i<9;i++) x[i] = frontface[i]; frontface[1] = downface[1]; frontface[4] = downface[4]; frontface[7] = downface[7]; downface[1] = backface[7]; downface[4] = backface[4]; downface[7] = backface[1]; backface[1] = upperface[7]; backface[4] = upperface[4]; backface[7] = upperface[1]; upperface[1] = x[1]; upperface[4] = x[4]; upperface[7] = x[7]; Plot(); } void DoVertical() { int i; DoUp(); DoDown(); DoDown(); DoDown(); for(i=0;i<9;i++) x[i] = leftface[i]; for(i=3;i<6;i++) { leftface[i] = frontface[i]; frontface[i] = rightface[i]; rightface[i] = backface[i]; backface[i] = x[i]; } Plot(); } void DoForward() { int i; for(i=0;i<9;i++) x[i] = frontface[i]; FaceRotate(); for(i=0;i<9;i++) frontface[i] = x[i]; for(i=0;i<9;i++) x[i] = upperface[i]; upperface[6] = leftface[8]; upperface[7] = leftface[5]; upperface[8] = leftface[2]; leftface[2] = downface[0]; leftface[5] = downface[1]; leftface[8] = downface[2]; downface[0] = rightface[6]; downface[1] = rightface[3]; downface[2] = rightface[0]; rightface[0] = x[6]; rightface[3] = x[7]; rightface[6] = x[8]; Plot(); } void DoBack() { int i; for(i=0;i<9;i++) x[i] = backface[i]; FaceRotate(); for(i=0;i<9;i++) backface[i] = x[i]; for(i=0;i<9;i++) x[i] = upperface[i]; upperface[0] = rightface[2]; upperface[1] = rightface[5]; upperface[2] = rightface[8]; rightface[2] = downface[8]; rightface[5] = downface[7]; rightface[8] = downface[6]; downface[6] = leftface[0]; downface[7] = leftface[3]; downface[8] = leftface[6]; leftface[0] = x[2]; leftface[3] = x[1]; leftface[6] = x[0]; Plot(); } void DoRight() { int i; for(i=0;i<9;i++) x[i] = rightface[i]; FaceRotate(); for(i=0;i<9;i++) rightface[i] = x[i]; for(i=0;i<9;i++) x[i] = upperface[i]; for(i=2;i<9;i+=3) { upperface[i] = frontface[i]; frontface[i] = downface[i]; } downface[2] = backface[6]; downface[5] = backface[3]; downface[8] = backface[0]; backface[0] = x[8]; backface[3] = x[5]; backface[6] = x[2]; Plot(); } void DoLeft() { int i; for(i=0;i<9;i++) x[i] = leftface[i]; FaceRotate(); for(i=0;i<9;i++) leftface[i] = x[i]; for(i=0;i<9;i++) x[i] = upperface[i]; upperface[0] = backface[8]; upperface[3] = backface[5]; upperface[6] = backface[2]; backface[2] = downface[6]; backface[5] = downface[3]; backface[8] = downface[0]; for(i=0;i<7;i+=3) { downface[i] = frontface[i]; frontface[i] = x[i]; } Plot(); } void FaceRotate() { int i; y[0] = x[6]; y[1] = x[3]; y[2] = x[0]; y[3] = x[7]; y[4] = x[4]; y[5] = x[1]; y[6] = x[8]; y[7] = x[5]; y[8] = x[2]; for(i=0;i<9;i++) x[i] = y[i]; } void DoUp() { register long i; for(i=0;i<9;i++) x[i] = upperface[i]; FaceRotate(); for(i=0;i<9;i++) upperface[i] = x[i]; for(i=0;i<9;i++) x[i] = leftface[i]; for(i=0;i<3;i++) { leftface[i] = frontface[i]; frontface[i] = rightface[i]; } for(i=0;i<3;i++) { rightface[i] = backface[i]; backface[i] = x[i]; } Plot(); } void DoDown() { int i; for(i=0;i<9;i++) x[i] = downface[i]; FaceRotate(); for(i=0;i<9;i++) downface[i] = x[i]; for(i=0;i<6;i++) x[i] = 0; x[6] = leftface[6]; x[7] = leftface[7]; x[8] = leftface[8]; for(i=6;i<9;i++) { leftface[i] = backface[i]; backface[i] = rightface[i]; } for(i=6;i<9;i++) { rightface[i] = frontface[i]; frontface[i] = x[i]; } Plot(); } void DoAbout() { struct Window *wG3; struct IntuiMessage *message; if (!(wG3 = OpenWindow(&NewWindowStructure2))) return; PrintIText(wG3->RPort,&IntuiTextList2,0L,0L); WaitPort(wG3->UserPort); while(message = (struct IntuiMessage *)GetMsg(wG3->UserPort)) ReplyMsg((struct Message *)message); CloseWindow(wG3); } void __regargs PrintText(Line,Row,str) int Line,Row; char *str; { Move(rpG,(Row*7L),(Line*10L+2L)); Text(rpG,str,strlen(str)); } void Plot() { int i; UWORD code; ULONG class; char str[80]; struct IntuiMessage *message; if ((message = (struct IntuiMessage *)GetMsg(wG->UserPort))) { class = message->Class; code = message->Code; ReplyMsg((struct Message *)message); if ((class == MOUSEBUTTONS)&&(code == SELECTDOWN)) { aborted = 1; for(i=0;i<9;i++) { upperface[i] = 2; leftface[i] = 3; frontface[i] = 4; rightface[i] = 5; backface[i] = 6; downface[i] = 7; } strcpy(str,"\nAborted\n"); if (fh) Write(fh,str,strlen(str)); PlotOn = 1; } } if (!PlotOn) return; SetAPen(rpG,upperface[0]); RectFill(rpG,90L,16L,109L,32L); SetAPen(rpG,upperface[1]); RectFill(rpG,111L,16L,130L,32L); SetAPen(rpG,upperface[2]); RectFill(rpG,132L,16L,151L,32L); SetAPen(rpG,upperface[3]); RectFill(rpG,90L,34L,109L,50L); SetAPen(rpG,upperface[4]); RectFill(rpG,111L,34L,130L,50L); SetAPen(rpG,upperface[5]); RectFill(rpG,132L,34L,151L,50L); SetAPen(rpG,upperface[6]); RectFill(rpG,90L,52L,109L,68L); SetAPen(rpG,upperface[7]); RectFill(rpG,111L,52L,130L,68L); SetAPen(rpG,upperface[8]); RectFill(rpG,132L,52L,151L,68L); SetAPen(rpG,leftface[0]); RectFill(rpG,20L,76L,39L,92L); SetAPen(rpG,leftface[1]); RectFill(rpG,41L,76L,60L,92L); SetAPen(rpG,leftface[2]); RectFill(rpG,62L,76L,81L,92L); SetAPen(rpG,leftface[3]); RectFill(rpG,20L,94L,39L,110L); SetAPen(rpG,leftface[4]); RectFill(rpG,41L,94L,60L,110L); SetAPen(rpG,leftface[5]); RectFill(rpG,62L,94L,81L,110L); SetAPen(rpG,leftface[6]); RectFill(rpG,20L,112L,39L,128L); SetAPen(rpG,leftface[7]); RectFill(rpG,41L,112L,60L,128L); SetAPen(rpG,leftface[8]); RectFill(rpG,62L,112L,81L,128L); SetAPen(rpG,frontface[0]); RectFill(rpG,90L,76L,109L,92L); SetAPen(rpG,frontface[1]); RectFill(rpG,111L,76L,130L,92L); SetAPen(rpG,frontface[2]); RectFill(rpG,132L,76L,151L,92L); SetAPen(rpG,frontface[3]); RectFill(rpG,90L,94L,109L,110L); SetAPen(rpG,frontface[4]); RectFill(rpG,111L,94L,130L,110L); SetAPen(rpG,frontface[5]); RectFill(rpG,132L,94L,151L,110L); SetAPen(rpG,frontface[6]); RectFill(rpG,90L,112L,109L,128L); SetAPen(rpG,frontface[7]); RectFill(rpG,111L,112L,130L,128L); SetAPen(rpG,frontface[8]); RectFill(rpG,132L,112L,151L,128L); SetAPen(rpG,rightface[0]); RectFill(rpG,160L,76L,179L,92L); SetAPen(rpG,rightface[1]); RectFill(rpG,181L,76L,200L,92L); SetAPen(rpG,rightface[2]); RectFill(rpG,202L,76L,221L,92L); SetAPen(rpG,rightface[3]); RectFill(rpG,160L,94L,179L,110L); SetAPen(rpG,rightface[4]); RectFill(rpG,181L,94L,200L,110L); SetAPen(rpG,rightface[5]); RectFill(rpG,202L,94L,221L,110L); SetAPen(rpG,rightface[6]); RectFill(rpG,160L,112L,179L,128L); SetAPen(rpG,rightface[7]); RectFill(rpG,181L,112L,200L,128L); SetAPen(rpG,rightface[8]); RectFill(rpG,202L,112L,221L,128L); SetAPen(rpG,backface[0]); RectFill(rpG,230L,76L,249L,92L); SetAPen(rpG,backface[1]); RectFill(rpG,251L,76L,270L,92L); SetAPen(rpG,backface[2]); RectFill(rpG,272L,76L,291L,92L); SetAPen(rpG,backface[3]); RectFill(rpG,230L,94L,249L,110L); SetAPen(rpG,backface[4]); RectFill(rpG,251L,94L,270L,110L); SetAPen(rpG,backface[5]); RectFill(rpG,272L,94L,291L,110L); SetAPen(rpG,backface[6]); RectFill(rpG,230L,112L,249L,128L); SetAPen(rpG,backface[7]); RectFill(rpG,251L,112L,270L,128L); SetAPen(rpG,backface[8]); RectFill(rpG,272L,112L,291L,128L); SetAPen(rpG,downface[0]); RectFill(rpG,90L,136L,109L,152L); SetAPen(rpG,downface[1]); RectFill(rpG,111L,136L,130L,152L); SetAPen(rpG,downface[2]); RectFill(rpG,132L,136L,151L,152L); SetAPen(rpG,downface[3]); RectFill(rpG,90L,154L,109L,170L); SetAPen(rpG,downface[4]); RectFill(rpG,111L,154L,130L,170L); SetAPen(rpG,downface[5]); RectFill(rpG,132L,154L,151L,170L); SetAPen(rpG,downface[6]); RectFill(rpG,90L,172L,109L,188L); SetAPen(rpG,downface[7]); RectFill(rpG,111L,172L,130L,188L); SetAPen(rpG,downface[8]); RectFill(rpG,132L,172L,151L,188L); } void Init() { register ULONG i; char str[80]; for(i=0;i<9;i++) { upperface[i] = 2; leftface[i] = 3; frontface[i] = 4; rightface[i] = 5; backface[i] = 6; downface[i] = 7; } SetDrMd(rpG,JAM1); SetAPen(rpG,1L); for(i=19;i<83;i+=21) { Move(rpG,i,75L); Draw(rpG,i,129L); } for(i=89;i<153;i+=21) { Move(rpG,i,75L); Draw(rpG,i,129L); Move(rpG,i,15L); Draw(rpG,i,69L); Move(rpG,i,135L); Draw(rpG,i,189L); } for(i=159;i<223;i+=21) { Move(rpG,i,75L); Draw(rpG,i,129L); } for(i=229;i<293;i+=21) { Move(rpG,i,75L); Draw(rpG,i,129L); } for(i=75;i<130;i+=18) { Move(rpG,19L,i); Draw(rpG,82L,i); Move(rpG,89L,i); Draw(rpG,152L,i); Move(rpG,159L,i); Draw(rpG,222L,i); Move(rpG,229L,i); Draw(rpG,292L,i); } for(i=15;i<70;i+=18) { Move(rpG,89L,i); Draw(rpG,152L,i); } for(i=135;i<190;i+=18) { Move(rpG,89L,i); Draw(rpG,152L,i); } strcpy(str,"Up"); PrintText(3,10,str); strcpy(str,"Left"); PrintText(7,5,str); strcpy(str,"Right"); PrintText(7,24,str); strcpy(str,"Back"); PrintText(7,33,str); strcpy(str,"Down"); PrintText(18,8,str); strcpy(str,"Front"); PrintText(4,23,str); Move(rpG,152L,75L); Draw(rpG,175L,47L); Plot(); } void main() { int Mx,My; UWORD code; ULONG class,temp; APTR object; ULONG signals; struct IntuiMessage *message; /* the message the IDCMP sends us */ #ifdef CPU020 struct ExecBase **execbaseptr=(struct ExecBase **)4L; UWORD cpuid; struct ExecBase *execbase; execbase = *execbaseptr; cpuid = execbase->AttnFlags; if (!(cpuid & AFF_68020)) { exit(0); } #endif if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 33L))) { exit(0); } if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 33L))) { CloseLibrary((struct Library *)IntuitionBase); exit(0); } if (!(myTextFont = OpenFont(&TOPAZ80))) { CloseLibrary((struct Library *)GfxBase); CloseLibrary((struct Library *)IntuitionBase); exit(0); } if (!(sC = OpenScreen(&NewScreenStructure))) { CloseFont(myTextFont); CloseLibrary((struct Library *)GfxBase); CloseLibrary((struct Library *)IntuitionBase); exit(0); } LoadRGB4(&(sC->ViewPort),Palette,PaletteColorCount); MyNewWindowStructure1.Screen = NewWindowStructure2.Screen = NewWindowStructure1.Screen = sC; if (!(wG = OpenWindow(&NewWindowStructure1))) /* open the window */ { CloseScreen(sC); CloseFont(myTextFont); CloseLibrary((struct Library *)GfxBase); CloseLibrary((struct Library *)IntuitionBase); exit(0); } rpG = wG->RPort; /* get a rastport pointer for the window */ SetFont(rpG,myTextFont); SetMenuStrip(wG,&MenuList1); /* attach any Menu */ Init(); do { signals = Wait(WINDOWSIGNAL); if (signals & WINDOWSIGNAL) while( (message = (struct IntuiMessage *) GetMsg(wG->UserPort) ) != NULL) { Mx = message->MouseX; My = message->MouseY; class = message->Class; code = message->Code; object = message->IAddress; /* Gadget */ ReplyMsg((struct Message *)message); if ( class == MENUPICK ) /* MenuItems */ HandleEvent((APTR)ItemAddress(&MenuList1,code)); else if ((class == MOUSEBUTTONS)&&(code == SELECTDOWN)) { onepoint++; if (onepoint == 1) { xchg1 = MatchBox(Mx,My); if (xchg1) SetPointer(wG,PickPtr,8L,0x10L,0L,0L); else onepoint = 0; } else { onepoint = 0; ClearPointer(wG); xchg2 = MatchBox(Mx,My); if (xchg2) { temp = *xchg1; *xchg1 = *xchg2; *xchg2 = temp; Plot(); } } } } } while (!done); CloseWindow(wG); CloseFont(myTextFont); CloseScreen(sC); CloseLibrary((struct Library *)GfxBase); CloseLibrary((struct Library *)IntuitionBase); }