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