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