aboutsummaryrefslogtreecommitdiffstats
path: root/games
diff options
context:
space:
mode:
authoralepulver <alepulver@FreeBSD.org>2006-05-22 05:32:28 +0800
committeralepulver <alepulver@FreeBSD.org>2006-05-22 05:32:28 +0800
commit72dbd6d5a84e5aeb9b102e80532e9a5ee6e3e81b (patch)
tree0b427a5ca550d992462db1d9797d71ad69488b23 /games
parent37affae03783749603fe90f7c63b914bd5b7873b (diff)
downloadfreebsd-ports-gnome-72dbd6d5a84e5aeb9b102e80532e9a5ee6e3e81b.tar.gz
freebsd-ports-gnome-72dbd6d5a84e5aeb9b102e80532e9a5ee6e3e81b.tar.zst
freebsd-ports-gnome-72dbd6d5a84e5aeb9b102e80532e9a5ee6e3e81b.zip
This is meant to be a very conservative branch of the Quake source code. I
intend to support Quake and Quakeworld in both software and GL versions, as well as Quakeworld Server; all on both MS Windows and Linux. I don't intend on adding lots of rendering enhancements, but rather fixing little bugs that I've come across over the years. I'll be adding small enhancements, but I don't want to completely overhaul the engine. WWW: http://disenchant.net/engine.html Approved by: garga (mentor)
Diffstat (limited to 'games')
-rw-r--r--games/Makefile1
-rw-r--r--games/tyrquake/Makefile51
-rw-r--r--games/tyrquake/distinfo3
-rw-r--r--games/tyrquake/files/patch-Makefile37
-rw-r--r--games/tyrquake/files/patch-NQ__common.c50
-rw-r--r--games/tyrquake/files/patch-NQ__model.c11
-rw-r--r--games/tyrquake/files/patch-QW__client__cl_main.c18
-rw-r--r--games/tyrquake/files/patch-QW__client__sys_linux.c10
-rw-r--r--games/tyrquake/files/patch-QW__common__common.c39
-rw-r--r--games/tyrquake/files/patch-QW__server__sys_unix.c11
-rw-r--r--games/tyrquake/files/patch-common__cd_linux.c331
-rw-r--r--games/tyrquake/files/patch-common__gl_vidlinuxglx.c12
-rw-r--r--games/tyrquake/files/patch-include__bspfile.h11
-rw-r--r--games/tyrquake/pkg-descr8
-rw-r--r--games/tyrquake/pkg-message8
-rw-r--r--games/tyrquake/pkg-plist7
16 files changed, 608 insertions, 0 deletions
diff --git a/games/Makefile b/games/Makefile
index b3a701e208a0..7148d8564b5d 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -662,6 +662,7 @@
SUBDIR += tvp
SUBDIR += twitch
SUBDIR += typespeed
+ SUBDIR += tyrquake
SUBDIR += uhexen
SUBDIR += umark
SUBDIR += uox3
diff --git a/games/tyrquake/Makefile b/games/tyrquake/Makefile
new file mode 100644
index 000000000000..e25fda6d02e6
--- /dev/null
+++ b/games/tyrquake/Makefile
@@ -0,0 +1,51 @@
+# New ports collection makefile for: tyrquake
+# Date created: 13 May 2006
+# Whom: alepulver
+#
+# $FreeBSD$
+#
+
+PORTNAME= tyrquake
+PORTVERSION= 0.53
+CATEGORIES= games
+MASTER_SITES= http://disenchant.net/files/engine/
+
+MAINTAINER= alepulver@FreeBSD.org
+COMMENT= Very conservative branch of the Quake source code
+
+USE_GCC= 3.2+
+USE_GL= yes
+USE_GMAKE= yes
+
+OPTIONS= OPTIMIZED_CFLAGS "Enable compilation optimizations" on \
+ X86_ASM "Enable x86 assembly code when possible" on
+
+WRKSRC= ${WRKDIR}/${PORTNAME}
+
+.include "${.CURDIR}/../quake-data/Makefile.include"
+
+.include <bsd.port.pre.mk>
+
+.if !defined(WITHOUT_OPTIMIZED_CFLAGS)
+MAKE_ENV+= OPTIMIZED_CFLAGS=YES
+.endif
+
+.if !defined(WITHOUT_X86_ASM)
+MAKE_ENV+= NO_X86_ASM=YES
+.endif
+
+do-install:
+.for file in tyr-quake tyr-glquake tyr-qwcl tyr-glqwcl tyr-qwsv
+ ${INSTALL_PROGRAM} ${WRKSRC}/${file} ${PREFIX}/bin
+.endfor
+.if !defined(NOPORTDOCS)
+ ${MKDIR} ${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/readme.txt ${DOCSDIR}
+.endif
+
+post-install:
+ @${ECHO_CMD}
+ @${CAT} ${PKGMESSAGE}
+ @${ECHO_CMD}
+
+.include <bsd.port.post.mk>
diff --git a/games/tyrquake/distinfo b/games/tyrquake/distinfo
new file mode 100644
index 000000000000..3b4e0799d91b
--- /dev/null
+++ b/games/tyrquake/distinfo
@@ -0,0 +1,3 @@
+MD5 (tyrquake-0.53.tar.gz) = a22fa7c5b798177e1f43e8837a2edb72
+SHA256 (tyrquake-0.53.tar.gz) = f3c594c7c30fd460018ac851c6cd3dd2e880a4676bc85efe933263b0002c520a
+SIZE (tyrquake-0.53.tar.gz) = 1240696
diff --git a/games/tyrquake/files/patch-Makefile b/games/tyrquake/files/patch-Makefile
new file mode 100644
index 000000000000..650fcd14e4b2
--- /dev/null
+++ b/games/tyrquake/files/patch-Makefile
@@ -0,0 +1,37 @@
+--- ./Makefile.orig Sat May 13 08:01:01 2006
++++ ./Makefile Sun May 14 16:20:57 2006
+@@ -90,7 +90,7 @@
+
+ STRIP ?= strip
+
+-CFLAGS := -Wall -Wno-trigraphs
++CFLAGS := $(CFLAGS) -Wall -Wno-trigraphs
+
+ # Enable this if you're getting pedantic again...
+ #ifeq ($(TARGET_OS),LINUX)
+@@ -100,6 +100,7 @@
+ ifdef DEBUG
+ CFLAGS += -g
+ else
++ifdef OPTIMIZED_CFLAGS
+ CFLAGS += -O2
+ # -funit-at-a-time is buggy for MinGW GCC > 3.2
+ # I'm assuming it's fixed for MinGW GCC >= 4.0 when that comes about
+@@ -107,7 +108,7 @@
+ then echo $(call cc-option,-fno-unit-at-a-time); fi ;)
+ CFLAGS += $(call cc-option,-fweb,)
+ CFLAGS += $(call cc-option,-frename-registers,)
+-CFLAGS += $(call cc-option,-mtune=i686,-mcpu=i686)
++endif
+ endif
+
+ # ---------------------------------------------------------
+@@ -133,7 +134,7 @@
+ .PHONY: prepare
+ prepare: $(BUILD_DIRS)
+
+-COMMON_CPPFLAGS := -DTYR_VERSION=$(TYR_VERSION)
++COMMON_CPPFLAGS := -DTYR_VERSION=$(TYR_VERSION) -DDATADIR='"$(Q1DIR)"' -I$(X11BASE)/include
+ ifdef DEBUG
+ COMMON_CPPFLAGS += -DDEBUG
+ else
diff --git a/games/tyrquake/files/patch-NQ__common.c b/games/tyrquake/files/patch-NQ__common.c
new file mode 100644
index 000000000000..d25bd67d314d
--- /dev/null
+++ b/games/tyrquake/files/patch-NQ__common.c
@@ -0,0 +1,50 @@
+--- ./NQ/common.c.orig Mon Mar 13 22:02:46 2006
++++ ./NQ/common.c Sun May 14 16:20:57 2006
+@@ -1680,9 +1680,13 @@
+ static void
+ COM_InitFilesystem(void)
+ {
++ char *home;
++ char homepath[MAX_OSPATH];
+ int i, j;
+ searchpath_t *search;
+
++ home = getenv("HOME");
++
+ //
+ // -basedir <path>
+ // Overrides the system supplied base directory (under GAMENAME)
+@@ -1691,7 +1695,7 @@
+ if (i && i < com_argc - 1)
+ strcpy(com_basedir, com_argv[i + 1]);
+ else
+- strcpy(com_basedir, host_parms.basedir);
++ strcpy(com_basedir, DATADIR);
+
+ j = strlen(com_basedir);
+
+@@ -1719,6 +1723,8 @@
+ // start up with GAMENAME by default (id1)
+ //
+ COM_AddGameDirectory(va("%s/" GAMENAME, com_basedir));
++ if (home != NULL)
++ COM_AddGameDirectory(va("%s/.tyrquake/" GAMENAME, home));
+
+ if (COM_CheckParm("-rogue"))
+ COM_AddGameDirectory(va("%s/rogue", com_basedir));
+@@ -1733,6 +1739,15 @@
+ if (i && i < com_argc - 1) {
+ com_modified = true;
+ COM_AddGameDirectory(va("%s/%s", com_basedir, com_argv[i + 1]));
++ }
++
++ if (home != NULL) {
++ snprintf(homepath, sizeof(homepath), "%s/.tyrquake/%s",
++ home, strrchr(com_basedir, '/') + 1 ?
++ strrchr(com_basedir, '/') + 1 : GAMENAME);
++ COM_CreatePath(homepath);
++ Sys_mkdir(homepath);
++ COM_AddGameDirectory(homepath);
+ }
+ //
+ // -path <dir or packfile> [<dir or packfile>] ...
diff --git a/games/tyrquake/files/patch-NQ__model.c b/games/tyrquake/files/patch-NQ__model.c
new file mode 100644
index 000000000000..35db3af72577
--- /dev/null
+++ b/games/tyrquake/files/patch-NQ__model.c
@@ -0,0 +1,11 @@
+--- ./NQ/model.c.orig Sat Mar 11 09:41:17 2006
++++ ./NQ/model.c Sun May 14 16:20:57 2006
+@@ -22,7 +22,7 @@
+ // models are the only shared resource between a client and server running
+ // on the same machine.
+
+-#include <stdint.h>
++#include <inttypes.h>
+
+ #include "console.h"
+ #include "quakedef.h"
diff --git a/games/tyrquake/files/patch-QW__client__cl_main.c b/games/tyrquake/files/patch-QW__client__cl_main.c
new file mode 100644
index 000000000000..1810cbd6f1aa
--- /dev/null
+++ b/games/tyrquake/files/patch-QW__client__cl_main.c
@@ -0,0 +1,18 @@
+--- ./QW/client/cl_main.c.orig Sat Mar 11 16:45:47 2006
++++ ./QW/client/cl_main.c Sun May 14 16:20:57 2006
+@@ -45,6 +45,7 @@
+ #include "winsock.h"
+ #include "winquake.h"
+ #else
++#include <sys/types.h>
+ #include <netinet/in.h>
+ #endif
+
+@@ -863,6 +864,7 @@
+ Con_Printf("Command packet from remote host. Ignored.\n");
+ return;
+ }
++
+ #ifdef _WIN32
+ ShowWindow(mainwindow, SW_RESTORE);
+ SetForegroundWindow(mainwindow);
diff --git a/games/tyrquake/files/patch-QW__client__sys_linux.c b/games/tyrquake/files/patch-QW__client__sys_linux.c
new file mode 100644
index 000000000000..bcca01cdcb33
--- /dev/null
+++ b/games/tyrquake/files/patch-QW__client__sys_linux.c
@@ -0,0 +1,10 @@
+--- ./QW/client/sys_linux.c.orig Sat May 13 06:03:07 2006
++++ ./QW/client/sys_linux.c Sun May 14 16:20:57 2006
+@@ -29,7 +29,6 @@
+ #include <string.h>
+ #include <sys/ipc.h>
+ #include <sys/mman.h>
+-#include <sys/shm.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
+ #include <sys/types.h>
diff --git a/games/tyrquake/files/patch-QW__common__common.c b/games/tyrquake/files/patch-QW__common__common.c
new file mode 100644
index 000000000000..f6c97764742f
--- /dev/null
+++ b/games/tyrquake/files/patch-QW__common__common.c
@@ -0,0 +1,39 @@
+--- ./QW/common/common.c.orig Mon Mar 13 22:03:06 2006
++++ ./QW/common/common.c Sun May 14 16:23:22 2006
+@@ -1794,8 +1794,12 @@
+ static void
+ COM_InitFilesystem(void)
+ {
++ char *home;
++ char homepath[MAX_OSPATH];
+ int i;
+
++ home = getenv("HOME");
++
+ //
+ // -basedir <path>
+ // Overrides the system supplied base directory (under id1)
+@@ -1804,13 +1808,22 @@
+ if (i && i < com_argc - 1)
+ strcpy(com_basedir, com_argv[i + 1]);
+ else
+- strcpy(com_basedir, host_parms.basedir);
++ strcpy(com_basedir, DATADIR);
+
+ //
+ // start up with id1 by default
+ //
+ COM_AddGameDirectory(va("%s/id1", com_basedir));
++ if (home != NULL)
++ COM_AddGameDirectory(va("%s/.tyrquake/id1", home));
++
+ COM_AddGameDirectory(va("%s/qw", com_basedir));
++ if (home != NULL) {
++ snprintf(homepath, sizeof(homepath), "%s/.tyrquake/qw", home);
++ COM_CreatePath(homepath);
++ Sys_mkdir(homepath);
++ COM_AddGameDirectory(homepath);
++ }
+
+ // any set gamedirs will be freed up to here
+ com_base_searchpaths = com_searchpaths;
diff --git a/games/tyrquake/files/patch-QW__server__sys_unix.c b/games/tyrquake/files/patch-QW__server__sys_unix.c
new file mode 100644
index 000000000000..5f5c975fa381
--- /dev/null
+++ b/games/tyrquake/files/patch-QW__server__sys_unix.c
@@ -0,0 +1,11 @@
+--- ./QW/server/sys_unix.c.orig Sat Feb 11 20:00:37 2006
++++ ./QW/server/sys_unix.c Sun May 14 16:20:57 2006
+@@ -25,7 +25,7 @@
+ #include "server.h"
+ #include "sys.h"
+
+-#ifdef __linux__
++#ifdef __unix__
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <sys/time.h>
diff --git a/games/tyrquake/files/patch-common__cd_linux.c b/games/tyrquake/files/patch-common__cd_linux.c
new file mode 100644
index 000000000000..35fe251d8b97
--- /dev/null
+++ b/games/tyrquake/files/patch-common__cd_linux.c
@@ -0,0 +1,331 @@
+--- ./common/cd_linux.c.orig Tue Dec 27 23:50:49 2005
++++ ./common/cd_linux.c Sun May 14 16:20:57 2006
+@@ -31,7 +31,11 @@
+ #include <time.h>
+ #include <errno.h>
+
++#ifdef __FreeBSD__
++#include <sys/cdio.h>
++#else
+ #include <linux/cdrom.h>
++#endif
+ #include <paths.h>
+
+ #include "cdaudio.h"
+@@ -57,8 +61,13 @@
+
+ static int cdfile = -1;
+ static char cd_dev[64] = _PATH_DEV "cdrom";
++#ifdef __FreeBSD__
++static struct ioc_vol drv_vol_saved;
++static struct ioc_vol drv_vol;
++#else
+ static struct cdrom_volctrl drv_vol_saved;
+ static struct cdrom_volctrl drv_vol;
++#endif
+
+ static void
+ CDAudio_Eject(void)
+@@ -66,8 +75,13 @@
+ if (cdfile == -1 || !enabled)
+ return; // no cd init'd
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCEJECT) == -1)
++ Con_DPrintf ("ioctl cdioceject failed\n");
++#else
+ if (ioctl(cdfile, CDROMEJECT) == -1)
+ Con_DPrintf("ioctl cdromeject failed\n");
++#endif
+ }
+
+
+@@ -77,29 +91,51 @@
+ if (cdfile == -1 || !enabled)
+ return; // no cd init'd
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCCLOSE) == -1)
++ Con_DPrintf ("ioctl cdiocclose failed\n");
++#else
+ if (ioctl(cdfile, CDROMCLOSETRAY) == -1)
+ Con_DPrintf("ioctl cdromclosetray failed\n");
++#endif
+ }
+
+ static int
+ CDAudio_GetAudioDiskInfo(void)
+ {
++#ifdef __FreeBSD__
++ struct ioc_toc_header tochdr;
++#else
+ struct cdrom_tochdr tochdr;
++#endif
+
+ cdValid = false;
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOREADTOCHEADER, &tochdr) == -1) {
++ Con_DPrintf ("ioctl cdioreadtocheader failed\n");
++#else
+ if (ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1) {
+ Con_DPrintf("ioctl cdromreadtochdr failed\n");
++#endif
+ return -1;
+ }
+
++#ifdef __FreeBSD__
++ if (tochdr.starting_track < 1) {
++#else
+ if (tochdr.cdth_trk0 < 1) {
++#endif
+ Con_DPrintf("CDAudio: no music tracks\n");
+ return -1;
+ }
+
+ cdValid = true;
++#ifdef __FreeBSD__
++ maxTrack = tochdr.ending_track;
++#else
+ maxTrack = tochdr.cdth_trk1;
++#endif
+
+ return 0;
+ }
+@@ -108,8 +144,14 @@
+ void
+ CDAudio_Play(byte track, qboolean looping)
+ {
++#ifdef __FreeBSD__
++ struct ioc_read_toc_entry entry;
++ struct cd_toc_entry toc_buffer;
++ struct ioc_play_track ti;
++#else
+ struct cdrom_tocentry entry;
+ struct cdrom_ti ti;
++#endif
+
+ if (cdfile == -1 || !enabled)
+ return;
+@@ -126,6 +168,20 @@
+ Con_DPrintf("CDAudio: Bad track number %u.\n", track);
+ return;
+ }
++#ifdef __FreeBSD__
++ #define CDROM_DATA_TRACK 4
++ bzero((char *)&toc_buffer, sizeof(toc_buffer));
++ entry.data_len = sizeof(toc_buffer);
++ entry.data = &toc_buffer;
++ // don't try to play a non-audio track
++ entry.starting_track = track;
++ entry.address_format = CD_MSF_FORMAT;
++ if ( ioctl(cdfile, CDIOREADTOCENTRYS, &entry) == -1 ) {
++ Con_DPrintf("ioctl cdromreadtocentry failed\n");
++ return;
++ }
++ if (toc_buffer.control == CDROM_DATA_TRACK) {
++#else
+ // don't try to play a non-audio track
+ entry.cdte_track = track;
+ entry.cdte_format = CDROM_MSF;
+@@ -134,6 +190,7 @@
+ return;
+ }
+ if (entry.cdte_ctrl == CDROM_DATA_TRACK) {
++#endif
+ Con_Printf("CDAudio: track %i is not audio\n", track);
+ return;
+ }
+@@ -144,18 +201,35 @@
+ CDAudio_Stop();
+ }
+
++#ifdef __FreeBSD__
++ ti.start_track = track;
++ ti.end_track = track;
++ ti.start_index = 1;
++ ti.end_index = 99;
++#else
+ ti.cdti_trk0 = track;
+ ti.cdti_trk1 = track;
+ ti.cdti_ind0 = 1;
+ ti.cdti_ind1 = 99;
++#endif
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCPLAYTRACKS, &ti) == -1) {
++ Con_DPrintf ("ioctl cdiocplaytracks failed\n");
++#else
+ if (ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1) {
+ Con_DPrintf("ioctl cdromplaytrkind failed\n");
++#endif
+ return;
+ }
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCRESUME) == -1)
++ Con_DPrintf ("ioctl cdiocresume failed\n");
++#else
+ if (ioctl(cdfile, CDROMRESUME) == -1)
+ Con_DPrintf("ioctl cdromresume failed\n");
++#endif
+
+ playLooping = looping;
+ playTrack = track;
+@@ -172,8 +246,13 @@
+ if (!playing)
+ return;
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCSTOP) == -1)
++ Con_DPrintf ("ioctl cdiocstop failed (%d)\n", errno);
++#else
+ if (ioctl(cdfile, CDROMSTOP) == -1)
+ Con_DPrintf("ioctl cdromstop failed (%d)\n", errno);
++#endif
+
+ wasPlaying = false;
+ playing = false;
+@@ -188,8 +267,13 @@
+ if (!playing)
+ return;
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCPAUSE) == -1)
++ Con_DPrintf ("ioctl cdiocpause failed\n");
++#else
+ if (ioctl(cdfile, CDROMPAUSE) == -1)
+ Con_DPrintf("ioctl cdrompause failed\n");
++#endif
+
+ wasPlaying = playing;
+ playing = false;
+@@ -208,8 +292,13 @@
+ if (!wasPlaying)
+ return;
+
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCRESUME) == -1)
++ Con_DPrintf ("ioctl cdiocresume failed\n");
++#else
+ if (ioctl(cdfile, CDROMRESUME) == -1)
+ Con_DPrintf("ioctl cdromresume failed\n");
++#endif
+ playing = true;
+ }
+
+@@ -322,26 +411,60 @@
+ void
+ CDAudio_Update(void)
+ {
++#ifdef __FreeBSD__
++ struct ioc_read_subchannel subchnl;
++ struct cd_sub_channel_info data;
++#else
+ struct cdrom_subchnl subchnl;
++#endif
+ static time_t lastchk;
+
+ if (!enabled)
+ return;
+
++#ifdef __FreeBSD__
++ if ((int)(255.0 * bgmvolume.value) != (int)drv_vol.vol[0]) {
++#else
+ if ((int)(255.0 * bgmvolume.value) != (int)drv_vol.channel0) {
++#endif
+ if (bgmvolume.value > 1.0f)
+ Cvar_SetValue ("bgmvolume", 1.0f);
+ if (bgmvolume.value < 0.0f)
+ Cvar_SetValue ("bgmvolume", 0.0f);
+
++#ifdef __FreeBSD__
++ drv_vol.vol[0] = drv_vol.vol[2] =
++ drv_vol.vol[1] = drv_vol.vol[3] = bgmvolume.value * 255.0;
++ if (ioctl(cdfile, CDIOCSETVOL, &drv_vol) == -1 )
++ Con_DPrintf("ioctl CDIOCSETVOL failed\n");
++#else
+ drv_vol.channel0 = drv_vol.channel2 =
+ drv_vol.channel1 = drv_vol.channel3 = bgmvolume.value * 255.0;
+ if (ioctl(cdfile, CDROMVOLCTRL, &drv_vol) == -1 )
+ Con_DPrintf("ioctl CDROMVOLCTRL failed\n");
++#endif
+ }
+
+ if (playing && lastchk < time(NULL)) {
+ lastchk = time(NULL) + 2; //two seconds between chks
++#if defined(__FreeBSD__)
++ subchnl.address_format = CD_MSF_FORMAT;
++ subchnl.data_format = CD_CURRENT_POSITION;
++ subchnl.data_len = sizeof(data);
++ subchnl.track = playTrack;
++ subchnl.data = &data;
++ if (ioctl(cdfile, CDIOCREADSUBCHANNEL, &subchnl) == -1 ) {
++ Con_DPrintf("ioctl cdiocreadsubchannel failed\n");
++ playing = false;
++ return;
++ }
++ if (subchnl.data->header.audio_status != CD_AS_PLAY_IN_PROGRESS &&
++ subchnl.data->header.audio_status != CD_AS_PLAY_PAUSED) {
++ playing = false;
++ if (playLooping)
++ CDAudio_Play(playTrack, true);
++ }
++#else
+ subchnl.cdsc_format = CDROM_MSF;
+ if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1) {
+ Con_DPrintf("ioctl cdromsubchnl failed\n");
+@@ -354,6 +477,7 @@
+ if (playLooping)
+ CDAudio_Play(playTrack, true);
+ }
++#endif
+ }
+ }
+
+@@ -398,16 +522,31 @@
+ Cmd_AddCommand("cd", CD_f);
+
+ /* get drive's current volume */
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCGETVOL, &drv_vol_saved) == -1) {
++ Con_DPrintf("ioctl CDIOCGETVOL failed\n");
++ drv_vol_saved.vol[0] = drv_vol_saved.vol[2] =
++ drv_vol_saved.vol[1] = drv_vol_saved.vol[3] = 255.0;
++ }
++#else
+ if (ioctl(cdfile, CDROMVOLREAD, &drv_vol_saved) == -1) {
+ Con_DPrintf("ioctl CDROMVOLREAD failed\n");
+ drv_vol_saved.channel0 = drv_vol_saved.channel2 =
+ drv_vol_saved.channel1 = drv_vol_saved.channel3 = 255.0;
+ }
++#endif
+ /* set our own volume */
++#ifdef __FreeBSD__
++ drv_vol.vol[0] = drv_vol.vol[2] =
++ drv_vol.vol[1] = drv_vol.vol[2] = bgmvolume.value * 255.0;
++ if (ioctl(cdfile, CDIOCSETVOL, &drv_vol) == -1)
++ Con_Printf("ioctl CDIOCSETVOL failed\n");
++#else
+ drv_vol.channel0 = drv_vol.channel2 =
+ drv_vol.channel1 = drv_vol.channel3 = bgmvolume.value * 255.0;
+ if (ioctl(cdfile, CDROMVOLCTRL, &drv_vol) == -1)
+ Con_Printf("ioctl CDROMVOLCTRL failed\n");
++#endif
+
+ return 0;
+ }
+@@ -421,8 +560,13 @@
+ CDAudio_Stop();
+
+ /* Restore the saved volume setting */
++#ifdef __FreeBSD__
++ if (ioctl(cdfile, CDIOCSETVOL, &drv_vol_saved) == -1)
++ Con_DPrintf("ioctl CDIOCSETVOL failed\n");
++#else
+ if (ioctl(cdfile, CDROMVOLCTRL, &drv_vol_saved) == -1)
+ Con_DPrintf("ioctl CDROMVOLCTRL failed\n");
++#endif
+
+ close(cdfile);
+ cdfile = -1;
diff --git a/games/tyrquake/files/patch-common__gl_vidlinuxglx.c b/games/tyrquake/files/patch-common__gl_vidlinuxglx.c
new file mode 100644
index 000000000000..b1000dcf5689
--- /dev/null
+++ b/games/tyrquake/files/patch-common__gl_vidlinuxglx.c
@@ -0,0 +1,12 @@
+--- ./common/gl_vidlinuxglx.c.orig Sat Feb 18 19:19:32 2006
++++ ./common/gl_vidlinuxglx.c Sun May 14 16:20:57 2006
+@@ -21,7 +21,9 @@
+ #include <termios.h>
+ #include <sys/ioctl.h>
+ #include <sys/stat.h>
++#ifdef __linux__
+ #include <sys/vt.h>
++#endif
+ #include <stdarg.h>
+ #include <stdio.h>
+ #include <signal.h>
diff --git a/games/tyrquake/files/patch-include__bspfile.h b/games/tyrquake/files/patch-include__bspfile.h
new file mode 100644
index 000000000000..8553bfd67811
--- /dev/null
+++ b/games/tyrquake/files/patch-include__bspfile.h
@@ -0,0 +1,11 @@
+--- ./include/bspfile.h.orig Sat Mar 11 09:38:29 2006
++++ ./include/bspfile.h Sun May 14 16:20:57 2006
+@@ -21,7 +21,7 @@
+ #ifndef BSPFILE_H
+ #define BSPFILE_H
+
+-#include <stdint.h>
++#include <inttypes.h>
+
+ #include "qtypes.h"
+
diff --git a/games/tyrquake/pkg-descr b/games/tyrquake/pkg-descr
new file mode 100644
index 000000000000..af4430ced929
--- /dev/null
+++ b/games/tyrquake/pkg-descr
@@ -0,0 +1,8 @@
+This is meant to be a very conservative branch of the Quake source code. I
+intend to support Quake and Quakeworld in both software and GL versions, as
+well as Quakeworld Server; all on both MS Windows and Linux. I don't intend on
+adding lots of rendering enhancements, but rather fixing little bugs that I've
+come across over the years. I'll be adding small enhancements, but I don't
+want to completely overhaul the engine.
+
+WWW: http://disenchant.net/engine.html
diff --git a/games/tyrquake/pkg-message b/games/tyrquake/pkg-message
new file mode 100644
index 000000000000..1caa5a5832bd
--- /dev/null
+++ b/games/tyrquake/pkg-message
@@ -0,0 +1,8 @@
+==============================================================================
+
+TyrQuake has been installed.
+
+If you hace sound problems try running it with the parameter
+"-sndspeed <speed>", where "<speed>" could be 22050 or 44100 for example.
+
+==============================================================================
diff --git a/games/tyrquake/pkg-plist b/games/tyrquake/pkg-plist
new file mode 100644
index 000000000000..a1dd58d8b0af
--- /dev/null
+++ b/games/tyrquake/pkg-plist
@@ -0,0 +1,7 @@
+bin/tyr-glquake
+bin/tyr-glqwcl
+bin/tyr-quake
+bin/tyr-qwcl
+bin/tyr-qwsv
+%%PORTDOCS%%%%DOCSDIR%%/readme.txt
+%%PORTDOCS%%@dirrm %%DOCSDIR%%