1 /*****************************************
2   xjump version 2
3 
4   main.c   ����� �� X Intrinsics�ط�
5 
6   (C) Oct 28, 1997  ROYALPANDA
7 *****************************************/
8 
9 #include<stdio.h>
10 #include<unistd.h>
11 #include<limits.h>
12 #include<sys/types.h>
13 #include<signal.h>
14 #include<X11/Intrinsic.h>
15 #include<X11/StringDefs.h>
16 #include<X11/Xaw/Form.h>
17 #include<X11/Xaw/Viewport.h>
18 #include<X11/Xaw/Label.h>
19 #include<X11/Shell.h>
20 #include<X11/xpm.h>
21 
22 #include"xjump.h"
23 #include"record.h"
24 
25 #include"picture.xpm"
26 #include"icon.xbm"
27 #include"icon_msk.xbm"
28 
29 #define TITLE 0
30 #define GAME  1
31 #define OVER  2
32 
33 #define SPEED 25
34 
35 extern char *DefaultResources[];
36 
37 static XtAppContext App;   /* ���ץꥱ���������ƥ����� */
38 
39 static Widget
40        Top,              /* �Ǿ��                        */
41        Score,            /* ������(��٥�)                */
42        Scr,              /* �ᥤ����̡ʥ���)             */
43        Score_v,          /* �ϥ�������(�ӥ塼�ݡ���)      */
44        ScoreList,        /* �ϥ�������(��٥�)            */
45        Gameover,         /* �����४���С�(��٥�)        */
46        Pause;            /* �ݡ���(��٥�)                */
47 
48 
49 static Colormap Cmap;    /* ���顼�ޥå� */
50 
51 static int IntervalState;       /* �����޽�����? */
52 static XtIntervalId IntervalId; /* �����ޡ������Σɣ� */
53 
54 static char *GraphFile = NULL;     /* �桼��������ե��å��ե����� */
55 
56 static int GameMode; /* �⡼�� (0�����ȥ�  1������  2�����४���С� 3�ݡ���) */
57 
58 static unsigned int Sc_now;
59 
60 static char Score_list[43*(RECORD_ENTRY+2)+1]="";    /* �ϥ��������ƥ����� */
61 
62 static XKeyboardState Keyboard;  /* �����ܡ��ɥ��ơ����� */
63 static int Repeat_mode = 1;      /* ������ԡ��Ȥξ���(1:default 0:off) */
64 
65 static int Use_keymap = 0;       /* �����ޥåפ�ľ���ɤफ�� */
66 
67 /* �ץ�ȥ�������� */
68 
69 static void timi( XtPointer c, XtIntervalId id );
70 
71 
72 /* �����Х��ѿ� */
73 
74 Display *Disp;           /* �ǥ����ץ쥤��¤�� */
75 
76 GC Gc_nomask;            /* GC (�ޥ���̵��) */
77 GC Gc_mask;              /* GC (�ޥ�������) */
78 
79 Drawable Scr_d;          /* �ᥤ����� */
80 Pixmap Char_p;           /* ����饯�� */
81 Pixmap Char_m;           /* ����饯��(�ޥ���) */
82 Pixmap Floor_p;          /* �� */
83 Pixmap Back_p;           /* �ط� */
84 
85 int Key[3] = {0,0,0};    /* �����ξ��� */
86 
87 hero_t Hero;             /* ��͸��ξ��� */
88 
89 int Floor_L[ HEIGHT ];   /* ���ξ��� */
90 int Floor_R[ HEIGHT ];
91 
92 int Map_index;
93 int Floor_top;
94 
95 record_t Record[ RECORD_ENTRY ];  /* �ϥ��������ꥹ��                    */
96 int Record_entry;                 /* �ϥ��������ꥹ�Ȥο�  -1:��Ͽ���ʤ� */
97 
98 char *Myname;   /* �ץ����̾ */
99 
100 
101 /* ������ԡ��Ȥ�ߤ�� */
102 
repeat_off(void)103 static void repeat_off( void )
104 {
105   if( Repeat_mode ){
106     XGetKeyboardControl( Disp,&Keyboard );
107     XAutoRepeatOff( Disp );
108     Repeat_mode = 0;
109   }
110 }
111 
112 
113 /* ������ԡ��Ȥ����᤹ */
114 
repeat_on(void)115 static void repeat_on( void )
116 {
117   if( !Repeat_mode ){
118     if( Keyboard.global_auto_repeat )
119       XAutoRepeatOn( Disp );
120     else
121       XAutoRepeatOff( Disp );
122 
123     Repeat_mode = 1;
124   }
125 }
126 
127 
128 /* ������ɽ�� */
129 
put_score(void)130 static void put_score( void )
131 {
132   char buf[12];
133 
134   sprintf( buf,"%010d",Sc_now );
135   XtVaSetValues( Score,XtNlabel,buf,NULL );
136 }
137 
138 
139 /* �ϥ����������̺��� */
140 
make_score(void)141 static void make_score( void )
142 {
143   int i;
144   char *p;
145 
146   if( Record_entry == -1 )
147     return;
148 
149   p = Score_list;
150 
151   p += sprintf( p,"RANK    FLOOR               NAME\n\
152 ----  ----------  -------------------------------\n");
153 
154   for( i = 0 ; i < Record_entry ; i++ )
155     p += sprintf( p,"%4d  %10d        %-20.20s\n",i+1,
156 	    Record[i].score,Record[i].name );
157 
158   p--;
159   *p = '\0';
160 
161   XtVaSetValues( ScoreList,
162 		XtNlabel,Score_list,
163 		NULL );
164 }
165 
166 
167 /* �����ޡ����� */
168 
reset_timer(void)169 static void reset_timer( void )
170 {
171   if( IntervalState ){
172     XtRemoveTimeOut( IntervalId );
173     IntervalState = 0;
174   }
175 }
176 
177 
178 /* �����ޡ��������� */
179 
set_timer(void)180 static void set_timer( void )
181 {
182   if( IntervalState )
183     reset_timer();
184   IntervalId = XtAppAddTimeOut( App, SPEED ,(XtTimerCallbackProc)timi,NULL );
185   IntervalState = 1;
186 }
187 
188 
189 /* �����४���С� */
190 
gameover(void)191 static void gameover( void )
192 {
193   XtMapWidget( Gameover );
194 
195   if( Use_keymap )
196     wait_keyup();
197 
198   GameMode = OVER;
199 
200   save_record( Sc_now );
201   make_score();
202 
203 }
204 
205 
206 /* �����ȥ� */
207 
title(void)208 static void title( void )
209 {
210   reset_timer();
211   XtUnmapWidget( Gameover );
212   XtUnmapWidget( Scr );
213   GameMode = TITLE;
214   if( Record_entry != -1 )
215     XtMapWidget( Score_v );
216 }
217 
218 
219 
220 /* �����ޡ������롼���� */
221 
timi(XtPointer c,XtIntervalId id)222 static void timi( XtPointer c,XtIntervalId id )
223 {
224   unsigned int floor;
225   static int timer;
226 
227   IntervalState = 0;
228 
229   set_timer();
230 
231   switch( GameMode ){
232 
233   case GAME:
234     if( Use_keymap )
235       keymap();
236     floor = move();
237     if( floor == DEAD ){
238       gameover();
239       timer = 0;
240     }
241     else if( floor > Sc_now ){
242       Sc_now = floor;
243       if( Sc_now > UINT_MAX - 5)
244 	Sc_now = UINT_MAX - 5;
245       put_score();
246     }
247     break;
248 
249   case OVER:
250     if( ++timer > 250 )
251       title();
252     break;
253   }
254 }
255 
256 
257 /* �ե��������ѹ�(������ԡ��Ȥ����ؤ�)(���٥�ȥϥ�ɥ�) */
258 
focus(Widget w,XtPointer p,XEvent * e)259 static void focus( Widget w,XtPointer p,XEvent *e )
260 {
261   if( e->type == FocusIn )
262     repeat_off();
263   else
264     repeat_on();
265 }
266 
267 
268 /* �������ݡ������� (���٥�ȥϥ�ɥ�) */
269 
expose(Widget w,XtPointer p,XEvent * e)270 static void expose( Widget w,XtPointer p,XEvent *e )
271 {
272   recover_scr( e->xexpose.x,e->xexpose.y,
273 	      e->xexpose.width,e->xexpose.height );
274 }
275 
276 
277 /* �ץ���ཪλ (���������ϥ�ɥ�) */
278 
quit_game(Widget w,XEvent * e,String * s,Cardinal * num)279 static void quit_game( Widget w,XEvent *e,String *s,Cardinal *num )
280 {
281   repeat_on();
282   XFlush( Disp );
283   exit(0);
284 }
285 
286 
287 /* �ץ���ཪλ(�����ʥ�ϥ�ɥ�) */
288 
sig_handler(int i)289 static void sig_handler( int i )
290 {
291   repeat_on();
292   XFlush( Disp );
293   exit(0);
294 }
295 
296 
297 /* �������� (���������ϥ�ɥ�) */
298 
start_game(Widget w,XEvent * e,String * s,Cardinal * num)299 static void start_game( Widget w,XEvent *e,String *s,Cardinal *num )
300 {
301   switch( GameMode ){
302   case TITLE:
303 
304     if( Use_keymap )
305       wait_keyup();
306 
307     XtUnmapWidget( Score_v );
308     XtUnmapWidget( Gameover );
309     reset_timer();
310     XtMapWidget( Scr );
311     init_game();
312     Sc_now = 0;
313     GameMode = GAME;
314 
315     set_timer();
316     break;
317 
318   case OVER:
319     title();
320     break;
321   }
322 }
323 
324 
325 /* �ݡ��� (���������ϥ�ɥ�) */
326 
pause_game(Widget w,XEvent * e,String * s,Cardinal * num)327 static void pause_game( Widget w,XEvent *e,String *s,Cardinal *num )
328 {
329   if( GameMode == 1 ){
330     reset_timer();
331     XtMapWidget( Pause );
332     GameMode = 3;
333   }else if( GameMode == 3 ){
334     GameMode = 1;
335     XtUnmapWidget( Pause );
336     set_timer();
337   }
338 }
339 
340 
341 
342 /* ���������줿(���������ϥ�ɥ�) */
343 
key_on(Widget w,XEvent * e,String * s,Cardinal * num)344 static void key_on( Widget w,XEvent *e,String *s,Cardinal *num )
345 {
346   if( Use_keymap )
347     return;
348 
349   switch( **s ){
350   case 'U':
351     Key[ KEY_UP ] = 1;
352     break;
353 
354   case 'R':
355     Key[ KEY_RIGHT ] = 1;
356     break;
357 
358   case 'L':
359     Key[ KEY_LEFT ] = 1;
360     break;
361   }
362 }
363 
364 /* ����Υ���줿 (���������ϥ�ɥ�) */
365 
key_off(Widget w,XEvent * e,String * s,Cardinal * num)366 static void key_off( Widget w,XEvent *e,String *s,Cardinal *num )
367 {
368   if( Use_keymap )
369     return;
370 
371   switch( **s ){
372   case 'U':
373     Key[ KEY_UP ] = 0;
374     break;
375 
376   case 'R':
377     Key[ KEY_RIGHT ] = 0;
378     break;
379 
380   case 'L':
381     Key[ KEY_LEFT ] = 0;
382     break;
383   }
384 }
385 
386 
387 /* ������������� */
388 
set_icon(void)389 static void set_icon( void )
390 {
391   Pixmap icon,mask;
392 
393   icon = XCreateBitmapFromData( Disp,DefaultRootWindow(Disp),icon_bits,
394 			       icon_width,icon_height );
395 
396   mask = XCreateBitmapFromData( Disp,DefaultRootWindow(Disp),icon_msk_bits,
397 			       icon_msk_width,icon_msk_height );
398 
399   XtVaSetValues( Top,XtNiconPixmap,icon,XtNiconMask,mask,NULL );
400 }
401 
402 
403 /* �إ�� */
404 
help()405 static void help()
406 {
407   fprintf( stderr,"Usage: %s [options]\n",Myname );
408   fprintf( stderr,"\t-toolkitoption ...\n" );
409   fprintf( stderr,"\t-private\t\tuse private colormap.\n" );
410   fprintf( stderr,"\t-graphic \"file\"\t\tuse your xpm graphic \"file\"\n" );
411   fprintf( stderr,"\t-keymap\t\t\tread keymap directly.\n" );
412   fprintf( stderr,"\t-help\t\t\tshow this messages.\n" );
413 }
414 
415 
416 /* ���ޥ�ɥ饤���ץ������� */
417 
option(int argc,char ** argv)418 static void option( int argc, char **argv )
419 {
420   int i;
421 
422   for( i = 1 ; i < argc ; i++ ){
423 
424     if( strcmp( argv[i],"-private" ) == 0 ){
425       Cmap =
426 	XCreateColormap( Disp,DefaultRootWindow(Disp),
427 			DefaultVisual(Disp,DefaultScreen(Disp)),AllocNone );
428       XtVaSetValues( Top,XtNcolormap,Cmap,NULL );
429       continue;
430     }
431 
432     if( strcmp( argv[i],"-graphic" ) == 0 ){
433       GraphFile = argv[++i];
434       continue;
435     }
436 
437     if( strcmp( argv[i],"-keymap" ) == 0 ){
438       Use_keymap = 1;
439       continue;
440     }
441 
442     if( strcmp( argv[i],"-help" ) == 0 ){
443       help();
444       exit(0);
445     }
446     fprintf(stderr,"%s: Unknown command line option \"%s\".\n",Myname,argv[i]);
447     help();
448     exit(1);
449   }
450 }
451 
452 
453 /* ����ե��å��κ������ɤ߹��� */
454 
make_graphic(void)455 static void make_graphic( void )
456 {
457   int i;
458   XpmAttributes attr;
459 
460   attr.valuemask = XpmColormap;
461   attr.colormap = Cmap;
462 
463   if( GraphFile != NULL )
464     i = XpmReadFileToPixmap( Disp,DefaultRootWindow(Disp),GraphFile,
465 			    &Char_p,&Char_m,&attr );
466     else
467       i = XpmCreatePixmapFromData( Disp,DefaultRootWindow(Disp),
468 				  picture_xpm,&Char_p,&Char_m,&attr );
469   if( i ){
470     fprintf( stderr,"%s: %s\n",Myname,XpmGetErrorString(i) );
471     exit(1);
472   }
473 
474   Gc_mask = XCreateGC( Disp,DefaultRootWindow(Disp),0,NULL );
475   XSetClipMask( Disp,Gc_mask,Char_m );
476 }
477 
478 
479 
480 /* Xlib�ط��������� */
481 
init_graph(void)482 static int init_graph( void )
483 {
484   int x;
485 
486   make_graphic();
487 
488   Gc_nomask = XCreateGC( Disp,DefaultRootWindow(Disp),0,NULL );
489 
490   Floor_p = XCreatePixmap( Disp,DefaultRootWindow(Disp),
491 			  WIDTH*16,16,
492 			  DefaultDepth(Disp,DefaultScreen(Disp)) );
493   XCopyArea( Disp,Char_p,Floor_p,Gc_nomask,128,16,16,16,0,0 );
494   XCopyArea( Disp,Char_p,Floor_p,Gc_nomask,128,32,16,16,WIDTH*16-16,0 );
495   for( x = 16 ; x < WIDTH*16-16 ; x+=16 )
496     XCopyArea( Disp,Char_p,Floor_p,Gc_nomask,128,48,16,16,x,0 );
497 
498   Back_p = XCreatePixmap( Disp,DefaultRootWindow(Disp),
499 			 WIDTH*16,16,
500 			 DefaultDepth(Disp,DefaultScreen(Disp)) );
501   XCopyArea( Disp,Char_p,Back_p,Gc_nomask,128,16,16,16,0,0 );
502   XCopyArea( Disp,Char_p,Back_p,Gc_nomask,128,32,16,16,WIDTH*16-16,0 );
503   for( x = 16 ; x < WIDTH*16-16 ; x+=16 )
504     XCopyArea( Disp,Char_p,Back_p,Gc_nomask,128,0,16,16,x,0 );
505 
506 }
507 
508 
509 /* �ᥤ�� */
510 
main(int argc,char ** argv)511 int main( int argc,char **argv )
512 {
513   static XtActionsRec a_table[] = {
514     {"start",  (XtActionProc)start_game},
515     {"pause",  (XtActionProc)pause_game},
516     {"quit",   (XtActionProc)quit_game},
517     {"key_on", (XtActionProc)key_on},
518     {"key_off",(XtActionProc)key_off},
519   };
520 
521   Widget game,w;
522 
523   uid_t uid;
524 
525   if( (Myname = argv[0]) == NULL )
526     Myname = "xjump";
527 
528   uid = geteuid();
529   seteuid(getuid());
530 
531   XtSetLanguageProc( NULL,NULL,NULL );
532 
533   Top = XtVaAppInitialize( &App,"XJump",NULL,0,
534 			  &argc,argv,DefaultResources,NULL );
535 
536   Disp = XtDisplay( Top );
537 
538 
539   Cmap = DefaultColormap( Disp,DefaultScreen(Disp) );
540 
541   option( argc,argv );
542 
543   seteuid( uid );
544 
545   game = XtVaCreateManagedWidget( "game",formWidgetClass,Top,NULL );
546 
547   XtVaCreateManagedWidget( "title",labelWidgetClass,game,NULL );
548 
549   w = XtVaCreateManagedWidget( "scoreBoard",formWidgetClass,game,
550 			      NULL );
551 
552   XtVaCreateManagedWidget( "scLabel",labelWidgetClass,w,
553 			  NULL );
554 
555   Score = XtVaCreateManagedWidget( "score",labelWidgetClass,w,
556 				  XtNlabel,"0000000000",
557 				  NULL );
558 
559   Gameover = XtVaCreateManagedWidget( "gameover",labelWidgetClass,game,
560 				     XtNmappedWhenManaged,FALSE,
561 				     NULL );
562 
563   Pause = XtVaCreateManagedWidget( "pause",labelWidgetClass,game,
564 				  XtNmappedWhenManaged,FALSE,
565 				  NULL );
566 
567   Scr = XtVaCreateManagedWidget( "scr",widgetClass,game,
568 				XtNwidth,WIDTH*16,
569 				XtNheight,HEIGHT*16,
570 				XtNmappedWhenManaged,FALSE,
571 				NULL );
572 
573   Score_v = XtVaCreateManagedWidget( "record_v",viewportWidgetClass,game,
574 				    XtNwidth,WIDTH*16,
575 				    XtNheight,HEIGHT*16,
576 				    NULL );
577 
578   ScoreList = XtVaCreateManagedWidget( "record",labelWidgetClass,Score_v,
579 				      XtNlabel,"",
580 				      NULL );
581 
582   XtVaCreateManagedWidget( "copyright",labelWidgetClass,game,NULL );
583 
584   XtAddEventHandler( Top,FocusChangeMask,FALSE,(XtEventHandler)focus,NULL );
585   XtAddEventHandler( Scr,ExposureMask,FALSE,(XtEventHandler)expose,NULL );
586 
587   XtAppAddActions( App,a_table,XtNumber(a_table) );
588 
589   if( Use_keymap )
590     query_keycode();
591 
592   if( signal( SIGINT,SIG_IGN ) != SIG_IGN )
593     signal( SIGINT,sig_handler );
594 
595   if( signal( SIGTERM,SIG_IGN ) != SIG_IGN )
596     signal( SIGTERM,sig_handler );
597 
598   XtRealizeWidget( Top );
599   init_graph();
600   set_icon();
601   Map_index = 0;
602   Scr_d = XtWindow( Scr );
603 
604   init_record();
605   if( Record_entry != -1 )
606     make_score();
607 
608   srnd();
609 
610   GameMode = TITLE;
611 
612   XtAppMainLoop( App );
613 
614   return 0;
615 }
616