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