1 #include "xtama_rensa.h"
2 
seek(int x,int y,int * rensa,int dir,int color)3 int seek ( int x , int y , int *rensa , int dir , int color )
4 {
5   if ( map[x][y] != color || state[x][y] != 0 )
6     return 0 ;
7 
8   state[x][y] |= dir ;
9   (*rensa) ++ ;
10 
11   if ( !( state[x][y] & SEEK_LEFT ))
12     {
13       if ( x > 0 )
14 	seek( x - 1, y , rensa , SEEK_RIGHT , color ) ;
15       state[x][y] |= SEEK_LEFT ;
16     }
17 
18   if ( !( state[x][y] & SEEK_LOWER ))
19     {
20       if ( y < 11 )
21 	seek( x , y + 1 , rensa , SEEK_UPPER , color ) ;
22       state[x][y] |= SEEK_LOWER ;
23     }
24 
25   if ( !( state[x][y] & SEEK_RIGHT ))
26     {
27       if ( x < 7 )
28 	seek( x + 1 , y , rensa , SEEK_LEFT , color ) ;
29       state[x][y] |= SEEK_RIGHT ;
30     }
31 
32   if ( !( state[x][y] & SEEK_UPPER ))
33     {
34       if ( y > 0 )
35 	seek( x , y - 1 , rensa , SEEK_LOWER , color ) ;
36       state[x][y] |= SEEK_UPPER ;
37     }
38   return * rensa ;
39 }
40 
41 
tama_rensa(int rensa)42 void tama_rensa( int rensa )
43 {
44   int i , j , sw , count , sw2 = 0 ;
45 
46   struct Tmap{
47     int x ;
48     int y ;
49     int color ;
50     int state ;
51   } tamamap[100] ;
52 
53 #ifdef NET
54   if ( net ) net_map( ) ; /* ������Υޥåפ��������� */
55 #endif
56 
57   Dairensa ++ ;
58 
59   for ( i = 0 ; i < 12 ; i ++ )
60     for ( j = 0 ; j < 8 ; j ++ )
61       miniball[j][i] = 0 ;
62 
63   sw2 = tama_grow( statemask )  ; /* 3�İʾ夯�äĤ�����ե�å��夷��
64                                      ͻ�����֤äƤ��� */
65 
66   tama_score( sw2 * rensa  ) ;  /* �������������� */
67 
68   for (i = 0 ; i < 12 ; i ++ )
69     for ( j = 0 ; j < 8 ; j ++ )
70       statemask[j][i] = 0 ;
71 
72   count = 0 ;
73 
74   for ( j = 0 ; j < 8 ; j ++ ) /* ������������ͤ�� */
75     {
76       sw = 0 ;
77       for ( i = 0 ; i < ( net ? 19 : 12 ) ; i ++ )
78 	{
79 	  if ( !map[j][i] && map[j][ i + 1 ] )
80 	    sw = True ;
81 	  if ( sw && map[j][i] )
82 	    {
83 	      statemask[j][i] = True ;
84 	      tamamap[count].x = j ;
85 	      tamamap[count].y = i * 4 ;
86 	      tamamap[count].color = map[j][i] ;
87 	      tamamap[count].state = True ;
88 	      count ++ ;
89 	      map[j][i] = 0 ;
90 	    }
91 	}
92     }
93 
94   j = sw = count ;
95 
96   if ( sw2 || j ) timer(100000) ;
97 
98   while( sw )
99     {
100       sw = 0 ;
101       for ( i = 0 ; i < count ; i ++ )
102 	if ( tamamap[i].state )
103 	  {
104 	    sw ++ ;
105 	    tamamap[i].state = tama_fall2( tamamap[i].x , &tamamap[i].y
106 					  , tamamap[i].color ) ;
107 	  }
108     }
109   if ( sw2 || j )
110     {
111       /*timer(500000 - sw2 * 2000) ;*/
112       tama_scan( rensa ) ;
113     }
114 }
115 
tama_scan()116 void tama_scan()
117 {
118   int i , j , ii , jj , tmp , tmp_rensa ;
119 
120   tmp_rensa = 0 ;
121 
122   for ( i = 0 ; i < 12 ; i ++ )
123     for ( j = 0 ; j < 8 ; j ++ )
124       state[j][i] = statemask[j][i] = 0 ;
125 
126 /* �����Ǥ�  */
127 
128   for ( i = 0 ; i < 12 ; i ++ )
129     for ( j = 0 ; j < 8 ; j ++ ) {
130       if ( map[j][i] ) {
131 	tmp = 0 ;
132 	if ( map[j][i] < 6 && statemask[j][i] == 0 )
133 	  if ( seek( j , i , &tmp ,0 , map[j][i] ) > erase ) {
134 	    for ( ii = 0 ; ii < 12 ; ii ++ )
135 	      for ( jj = 0 ; jj < 8 ; jj ++ ) {
136 		if ( state[jj][ii] == 15 ) {
137 		  statemask[jj][ii] = True ;
138 		  rensa ++ ;
139 		  tmp_rensa ++ ;
140 		}
141 	      }
142 	  }
143 	for ( ii = 0 ; ii < 12 ; ii ++ )
144 	  for ( jj = 0 ; jj < 8 ; jj ++ )
145 	    state[jj][ii] =  0 ;
146       }
147     }
148 #ifdef NET
149   if ( net ) net_tama(tmp_rensa) ;
150 #endif
151   tama_rensa(rensa) ;
152 }
153 
154 
155 
156 
157