#ifdef NET #include "xtama_net.h" void net_map() { int n , i , j ; char sendline[MAXLINE] ; sendline[0] = 'm' ; for ( i = 0 ; i < 12 ; i ++ ) for ( j = 0 ; j < 8 ; j ++ ) sendline[i * 8 + j + 1 ] = '!' + map[j][i] ; sendline[8 * i + 1] = '\n' ; sendline[8 * i + 2] = '\0' ; n = strlen(sendline) ; if ( writen( sockfd , sendline , n ) != n ) err_sys("str_cli: writen error on socket") ; if ( n < 0 ) err_sys("str_cli: readline error") ; } int readline(fd , ptr , maxline) register int fd ; register char *ptr ; register int maxline ; { int n , rc ; char c ; for ( n = 1 ; n < maxline ; n ++ ){ if (( rc = read(fd , &c , 1 )) == 1 ){ *ptr++ = c ; if ( c == '\n' ) break ; } else if ( rc == 0 ) { if ( n == 1 ) return( 0 ) ; else break ; }else return( -1); } *ptr = 0 ; return( n ) ; } int writen( fd , ptr , nbytes) register int fd ; register char *ptr ; register int nbytes ; { int nleft , nwritten ; nleft = nbytes ; while( nleft > 0 ){ nwritten = write( fd , ptr , nleft ) ; if ( nwritten <= 0 ) return (nwritten) ; nleft -= nwritten ; ptr += nwritten ; } return(nbytes - nleft ) ; } void err_sys( ptr ) char * ptr ; { printf("%s \n ",ptr ) ; } void net_tama( int tmp_rensa ) { char mess[5] ; if ( Dairensa == 0 && tmp_rensa == 0 ) return ; sprintf( mess ,"r%c\n",'!'+ tmp_rensa ) ; if ( writen( sockfd , mess , strlen(mess) ) != strlen(mess) ) err_sys("str_cli: writen error on socket") ; } Bool net_getmessage(char *ptr ) { char mess[100] , *c ; int i , j ; static int stocktama = 0 , tekirensa = 0 ; readline( sockfd , &mess , sizeof(mess) ); switch ( mess[0] ){ case 'r' : if ( mess[1] - '!' ){ stocktama += mess[1] - '!' ; tekirensa ++ ; } else { if ( tekirensa > 1 ) tamakazu = stocktama ; stocktama = tekirensa = 0 ; } break ; case 'c': if ( !strncmp ( "Break" , &mess[1] , 5 )) { XCloseDisplay ( dpy ) ; exit(0) ; } if ( !strncmp( "Pause." , &mess[1] , 6 )) while( !net_getmessage("Start")); if ( !strncmp( "Quit" ,&mess[1] , 4 )) { printf("Connection closed\n") ; gameover = True ; net = False ; mode = 4 ; } if (strlen(ptr)) { c = mess ; while( *(++c) != '\n' ) ; *c = '\0' ; strcpy ( ptr , &mess[1] ) ; /* printf("%s %s\n",ptr , &mess[1] ) ; */ if ( !strncmp( ptr , &mess[1] , strlen( ptr ))) return True ; } case 'e': if ( erase > mess[1] - '!' ) erase = mess[1] - '!' ; break; case 'm': for ( i = 0 ; i < 12 ; i ++ ) for ( j = 0 ; j < 8 ; j ++ ) vsmap[j][i] = mess[i*8+j+1] - '!' ; draw(tekirensa); break ; default: printf("Illegal message : %s \n" , mess ) ; } return False ; } void net_init(Bool isserver , char *server) { int ssockfd , i ; int clilen ; struct sockaddr_in cli_addr , serv_addr ; char *tmp ; struct hostent *host ; tmp = (char *)&serv_addr ; for ( i = 0 ; i < sizeof( serv_addr ) ; i ++ ) { (*tmp) = '\0' ; tmp ++ ; } serv_addr.sin_family = AF_INET ; serv_addr.sin_port = htons( SERV_TCP_PORT ) ; if ( ( ssockfd = socket( AF_INET , SOCK_STREAM , 0 )) < 0 ) err_sys("server: can't open stream scoket"); if ( isserver){ serv_addr.sin_addr.s_addr = htonl( INADDR_ANY ) ; if ( bind( ssockfd , ( struct sockaddr * ) &serv_addr , sizeof (serv_addr)) < 0 ) { close( ssockfd ) ; err_sys("server: can't bind local address" ) ; exit(1); } listen( ssockfd , 1 ) ; clilen = sizeof(cli_addr) ; printf("Now listening .....\n"); sockfd = accept(ssockfd , ( struct sockaddr *) &cli_addr , & clilen) ; if ( sockfd < 0 ) err_sys("server: accept error") ; else { host = gethostbyaddr((char *) &(cli_addr.sin_addr) , sizeof ( struct in_addr ) , AF_INET ) ; printf("Accept %s\n",host -> h_name) ; } close(ssockfd) ; } else { struct hostent *hp; if ((serv_addr.sin_addr.s_addr = inet_addr(server)) == -1) { if ((hp = gethostbyname(server)) == NULL) { printf("Who is %s?\n", server); exit(0); } else serv_addr.sin_addr.s_addr = *(long *) hp->h_addr; } if (connect(ssockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0 ) { printf("%s not listening!\n" , server ); exit(0); } sockfd = ssockfd ; printf("Got connection.\n"); } return ; } void draw(int tekirensa) { int i , j , k , values ; XGCValues gcval ; char numbuf[3] ; gcval.line_width = 5 ; XChangeGC( dpy , gc , GCLineWidth , &gcval ) ; XClearWindow( dpy , vsback ) ; for ( i = 0 ; i < 12 ; i ++ ) for ( j = 0 ; j < 8 ; j ++ ) if ( vsmap[j][i] ){ if( vsmap[j][i] > 7 ) { XSetForeground( dpy , gc , iro[ 6 + (vsmap[j][i]-8)%5]); XDrawRectangle( dpy , vsback , gc , j * SZ + 4, 440 - i * SZ + 4, SZ -10 , SZ - 10 ) ; } else { XSetForeground( dpy , gc , iro[6 + (vsmap[j][i]-1)%5] ); XFillArc( dpy , vsback , gc , j * SZ , 440 - i * SZ , SZ , SZ ,0 * 64, 360 * 64 ); } } if ( tekirensa > 1 ){ gcval.foreground = iro[RED] ; gcval.fill_style = FillStippled ; values = GCStipple | GCClipMask | GCTileStipXOrigin|GCTileStipYOrigin | GCClipXOrigin|GCClipYOrigin |GCFillStyle | GCForeground; sprintf( numbuf , "%d", tekirensa ) ; for ( j = 0 ; j < strlen( numbuf ) ; j ++ ){ k = numbuf[j] - '0' ; gcval.stipple = gcval.clip_mask = number[k] ; gcval.ts_y_origin = gcval.clip_y_origin = 130 ; gcval.ts_x_origin = gcval.clip_x_origin = 180 - 96 * ( strlen(numbuf) - j ) ; XChangeGC( dpy , gc3 , values , &gcval) ; XFillRectangle( dpy , vsback , gc3 , gcval.ts_x_origin , 130 , 96, 80 ) ; } for ( j = 0 ; j < 2 ; j ++ ){ gcval.stipple = gcval.clip_mask = number[10+j] ; gcval.ts_y_origin = gcval.clip_y_origin = 210 ; gcval.ts_x_origin = gcval.clip_x_origin = 130 + 96 * j ; XChangeGC( dpy , gc3 , values , &gcval) ; XFillRectangle( dpy , vsback , gc3 , gcval.ts_x_origin , 210 , 96, 80 ) ; } gcval.fill_style = FillTiled ; XChangeGC( dpy , gc3 ,GCFillStyle,&gcval ) ; } XSync( dpy , 0 ); } #endif