📄 gbnclient.c
字号:
/* * Batalla Naval (c) 1995,96,97,98 Ricardo Quesada * (rquesada@dc.uba.ar) * * Cliente X - GTK * Version: pre-0.60-31 * * Depende de las librerias GTK * * - Obviamente el codigo es casi el mismo que del cliente Xview, Okay ? * aunque espero que sea un cacho mas estable * - Perdon, creo que vario muchisimo del cliente XView, a si que no es casi * igual, Okay ? * - Bueno, esta bien. * *//* * pre-0.60-1/3 xx/09/97 - Jugar con las GTK * pre-0.60-4 xx/09/97 - Crear pantalla * ... despues de los examenes ... * pre-0.60-5 27/12/97 - Usar pixmaps * pre-0.60-6 28/12/97 - Uh? * ... despues de las vacaciones ... * pre-0.60-7 13/02/98 - Un buen rato despues... connect y etc. * pre-0.60-8 14/02/98 - Connect y Disconnect y Status * pre-0.60-9 14/02/98 - Send Board y Start y vscrollbar * pre-0.60-10 16/02/98 - Right panel, hit and otras boludeces. * pre-0.60-11 19/02/98 - Mas pixmaps y otras bellas cosas (algo jugable). * pre-0.60-12 21/02/98 - Probe scrolled_window... pero no. Saque table * pre-0.60-13 23/02/98 - Parti en 2 el codigo... * pre-0.60-14 01/03/98 - Hacer algo mas, no ? * pre-0.60-15 01/03/98 - Funciona el juego joya. Espero * pre-0.60-16 03/03/98 - Uni de nuevo el codigo en un solo archivo. * Pude arreglar el problema de las notebooks * con las nuevas GTK 0.99.4 - Anda vieja. * pre-0.60-17 04/03/98 - Anda la opcion de config * pre-0.60-18 04/03/98 - Mensajes y esas porquerias * pre-0.60-19 04/03/98 - Porquerias con las notebooks * pre-0.60-20 05/03/98 - Tratar de arreglar las putas notebooks * pre-0.60-21 07/03/98 - Encontre el puto bug que no me dejaba dormir * buscar en el codigo por "puto bug" * pre-0.60-22 07/03/98 - ? * pre-0.60-23 07/03/98 - Jugable... * pre-0.60-24 08/03/98 - Pixmaps inside * pre-0.60-25 08/03/98 - Un nuevo help * pre-0.60-26 08/03/98 - Uso los pixmaps the GameOver y Winner * pre-0.60-27 08/03/98 - Tiene icono * pre-0.60-28 09/03/98 - No tiene mas menu y actualiza el vscrollbar * pre-0.60-29 10/03/98 - Algunos detalles y check button en bnsendmsg * pre-0.60-30 17/03/98 - Agregar el popup a las notebooks, y los tooltips * pre-0.60-31 18/03/98 - Otro status bar abajo ( left y right ) *//* ---- Includes Generales ---- */#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <netdb.h>#include <stdio.h>#include <syslog.h>#include <errno.h>#include <string.h>/* ---- Includes propios de la Interface ---- */#include <gtk/gtk.h>/* ---- Includes propios del Juego ---- */#include "../share/protocol.h"#include "cliente.h"#include "pixmaps.h"/* * Funciones de manejo de pantalla y otras */static void ttyfill(char msg[]){ gchar messg[100]; gfloat new_value ; strncpy(messg,msg,100); gtk_text_freeze(GTK_TEXT(text)); gtk_widget_realize(text); gtk_text_insert( GTK_TEXT(text),NULL,NULL,NULL,messg,-1); gtk_text_thaw(GTK_TEXT(text)); /* tendria que encontrar la manera de que sea automatico el valor este */ if( GTK_RANGE( vscrollbar )->adjustment->upper >= 154 ) { new_value = GTK_RANGE( vscrollbar )-> adjustment->upper - 154; GTK_RANGE(vscrollbar)->adjustment->value = new_value; GTK_RANGE(vscrollbar)->timer = 0; /* para que sirver ? */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_RANGE(vscrollbar)->adjustment), "value_changed"); }}static void pmicell(int x,int y,int color){ if(x<10 && x>=0 && y>=0 && y<10) { switch( color ) { case NOBARCO: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], fondo, x*ANCHO+1,y*LARGO+1, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case AGUA: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], azul, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case BARCO: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], verde, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case TOCADO: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], rojo, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case HUNDIDO: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], negro, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; default: gdk_draw_pixmap( drawing_left->window, drawing_left->style->fg_gc[GTK_WIDGET_STATE(drawing_left)], negro, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; } }}static void ptucell(int x,int y,int color){ gint i; if(x<10 && x>=0 && y>=0 && y<10) { i = gtk_notebook_current_page( GTK_NOTEBOOK( notebook_right ) ); i = usuario.pages[ i ] ; /* puto bug resuelto */ switch( color ) { case NOBARCO: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], fondo, x*ANCHO+1,y*LARGO+1, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case AGUA: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], azul, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case BARCO: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], verde, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case TOCADO: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], rojo, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; case HUNDIDO: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], negro, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; default: gdk_draw_pixmap( drawing_right[i]->window, drawing_right[i]->style->fg_gc[GTK_WIDGET_STATE(drawing_right[i])], negro, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); break; } }}static void foot_right( char* text ){ gtk_statusbar_pop( GTK_STATUSBAR(statusbar_right), 1 ); gtk_statusbar_push( GTK_STATUSBAR(statusbar_right), 1, text);}static void foot_left( char* text ){ gtk_statusbar_pop( GTK_STATUSBAR(statusbar_left), 1 ); gtk_statusbar_push( GTK_STATUSBAR(statusbar_left), 1, text);}/* Funcion que saca a un usuario */gint sacar_usrpage( gint jugador ){ gint i,j,k; j=32; /* no es nada esto, pero sirve para el debug */ for(i=0;i<MAXPLAYER;i++) { if (usuario.pages[i]==jugador) { j=i; for( k=i; k < (MAXPLAYER-1); k++ ) { usuario.pages[k]=usuario.pages[k+1]; } usuario.pages[MAXPLAYER-1]=-32; } } return j;}/* Funcion que busca un usuario en una page */gint buscar_usr( gint usr ){ gint i,j; j=-20; for(i=0;i<MAXPLAYER;i++) { if(usuario.pages[i]==usr) { j=i; break; } } return j;}/* Funcion que pone el Help */static void h2o(char messg[]){ gtk_text_freeze(GTK_TEXT(text_help)); gtk_widget_realize(text_help); gtk_text_insert( GTK_TEXT(text_help),NULL,NULL,NULL,messg,-1); gtk_text_thaw(GTK_TEXT(text_help));}void bn_help( void ){ h2o("BATALLA NAVAL -\n" "\tHIDE,HELP & CREDITS" "\n\n\n" "HIDE\n" "Use this option to hide your ships from your enemies, " "in case you are playing in the same room with them, of course." "\n\n\n" "HELP\n" "First you must fill your board. Press 'My board' in this " "notebook, and complete it with:\n" " - 4 ships of 1 unit\n" " - 3 ships of 2 units\n" " - 2 ships of 3 units\n" " - 1 ship of 4 units\n" "\n" "Remember that the ships must be put horizontally or vertically " "only, and that they must be one cell away from the others ships.\n" "Then 'Connect' to the server, if there is an error 'Config' your client.\n" "Then 'Send-your-Board' to the server and wait others players. " "You can view the 'Status' of the server, " "and when there are enough players 'Start' the game. OK?" "\n\n\n" "CREDITS\n" "Un-original idea by:\n" "Sebastian Cativa Tolosa & Ricardo Quesada\n\n" "Server, GTK Client, XView Client & ncurses Client by:\n" "Ricardo Quesada\n\n" "Win 16 client & bugfixes by:\n" "Horacio Pe馻\n\n" "\n\n\n" "e-mail's:\n" "Sebastian Cativa Tolosa\n(scativa@dc.uba.ar)\n\n" "Horacio Pe馻\n(horape@century.com.ar)\n\n" "Ricardo Quesada\n(rquesada@dc.uba.ar)\n\n" ); }/**************************************************************************** * FUNCIONES DE LOS EVENTOS DEL MOUSE ****************************************************************************//* Left */static gint expose_event (GtkWidget *widget, GdkEventExpose *event){ gint i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { pmicell( i,j, mitabla[i][j] ); } } /* Dibuja las lineas */ for(i=0;i<10;i++) { gdk_draw_line (widget->window, widget->style->black_gc, 0,LARGO*i, ANCHO*10,LARGO*i); gdk_draw_line (widget->window, widget->style->black_gc, ANCHO*i,0, ANCHO*i,LARGO*10); } return FALSE;}// Se馻l PRESS_BUTTONstatic gint button_press_event (GtkWidget *widget, GdkEventButton *event){ gint x,y; x=event->x / ANCHO; y=event->y / LARGO; if( usuario.play >=3 ) { ttyfill("Hey, What are you trying to do ?\n"); return TRUE; } else if( usuario.play ==2 ) { ttyfill("I'm sorry but you can't modify your board right now.\n"); return TRUE; } if ( event->button == 1 ) { gdk_draw_pixmap( widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], verde, 0,0, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); mitabla[x][y]=1; } else if ( event->button == 3 ) { gdk_draw_pixmap( widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], fondo, x*ANCHO+1,y*LARGO+1, x*ANCHO+1,y*LARGO+1, ANCHO-1,LARGO-1); mitabla[x][y]=0; } return TRUE;}/* Right About */static gint expose_event_about (GtkWidget *widget, GdkEventExpose *event){ gdk_draw_pixmap( widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], about, 0,0, 0,0, 200,200 ); return FALSE;}/* Right, page switch */static gint page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num){ gchar outbuf[MSGMAXLEN]; if( usuario.play>=3 ) { usuario.usrfrom = usuario.pages[ page_num ] + 1; bnwrite(sock,outbuf,BNREA,usuario.usrfrom,bnsup,usuario.numjug); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -