Merged page detach patch.
Lots of little fixes.
+2001-11-05
+ * Cleaned up page detach patch.
+ * Merged TetriFast support.
+ (tested compatible with Pihvi's Java Tetrinet Server)
+ * Added some fixes by Pihvi.
+ * Miscellaneous bug fixes.
+
2001-01-13
* Merged page detach patch from Neil Bird <neil.bird@rdel.co.uk>.
* Fixed stupid bug in tetrinet_specialkey().
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
$(ACLOCAL_M4): configure.in
cd $(srcdir) && $(ACLOCAL)
-config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
-dnl aclocal.m4 generated automatically by aclocal 1.4
+dnl aclocal.m4 generated automatically by aclocal 1.4-p4
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
rm -f conf.esdtest
])
+dnl AM_ESD_SUPPORTS_MULTIPLE_RECORD([ACTION-IF-SUPPORTS [, ACTION-IF-NOT-SUPPORTS]])
+dnl Test, whether esd supports multiple recording clients (version >=0.2.21)
+dnl
+AC_DEFUN(AM_ESD_SUPPORTS_MULTIPLE_RECORD,
+[dnl
+ AC_MSG_NOTICE([whether installed esd version supports multiple recording clients])
+ ac_save_ESD_CFLAGS="$ESD_CFLAGS"
+ ac_save_ESD_LIBS="$ESD_LIBS"
+ AM_PATH_ESD(0.2.21,
+ ifelse([$1], , [
+ AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, true)
+ AC_DEFINE(ESD_SUPPORTS_MULTIPLE_RECORD, 1,
+ [Define if you have esound with support of multiple recording clients.])],
+ [$1]),
+ ifelse([$2], , [AM_CONDITIONAL(ESD_SUPPORTS_MULTIPLE_RECORD, false)], [$2])
+ if test "x$ac_save_ESD_CFLAGS" != x ; then
+ ESD_CFLAGS="$ac_save_ESD_CFLAGS"
+ fi
+ if test "x$ac_save_ESD_LIBS" != x ; then
+ ESD_LIBS="$ac_save_ESD_LIBS"
+ fi
+ )
+])
+
PACKAGE=gtetrinet
-VERSION=0.4.1
+VERSION=0.5pre0
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
{ echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/gtetrinet.c)
-AM_INIT_AUTOMAKE(gtetrinet, 0.4.1)
+AM_INIT_AUTOMAKE(gtetrinet, 0.5pre0)
AC_PROG_CC
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
#include "partyline.h"
#include "dialogs.h"
#include "misc.h"
+#include "gtetrinet.h"
#define PORT 31457
#define SPECPORT 31458
char *str;
};
+/* some of these strings change depending on the game mode selected */
+/* these changes are put into effect through the function inmsg_change */
struct inmsgt inmsgtable[] = {
{IN_CONNECT, "connect"},
{IN_DISCONNECT, "disconnect"},
{0, 0}
};
+static struct inmsgt *get_inmsg_entry(enum inmsg_type num)
+{
+ int i;
+ for (i = 0; inmsgtable[i].num && inmsgtable[i].num != num; i ++);
+ return &inmsgtable[i];
+}
+
+static void inmsg_change()
+{
+ switch (gamemode) {
+ case ORIGINAL:
+ get_inmsg_entry(IN_PLAYERNUM)->str = "playernum";
+ get_inmsg_entry(IN_NEWGAME)->str = "newgame";
+ break;
+ case TETRIFAST:
+ get_inmsg_entry(IN_PLAYERNUM)->str = ")#)(!@(*3";
+ get_inmsg_entry(IN_NEWGAME)->str = "*******";
+ break;
+ }
+}
+
struct outmsgt outmsgtable[] = {
{OUT_DISCONNECT, "disconnect"},
{OUT_CONNECTED, "connected"},
connectingdialog_new ();
+ /* set the game mode */
+ inmsg_change();
+
if ((clientpid = fork()) == 0) {
client_process ();
_exit (0);
/* set up the connection */
h = gethostbyname (server);
- if (h == 0) return -1;
+ if (h == 0) {
+ /* set errno = 0 so that we know it's a gethostbyname error */
+ errno = 0;
+ return -1;
+ }
memset (&sa, 0, sizeof (sa));
memcpy (&sa.sin_addr, h->h_addr, h->h_length);
sa.sin_family = h->h_addrtype;
unsigned char iphashbuf[6];
int i, l, len;
/* construct message */
- sprintf (buf, "tetrisstart %s 1.13", nick);
+ if (gamemode == TETRIFAST)
+ sprintf (buf, "tetrifaster %s 1.13", nick);
+ else
+ sprintf (buf, "tetrisstart %s 1.13", nick);
/* do that encoding thingy */
server_ip (ip);
sprintf (iphashbuf, "%d", ip[0]*54 + ip[1]*41 + ip[2]*29 + ip[3]*17);
static int connecting;
static GtkWidget *serveraddressentry, *nicknameentry, *teamnameentry, *spectatorcheck, *passwordentry;
static GtkWidget *connectdialog, *passwordlabel, *teamnamelabel;
+static GtkWidget *originalradio, *tetrifastradio;
+static GSList *gametypegroup;
+static int oldgamemode;
void connectdialog_button (GnomeDialog *dialog, gint button, gpointer data)
{
gtk_entry_get_text(GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(nicknameentry)))));
break;
case 1:
+ gamemode = oldgamemode;
gtk_widget_destroy (connectdialog);
break;
}
}
}
-void connectdialog_cancel (GtkWidget *widget, gpointer data)
+void connectdialog_originaltoggle (GtkWidget *widget, gpointer data)
{
- gtk_widget_destroy (connectdialog);
+ if (GTK_TOGGLE_BUTTON(widget)-> active) {
+ gamemode = ORIGINAL;
+ }
+}
+
+void connectdialog_tetrifasttoggle (GtkWidget *widget, gpointer data)
+{
+ if (GTK_TOGGLE_BUTTON(widget)-> active) {
+ gamemode = TETRIFAST;
+ }
}
void connectdialog_connected (void)
/* check if dialog is already displayed */
if (connecting) return;
connecting = TRUE;
+
+ /* save some stuff */
+ oldgamemode = gamemode;
+
/* make dialog that asks for address/nickname */
connectdialog = gnome_dialog_new (_("Connect to Server"),
GNOME_STOCK_BUTTON_OK,
gtk_table_set_col_spacings (GTK_TABLE(table1), GNOME_PAD_SMALL);
/* server address */
- table2 = gtk_table_new (1, 1, FALSE);
+ table2 = gtk_table_new (2, 1, FALSE);
serveraddressentry = gnome_entry_new ("Server");
gtk_entry_set_text (GTK_ENTRY(gnome_entry_gtk_entry(GNOME_ENTRY(serveraddressentry))),
gtk_table_attach (GTK_TABLE(table2), serveraddressentry,
0, 1, 0, 1, GTK_FILL | GTK_EXPAND,
GTK_FILL | GTK_EXPAND, 0, 0);
+ /* game type radio buttons */
+ originalradio = gtk_radio_button_new_with_label (NULL, _("Original"));
+ gametypegroup = gtk_radio_button_group (GTK_RADIO_BUTTON(originalradio));
+ tetrifastradio = gtk_radio_button_new_with_label (gametypegroup, _("TetriFast"));
+ switch (gamemode) {
+ case ORIGINAL:
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(originalradio), TRUE);
+ break;
+ case TETRIFAST:
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tetrifastradio), TRUE);
+ break;
+ }
+ gtk_widget_show (originalradio);
+ gtk_widget_show (tetrifastradio);
+ widget = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX(widget), originalradio, 0, 0, 0);
+ gtk_box_pack_start (GTK_BOX(widget), tetrifastradio, 0, 0, 0);
+ gtk_widget_show (widget);
+ gtk_table_attach (GTK_TABLE(table2), widget,
+ 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
gtk_table_set_row_spacings (GTK_TABLE(table2), GNOME_PAD_SMALL);
gtk_table_set_col_spacings (GTK_TABLE(table2), GNOME_PAD_SMALL);
gtk_table_attach (GTK_TABLE(table1), frame, 1, 2, 1, 2,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
-
gtk_widget_show (table1);
gtk_box_pack_start (GTK_BOX(GNOME_DIALOG(connectdialog)->vbox),
GTK_SIGNAL_FUNC(connectdialog_destroy), NULL);
gtk_signal_connect (GTK_OBJECT(spectatorcheck), "toggled",
GTK_SIGNAL_FUNC(connectdialog_spectoggle), NULL);
+ gtk_signal_connect (GTK_OBJECT(originalradio), "toggled",
+ GTK_SIGNAL_FUNC(connectdialog_originaltoggle), NULL);
+ gtk_signal_connect (GTK_OBJECT(tetrifastradio), "toggled",
+ GTK_SIGNAL_FUNC(connectdialog_tetrifasttoggle), NULL);
gtk_widget_show (connectdialog);
}
{
char buf[256];
strcpy (buf, gtk_entry_get_text(GTK_ENTRY(gmsginput)));
+ if (strlen(buf) == 0) return;
buf[strlen(buf)-1] = 0;
gtk_entry_set_text (GTK_ENTRY(gmsginput), buf);
gtk_entry_set_position (GTK_ENTRY(gmsginput), strlen(buf));
gint keypress (GtkWidget *widget, GdkEventKey *key);
gint keyrelease (GtkWidget *widget, GdkEventKey *key);
-static GtkWidget *app, *pfields;
+static GtkWidget *app, *pfields, *pparty, *pwinlist;
+static GtkWidget *winlistwidget, *partywidget, *fieldswidget;
GtkWidget *notebook;
char *option_connect = 0, *option_nick = 0, *option_team = 0, *option_pass = 0;
int option_spec = 0;
+int gamemode = ORIGINAL;
+
+int fields_width, fields_height;
+
static const struct poptOption options[] = {
{"connect", 'c', POPT_ARG_STRING, &option_connect, 0, N_("Connect to server"), N_("SERVER")},
{"nickname", 'n', POPT_ARG_STRING, &option_nick, 0, N_("Set nickname to use"), N_("NICKNAME")},
make_menus (GNOME_APP(app));
/* create the pages in the notebook */
- page = fields_page_new ();
- gtk_widget_set_sensitive (page, TRUE);
- gtk_widget_show (page);
+ fieldswidget = fields_page_new ();
+ gtk_widget_set_sensitive (fieldswidget, TRUE);
+ gtk_widget_show (fieldswidget);
pfields = gtk_hbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER(pfields), 0);
- gtk_container_add (GTK_CONTAINER(pfields), page);
+ gtk_container_add (GTK_CONTAINER(pfields), fieldswidget);
gtk_widget_show (pfields);
- gtk_object_set_data( GTK_OBJECT(page), "title", "Playing Fields"); // FIXME
+ gtk_object_set_data( GTK_OBJECT(fieldswidget), "title", "Playing Fields"); // FIXME
label = pixmapdata_label (fields_xpm, "Playing Fields");
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pfields, label);
- page = partyline_page_new ();
- gtk_widget_show (page);
- box = gtk_hbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER(box), 0);
- gtk_container_add (GTK_CONTAINER(box), page);
- gtk_widget_show (box);
- gtk_object_set_data( GTK_OBJECT(page), "title", "Partyline"); // FIXME
+ partywidget = partyline_page_new ();
+ gtk_widget_show (partywidget);
+ pparty = gtk_hbox_new (FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER(pparty), 0);
+ gtk_container_add (GTK_CONTAINER(pparty), partywidget);
+ gtk_widget_show (pparty);
+ gtk_object_set_data( GTK_OBJECT(partywidget), "title", "Partyline"); // FIXME
label = pixmapdata_label (partyline_xpm, "Partyline");
gtk_widget_show (label);
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), box, label);
-
- page = winlist_page_new ();
- gtk_widget_show (page);
- box = gtk_hbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER(box), 0);
- gtk_container_add (GTK_CONTAINER(box), page);
- gtk_widget_show (box);
- gtk_object_set_data( GTK_OBJECT(page), "title", "Winlist"); // FIXME
+ gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pparty, label);
+
+ winlistwidget = winlist_page_new ();
+ gtk_widget_show (winlistwidget);
+ pwinlist = gtk_hbox_new (FALSE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER(pwinlist), 0);
+ gtk_container_add (GTK_CONTAINER(pwinlist), winlistwidget);
+ gtk_widget_show (pwinlist);
+ gtk_object_set_data( GTK_OBJECT(winlistwidget), "title", "Winlist"); // FIXME
label = pixmapdata_label (winlist_xpm, "Winlist");
gtk_widget_show (label);
- gtk_notebook_append_page (GTK_NOTEBOOK(notebook), box, label);
+ gtk_notebook_append_page (GTK_NOTEBOOK(notebook), pwinlist, label);
gtk_widget_show (notebook);
gtk_widget_show (app);
+ gtk_widget_set_usize(partywidget, 480, 360);
+ gtk_widget_set_usize(winlistwidget, 480, 360);
+
/* initialise some stuff */
textbox_setup ();
commands_checkstate ();
(gpointer)(pageData));
gtk_widget_show_all( newWindow );
+
+ /* cure annoying side effect */
+ if (gmsgstate)
+ fields_gmsginput(TRUE);
+ else
+ fields_gmsginput(FALSE);
+
}
#define APPNAME "GTetrinet"
#define APPVERSION VERSION
+#define ORIGINAL 0
+#define TETRIFAST 1
+
+extern int gamemode;
+
extern void destroymain (GtkWidget *widget, gpointer data);
extern gint keypress (GtkWidget *widget, GdkEventKey *key);
extern gint keyrelease (GtkWidget *widget, GdkEventKey *key);
#include "dialogs.h"
#include "sound.h"
-#define NEXTBLOCKDELAY 1000
+#define NEXTBLOCKDELAY (gamemode==TETRIFAST?0:1000)
#define DOWNDELAY 100
#define PARTYLINEDELAY1 100
#define PARTYLINEDELAY2 200
break;
case S_BLOCKQUAKE:
for (y = 0; y < FIELDHEIGHT; y ++) {
- /*
- note: I actually measured these frequencies - the following
- is an approximation of what I measured
- */
- int s;
- i = randomnum (20);
- if (i < 9) s = 0;
- else if (i < 15) s = 1;
- else if (i < 18) s = 2;
- else s = 3;
+ /* [ the original approximation of blockquake frequencies were
+ not quite correct ] */
+ /* ### This is a much better approximation and probably how the */
+ /* ### original tetrinet does it */
+ int s = 0;
+ i = randomnum (22);
+ if (i < 1) s ++;
+ if (i < 4) s ++;
+ if (i < 11) s ++;
if (randomnum(2)) s = -s;
tetrinet_shiftline (y, s, field);
+ /* ### Corrected by Pihvi */
}
tetrinet_updatefield (field);
break;
extern int ingame, playing, paused;
extern int moderator, spectating;
extern int bigfieldnum;
+extern int gmsgstate;
extern char specialblocks[256];
extern int specialblocknum;
void tetris_addlines (int count, int type)
{
- int x, y, ok, n, i;
+ int x, y, n, i;
FIELD field;
copyfield (field, fields[playernum]);
for (i = 0; i < count; i ++) {
/* generate a random line with spaces in it */
switch (type) {
case 1: /* addline lines */
- ok = FALSE;
- while (!ok) {
- for (x = 0; x < FIELDWIDTH; x ++) {
- n = randomnum (13);
- /* in the original tetrinet, spaces seem to have 1.5 times the
- probability of other blocks */
- if (n < 10) field[FIELDHEIGHT-1][x] = n/2 + 1;
- else {
- field[FIELDHEIGHT-1][x] = 0;
- ok = TRUE;
- }
- }
- }
+ /* ### This is how the original tetrinet seems to do an add line */
+ for (x = 0; x < FIELDWIDTH; x ++)
+ field[FIELDHEIGHT-1][x] = randomnum(6);
+ field[FIELDHEIGHT-1][randomnum(FIELDWIDTH)] = 0;
+ /* ### Corrected by Pihvi */
break;
case 2: /* classicmode lines */
/* fill up the line */
- for (x = 0; x < FIELDWIDTH; x ++) {
+ for (x = 0; x < FIELDWIDTH; x ++)
field[FIELDHEIGHT-1][x] = randomnum(5) + 1;
- }
/* add a single space */
field[FIELDHEIGHT-1][randomnum(FIELDWIDTH)] = 0;
break;
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation