1 #ifdef NET
2 #include "xtama_net.h"
3 
net_map()4 void net_map()
5 {
6   int n , i , j ;
7   char sendline[MAXLINE] ;
8 
9   sendline[0] = 'm' ;
10 
11   for ( i = 0 ; i < 12 ; i ++ )
12     for ( j = 0 ; j < 8 ; j ++ )
13       sendline[i * 8 + j + 1 ] = '!' + map[j][i] ;
14 
15   sendline[8 * i + 1] = '\n' ;
16   sendline[8 * i + 2] = '\0' ;
17 
18   n = strlen(sendline) ;
19   if ( writen( sockfd , sendline , n ) != n )
20     err_sys("str_cli: writen error on socket") ;
21 
22   if ( n < 0 )
23     err_sys("str_cli: readline error") ;
24 }
25 
26 
readline(fd,ptr,maxline)27 int readline(fd , ptr , maxline)
28 register int fd ;
29 register char *ptr ;
30 register int maxline ;
31 {
32   int n , rc ;
33   char c ;
34 
35   for ( n = 1 ; n < maxline ; n ++ ){
36     if (( rc = read(fd , &c , 1 )) == 1 ){
37       *ptr++ = c ;
38       if ( c == '\n' )
39 	break ;
40     } else if ( rc == 0 ) {
41       if ( n == 1 )
42 	return( 0 ) ;
43       else break ;
44     }else
45       return( -1);
46   }
47 
48   *ptr = 0 ;
49 
50   return( n ) ;
51 }
52 
writen(fd,ptr,nbytes)53 int writen( fd , ptr , nbytes)
54 register int fd ;
55 register char *ptr ;
56 register int nbytes ;
57 {
58   int nleft , nwritten ;
59 
60   nleft = nbytes ;
61   while( nleft > 0 ){
62     nwritten = write( fd , ptr , nleft ) ;
63     if ( nwritten <= 0 )
64       return (nwritten) ;
65 
66     nleft -= nwritten ;
67     ptr += nwritten ;
68 
69   }
70 
71   return(nbytes - nleft ) ;
72 }
73 
err_sys(ptr)74 void err_sys( ptr )
75 char * ptr ;
76 {
77   printf("%s \n ",ptr ) ;
78 }
79 
net_tama(int tmp_rensa)80 void net_tama( int tmp_rensa )
81 {
82   char mess[5] ;
83 
84   if ( Dairensa == 0 && tmp_rensa == 0 )
85     return ;
86 
87   sprintf( mess ,"r%c\n",'!'+ tmp_rensa ) ;
88   if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) )
89     err_sys("str_cli: writen error on socket") ;
90 }
91 
net_getmessage(char * ptr)92 Bool net_getmessage(char *ptr )
93 {
94   char mess[100] , *c ;
95   int i , j ;
96   static int stocktama = 0 , tekirensa = 0 ;
97 
98   readline( sockfd , &mess , sizeof(mess) );
99 
100   switch ( mess[0] ){
101   case 'r' :
102     if ( mess[1] - '!' ){
103       stocktama += mess[1] - '!' ;
104       tekirensa ++ ;
105     }
106     else {
107       if ( tekirensa > 1 ) tamakazu = stocktama ;
108       stocktama = tekirensa = 0 ;
109     }
110     break ;
111   case 'c':
112     if ( !strncmp ( "Break" , &mess[1] , 5 )) {
113       XCloseDisplay ( dpy ) ;
114       exit(0) ;
115     }
116     if ( !strncmp( "Pause." , &mess[1] , 6 ))
117       while( !net_getmessage("Start"));
118     if ( !strncmp( "Quit" ,&mess[1] , 4 )) {
119       printf("Connection closed\n") ;
120       gameover = True ;
121       net = False ;
122       mode = 4 ;
123     }
124     if (strlen(ptr)) {
125       c = mess ;
126       while( *(++c) != '\n' ) ;
127       *c = '\0' ;
128       strcpy ( ptr , &mess[1] ) ;
129      /* printf("%s %s\n",ptr , &mess[1] ) ;
130      */ if ( !strncmp( ptr , &mess[1] , strlen( ptr )))
131 	return True ;
132     }
133   case 'e':
134     if ( erase > mess[1] - '!' )
135       erase = mess[1] - '!' ;
136     break;
137   case 'm':
138     for ( i = 0 ; i < 12 ; i ++ )
139       for ( j = 0 ; j < 8 ; j ++ )
140 	vsmap[j][i] = mess[i*8+j+1] - '!' ;
141     draw(tekirensa);
142     break ;
143   default:
144     printf("Illegal message : %s \n" , mess ) ;
145   }
146   return False ;
147 }
148 
net_init(Bool isserver,char * server)149 void net_init(Bool isserver , char *server)
150 {
151   int ssockfd , i ;
152   int clilen ;
153   struct sockaddr_in cli_addr , serv_addr ;
154   char *tmp ;
155   struct hostent *host ;
156 
157   tmp = (char *)&serv_addr ;
158   for ( i = 0 ; i < sizeof( serv_addr ) ; i ++ )
159     {
160       (*tmp) = '\0' ;
161       tmp ++ ;
162     }
163 
164   serv_addr.sin_family = AF_INET ;
165   serv_addr.sin_port = htons( SERV_TCP_PORT ) ;
166 
167   if ( ( ssockfd = socket( AF_INET , SOCK_STREAM , 0 )) < 0 )
168     err_sys("server: can't open stream scoket");
169 
170   if ( isserver){
171 
172     serv_addr.sin_addr.s_addr = htonl( INADDR_ANY ) ;
173 
174     if ( bind( ssockfd , ( struct sockaddr * ) &serv_addr ,
175 	      sizeof (serv_addr)) < 0 ) {
176       close( ssockfd ) ;
177       err_sys("server: can't bind local address" ) ;
178 
179       exit(1);
180     }
181 
182     listen( ssockfd , 1 ) ;
183 
184     clilen = sizeof(cli_addr) ;
185     printf("Now listening .....\n");
186     sockfd = accept(ssockfd , ( struct sockaddr *) &cli_addr , & clilen) ;
187 
188     if ( sockfd < 0 )
189       err_sys("server: accept error") ;
190     else {
191       host = gethostbyaddr((char *) &(cli_addr.sin_addr) ,
192 			   sizeof ( struct in_addr ) , AF_INET ) ;
193       printf("Accept %s\n",host -> h_name) ;
194     }
195 
196     close(ssockfd) ;
197   }
198   else {
199     struct hostent *hp;
200     if ((serv_addr.sin_addr.s_addr = inet_addr(server)) == -1) {
201       if ((hp = gethostbyname(server)) == NULL) {
202 	printf("Who is %s?\n", server);
203 	exit(0);
204       } else
205 	serv_addr.sin_addr.s_addr = *(long *) hp->h_addr;
206     }
207 
208     if (connect(ssockfd, (struct sockaddr *) & serv_addr,
209 		sizeof(serv_addr)) < 0 ) {
210       printf("%s not listening!\n" , server );
211       exit(0);
212     }
213     sockfd = ssockfd ;
214     printf("Got connection.\n");
215   }
216 
217   return ;
218 }
219 
220 
draw(int tekirensa)221 void draw(int tekirensa)
222 {
223   int i , j , k , values ;
224   XGCValues gcval ;
225   char numbuf[3] ;
226 
227   gcval.line_width = 5 ;
228   XChangeGC( dpy , gc , GCLineWidth , &gcval ) ;
229 
230   XClearWindow( dpy , vsback ) ;
231   for ( i = 0 ; i < 12 ; i ++ )
232     for ( j = 0 ; j < 8 ; j ++ )
233       if ( vsmap[j][i] ){
234 	if( vsmap[j][i] > 7 ) {
235 	  XSetForeground( dpy , gc , iro[ 6 + (vsmap[j][i]-8)%5]);
236 	  XDrawRectangle( dpy , vsback , gc , j * SZ + 4, 440 - i * SZ + 4, SZ -10 , SZ - 10 ) ;
237 	}
238 	else {
239 	  XSetForeground( dpy , gc , iro[6 + (vsmap[j][i]-1)%5] );
240 	  XFillArc( dpy , vsback , gc , j * SZ , 440 - i * SZ , SZ , SZ ,0 * 64, 360 * 64 );
241 	}
242       }
243   if ( tekirensa > 1 ){
244     gcval.foreground = iro[RED] ;
245     gcval.fill_style = FillStippled ;
246     values = GCStipple | GCClipMask | GCTileStipXOrigin|GCTileStipYOrigin |
247       GCClipXOrigin|GCClipYOrigin |GCFillStyle | GCForeground;
248 
249     sprintf( numbuf , "%d", tekirensa ) ;
250 
251     for ( j = 0 ; j < strlen( numbuf ) ; j ++ ){
252       k = numbuf[j] - '0' ;
253       gcval.stipple = gcval.clip_mask = number[k] ;
254       gcval.ts_y_origin = gcval.clip_y_origin = 130 ;
255       gcval.ts_x_origin = gcval.clip_x_origin =
256 	180 - 96 * ( strlen(numbuf) - j ) ;
257 
258       XChangeGC( dpy , gc3 , values , &gcval) ;
259       XFillRectangle( dpy , vsback , gc3 , gcval.ts_x_origin  , 130 , 96, 80 ) ;
260     }
261 
262     for ( j = 0 ; j < 2 ; j ++ ){
263       gcval.stipple = gcval.clip_mask = number[10+j] ;
264       gcval.ts_y_origin = gcval.clip_y_origin = 210 ;
265       gcval.ts_x_origin = gcval.clip_x_origin = 130 + 96 * j  ;
266       XChangeGC( dpy , gc3 , values , &gcval) ;
267       XFillRectangle( dpy , vsback , gc3 , gcval.ts_x_origin  , 210 , 96, 80 ) ;
268     }
269     gcval.fill_style = FillTiled ;
270     XChangeGC( dpy , gc3 ,GCFillStyle,&gcval ) ;
271   }
272   XSync( dpy , 0 );
273 }
274 
275 #endif
276