1 #include "xtama_main.h"
2
tama_title()3 void tama_title()
4 {
5 int i , value ;
6 Bool res = 1 ;
7 XEvent eve ;
8 char tmp_char[4] ;
9 KeySym keysym ;
10 char mess[100] ;
11 XSizeHints hint;
12
13 XSelectInput( dpy , frame , KeyPressMask|ExposureMask|ButtonPressMask) ;
14
15 XMapWindow( dpy , frame ) ;
16 Setcursor( 0 ) ;
17
18 if ( net )
19 XMapSubwindows( dpy , frame ) ;
20
21 mode = net * 4 ;
22
23 while(1){
24
25 hint.max_width = hint.min_width = net ? 830 : 500 ;
26 hint.max_height = hint.min_height = 550 ;
27 hint.flags = PMinSize | PMaxSize;
28 XSetNormalHints(dpy, frame, &hint);
29
30 XResizeWindow( dpy , frame , hint.max_width , hint.max_height ) ;
31
32 XClearWindow( dpy , back ) ;
33 XClearWindow( dpy , score ) ;
34 XClearArea( dpy , frame , 0 , 0 , 0 , 0 , True ) ;
35
36 timer( 10000 ) ;
37
38 XSetWindowBackgroundPixmap( dpy , sele , sele_xpm[mode] ) ;
39 if ( net ) XMoveWindow( dpy , sele ,60 , 220 ) ;
40 else XMoveWindow( dpy , sele ,150 , 300 ) ;
41
42 XClearWindow( dpy , sele ) ;
43
44 XMapWindow( dpy , sele ) ;
45
46 XSync( dpy , 0 ) ;
47
48 res = 1 ;
49
50 while( res ){
51 if( XEventsQueued( dpy, QueuedAfterFlush ) ){
52 XNextEvent( dpy , &eve ) ;
53 if ( eve.type == Expose && !net )
54 tama_show_title() ;
55 else {
56 if ( eve.type == KeyPress ){
57 XLookupString( (XKeyEvent *)&eve , tmp_char , 4 , &keysym , NULL ) ;
58 value = keysym ;
59 }
60 else
61 value = button( eve.xbutton.button ) ;
62 switch ( value ) {
63 case XK_q:
64 #ifdef NET
65 strcpy( mess , "cQuit\n\0") ;
66 if ( net ) if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) ) ;
67 #endif
68 XCloseDisplay( dpy ) ;
69 exit(0);
70 break ;
71 case FALL:
72 if ( !mouse )
73 break ;
74 case XK_space:
75 res = 0 ;
76 break ;
77 case LTURN:
78 if ( !mouse )
79 break ;
80 case XK_Left:
81 if ( !net )
82 for ( i = 150 ; i < 500 ; i += 40 ){
83 XMoveWindow( dpy , sele , i , 300 ) ;
84
85 XSync( dpy , 1 ) ;
86 timer( 10000 ) ;
87 }
88 mode -- ;
89 if ( mode < 3 && net ) mode = 4 ;
90 if ( mode < 0 && !net ) mode = 3 ;
91
92 XSetWindowBackgroundPixmap( dpy , sele ,
93 sele_xpm[ mode ] ) ;
94 XClearWindow( dpy , sele ) ;
95 XSync( dpy , 1 ) ;
96
97 if ( !net )
98 for ( i = -210 ; i < 160 ; i += 40 ){
99 XMoveWindow( dpy , sele , i , 300 ) ;
100 XSync( dpy , 1 ) ;
101 timer( 10000 ) ;
102 }
103 break ;
104 case RTURN:
105 if ( !mouse )
106 break ;
107 case XK_Right:
108 if ( !net )
109 for ( i = 150 ; i > -240 ; i -= 40 ){
110 XMoveWindow( dpy , sele , i , 300 ) ;
111 XSync( dpy , 1 ) ;
112 timer( 10000 ) ;
113 }
114 mode ++ ;
115 if ( mode > 4 && net ) mode = 3 ;
116 if ( mode > 3 && !net ) mode = 0 ;
117
118 XSetWindowBackgroundPixmap( dpy , sele , sele_xpm[ mode ] ) ;
119 XClearWindow( dpy , sele ) ;
120 XSync( dpy , 1 );
121
122 if ( !net )
123 for ( i = 510 ; i > 140 ; i -= 40 ){
124 XMoveWindow( dpy , sele , i , 300 ) ;
125 XSync( dpy , 1 ) ;
126 timer( 10000 ) ;
127 }
128 default:
129 break ;
130 }
131 }
132 }
133 timer( 100000 ) ;
134 }
135
136 if ( mode == 0 || mode == 1 || mode == 4 ){
137 XUnmapWindow( dpy , sele ) ;
138 XClearWindow( dpy , frame ) ;
139 if ( !net ) {
140 XMapWindow(dpy ,back);
141 XMapWindow(dpy, score);
142 XSync( dpy , 1 ) ;
143 }
144 practice = ( mode == 1 ) ; /* �����⡼��*/
145 tama_main() ;
146
147 if ( !net ) {
148 XUnmapWindow( dpy , back ) ;
149 XUnmapWindow( dpy , score ) ;
150 XSync( dpy , 1 ) ;
151 }
152
153 if ( mode == 0 && erase == ERASE ) scoredemo() ;
154 Score = 0 ;
155 Setcursor(0) ;
156 }
157
158 if ( mode == 2 ){
159 Setcursor( 4 ) ;
160 XUnmapWindow( dpy , sele ) ;
161 XClearWindow( dpy , frame ) ;
162 scoredemo() ;
163 Setcursor( 0 ) ;
164 };
165
166 if ( mode == 3 ){
167 #ifdef NET
168 if ( net ){
169 strcpy( mess , "cQuit\n\0") ;
170 if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) ) ;
171 }
172 #endif
173 XCloseDisplay( dpy ) ;
174 exit(0);
175 }
176 XSync( dpy , 1 ) ;
177 }
178 }
179
tama_show_title()180 void tama_show_title()
181 {
182 int values ;
183 XGCValues gcval ;
184
185 values = GCTileStipXOrigin|GCTileStipYOrigin|
186 GCClipXOrigin|GCClipYOrigin| GCTile | GCClipMask |GCFillStyle ;
187 gcval.fill_style = FillTiled ;
188 gcval.ts_x_origin = gcval.clip_x_origin = 122 ;
189 gcval.ts_y_origin = gcval.clip_y_origin = 120 ;
190 gcval.tile = titl_xpm ;
191 gcval.clip_mask = title_msk ;
192 XChangeGC( dpy , gc3 , values , &gcval) ;
193 XFillRectangle( dpy , frame , gc3 , 122 , 120 , 256 , 90 ) ;
194 XSync( dpy , 0 ) ;
195 }
196
tama_main()197 void tama_main()
198 {
199 int j ,i , ii , tx1 , tx2 , tmp_score = 0 , task = 0 , max ;
200 int ty1 , ty2 , value ;
201 char buffer[4] , mess[MAX] ;
202 KeySym keysym ;
203 XEvent eve ;
204 unsigned long values ;
205 XGCValues gcval ;
206 int sw , speed , color1 , color2 , color1_b , color2_b ;
207 struct timeval time , tmp_time ;
208 Bool res ;
209 Window win ;
210
211 values = GCTile | GCFillStyle | GCClipMask ;
212 gcval.tile = animation[1][4] ;
213 gcval.clip_mask = animation_mask[4] ;
214 gcval.fill_style = FillTiled ;
215 XChangeGC( dpy , gc3 , values , &gcval ) ;
216
217 for ( i = 0 ; i < 8 ; i ++ )
218 for ( ii = 0 ; ii < 19 ; ii ++ )
219 map[i][ii] = 0 ;
220
221 XSelectInput( dpy , frame , KeyPressMask|ExposureMask|ButtonPressMask ) ;
222 XSelectInput( dpy , score , ExposureMask ) ;
223
224 level = 0 ;
225 if ( !net ){
226 text_etc();
227 level_disp(level) ;
228 }
229 else
230 text_etc2();
231
232 XSync( dpy , True );
233
234 sw = 0 ;
235
236 max = getspeed ( level ) ;
237
238 select_tama( &color1 , &color2 ) ;
239
240 if ( !net ){
241 gettimeofday( &time , NULL ) ;
242 time.tv_sec += 30 ;
243 Score = tmp_score = 0 ;
244 task = tamakazu = 50 ;
245 tama_timer( time.tv_sec ) ;
246 }
247
248 #ifdef NET
249 if ( net ) {
250 strcpy( mess , "cStart game!\n\0") ;
251 if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) )
252 err_sys("str_cli: writen error on socket") ;
253 sprintf(mess,"e%c\n", '!' + erase );
254 if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) )
255 err_sys("str_cli: writen error on socket") ;
256 tamakazu = 0 ;
257 res = False ;
258 do {
259 strcpy( mess , "Start game!") ;
260 res = net_getmessage(mess) ;
261 if (!strcmp("Quit" , mess )) {
262 return ;
263 }
264 } while( !res ) ;
265 XClearWindow( dpy , vsback ) ;
266 }
267 #endif
268
269 gameover = False ;
270
271 while(True)
272 {
273 tx1 = tx2 = 3 ;
274 select_tama( &color1_b , &color2_b ) ;
275
276 MoveWindow( color1_b , color2_b , 1 , 20 , 1, 24 ,True ,
277 1 , 20 , 1, 24 , score ) ;
278
279
280 ty1 = 48;
281 ty2 = 52 ;
282
283 MoveWindow( color1 , color2 , tx1 ,ty1 , tx2 , ty2 , False ,
284 0 , 0 , 0, 0 , back );
285
286 XSync( dpy , 0 ) ;
287
288 while ( tama_fall( &tx1, &ty1 , &tx2 , &ty2 , sw , color1 , color2))
289 {
290 #ifdef NET
291 if ( net ) {
292 tmp_time.tv_sec = 0 ;
293 tmp_time.tv_usec = 0 ;
294 FD_ZERO( &readfd ) ;
295 FD_SET( fdc , &readfd ) ;
296 if ( select( fdc + 1 , &readfd , (fd_set *) 0 ,
297 (fd_set * )0 ,&tmp_time )){
298 strcpy( mess , "Game over.");
299 if ( net_getmessage(mess)) {
300 values = GCStipple | GCClipMask | GCTileStipXOrigin|
301 GCTileStipYOrigin | GCClipXOrigin|
302 GCClipYOrigin |GCFillStyle | GCForeground;
303 gcval.foreground = iro[RED] ;
304 gcval.stipple = over[2] ;
305 gcval.clip_mask = over[2] ;
306 gcval.fill_style = FillStippled ;
307 gcval.ts_y_origin = gcval.clip_y_origin = 230 ;
308 gcval.ts_x_origin = gcval.clip_x_origin = 75 ;
309 XChangeGC( dpy , gc3 , values , &gcval) ;
310 XFillRectangle( dpy , back , gc3 , 75 , 230 , 156 , 35 ) ;
311 Setcursor(4) ;
312 XSync( dpy , 0 ) ;
313 gcval.fill_style = FillTiled ;
314 XChangeGC( dpy , gc3 ,GCFillStyle,&gcval ) ;
315 gameover = True ;
316 goto Label2 ;
317 }
318 }
319 }
320 #endif
321 for ( speed = 0 ; speed < max && !sw ; speed ++ )
322 {
323 if( XEventsQueued( dpy, QueuedAfterFlush ) == 0 ) ;
324 else
325 {
326 XNextEvent( dpy , &eve ) ;
327 if ( eve.type == KeyPress || (eve.type == ButtonPress && mouse)){
328 if ( eve.type == KeyPress ){
329 XLookupString( (XKeyEvent *)&eve , buffer , 4 , &keysym ,
330 NULL ) ;
331 value = keysym ;
332 }
333 else
334 value = button( eve.xbutton.button ) ;
335 switch( value ) {
336 case XK_q:
337 goto Label ;
338 break ;
339 case XK_s:
340 {
341 int i , j ;
342 for ( i = 0 ; i < 15 ; i ++ )
343 {
344 for ( j = 0 ; j < 8 ; j ++ )
345 printf("(%2d)",map[j][14-i] ) ;
346 putchar('\n') ;
347 }
348 }
349 break ;
350
351 case XK_space:
352 case FALL:
353 sw = 1 ;
354 speed += 100 ;
355 break ;
356 case XK_Right:
357 tama_moveside( &tx1 , &ty1 ,
358 &tx2 , &ty2 , RIGHT , color1 , color2);
359 break ;
360 case XK_Left:
361 tama_moveside( &tx1 , &ty1 ,
362 &tx2 , &ty2 , LEFT , color1 , color2);
363 break ;
364 case XK_Up:
365 case LTURN:
366 tama_roll( &tx1 , &ty1 , &tx2 , &ty2 , LEFT ,
367 color1 , color2 ) ;
368 break ;
369 case XK_Down:
370 case RTURN:
371 tama_roll( &tx1 , &ty1 , &tx2 , &ty2 , RIGHT ,
372 color1 , color2 ) ;
373 break ;
374 case XK_p:
375 XClearWindow( dpy , back ) ;
376 res = False ;
377 gettimeofday( &tmp_time , NULL ) ;
378 time.tv_sec = time.tv_sec - tmp_time.tv_sec ;
379
380 #ifdef NET
381 strcpy( mess , "cPause.\n\0") ;
382 if ( net )
383 if ( writen( sockfd , mess , strlen(mess) )
384 != strlen(mess) )
385 err_sys("str_cli: writen error on socket") ;
386 #endif
387 do{
388 if(XEventsQueued( dpy, QueuedAfterFlush ) ){
389 XNextEvent( dpy , &eve ) ;
390 if ( eve.type == KeyPress ){
391 XLookupString( (XKeyEvent *)&eve , buffer , 4 , &keysym , NULL ) ;
392 if ( keysym == XK_p)
393 res = True ;
394 }
395 }
396 }while(!res) ;
397 #ifdef NET
398 strcpy( mess , "cStart.\n\0") ;
399 if ( net )
400 if ( writen( sockfd , mess , strlen(mess) )
401 != strlen(mess) )
402 err_sys("str_cli: writen error on socket") ;
403 #endif
404 XSync( dpy , 0 );
405 gettimeofday( &tmp_time , NULL ) ;
406 time.tv_sec = tmp_time.tv_sec + time.tv_sec ;
407 for ( i = 0 ; i < 12 ; i += 2 )
408 for ( j = 0 ; j < 8 ; j ++ )
409 MoveWindow( map[j][i] - 1 , map[j][i+1] - 1
410 , j , i * 4 , j , i * 4 + 4 , False ,
411 0 , 0 , 0 , 0 , back ) ;
412 }
413 }
414 if ( eve.type == Expose )
415 {
416 if ( !net ){
417 text_etc();
418 tama_timer( time.tv_sec ) ;
419 tama_score( 0 ) ;
420 MoveWindow( color2_b , color1_b , 1 , 20 , 1, 24 ,False ,
421 0 , 0 , 0, 0 , score ) ;
422 }
423 else
424 text_etc2() ;
425 XClearWindow( dpy , back ) ;
426 for ( i = 0 ; i < 12 ; i += 2 )
427 for ( j = 0 ; j < 8 ; j ++ )
428 MoveWindow( map[j][i] - 1 , map[j][i+1] - 1 ,
429 j , i * 4 , j , i * 4 + 4 , False ,
430 0 , 0 , 0 , 0 , back ) ;
431 }
432 }
433 if ( mouse ){
434 XQueryPointer( dpy , back , &win , &win ,
435 &i ,&i , &j , &i , ( unsigned int *) &i ) ;
436 i = j / 40 ;
437 if ( tx1 < i )
438 tama_moveside( &tx1 , &ty1 ,
439 &tx2 , &ty2 , RIGHT , color1 , color2);
440 if ( tx1 > i )
441 tama_moveside( &tx1 , &ty1 ,
442 &tx2 , &ty2 , LEFT , color1 , color2);
443
444 }
445 timer(5000) ;
446 }
447 }
448
449 if ( gameover )
450 goto Label ;
451
452 sw = 0 ;
453
454 tama_set( tx1 , ty1 ,tx2 ,ty2 , color1 , color2 ) ;
455
456 rensa = Dairensa = 0 ;
457
458 if ( color2 == 5 || color2 == 6 ){
459 tama_war(tx1 , ty1 ,tx2 ,ty2 , color1 , color2);
460 if ( !net ) tamakazu -= rensa ;
461 }
462 else{
463 tama_scan() ;
464 if ( !net ) tamakazu -= rensa * ( Dairensa - 1 ) ;
465 }
466
467 color1 = color1_b ;
468 color2 = color2_b ;
469
470 if ( !net ){
471 if ( ( tama_timer( time.tv_sec , tmp_score ))){
472 tama_pulas( tamakazu > 0 ? tamakazu : 0 ) ;
473 gettimeofday( &time , NULL ) ;
474 time.tv_sec += 30 + practice * 10 ;
475 tamakazu = ++ task ;
476 tama_timer( time.tv_sec ) ;
477
478 max = getspeed( level ) ;
479 level ++ ;
480 level_disp( level ) ;
481 }
482
483 tmp_score = Score ;
484 }
485 else
486 if ( tamakazu > 0 ) {
487 tamakazu -= tama_pulas( tamakazu ) ;
488 /*if ( tamakazu > 16 ) {
489 tamakazu -= tama_pulas(16) ;
490 }
491 else {
492 tamakazu -= tama_pulas( tamakazu ) ;
493 }*/
494 }
495 Setcursor(-1) ;
496 }
497
498 Label :
499 #ifdef NET
500 if ( net ) {
501 strcpy( mess , "cGame over.\n\0") ;
502 if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) )
503 err_sys("str_cli: writen error on socket") ;
504 }
505 #endif
506 Label2 :
507 /*here*/;
508
509 XSync( dpy , 1 ) ;
510 while( XEventsQueued( dpy, QueuedAfterFlush ) == 0 )
511 timer(10000) ;
512
513 return ;
514
515 }
516
timer(int interval)517 void timer( int interval ) /* the timer function */
518 {
519 struct timeval new_time ;
520
521 new_time.tv_sec = 0 ;
522 new_time.tv_usec = interval ;
523 select( 0 , (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &new_time ) ;
524 return ;
525
526 }
527
528
select_tama(int * r1,int * r2)529 void select_tama(int *r1 , int *r2 )
530 {
531 int i ;
532 int * rnd[2] = { r1 , r2 } ;
533
534 if ( !(lrand48() % 8) )
535 {
536 if ( !practice ){
537 *rnd[0] = *rnd[1] = lrand48() % 2 + 5 ;
538 if ( *rnd[0] == 6 )
539 *rnd[0] = lrand48() % 5 ;
540 }
541 else *rnd[0] = *rnd[1] = 5 ;
542 }
543
544 else
545 for ( i = 0 ; i < 2 ; i ++ )
546 {
547 if ( lrand48() % 4 )
548 *rnd[i] = lrand48() % 5 ;
549 else
550 *rnd[i] = lrand48() % 5 + 7 ;
551 }
552 }
553
getspeed(int level)554 int getspeed( int level )
555 {
556 int tmpspeed ;
557 if ( practice )
558 tmpspeed = 15 - ( level * 0.3 ) ;
559 else
560 tmpspeed = 9 - ( level * 0.24 ) ;
561
562 if ( tmpspeed < 3 ) {
563 if ( level > 34 )
564 tmpspeed =2 ;
565 else
566 tmpspeed = 3 ;
567 }
568 return tmpspeed ;
569 }
570
text_etc()571 void text_etc()
572 {
573 int values ;
574 XGCValues gcval ;
575
576 XSetForeground( dpy , gc , iro[BLUE] ) ;
577 XClearWindow( dpy , score ) ;
578 XDrawString( dpy , score , gc , 8 , 90 ,"Level" , 5 ) ;
579 XDrawString( dpy , score , gc , 10 , 116 ,"Score" , 5 );
580 XDrawString( dpy , score , gc , 10 , 190 ,"NEXT" , 4 ) ;
581 XDrawString( dpy , score , gc , 10 , 315 ,"Timer" , 5 );
582 XDrawString( dpy , score , gc , 10 , 395 ,"Task" , 4 ) ;
583
584 values = GCTileStipXOrigin|GCTileStipYOrigin|
585 GCClipXOrigin|GCClipYOrigin| GCTile | GCClipMask | GCFillStyle ;
586 gcval.fill_style = FillTiled ;
587 gcval.ts_x_origin = gcval.clip_x_origin = 2 ;
588 gcval.ts_y_origin = gcval.clip_y_origin = 10 ;
589 gcval.tile = titl2_xpm ;
590 gcval.clip_mask = title2_msk ;
591 XChangeGC( dpy , gc3 , values , &gcval) ;
592 XFillRectangle( dpy , score , gc3 , 2 , 10 , 147 , 49 ) ;
593
594 gcval.ts_x_origin = gcval.clip_x_origin = 30 ;
595 gcval.ts_y_origin = gcval.clip_y_origin = 430 ;
596 gcval.tile = char_xpm ;
597 gcval.clip_mask = char_msk ;
598 XChangeGC( dpy , gc3 , values , &gcval) ;
599 XFillRectangle( dpy , score , gc3 , 30 , 430 , 89 , 93 ) ;
600 XSync( dpy , 0 ) ;
601 }
602
text_etc2()603 void text_etc2()
604 {
605 XSetForeground( dpy , gc , iro[BLUE] ) ;
606 XDrawString( dpy , score , gc , 10 , 116 ,"Score" , 5 );
607 XDrawString( dpy , score , gc , 10 , 190 ,"NEXT" , 4 ) ;
608 }
609
610
button(int bnum)611 int button( int bnum )
612 {
613 int i ;
614 for ( i = 0 ; i < 3 ; i ++ )
615 if ( mous[i] == bnum )
616 return i ;
617
618 return 0 ;
619 }
620