aboutsummaryrefslogtreecommitdiff
path: root/games/fteqw
diff options
context:
space:
mode:
authorAlejandro Pulver <alepulver@FreeBSD.org>2006-09-03 03:43:29 +0000
committerAlejandro Pulver <alepulver@FreeBSD.org>2006-09-03 03:43:29 +0000
commit74e3bb7a35cc4fcae99e66e176293ef65248aa30 (patch)
tree2bf8f5b5f913ac3b210d60c567e0f08ab6a277c5 /games/fteqw
parent545492f4aee2765ae30571c2f5acc71c41518e00 (diff)
downloadports-74e3bb7a35cc4fcae99e66e176293ef65248aa30.tar.gz
ports-74e3bb7a35cc4fcae99e66e176293ef65248aa30.zip
Notes
Diffstat (limited to 'games/fteqw')
-rw-r--r--games/fteqw/Makefile88
-rw-r--r--games/fteqw/distinfo3
-rw-r--r--games/fteqw/files/patch-Makefile97
-rw-r--r--games/fteqw/files/patch-client__cl_main.c17
-rw-r--r--games/fteqw/files/patch-client__snd_linux.c82
-rw-r--r--games/fteqw/files/patch-client__sys_linux.c23
-rw-r--r--games/fteqw/files/patch-common__fs.c38
-rw-r--r--games/fteqw/files/patch-common__net_wins.c11
-rw-r--r--games/fteqw/files/patch-gl__gl_vidlinuxglx.c11
-rw-r--r--games/fteqw/files/patch-server__sv_sys_unix.c23
-rw-r--r--games/fteqw/files/pkg-message.in12
-rw-r--r--games/fteqw/pkg-descr10
12 files changed, 415 insertions, 0 deletions
diff --git a/games/fteqw/Makefile b/games/fteqw/Makefile
new file mode 100644
index 000000000000..0f468645b77b
--- /dev/null
+++ b/games/fteqw/Makefile
@@ -0,0 +1,88 @@
+# New ports collection makefile for: fteqw
+# Date created: 2 Sep 2006
+# Whom: alepulver
+#
+# $FreeBSD$
+#
+
+PORTNAME= fteqw
+PORTVERSION= 2770
+CATEGORIES= games
+MASTER_SITES= SF
+DISTNAME= ftesrc${PORTVERSION}-all
+
+MAINTAINER= alepulver@FreeBSD.org
+COMMENT= QuakeWorld client with cool features, but still compatible
+
+USE_ZIP= yes
+USE_DOS2UNIX= yes
+USE_GCC= 3.2+
+USE_GMAKE= yes
+WRKSRC= ${WRKDIR}/engine
+
+OPTIONS= GL "Build OpenGL client" on \
+ OPTIMIZED_CFLAGS "Enable compilation optimizations" on \
+ SV "Build dedicated server" on \
+ SW "Build software (X11) client" on \
+ X86_ASM "Enable use of x86 assembly code" on
+
+SUB_FILES= pkg-message
+
+.include "${.CURDIR}/../quake-data/Makefile.include"
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITHOUT_DEDICATED) && defined(WITHOUT_GLX) && defined(WITHOUT_X11)
+IGNORE= needs at least one executable (DEDICATED, GLX or X11)
+.endif
+
+.if !defined(WITHOUT_GL) || !defined(WITHOUT_SW)
+LIB_DEPENDS+= jpeg.9:${PORTSDIR}/graphics/jpeg \
+ png.5:${PORTSDIR}/graphics/png \
+ vorbis.3:${PORTSDIR}/audio/libvorbis
+.endif
+
+.if !defined(WITHOUT_GL)
+USE_GL= yes
+ALL_TARGET+= gl-rel
+PLIST_FILES+= bin/fteqw-gl
+FTE_TARGETS+= fteqw.gl
+.endif
+
+.if !defined(WITHOUT_OPTIMIZED_CFLAGS)
+MAKE_ENV+= OPTIMIZED_CFLAGS=true
+.endif
+
+.if !defined(WITHOUT_SV)
+ALL_TARGET+= sv-rel
+PLIST_FILES+= bin/fteqw-sv
+FTE_TARGETS+= fteqw.sv
+.endif
+
+.if !defined(WITHOUT_SW)
+USE_XLIB= yes
+ALL_TARGET+= sw-rel
+PLIST_FILES+= bin/fteqw-sw
+FTE_TARGETS+= fteqw.sw
+.endif
+
+.if !defined(WITHOUT_X86_ASM) && ${ARCH} == "i386"
+MAKE_ENV+= USEASM=true
+.endif
+
+post-patch:
+ @${REINPLACE_CMD} -e 's/malloc\.h/stdlib.h/' ${WRKSRC}/gl/gl_alias.c
+ @${REINPLACE_CMD} -e 's/__linux__/__unix__/' \
+ ${WRKSRC}/common/plugin.c ${WRKSRC}/server/svq3_game.c
+
+do-install:
+.for f in ${FTE_TARGETS}
+ ${INSTALL_PROGRAM} ${WRKSRC}/release/${f} ${PREFIX}/bin/${f:S/./-/}
+.endfor
+
+post-install:
+ @${ECHO_CMD}
+ @${CAT} ${PKGMESSAGE}
+ @${ECHO_CMD}
+
+.include <bsd.port.post.mk>
diff --git a/games/fteqw/distinfo b/games/fteqw/distinfo
new file mode 100644
index 000000000000..885aa24f36ac
--- /dev/null
+++ b/games/fteqw/distinfo
@@ -0,0 +1,3 @@
+MD5 (ftesrc2770-all.zip) = 1a47b5d5c88422316814d6e4ed1c2d17
+SHA256 (ftesrc2770-all.zip) = bc8eb51f67a0f8d73a355db4d317dd35a26a6c1827d96f180a76d7bacef1d43e
+SIZE (ftesrc2770-all.zip) = 2713584
diff --git a/games/fteqw/files/patch-Makefile b/games/fteqw/files/patch-Makefile
new file mode 100644
index 000000000000..fa95576da1b5
--- /dev/null
+++ b/games/fteqw/files/patch-Makefile
@@ -0,0 +1,97 @@
+--- ./Makefile.orig Tue Jul 18 00:34:50 2006
++++ ./Makefile Sat Sep 2 18:40:11 2006
+@@ -1,5 +1,5 @@
+-CC=gcc
+-STRIP=strip
++CC?=gcc
++STRIP?=strip
+
+ STRIPFLAGS=--strip-unneeded --remove-section=.comment
+
+@@ -86,9 +86,9 @@
+ BASELDFLAGS ?= -lm -ldl
+
+ #BASELDFLAGS=-lm -lz
+-GLXLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext -lpng -ljpeg
+-GLSLDFLAGS=-L/usr/X11R6/lib -lMesaGL -lglide -lvga
+-XLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext -lpng -ljpeg
++GLXLDFLAGS=-L$(X11BASE)/lib -lX11 -lXext -L$(LOCALBASE)/lib -lpng -ljpeg
++GLSLDFLAGS=-L$(X11BASE)/lib -lMesaGL -lglide -lvga
++XLDFLAGS=-L$(X11BASE)/lib -lX11 -lXext -L$(LOCALBASE)/lib -lpng -ljpeg
+ SLDFLAGS=-lvga
+
+ ifeq ($(USEASM),true)
+@@ -119,12 +119,14 @@
+ BASE_ASM_CFLAGS = -DNOASM
+ endif
+
+-BASE_CFLAGS=$(BASE_ASM_CFLAGS) -Wall -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(COMMON_DIR) -I$(SW_DIR) -I$(GL_DIR) -I$(PROGS_DIR) -I$(LIBS_DIR) -I$(QUX_DIR) -I$(LIBS_DIR)/dxsdk7/include -I$(LIBS_DIR)/sdl/include -I$(LIBS_DIR)/sdl/include/SDL -D_vsnprintf=vsnprintf -D_snprintf=snprintf
++BASE_CFLAGS=$(BASE_ASM_CFLAGS) -Dstrnicmp=strncasecmp -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(COMMON_DIR) -I$(SW_DIR) -I$(GL_DIR) -I$(PROGS_DIR) -I$(LIBS_DIR) -I$(QUX_DIR) -I$(LIBS_DIR)/dxsdk7/include -I$(LIBS_DIR)/sdl/include -I$(LIBS_DIR)/sdl/include/SDL -D_vsnprintf=vsnprintf -D_snprintf=snprintf
+ CLIENT_ONLY_CFLAGS=-DCLIENTONLY
+ SERVER_ONLY_CFLAGS=-DSERVERONLY
+ JOINT_CFLAGS=
+ DEBUG_CFLAGS=-ggdb -g
++ifeq ($(OPTIMIZED_CFLAGS),true)
+ RELEASE_CFLAGS=-O6 -fno-strict-aliasing -ffast-math -funroll-loops -fexpensive-optimizations $(CPUOPTIMIZATIONS)
++endif
+ GLCFLAGS=-DGLQUAKE
+ SWCFLAGS=-DSWQUAKE
+
+@@ -339,11 +341,11 @@
+ GL_EXE_NAME=../fteqw_sdl.gl
+ GLCL_EXE_NAME=../fteqwcl_sdl.gl
+ ifdef windir
+- GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lwsock32 `sdl-config --libs`
++ GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lwsock32 `$(SDL_CONFIG) --libs`
+ else
+- GL_LDFLAGS=$(GLLDFLAGS) -lpng -ljpeg `sdl-config --libs`
++ GL_LDFLAGS=$(GLLDFLAGS) -lpng -ljpeg `$(SDL_CONFIG) --libs`
+ endif
+-GL_CFLAGS=$(GLCFLAGS) `sdl-config --cflags`
++GL_CFLAGS=$(GLCFLAGS) `$(SDL_CONFIG) --cflags`
+ GLB_DIR=gl_sdl
+ GLCL_DIR=glcl_sdl
+
+@@ -354,9 +356,9 @@
+ SW_LDFLAGS=$(SWLDFLAGS) -lmingw32 -lwsock32 -lSDLmain -lSDL
+ else
+ #pthread is needed because of SDL.
+-SW_LDFLAGS=$(SWLDFLAGS) `sdl-config --libs` -lpng -ljpeg
++SW_LDFLAGS=$(SWLDFLAGS) `$(SDL_CONFIG) --libs` -lpng -ljpeg
+ endif
+-SW_CFLAGS=$(SWCFLAGS) `sdl-config --cflags`
++SW_CFLAGS=$(SWCFLAGS) `$(SDL_CONFIG) --cflags`
+ SWB_DIR=sw_sdl
+ SWCL_DIR=swcl_sdl
+
+@@ -424,8 +426,8 @@
+ endif
+ GL_EXE_NAME=../fteqw.gl
+ GLCL_EXE_NAME=../fteqwcl.gl
+- GL_LDFLAGS= -L/usr/local/lib $(GLLDFLAGS) $(GLXLDFLAGS) -lXxf86vm
+- GL_CFLAGS=$(GLCFLAGS) -I/usr/local/include -I/usr/X11R6/include
++ GL_LDFLAGS=$(GLLDFLAGS) $(GLXLDFLAGS) -lXxf86vm
++ GL_CFLAGS=$(GLCFLAGS) -I$(LOCALBASE)/include -I$(X11BASE)/include
+ GLB_DIR=gl_bsd
+ GLCL_DIR=glcl_bsd
+
+@@ -436,8 +438,8 @@
+ endif
+ SW_EXE_NAME=../fteqw.sw
+ SWCL_EXE_NAME=../fteqwcl.sw
+- SW_LDFLAGS=-L/usr/local/lib $(SWLDFLAGS) $(XLDFLAGS)
+- SW_CFLAGS=$(SWCFLAGS) -I/usr/local/include -I/usr/X11R6/include
++ SW_LDFLAGS=$(SWLDFLAGS) $(XLDFLAGS)
++ SW_CFLAGS=$(SWCFLAGS) -I$(LOCALBASE)/include -I$(X11BASE)/include
+ SWB_DIR=sw_bsd
+ SWCL_DIR=swcl_bsd
+
+@@ -449,7 +451,7 @@
+ M_EXE_NAME=../fteqw
+ MCL_EXE_NAME=../fteqwcl
+ M_LDFLAGS=$(GLLDFLAGS) $(GLXLDFLAGS) -lXxf86vm
+- M_CFLAGS=$(SWCFLAGS) $(GLCFLAGS) -I/usr/X11R6/include
++ M_CFLAGS=$(SWCFLAGS) $(GLCFLAGS) -I$(X11BASE)/include
+ MB_DIR=m_bsd
+ MCL_DIR=mcl_bsd
+ endif
diff --git a/games/fteqw/files/patch-client__cl_main.c b/games/fteqw/files/patch-client__cl_main.c
new file mode 100644
index 000000000000..c688f240cbd5
--- /dev/null
+++ b/games/fteqw/files/patch-client__cl_main.c
@@ -0,0 +1,17 @@
+--- ./client/cl_main.c.orig Tue Jul 18 00:34:50 2006
++++ ./client/cl_main.c Sat Sep 2 19:03:55 2006
+@@ -2873,11 +2873,13 @@
+
+ if (host_initialized && cfg_save_name.string && *cfg_save_name.string)
+ {
+- if (strchr(cfg_save_name.string, '.'))
++#if 0
++ if (strstr(cfg_save_name.string, ".."))
+ {
+ Con_TPrintf (TLC_CONFIGCFG_WRITEFAILED);
+ return;
+ }
++#endif
+
+ f = FS_OpenVFS(va("%s.cfg",cfg_save_name.string), "wb", FS_GAMEONLY);
+ if (!f)
diff --git a/games/fteqw/files/patch-client__snd_linux.c b/games/fteqw/files/patch-client__snd_linux.c
new file mode 100644
index 000000000000..efe25ad5f21b
--- /dev/null
+++ b/games/fteqw/files/patch-client__snd_linux.c
@@ -0,0 +1,82 @@
+--- ./client/snd_linux.c.orig Tue Jul 18 00:34:50 2006
++++ ./client/snd_linux.c Sat Sep 2 18:40:11 2006
+@@ -115,14 +115,6 @@
+ return 0;
+ }
+
+- if (ioctl(sc->audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
+- {
+- perror("GETOSPACE");
+- Con_Printf(S_ERROR "OSS: Um, can't do GETOSPACE?\n");
+- OSS_Shutdown(sc);
+- return 0;
+- }
+-
+ sc->sn.splitbuffer = 0;
+
+ // set sample bits & speed
+@@ -152,27 +144,6 @@
+ sc->sn.speed = tryrates[i];
+ }
+
+- if (sc->sn.samples > (info.fragstotal * info.fragsize * 4))
+- {
+- Con_Printf(S_NOTICE "OSS: Enabling bigfoot's mmap hack! Hope you know what you're doing!\n");
+- sc->sn.samples = info.fragstotal * info.fragsize * 4;
+- }
+- sc->sn.samples = info.fragstotal * info.fragsize;
+- sc->sn.submission_chunk = 1;
+-
+-// memory map the dma buffer
+-
+- sc->sn.buffer = (unsigned char *) mmap(NULL, sc->sn.samples, PROT_WRITE, MAP_FILE|MAP_SHARED, sc->audio_fd, 0);
+- if (!sc->sn.buffer)
+- {
+- perror(snddev);
+- Con_Printf(S_ERROR "OSS: Could not mmap %s\n", snddev);
+- OSS_Shutdown(sc);
+- return 0;
+- }
+-
+- sc->sn.samples /= (sc->sn.samplebits/8);
+-
+ tmp = 0;
+ if (sc->sn.numchannels == 2)
+ tmp = 1;
+@@ -228,6 +199,36 @@
+ Con_Printf(S_ERROR "OSS: %d-bit sound not supported.\n", sc->sn.samplebits);
+ OSS_Shutdown(sc);
+ return 0;
++ }
++
++ if (ioctl(sc->audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
++ {
++ perror("GETOSPACE");
++ Con_Printf(S_ERROR "OSS: Um, can't do GETOSPACE?\n");
++ OSS_Shutdown(sc);
++ return 0;
++ }
++
++ sc->sn.samples = info.fragstotal * info.fragsize;
++ sc->sn.submission_chunk = 1;
++
++// memory map the dma buffer
++
++ sc->sn.buffer = (unsigned char *) mmap(NULL, sc->sn.samples, PROT_WRITE, MAP_FILE|MAP_SHARED, sc->audio_fd, 0);
++ if (!sc->sn.buffer)
++ {
++ perror(snddev);
++ Con_Printf(S_ERROR "OSS: Could not mmap %s\n", snddev);
++ OSS_Shutdown(sc);
++ return 0;
++ }
++
++ sc->sn.samples /= (sc->sn.samplebits/8);
++
++ if (sc->sn.samples > (info.fragstotal * info.fragsize * 4))
++ {
++ Con_Printf(S_NOTICE "OSS: Enabling bigfoot's mmap hack! Hope you know what you're doing!\n");
++ sc->sn.samples = info.fragstotal * info.fragsize * 4;
+ }
+
+ // toggle the trigger & start her up
diff --git a/games/fteqw/files/patch-client__sys_linux.c b/games/fteqw/files/patch-client__sys_linux.c
new file mode 100644
index 000000000000..1998a2e12e38
--- /dev/null
+++ b/games/fteqw/files/patch-client__sys_linux.c
@@ -0,0 +1,23 @@
+--- ./client/sys_linux.c.orig Tue Jul 18 00:34:50 2006
++++ ./client/sys_linux.c Sat Sep 2 18:40:52 2006
+@@ -364,18 +364,15 @@
+ void *(*GetGameAPI)(void *);
+
+ char name[MAX_OSPATH];
+- char curpath[MAX_OSPATH];
+ char *searchpath;
+- const char *gamename = "gamei386.so";
++ const char *gamename = "game.so";
+
+ void *ret;
+
+- getcwd(curpath, sizeof(curpath));
+-
+ searchpath = 0;
+ while((searchpath = COM_NextPath(searchpath)))
+ {
+- sprintf (name, "%s/%s/%s", curpath, searchpath, gamename);
++ sprintf (name, "%s/%s", searchpath, gamename);
+
+ game_library = dlopen (name, RTLD_LAZY );
+ if (game_library)
diff --git a/games/fteqw/files/patch-common__fs.c b/games/fteqw/files/patch-common__fs.c
new file mode 100644
index 000000000000..23c3209883d7
--- /dev/null
+++ b/games/fteqw/files/patch-common__fs.c
@@ -0,0 +1,38 @@
+--- ./common/fs.c.orig Tue Jul 18 00:34:40 2006
++++ ./common/fs.c Sat Sep 2 19:18:59 2006
+@@ -2051,7 +2051,7 @@
+ case FS_GAMEONLY: //OS access only, no paks
+ if (*com_homedir)
+ {
+- snprintf(fullname, sizeof(fullname), "%s%s/%s", com_homedir, gamedirfile, filename);
++ snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_homedir, gamedirfile, filename);
+ vfs = VFSOS_Open(fullname, mode);
+ if (vfs)
+ return vfs;
+@@ -2060,7 +2060,7 @@
+ return VFSOS_Open(fullname, mode);
+ case FS_GAME:
+ if (*com_homedir)
+- snprintf(fullname, sizeof(fullname), "%s%s/%s", com_homedir, gamedirfile, filename);
++ snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_homedir, gamedirfile, filename);
+ else
+ snprintf(fullname, sizeof(fullname), "%s%s/%s", com_quakedir, gamedirfile, filename);
+ break;
+@@ -2073,7 +2073,7 @@
+ case FS_BASE:
+ if (*com_homedir)
+ {
+- snprintf(fullname, sizeof(fullname), "%s%s", com_homedir, filename);
++ snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, filename);
+ vfs = VFSOS_Open(fullname, mode);
+ if (vfs)
+ return vfs;
+@@ -2083,7 +2083,7 @@
+ case FS_CONFIGONLY:
+ if (*com_homedir)
+ {
+- snprintf(fullname, sizeof(fullname), "%sfte/%s", com_homedir, filename);
++ snprintf(fullname, sizeof(fullname), "%s/fte/%s", com_homedir, filename);
+ vfs = VFSOS_Open(fullname, mode);
+ if (vfs)
+ return vfs;
diff --git a/games/fteqw/files/patch-common__net_wins.c b/games/fteqw/files/patch-common__net_wins.c
new file mode 100644
index 000000000000..05bfae78dfc3
--- /dev/null
+++ b/games/fteqw/files/patch-common__net_wins.c
@@ -0,0 +1,11 @@
+--- common/net_wins.c.orig Sun Sep 3 00:25:08 2006
++++ common/net_wins.c Sun Sep 3 00:26:44 2006
+@@ -23,6 +23,8 @@
+ #include "quakedef.h"
+ #include "netinc.h"
+
++#include <sys/time.h>
++
+ netadr_t net_local_cl_ipadr;
+ netadr_t net_local_cl_ip6adr;
+ netadr_t net_local_cl_ipxadr;
diff --git a/games/fteqw/files/patch-gl__gl_vidlinuxglx.c b/games/fteqw/files/patch-gl__gl_vidlinuxglx.c
new file mode 100644
index 000000000000..0a80aa0eccf7
--- /dev/null
+++ b/games/fteqw/files/patch-gl__gl_vidlinuxglx.c
@@ -0,0 +1,11 @@
+--- ./gl/gl_vidlinuxglx.c.orig Tue Jul 18 00:34:46 2006
++++ ./gl/gl_vidlinuxglx.c Sat Sep 2 18:40:11 2006
+@@ -41,7 +41,7 @@
+ #include <X11/extensions/xf86dga.h>
+ #endif
+
+-#ifdef __linux__
++#ifdef __unix__
+ #define WITH_VMODE //undefine this if the following include fails.
+ #endif
+ #ifdef WITH_VMODE
diff --git a/games/fteqw/files/patch-server__sv_sys_unix.c b/games/fteqw/files/patch-server__sv_sys_unix.c
new file mode 100644
index 000000000000..e4f61f4ce5da
--- /dev/null
+++ b/games/fteqw/files/patch-server__sv_sys_unix.c
@@ -0,0 +1,23 @@
+--- ./server/sv_sys_unix.c.orig Tue Jul 18 00:34:46 2006
++++ ./server/sv_sys_unix.c Sat Sep 2 18:41:11 2006
+@@ -807,18 +807,15 @@
+ void *(*GetGameAPI)(void *);
+
+ char name[MAX_OSPATH];
+- char curpath[MAX_OSPATH];
+ char *searchpath;
+- const char *gamename = "gamei386.so";
++ const char *gamename = "game.so";
+
+ void *ret;
+
+- getcwd(curpath, sizeof(curpath));
+-
+ searchpath = 0;
+ while((searchpath = COM_NextPath(searchpath)))
+ {
+- sprintf (name, "%s/%s/%s", curpath, searchpath, gamename);
++ sprintf (name, "%s/%s", searchpath, gamename);
+ game_library = dlopen (name, RTLD_LAZY );
+ if (game_library)
+ {
diff --git a/games/fteqw/files/pkg-message.in b/games/fteqw/files/pkg-message.in
new file mode 100644
index 000000000000..dd01a1d59dbc
--- /dev/null
+++ b/games/fteqw/files/pkg-message.in
@@ -0,0 +1,12 @@
+==============================================================================
+
+FTE QuakeWorld has been installed.
+
+To start in full-screen mode run it with "-fullscreen".
+
+To load and save the configuration to ~/.fte run it with "-usehome".
+
+To select the game you want to play use "-basedir <dir>". For example, to play
+Quake use "-basedir %%Q1DIR%%".
+
+==============================================================================
diff --git a/games/fteqw/pkg-descr b/games/fteqw/pkg-descr
new file mode 100644
index 000000000000..f9c969dfcd21
--- /dev/null
+++ b/games/fteqw/pkg-descr
@@ -0,0 +1,10 @@
+The intentions to the FTE QuakeWorld mod are to add some cool features to
+QuakeWorld, without loosing any (backwards) compatability.
+
+All QuakeWorld clients should be able to connect to an FTE server, and all FTE
+clients should connect to any other QW server.
+
+The FTE client, supports Quake, NetQuake, QuakeWorld, Quake II, Quake III
+Arena, Hexen 2, Nexuiz and others.
+
+WWW: http://fteqw.com/