1 /*
2 **
3 **	X11 Jewel By David Cooper and Jose Guterman 05/92
4 **
5 */
6 
7 #define XK_MISCELLANY
8 #define XK_LATIN1
9 #ifdef VMS
10 #include <decw$include/Xlib.h>
11 #include <decw$include/Xutil.h>
12 #include <decw$include/Xos.h>
13 #include <decw$include/keysymdef.h>
14 #else
15 #include <X11/Xlib.h>
16 #include <X11/Xutil.h>
17 #include <X11/Xos.h>
18 #include <X11/keysymdef.h>
19 #endif
20 
21 #include <stdlib.h>
22 
23 #include "general.h"
24 #include "logic.h"
25 #include "jewel.h"
26 #include "xw.h"
27 #include "xhscore.h"
28 #include "hscore.h"
29 #include "intro.h"
30 #include "game.h"
31 #include "panel.h"
32 #include "help.h"
33 
34 #include "version.h"
35 char *StartString="Press \140Space\047 to begin, or \140H\047 for Help";
36 
37 enum JStates JewelState;
38 /* event functions */
39 
xw_focus_event(xfev)40 void xw_focus_event(xfev)
41 XFocusChangeEvent *xfev;
42 	{
43 	/* handle focus change */
44 	if ((JewelState == GAME) && (xfev->type == FocusOut))
45 		{
46 		/*printf("FocusOut->PAUSED\n");*/
47 		Set_Pause();
48 		}
49 	}
50 
51 
xw_leave_event(xlev)52 void xw_leave_event(xlev)
53 XLeaveWindowEvent *xlev;
54 	{
55 #ifdef LEAVE_PAUSE
56 	if (JewelState == GAME)
57 		{
58 		/*printf("LeaveOut->PAUSED\n");*/
59 		Set_Pause();
60 		}
61 #endif
62 	}
63 
64 
65 static enum JStates OldState=NULL_STATE;
66 
StartIcon()67 static void StartIcon()
68     {
69     OldState=JewelState;
70     JewelState=ICON;
71     xw_set_timer(2000l);
72     }
73 
EndIcon()74 static void EndIcon()
75     {
76     JewelState=OldState;
77     xw_set_timer(100L);
78     }
79 
xw_map_event(xmev)80 void xw_map_event(xmev)
81 XMapEvent *xmev;
82 	{
83 	/*printf("GOT MAP EVENT. win=%ld, type=%d\n",xmev->window,
84 	xmev->type);*/
85 	if (xmev->window == xw_window)
86 		{
87 		if ((JewelState!=ICON) && (xmev->type == UnmapNotify))
88 			{
89 			StartIcon();
90 			}
91 		if ((JewelState==ICON) && (xmev->type == MapNotify))
92 			{
93 			EndIcon();
94 			}
95 		}
96 	}
97 
xw_key_event(xkev)98 void xw_key_event(xkev)
99 XKeyEvent *xkev;
100 	{
101 	/* deal with key event */
102 	KeySym key;
103 
104 	key=XLookupKeysym(xkev,xkev->state);
105 	switch(JewelState)
106 		{
107 		case GAME:
108 			switch(key)
109 				{
110 				/* HIDDEN KEYS USED FOR DEBUGGING
111 				case XK_plus:
112 				case XK_KP_Add:
113 					Inc_Stage();
114 					break;
115 				case XK_minus:
116 				case XK_KP_Subtract:
117 					Dec_Stage();
118 					break;
119 				********************************/
120 				case XK_U:
121 				case XK_u:
122 				case XK_Menu:/* do */
123 				case XK_F1:
124 				case XK_F20:
125 					XIconifyWindow(xw_display, xw_window, xw_screen);
126 					break;
127 				case XK_Cancel:
128 				case XK_E:
129 				case XK_e:
130 					Melt_Down();
131 					End_Game();
132 					break;
133 				case XK_P:
134 				case XK_p:
135 					Toggle_Pause();
136 					break;
137 				case XK_S:
138 				case XK_s:
139 					Toggle_Sound();
140 					break;
141 				case XK_X:
142 				case XK_x:
143 				case XK_Q:
144 				case XK_q:
145 					printf("Thankyou for playing...try again sometime!\n");
146 					xw_exit_main();
147 					break;
148 				case XK_Left:
149 				case XK_4:
150 				case XK_KP_4:
151 				case XK_J:
152 				case XK_j:
153 					if (!Paused()) Move_Left();
154 					break;
155 				case XK_Right:
156 				case XK_6:
157 				case XK_KP_6:
158 				case XK_L:
159 				case XK_l:
160 					if (!Paused()) Move_Right();
161 					break;
162 				case XK_Next:
163 				case XK_Up:
164 				case XK_5:
165 				case XK_KP_5:
166 				case XK_K:
167 				case XK_k:
168 					if (!Paused()) Rotate();
169 					break;
170 				case XK_Down:
171 				case XK_0:
172 				case XK_KP_0:
173 				case XK_space:
174 				case XK_KP_Space:
175 					if (!Paused()) Drop();
176 					break;
177 				}
178 			break;
179 		case INTRO:
180 		case HIGHSCORE:
181 		case HELP:
182 			switch (key)
183 				{
184 				case XK_Select:
185 				case XK_Execute:
186 				case XK_S:
187 				case XK_s:
188 				case XK_space:
189 				case XK_KP_Space:
190 					Start_New_Game();
191 					break;
192 				case XK_P:
193 				case XK_p:
194 					Set_State_High_Score();
195 					break;
196 				case XK_H:
197 				case XK_h:
198 				case XK_F1:
199 				case XK_Help:
200 				case XK_Menu:
201 					Start_Help();
202 					break;
203 				case XK_X:
204 				case XK_x:
205 				case XK_Q:
206 				case XK_q:
207 					printf("Thankyou for playing...try again sometime!\n");
208 					xw_exit_main();
209 					break;
210 				}
211 			break;
212 		}
213 	XFlush(xw_display);
214 
215 	/*xw_ev.x = xkev->x;
216 	xw_ev.y = xkev->y;*/
217 	}
218 
219 
220 
xw_but_event(xbev)221 void xw_but_event(xbev)
222 XButtonEvent *xbev;
223 	{
224 	/* deal with key event */
225 	/*printf("buttonpress:%d\n",xbev->button); */
226 	/*xw_ev.button = xbev->button;
227 	xw_ev.x = xbev->x;
228 	xw_ev.y = xbev->y;*/
229 	}
230 
231 
232 
xw_expose_event(xev)233 void xw_expose_event(xev)
234 XExposeEvent *xev;
235 	{
236 	/* do screen update */
237 	/*printf("GOT EXPOS EVENT, win=%ld, jstate=%d\n", xev->window,
238 	JewelState);*/
239 #ifdef ICON_WINDOW
240 	if (xev->window != xw_window)
241 	    { /* must be icon window */
242 	    if (JewelState != ICON)
243 		{ StartIcon(); }
244 	    return;
245 	    }
246 	else
247 	    {
248 	    if (JewelState == ICON)
249 		{ EndIcon(); }
250 	    }
251 #endif
252 	if (!(xev->count))
253 		{
254 		switch(JewelState)
255 			{
256 			case NULL_STATE:
257 				Start_Intro();
258 				break;
259 			case GAME:
260 				Expose_Game();
261 				break;
262 			case HELP:
263 				Expose_Help();
264 				break;
265 			case INTRO:
266 				Expose_Intro();
267 				break;
268 			case HIGHSCORE:
269 				Refresh_High_Scores();
270 				break;
271 			}
272 		}
273 	}
274 
275 
Rot_Icons()276 void Rot_Icons()
277 	{
278 #ifdef ICON_WINDOW
279 	extern Window iw_window;
280 	extern int iw_width, iw_height;
281 	static int IconPiece=PIECE1;
282 
283 	XCopyPlane(xw_display, PiecesPM[IconPiece], iw_window, PiecesGC[IconPiece],
284 		0, 0, SIZE_PIECE, SIZE_PIECE,
285 		(iw_width - SIZE_PIECE)/2, (iw_height - SIZE_PIECE)/2, 1L);
286 
287 	IconPiece++;
288 	if (IconPiece == NUM_REAL_PIECES) { IconPiece=PIECE1; }
289 #endif
290 
291 	xw_set_timer(2000L);
292 	}
293 
xw_timeout()294 void xw_timeout()
295 	{
296 	/* handle timer */
297 	switch(JewelState)
298 		{
299 		case GAME:
300 			Game_Timeout();
301 			break;
302 		case HIGHSCORE:
303 			Start_Help();
304 			break;
305 		case HELP:
306 			Start_Intro();
307 			break;
308 		case INTRO:
309 			Intro_Timeout();
310 			break;
311 		case ICON:
312 			Rot_Icons();
313 			break;
314 		}
315 	}
316 
317 
318 
319 /********************************************************/
320 
321 #include "bitmaps/jewellogo.xbm"
322 #include "bitmaps/jewellogo2.xbm"
323 /* border */
324 #include "bitmaps/border.xbm"
325 /*#include "bitmaps/border1.xbm"*/
326 /* pieces */
327 #include "bitmaps/piece1.xbm"
328 #include "bitmaps/piece2.xbm"
329 #include "bitmaps/piece3.xbm"
330 #include "bitmaps/piece4.xbm"
331 #include "bitmaps/piece5.xbm"
332 #include "bitmaps/piece6.xbm"
333 #include "bitmaps/jewel.xbm"
334 #include "bitmaps/flash1.xbm"
335 #include "bitmaps/flash2.xbm"
336 #include "bitmaps/flash3.xbm"
337 #include "bitmaps/flash4.xbm"
338 /* backdrops */
339 #include "bitmaps/back1.xbm"
340 #include "bitmaps/back2.xbm"
341 #include "bitmaps/back3.xbm"
342 #include "bitmaps/back4.xbm"
343 
344 int Border_Width=border_width;
345 int Border_Height=border_height;
346 int Jewellogo2_Width=jewellogo2_width;
347 int Jewellogo2_Height=jewellogo2_height;
348 int Jewellogo_Width=jewellogo_width;
349 int Jewellogo_Height=jewellogo_height;
350 
351 Pixmap LogoPM;
352 Pixmap Logo2PM;
353 GC LogoGC;
354 GC Logo2GC;
355 
356 Pixmap BorderPM;
357 GC BorderGC;
358 
359 Pixmap PiecesPM[NUM_PIECES];
360 GC PiecesGC[NUM_PIECES];
361 
362 GC ScoreGC;
363 GC HighScoreGC;
364 int Score_Char_MHeight;
365 int Score_x_right;
366 GC VerGC;
367 XFontStruct *VerFont, *ScoreFont, *HighScoreFont;
368 
369 Pixel colors[NUM_PIECES];
370 
371 Pixel green;
372 Pixel yellow;
373 Pixel black;
374 Pixel white;
375 
Init_Jewel()376 void Init_Jewel()
377 	{
378 	XGCValues gcv;
379 	unsigned long gcvm=(GCGraphicsExposures | GCForeground | GCBackground);
380 
381 	green=xw_alloc_color("green");
382 	yellow=xw_alloc_color("yellow");
383 	black=BlackPixel(xw_display,xw_screen);
384 	white=WhitePixel(xw_display,xw_screen);
385 
386 	gcv.graphics_exposures=False;
387 	gcv.background=black;
388 
389 	/* Logo */
390 	gcv.foreground=green;
391 	LogoGC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
392 	LogoPM=XCreateBitmapFromData(xw_display, xw_window,
393 			jewellogo_bits, jewellogo_width, jewellogo_height);
394 	XSetClipMask(xw_display,LogoGC,LogoPM);
395 
396 	gcv.foreground=white;
397 	Logo2GC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
398 	Logo2PM=XCreateBitmapFromData(xw_display, xw_window,
399 			jewellogo2_bits, jewellogo2_width, jewellogo2_height);
400 
401 	/* border */
402 	gcv.foreground=white;
403 	BorderGC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
404 	BorderPM=XCreateBitmapFromData(xw_display, xw_window, border_bits,
405 			border_width, border_height);
406 
407 	/* Pieces */
408 	colors[WILD_PIECE]=xw_alloc_color(WILD_C);
409 	gcv.foreground=colors[WILD_PIECE];
410 	PiecesGC[WILD_PIECE]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
411 	PiecesPM[WILD_PIECE]=XCreateBitmapFromData(xw_display, xw_window,
412 			jewel_bits, jewel_width, jewel_height);
413 
414 	colors[PIECE1]=xw_alloc_color(PIECE1_C);
415 	gcv.foreground=colors[PIECE1];
416 	PiecesGC[PIECE1]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
417 	PiecesPM[PIECE1]=XCreateBitmapFromData(xw_display, xw_window,
418 			piece1_bits, piece1_width, piece1_height);
419 
420 	colors[PIECE2]=xw_alloc_color(PIECE2_C);
421 	gcv.foreground=colors[PIECE2];
422 	PiecesGC[PIECE2]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
423 	PiecesPM[PIECE2]=XCreateBitmapFromData(xw_display, xw_window,
424 			piece2_bits, piece2_width, piece2_height);
425 
426 	colors[PIECE3]=xw_alloc_color(PIECE3_C);
427 	gcv.foreground=colors[PIECE3];
428 	PiecesGC[PIECE3]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
429 	PiecesPM[PIECE3]=XCreateBitmapFromData(xw_display, xw_window,
430 			piece3_bits, piece3_width, piece3_height);
431 
432 	colors[PIECE4]=xw_alloc_color(PIECE4_C);
433 	gcv.foreground=colors[PIECE4];
434 	PiecesGC[PIECE4]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
435 	PiecesPM[PIECE4]=XCreateBitmapFromData(xw_display, xw_window,
436 			piece4_bits, piece4_width, piece4_height);
437 
438 	colors[PIECE5]=xw_alloc_color(PIECE5_C);
439 	gcv.foreground=colors[PIECE5];
440 	PiecesGC[PIECE5]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
441 	PiecesPM[PIECE5]=XCreateBitmapFromData(xw_display, xw_window,
442 			piece5_bits, piece5_width, piece5_height);
443 
444 	colors[PIECE6]=xw_alloc_color(PIECE6_C);
445 	gcv.foreground=colors[PIECE6];
446 	PiecesGC[PIECE6]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
447 	PiecesPM[PIECE6]=XCreateBitmapFromData(xw_display, xw_window,
448 			piece6_bits, piece6_width, piece6_height);
449 
450 	/* Flash pieces */
451 	colors[FLASH1]=xw_alloc_color(FLASH_C);
452 	gcv.foreground=colors[FLASH1];
453 	PiecesGC[FLASH1]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
454 	PiecesPM[FLASH1]=XCreateBitmapFromData(xw_display, xw_window,
455 			flash1_bits, flash1_width, flash1_height);
456 
457 	colors[FLASH2]=colors[FLASH1];
458 	PiecesGC[FLASH2]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
459 	PiecesPM[FLASH2]=XCreateBitmapFromData(xw_display, xw_window,
460 			flash2_bits, flash2_width, flash2_height);
461 
462 	colors[FLASH3]=colors[FLASH1];
463 	PiecesGC[FLASH3]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
464 	PiecesPM[FLASH3]=XCreateBitmapFromData(xw_display, xw_window,
465 			flash3_bits, flash3_width, flash3_height);
466 
467 	colors[FLASH4]=colors[FLASH1];
468 	PiecesGC[FLASH4]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
469 	PiecesPM[FLASH4]=XCreateBitmapFromData(xw_display, xw_window,
470 			flash4_bits, flash4_width, flash4_height);
471 
472 	/* Backdrops */
473 	colors[BACKGND1]=xw_alloc_color(BACKGND_C);
474 	gcv.foreground=colors[BACKGND1];
475 	PiecesGC[BACKGND1]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
476 	PiecesPM[BACKGND1]=XCreateBitmapFromData(xw_display, xw_window,
477 			back1_bits, back1_width, back1_height);
478 
479 	colors[BACKGND2]=colors[BACKGND1];
480 	PiecesGC[BACKGND2]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
481 	PiecesPM[BACKGND2]=XCreateBitmapFromData(xw_display, xw_window,
482 			back2_bits, back2_width, back2_height);
483 
484 	colors[BACKGND3]=colors[BACKGND1];
485 	PiecesGC[BACKGND3]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
486 	PiecesPM[BACKGND3]=XCreateBitmapFromData(xw_display, xw_window,
487 			back3_bits, back3_width, back3_height);
488 
489 	colors[BACKGND4]=colors[BACKGND1];
490 	PiecesGC[BACKGND4]=XCreateGC(xw_display, xw_window, gcvm, &gcv);
491 	PiecesPM[BACKGND4]=XCreateBitmapFromData(xw_display, xw_window,
492 			back4_bits, back4_width, back4_height);
493 
494 	/* fonts */
495 	gcvm|=GCFont;
496 
497 	if ( (VerFont=XLoadQueryFont(xw_display,VER_FONT)) == NULL)
498 		{ xw_fatal("Cannot load VERSION font.\n",__LINE__,__FILE__); }
499 	gcv.font=VerFont->fid;
500 	gcv.foreground=white;
501 	VerGC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
502 
503 	if ( (HighScoreFont=XLoadQueryFont(xw_display,HIGHSC_FONT)) == NULL)
504 		{ xw_fatal("Cannot load HIGHSCORE font.\n",__LINE__,__FILE__); }
505 	gcv.foreground=white;
506 	gcv.font=HighScoreFont->fid;
507 	HighScoreGC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
508 
509 	if ( (ScoreFont=XLoadQueryFont(xw_display,SCORE_FONT)) == NULL)
510 		{
511 		if ( (ScoreFont=XLoadQueryFont(xw_display,ALT_SC_FONT)) == NULL)
512 			{ xw_fatal("Cannot load SCORE font.\n",__LINE__,__FILE__); }
513 		}
514 	gcv.foreground=white;
515 	gcv.font=ScoreFont->fid;
516 	ScoreGC=XCreateGC(xw_display, xw_window, gcvm, &gcv);
517 	Score_Char_MHeight=(ScoreFont->ascent + ScoreFont->descent)*3/2;
518 	Score_x_right=SCORE_LOC_X + (ScoreFont->max_bounds.width*SCORE_WIDTH);
519 	}
520 
521 
522 
main(argc,argv)523 int main(argc,argv)
524 int argc;
525 char **argv;
526 	{
527 	XKeyboardControl Values;
528 	struct timeval curtime;
529 
530 	gettimeofday(&curtime,NULL);
531 	srandom((unsigned int)(curtime.tv_usec>>8));
532 
533 	JewelState=NULL_STATE;
534 
535 	xw_init(argc,argv,SCREEN_X, SCREEN_Y);
536 
537 	Init_Jewel();
538 
539 	Values.bell_duration=50;
540 	XChangeKeyboardControl(xw_display,KBBellDuration, &Values);
541 	xw_start();
542 	Init_Draw_High_Scores();
543 	Init_Intro();
544 	Init_Help();
545 
546 	xw_main_loop();
547 	XCloseDisplay(xw_display);
548 	exit(0);
549 	}
550