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