1 /*- 2 # X-BASED RUBIK'S CUBE(tm) 3 # 4 # RubikP.h 5 # 6 ### 7 # 8 # Copyright (c) 1994 - 99 David Albert Bagley, bagleyd@tux.org 9 # 10 # All Rights Reserved 11 # 12 # Permission to use, copy, modify, and distribute this software and 13 # its documentation for any purpose and without fee is hereby granted, 14 # provided that the above copyright notice appear in all copies and 15 # that both that copyright notice and this permission notice appear in 16 # supporting documentation, and that the name of the author not be 17 # used in advertising or publicity pertaining to distribution of the 18 # software without specific, written prior permission. 19 # 20 # This program is distributed in the hope that it will be "playable", 21 # but WITHOUT ANY WARRANTY; without even the implied warranty of 22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 23 # 24 */ 25 26 /* Private header file for Rubik */ 27 28 #ifndef _RubikP_h 29 #define _RubikP_h 30 31 #include "Rubik.h" 32 33 /*** random number generator ***/ 34 #if HAVE_RAND48 35 #define SRAND srand48 36 #define LRAND lrand48 37 #define MAXRAND (2147483648.0) 38 #else /* HAVE_RAND48 */ 39 #if HAVE_RANDOM 40 #define SRAND srand48 41 #define LRAND lrand48 42 #define MAXRAND (2147483648.0) 43 #else /* HAVE_RANDOM */ 44 #if HAVE_RAND 45 #define SRAND srand48 46 #define LRAND lrand48 47 #ifdef AIXV3 48 #define MAXRAND (2147483648.0) 49 #else 50 #define MAXRAND (32768.0) 51 #endif 52 #endif /* HAVE_RAND */ 53 #endif /* HAVE_RANDOM */ 54 #endif /* HAVE_RAND48 */ 55 56 #ifndef SRAND 57 extern void SetRNG(long int s); 58 59 #define SRAND(X) SetRNG((long) X) 60 #endif 61 #ifndef LRAND 62 extern long LongRNG(void); 63 64 #define LRAND() LongRNG() 65 #endif 66 #ifndef MAXRAND 67 #define MAXRAND (2147483648.0) 68 #endif 69 70 #define NRAND(X) ((int)(LRAND()%(X))) 71 72 #define SYMBOL ':' 73 74 #define IGNORE (-1) 75 #define TOP 0 76 #define RIGHT 1 77 #define BOTTOM 2 78 #define LEFT 3 79 #define STRT 4 80 #define CW 5 81 #define HALF 6 82 #define CCW 7 83 #define MAXORIENT 4 84 #define MAXMAXSIZE (MAX(w->rubik.sizex, MAX(w->rubik.sizey, w->rubik.sizez))) 85 86 /* The following are in xrubik.c also */ 87 #define MAXFACES 6 88 #define MINCUBES 1 89 90 #define DEFAULTCUBES 3 91 92 #define MIN(a,b) (((int)(a)<(int)(b))?(int)(a):(int)(b)) 93 #define MAX(a,b) (((int)(a)>(int)(b))?(int)(a):(int)(b)) 94 95 typedef struct _RubikLoc { 96 char face, rotation; 97 } RubikLoc; 98 99 typedef struct _RubikPart { 100 Pixel foreground; 101 Pixel borderColor; 102 Pixel faceColor[MAXFACES]; 103 RubikLoc *cubeLoc[MAXFACES]; 104 RubikLoc *rowLoc[MAXORIENT]; 105 int currentFace, currentPosition, currentDirection; 106 Boolean started, practice, orient, vertical, mono, reverse; 107 int dim; /* This allows us to reuse code between 2d and 3d */ 108 int depth; 109 int sizex, sizey, sizez; 110 int degreeTurn; 111 Position delta; 112 Position orientLineLength; 113 XPoint puzzleSize; 114 XPoint puzzleOffset, letterOffset; 115 GC puzzleGC; 116 GC borderGC; 117 GC faceGC[MAXFACES]; 118 GC inverseGC; 119 String faceName[MAXFACES]; 120 char *username; 121 XtCallbackList select; 122 } RubikPart; 123 124 typedef struct _RubikRec { 125 CorePart core; 126 RubikPart rubik; 127 } RubikRec; 128 129 /* This gets around C's inability to do inheritance */ 130 typedef struct _RubikClassPart { 131 int ignore; 132 } RubikClassPart; 133 134 typedef struct _RubikClassRec { 135 CoreClassPart core_class; 136 RubikClassPart rubik_class; 137 } RubikClassRec; 138 139 typedef struct _RowNext { 140 int face, direction, sideFace; 141 } RowNext; 142 143 extern RubikClassRec rubikClassRec; 144 extern RubikLoc *startLoc[MAXFACES]; 145 146 extern void QuitRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 147 extern void PracticeRubik(RubikWidget w, XEvent * event, char **args, 148 int nArgs); 149 extern void PracticeRubikMaybe(RubikWidget w, XEvent * event, char **args, 150 int nArgs); 151 extern void RandomizeRubik(RubikWidget w, XEvent * event, char **args, 152 int nArgs); 153 extern void RandomizeRubikMaybe(RubikWidget w, XEvent * event, char **args, 154 int nArgs); 155 extern void GetRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 156 extern void WriteRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 157 extern void UndoRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 158 extern void SolveRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 159 extern void DecrementRubik(RubikWidget w, XEvent * event, char **args, 160 int nArgs); 161 extern void IncrementRubik(RubikWidget w, XEvent * event, char **args, 162 int nArgs); 163 extern void IncrementXRubik(RubikWidget w, XEvent * event, char **args, 164 int nArgs); 165 extern void IncrementYRubik(RubikWidget w, XEvent * event, char **args, 166 int nArgs); 167 extern void IncrementZRubik(RubikWidget w, XEvent * event, char **args, 168 int nArgs); 169 extern void OrientizeRubik(RubikWidget w, XEvent * event, char **args, 170 int nArgs); 171 extern void MoveRubikCw(RubikWidget w, XEvent * event, char **args, int nArgs); 172 extern void MoveRubikCcw(RubikWidget w, XEvent * event, char **args, int nArgs); 173 extern void MoveRubikInput(RubikWidget w, 174 int x, int y, int direction, int control); 175 extern void MoveRubik(RubikWidget w, 176 int face, int position, int direction, int control); 177 extern void SelectRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 178 extern void ReleaseRubik(RubikWidget w, XEvent * event, char **args, int nArgs); 179 180 extern void ResetPolyhedrons(RubikWidget w); 181 extern void SolvePolyhedrons(RubikWidget w); 182 extern void DrawAllPolyhedrons(RubikWidget w); 183 extern Boolean CheckSolved(RubikWidget w); 184 extern void InitMoves(void); 185 extern void PutMove(int face, int position, int direction, int control); 186 extern void GetMove(int *face, int *position, int *direction, int *control); 187 extern int MadeMoves(void); 188 extern void FlushMoves(RubikWidget w); 189 extern int NumMoves(void); 190 extern void ScanMoves(FILE * fp, RubikWidget w, int moves); 191 extern void PrintMoves(FILE * fp); 192 extern void ScanStartPosition(FILE * fp, RubikWidget w); 193 extern void PrintStartPosition(FILE * fp, RubikWidget w); 194 extern void SetStartPosition(RubikWidget w); 195 extern void faceSizes(RubikWidget w, int face, int *sizeOfRow, int *sizeOfColumn); 196 extern int sizeFace(RubikWidget w, int face); 197 extern int sizeRow(RubikWidget w, int face); 198 199 #ifdef DEBUG 200 extern void PrintCube(RubikWidget w); 201 extern void PrintFace(RubikWidget w); 202 extern void PrintRow(RubikWidget w, int orient); 203 204 #endif 205 206 #endif /* _RubikP_h */ 207