All pastes #1409384 Raw Edit

oa diff

public text v1 · immutable
#1409384 ·published 2009-05-01 12:25 UTC
rendered paste body
The OpenArena SVN source tree is a bit of a mess.  I found that it contains files from different SVN versions so a diff is ugly.  I cleaned it up.  I build a local OpenArena engine against the latest ioquake3 source code so I get bug fixes and new features.  This includes the patches from Debian.

[code]
diff --git a/Makefile b/Makefile
index b3d08c7..75999c8 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,8 @@
 # GNU Make required
 #
 
-COMPILE_PLATFORM=$(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]')
+# Support kFreeBSD
+COMPILE_PLATFORM=$(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]'|sed -e 's/\//_/g')
 
 COMPILE_ARCH=$(shell uname -m | sed -e s/i.86/i386/)
 
@@ -23,9 +24,6 @@ ifeq ($(COMPILE_PLATFORM),mingw32)
   endif
 endif
 
-ifndef BUILD_STANDALONE
-  BUILD_STANDALONE =
-endif
 ifndef BUILD_CLIENT
   BUILD_CLIENT     =
 endif
@@ -59,6 +57,26 @@ endif
 #############################################################################
 -include Makefile.local
 
+#############################################################################
+# Standalone options
+#############################################################################
+
+# Standalone must define all of these.
+ifndef BUILD_STANDALONE
+  BUILD_STANDALONE =
+  USE_BLOOM        =0
+  GAME_DEDICATED_NAME=ioq3ded
+  GAME_CLIENT_NAME=ioquake3
+  GAME_DIRECTORY_NAME=baseq3
+endif
+
+ifdef USE_BLOOM
+  CFLAGS += -DENABLE_BLOOM
+else
+  USE_BLOOM =
+  CFLAGS += -UENABLE_BLOOM
+endif
+
 ifndef PLATFORM
 PLATFORM=$(COMPILE_PLATFORM)
 endif
@@ -143,6 +161,10 @@ ifndef USE_INTERNAL_SPEEX
 USE_INTERNAL_SPEEX=1
 endif
 
+ifndef USE_INTERNAL_JPEG
+USE_INTERNAL_JPEG=1
+endif
+
 ifndef USE_LOCAL_HEADERS
 USE_LOCAL_HEADERS=1
 endif
@@ -219,10 +241,10 @@ LIB=lib
 INSTALL=install
 MKDIR=mkdir
 
-ifeq ($(PLATFORM),linux)
-
+# Support kFreeBSD
+ifneq (,findstring($(PLATFORM),linux gnu_kfreebsd))
   ifeq ($(ARCH),alpha)
-    ARCH=axp
+    ARCH=alpha
   else
   ifeq ($(ARCH),x86_64)
     LIB=lib64
@@ -285,6 +307,9 @@ ifeq ($(PLATFORM),linux)
     OPTIMIZE += -mtune=ultrasparc3 -mv8plus
     HAVE_VM_COMPILED=true
   endif
+  ifeq ($(ARCH),alpha)
+    OPTIMIZE = -O3 -funroll-loops -fomit-frame-pointer
+  endif
   endif
   endif
 
@@ -522,7 +547,7 @@ else # ifeq mingw32
 ifeq ($(PLATFORM),freebsd)
 
   ifneq (,$(findstring alpha,$(shell uname -m)))
-    ARCH=axp
+    ARCH=alpha
   else #default to i386
     ARCH=i386
   endif #alpha test
@@ -542,7 +567,7 @@ ifeq ($(PLATFORM),freebsd)
     BASE_CFLAGS += -DUSE_CODEC_VORBIS
   endif
 
-  ifeq ($(ARCH),axp)
+  ifeq ($(ARCH),alpha)
     BASE_CFLAGS += -DNO_VM_COMPILED
     RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O3 -ffast-math -funroll-loops \
       -fomit-frame-pointer -fexpensive-optimizations
@@ -786,21 +811,21 @@ endif #SunOS
 TARGETS =
 
 ifneq ($(BUILD_SERVER),0)
-  TARGETS += $(B)/ioq3ded.$(ARCH)$(BINEXT)
+  TARGETS += $(B)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT)
 endif
 
 ifneq ($(BUILD_CLIENT),0)
-  TARGETS += $(B)/ioquake3.$(ARCH)$(BINEXT)
+  TARGETS += $(B)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT)
   ifneq ($(BUILD_CLIENT_SMP),0)
-    TARGETS += $(B)/ioquake3-smp.$(ARCH)$(BINEXT)
+    TARGETS += $(B)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT)
   endif
 endif
 
 ifneq ($(BUILD_GAME_SO),0)
   TARGETS += \
-    $(B)/baseq3/cgame$(ARCH).$(SHLIBEXT) \
-    $(B)/baseq3/qagame$(ARCH).$(SHLIBEXT) \
-    $(B)/baseq3/ui$(ARCH).$(SHLIBEXT)
+    $(B)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT) \
+    $(B)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT) \
+    $(B)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT)
   ifneq ($(BUILD_MISSIONPACK),0)
     TARGETS += \
     $(B)/missionpack/cgame$(ARCH).$(SHLIBEXT) \
@@ -812,9 +837,9 @@ endif
 ifneq ($(BUILD_GAME_QVM),0)
   ifneq ($(CROSS_COMPILING),1)
     TARGETS += \
-      $(B)/baseq3/vm/cgame.qvm \
-      $(B)/baseq3/vm/qagame.qvm \
-      $(B)/baseq3/vm/ui.qvm
+      $(B)/$(GAME_DIRECTORY_NAME)/vm/cgame.qvm \
+      $(B)/$(GAME_DIRECTORY_NAME)/vm/qagame.qvm \
+      $(B)/$(GAME_DIRECTORY_NAME)/vm/ui.qvm
     ifneq ($(BUILD_MISSIONPACK),0)
       TARGETS += \
       $(B)/missionpack/vm/qagame.qvm \
@@ -831,12 +856,20 @@ endif
 ifeq ($(USE_VOIP),1)
   BASE_CFLAGS += -DUSE_VOIP
   ifeq ($(USE_INTERNAL_SPEEX),1)
-    BASE_CFLAGS += -DFLOATING_POINT -DUSE_ALLOCA -I$(SPEEXDIR)/include
+    BASE_CFLAGS += -DFLOATING_POINT -DUSE_ALLOCA -DUSE_INTERNAL_SPEEX -I$(SPEEXDIR)/include
   else
-    CLIENT_LIBS += -lspeex
+    BASE_CFLAGS += -UUSE_INTERNAL_SPEEX
+    CLIENT_LIBS += -lspeex -lspeexdsp
   endif
 endif
 
+ifeq ($(USE_INTERNAL_JPEG),1)
+  BASE_CFLAGS += -DUSE_INTERNAL_JPEG
+else
+  BASE_CFLAGS += -UUSE_INTERNAL_JPEG
+  CLIENT_LIBS += -ljpeg
+endif
+
 ifdef DEFAULT_BASEDIR
   BASE_CFLAGS += -DDEFAULT_BASEDIR=\\\"$(DEFAULT_BASEDIR)\\\"
 endif
@@ -967,7 +1000,7 @@ release:
 # an informational message, then start building
 targets: makedirs
 	@echo ""
-	@echo "Building ioquake3 in $(B):"
+	@echo "Building $(GAME_CLIENT_NAME) in $(B):"
 	@echo "  PLATFORM: $(PLATFORM)"
 	@echo "  ARCH: $(ARCH)"
 	@echo "  VERSION: $(VERSION)"
@@ -1009,12 +1042,12 @@ makedirs:
 	@if [ ! -d $(B)/client ];then $(MKDIR) $(B)/client;fi
 	@if [ ! -d $(B)/clientsmp ];then $(MKDIR) $(B)/clientsmp;fi
 	@if [ ! -d $(B)/ded ];then $(MKDIR) $(B)/ded;fi
-	@if [ ! -d $(B)/baseq3 ];then $(MKDIR) $(B)/baseq3;fi
-	@if [ ! -d $(B)/baseq3/cgame ];then $(MKDIR) $(B)/baseq3/cgame;fi
-	@if [ ! -d $(B)/baseq3/game ];then $(MKDIR) $(B)/baseq3/game;fi
-	@if [ ! -d $(B)/baseq3/ui ];then $(MKDIR) $(B)/baseq3/ui;fi
-	@if [ ! -d $(B)/baseq3/qcommon ];then $(MKDIR) $(B)/baseq3/qcommon;fi
-	@if [ ! -d $(B)/baseq3/vm ];then $(MKDIR) $(B)/baseq3/vm;fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME) ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME);fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/cgame ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/cgame;fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/game ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/game;fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/ui ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/ui;fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/qcommon ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/qcommon;fi
+	@if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/vm ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/vm;fi
 	@if [ ! -d $(B)/missionpack ];then $(MKDIR) $(B)/missionpack;fi
 	@if [ ! -d $(B)/missionpack/cgame ];then $(MKDIR) $(B)/missionpack/cgame;fi
 	@if [ ! -d $(B)/missionpack/game ];then $(MKDIR) $(B)/missionpack/game;fi
@@ -1295,8 +1328,10 @@ Q3OBJ = \
   $(B)/client/l_memory.o \
   $(B)/client/l_precomp.o \
   $(B)/client/l_script.o \
-  $(B)/client/l_struct.o \
-  \
+  $(B)/client/l_struct.o
+
+ifeq ($(USE_INTERNAL_JPEG),1)
+Q3OBJ += \
   $(B)/client/jcapimin.o \
   $(B)/client/jcapistd.o \
   $(B)/client/jccoefct.o  \
@@ -1331,8 +1366,10 @@ Q3OBJ = \
   $(B)/client/jidctflt.o \
   $(B)/client/jmemmgr.o \
   $(B)/client/jmemnobs.o \
-  $(B)/client/jutils.o \
-  \
+  $(B)/client/jutils.o
+endif
+
+Q3OBJ += \
   $(B)/client/tr_animation.o \
   $(B)/client/tr_backend.o \
   $(B)/client/tr_bsp.o \
@@ -1370,6 +1407,10 @@ Q3OBJ = \
   $(B)/client/con_log.o \
   $(B)/client/sys_main.o
 
+ifeq ($(USE_BLOOM),1)
+  Q3OBJ += $(B)/client/tr_bloom.o
+endif
+
 ifeq ($(ARCH),i386)
   Q3OBJ += \
     $(B)/client/snd_mixa.o \
@@ -1473,13 +1514,13 @@ Q3POBJ += \
 Q3POBJ_SMP += \
   $(B)/clientsmp/sdl_glimp.o
 
-$(B)/ioquake3.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ) $(LIBSDLMAIN)
+$(B)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ) $(LIBSDLMAIN)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) \
 		-o $@ $(Q3OBJ) $(Q3POBJ) \
 		$(LIBSDLMAIN) $(CLIENT_LIBS) $(LIBS)
 
-$(B)/ioquake3-smp.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ_SMP) $(LIBSDLMAIN)
+$(B)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ_SMP) $(LIBSDLMAIN)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(THREAD_LDFLAGS) \
 		-o $@ $(Q3OBJ) $(Q3POBJ_SMP) \
@@ -1613,7 +1654,7 @@ else
     $(B)/ded/con_tty.o
 endif
 
-$(B)/ioq3ded.$(ARCH)$(BINEXT): $(Q3DOBJ)
+$(B)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT): $(Q3DOBJ)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(Q3DOBJ) $(LIBS)
 
@@ -1624,40 +1665,40 @@ $(B)/ioq3ded.$(ARCH)$(BINEXT): $(Q3DOBJ)
 #############################################################################
 
 Q3CGOBJ_ = \
-  $(B)/baseq3/cgame/cg_main.o \
-  $(B)/baseq3/cgame/bg_misc.o \
-  $(B)/baseq3/cgame/bg_pmove.o \
-  $(B)/baseq3/cgame/bg_slidemove.o \
-  $(B)/baseq3/cgame/bg_lib.o \
-  $(B)/baseq3/cgame/cg_consolecmds.o \
-  $(B)/baseq3/cgame/cg_draw.o \
-  $(B)/baseq3/cgame/cg_drawtools.o \
-  $(B)/baseq3/cgame/cg_effects.o \
-  $(B)/baseq3/cgame/cg_ents.o \
-  $(B)/baseq3/cgame/cg_event.o \
-  $(B)/baseq3/cgame/cg_info.o \
-  $(B)/baseq3/cgame/cg_localents.o \
-  $(B)/baseq3/cgame/cg_marks.o \
-  $(B)/baseq3/cgame/cg_players.o \
-  $(B)/baseq3/cgame/cg_playerstate.o \
-  $(B)/baseq3/cgame/cg_predict.o \
-  $(B)/baseq3/cgame/cg_scoreboard.o \
-  $(B)/baseq3/cgame/cg_servercmds.o \
-  $(B)/baseq3/cgame/cg_snapshot.o \
-  $(B)/baseq3/cgame/cg_view.o \
-  $(B)/baseq3/cgame/cg_weapons.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_main.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_misc.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_pmove.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_slidemove.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_lib.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_consolecmds.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_draw.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_drawtools.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_effects.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_ents.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_event.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_info.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_localents.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_marks.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_players.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_playerstate.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_predict.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_scoreboard.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_servercmds.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_snapshot.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_view.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_weapons.o \
   \
-  $(B)/baseq3/qcommon/q_math.o \
-  $(B)/baseq3/qcommon/q_shared.o
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o
 
-Q3CGOBJ = $(Q3CGOBJ_) $(B)/baseq3/cgame/cg_syscalls.o
+Q3CGOBJ = $(Q3CGOBJ_) $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_syscalls.o
 Q3CGVMOBJ = $(Q3CGOBJ_:%.o=%.asm)
 
-$(B)/baseq3/cgame$(ARCH).$(SHLIBEXT): $(Q3CGOBJ)
+$(B)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT): $(Q3CGOBJ)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3CGOBJ)
 
-$(B)/baseq3/vm/cgame.qvm: $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM)
+$(B)/$(GAME_DIRECTORY_NAME)/vm/cgame.qvm: $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM)
 	$(echo_cmd) "Q3ASM $@"
 	$(Q)$(Q3ASM) -o $@ $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm
 
@@ -1712,49 +1753,49 @@ $(B)/missionpack/vm/cgame.qvm: $(MPCGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM)
 #############################################################################
 
 Q3GOBJ_ = \
-  $(B)/baseq3/game/g_main.o \
-  $(B)/baseq3/game/ai_chat.o \
-  $(B)/baseq3/game/ai_cmd.o \
-  $(B)/baseq3/game/ai_dmnet.o \
-  $(B)/baseq3/game/ai_dmq3.o \
-  $(B)/baseq3/game/ai_main.o \
-  $(B)/baseq3/game/ai_team.o \
-  $(B)/baseq3/game/ai_vcmd.o \
-  $(B)/baseq3/game/bg_misc.o \
-  $(B)/baseq3/game/bg_pmove.o \
-  $(B)/baseq3/game/bg_slidemove.o \
-  $(B)/baseq3/game/bg_lib.o \
-  $(B)/baseq3/game/g_active.o \
-  $(B)/baseq3/game/g_arenas.o \
-  $(B)/baseq3/game/g_bot.o \
-  $(B)/baseq3/game/g_client.o \
-  $(B)/baseq3/game/g_cmds.o \
-  $(B)/baseq3/game/g_combat.o \
-  $(B)/baseq3/game/g_items.o \
-  $(B)/baseq3/game/g_mem.o \
-  $(B)/baseq3/game/g_misc.o \
-  $(B)/baseq3/game/g_missile.o \
-  $(B)/baseq3/game/g_mover.o \
-  $(B)/baseq3/game/g_session.o \
-  $(B)/baseq3/game/g_spawn.o \
-  $(B)/baseq3/game/g_svcmds.o \
-  $(B)/baseq3/game/g_target.o \
-  $(B)/baseq3/game/g_team.o \
-  $(B)/baseq3/game/g_trigger.o \
-  $(B)/baseq3/game/g_utils.o \
-  $(B)/baseq3/game/g_weapon.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_main.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_chat.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_cmd.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_dmnet.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_dmq3.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_main.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_team.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/ai_vcmd.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/bg_misc.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/bg_pmove.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/bg_slidemove.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/bg_lib.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_active.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_arenas.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_bot.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_client.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_cmds.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_combat.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_items.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_mem.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_misc.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_missile.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_mover.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_session.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_spawn.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_svcmds.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_target.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_team.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_trigger.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_utils.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/game/g_weapon.o \
   \
-  $(B)/baseq3/qcommon/q_math.o \
-  $(B)/baseq3/qcommon/q_shared.o
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o
 
-Q3GOBJ = $(Q3GOBJ_) $(B)/baseq3/game/g_syscalls.o
+Q3GOBJ = $(Q3GOBJ_) $(B)/$(GAME_DIRECTORY_NAME)/game/g_syscalls.o
 Q3GVMOBJ = $(Q3GOBJ_:%.o=%.asm)
 
-$(B)/baseq3/qagame$(ARCH).$(SHLIBEXT): $(Q3GOBJ)
+$(B)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT): $(Q3GOBJ)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3GOBJ)
 
-$(B)/baseq3/vm/qagame.qvm: $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM)
+$(B)/$(GAME_DIRECTORY_NAME)/vm/qagame.qvm: $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM)
 	$(echo_cmd) "Q3ASM $@"
 	$(Q)$(Q3ASM) -o $@ $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm
 
@@ -1816,59 +1857,59 @@ $(B)/missionpack/vm/qagame.qvm: $(MPGVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM)
 #############################################################################
 
 Q3UIOBJ_ = \
-  $(B)/baseq3/ui/ui_main.o \
-  $(B)/baseq3/ui/bg_misc.o \
-  $(B)/baseq3/ui/bg_lib.o \
-  $(B)/baseq3/ui/ui_addbots.o \
-  $(B)/baseq3/ui/ui_atoms.o \
-  $(B)/baseq3/ui/ui_cdkey.o \
-  $(B)/baseq3/ui/ui_cinematics.o \
-  $(B)/baseq3/ui/ui_confirm.o \
-  $(B)/baseq3/ui/ui_connect.o \
-  $(B)/baseq3/ui/ui_controls2.o \
-  $(B)/baseq3/ui/ui_credits.o \
-  $(B)/baseq3/ui/ui_demo2.o \
-  $(B)/baseq3/ui/ui_display.o \
-  $(B)/baseq3/ui/ui_gameinfo.o \
-  $(B)/baseq3/ui/ui_ingame.o \
-  $(B)/baseq3/ui/ui_loadconfig.o \
-  $(B)/baseq3/ui/ui_menu.o \
-  $(B)/baseq3/ui/ui_mfield.o \
-  $(B)/baseq3/ui/ui_mods.o \
-  $(B)/baseq3/ui/ui_network.o \
-  $(B)/baseq3/ui/ui_options.o \
-  $(B)/baseq3/ui/ui_playermodel.o \
-  $(B)/baseq3/ui/ui_players.o \
-  $(B)/baseq3/ui/ui_playersettings.o \
-  $(B)/baseq3/ui/ui_preferences.o \
-  $(B)/baseq3/ui/ui_qmenu.o \
-  $(B)/baseq3/ui/ui_removebots.o \
-  $(B)/baseq3/ui/ui_saveconfig.o \
-  $(B)/baseq3/ui/ui_serverinfo.o \
-  $(B)/baseq3/ui/ui_servers2.o \
-  $(B)/baseq3/ui/ui_setup.o \
-  $(B)/baseq3/ui/ui_sound.o \
-  $(B)/baseq3/ui/ui_sparena.o \
-  $(B)/baseq3/ui/ui_specifyserver.o \
-  $(B)/baseq3/ui/ui_splevel.o \
-  $(B)/baseq3/ui/ui_sppostgame.o \
-  $(B)/baseq3/ui/ui_spskill.o \
-  $(B)/baseq3/ui/ui_startserver.o \
-  $(B)/baseq3/ui/ui_team.o \
-  $(B)/baseq3/ui/ui_teamorders.o \
-  $(B)/baseq3/ui/ui_video.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_main.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/bg_misc.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/bg_lib.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_addbots.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_atoms.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_cdkey.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_cinematics.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_confirm.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_connect.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_controls2.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_credits.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_demo2.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_display.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_gameinfo.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_ingame.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_loadconfig.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_menu.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_mfield.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_mods.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_network.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_options.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_playermodel.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_players.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_playersettings.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_preferences.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_qmenu.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_removebots.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_saveconfig.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_serverinfo.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_servers2.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_setup.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sound.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sparena.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_specifyserver.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_splevel.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sppostgame.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_spskill.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_startserver.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_team.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_teamorders.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_video.o \
   \
-  $(B)/baseq3/qcommon/q_math.o \
-  $(B)/baseq3/qcommon/q_shared.o
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \
+  $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o
 
 Q3UIOBJ = $(Q3UIOBJ_) $(B)/missionpack/ui/ui_syscalls.o
 Q3UIVMOBJ = $(Q3UIOBJ_:%.o=%.asm)
 
-$(B)/baseq3/ui$(ARCH).$(SHLIBEXT): $(Q3UIOBJ)
+$(B)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT): $(Q3UIOBJ)
 	$(echo_cmd) "LD $@"
 	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3UIOBJ)
 
-$(B)/baseq3/vm/ui.qvm: $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm $(Q3ASM)
+$(B)/$(GAME_DIRECTORY_NAME)/vm/ui.qvm: $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm $(Q3ASM)
 	$(echo_cmd) "Q3ASM $@"
 	$(Q)$(Q3ASM) -o $@ $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm
 
@@ -1976,16 +2017,16 @@ endif
 ## GAME MODULE RULES
 #############################################################################
 
-$(B)/baseq3/cgame/bg_%.o: $(GDIR)/bg_%.c
+$(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_%.o: $(GDIR)/bg_%.c
 	$(DO_CGAME_CC)
 
-$(B)/baseq3/cgame/%.o: $(CGDIR)/%.c
+$(B)/$(GAME_DIRECTORY_NAME)/cgame/%.o: $(CGDIR)/%.c
 	$(DO_CGAME_CC)
 
-$(B)/baseq3/cgame/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
 	$(DO_CGAME_Q3LCC)
 
-$(B)/baseq3/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC)
 	$(DO_CGAME_Q3LCC)
 
 $(B)/missionpack/cgame/bg_%.o: $(GDIR)/bg_%.c
@@ -2001,10 +2042,10 @@ $(B)/missionpack/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC)
 	$(DO_CGAME_Q3LCC_MISSIONPACK)
 
 
-$(B)/baseq3/game/%.o: $(GDIR)/%.c
+$(B)/$(GAME_DIRECTORY_NAME)/game/%.o: $(GDIR)/%.c
 	$(DO_GAME_CC)
 
-$(B)/baseq3/game/%.asm: $(GDIR)/%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/game/%.asm: $(GDIR)/%.c $(Q3LCC)
 	$(DO_GAME_Q3LCC)
 
 $(B)/missionpack/game/%.o: $(GDIR)/%.c
@@ -2014,16 +2055,16 @@ $(B)/missionpack/game/%.asm: $(GDIR)/%.c $(Q3LCC)
 	$(DO_GAME_Q3LCC_MISSIONPACK)
 
 
-$(B)/baseq3/ui/bg_%.o: $(GDIR)/bg_%.c
+$(B)/$(GAME_DIRECTORY_NAME)/ui/bg_%.o: $(GDIR)/bg_%.c
 	$(DO_UI_CC)
 
-$(B)/baseq3/ui/%.o: $(Q3UIDIR)/%.c
+$(B)/$(GAME_DIRECTORY_NAME)/ui/%.o: $(Q3UIDIR)/%.c
 	$(DO_UI_CC)
 
-$(B)/baseq3/ui/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/ui/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC)
 	$(DO_UI_Q3LCC)
 
-$(B)/baseq3/ui/%.asm: $(Q3UIDIR)/%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/ui/%.asm: $(Q3UIDIR)/%.c $(Q3LCC)
 	$(DO_UI_Q3LCC)
 
 $(B)/missionpack/ui/bg_%.o: $(GDIR)/bg_%.c
@@ -2039,10 +2080,10 @@ $(B)/missionpack/ui/%.asm: $(UIDIR)/%.c $(Q3LCC)
 	$(DO_UI_Q3LCC_MISSIONPACK)
 
 
-$(B)/baseq3/qcommon/%.o: $(CMDIR)/%.c
+$(B)/$(GAME_DIRECTORY_NAME)/qcommon/%.o: $(CMDIR)/%.c
 	$(DO_SHLIB_CC)
 
-$(B)/baseq3/qcommon/%.asm: $(CMDIR)/%.c $(Q3LCC)
+$(B)/$(GAME_DIRECTORY_NAME)/qcommon/%.asm: $(CMDIR)/%.c $(Q3LCC)
 	$(DO_Q3LCC)
 
 $(B)/missionpack/qcommon/%.o: $(CMDIR)/%.c
@@ -2063,32 +2104,32 @@ TOOLSOBJ = $(LBURGOBJ) $(Q3CPPOBJ) $(Q3RCCOBJ) $(Q3LCCOBJ) $(Q3ASMOBJ)
 
 
 copyfiles: release
-	@if [ ! -d $(COPYDIR)/baseq3 ]; then echo "You need to set COPYDIR to where your Quake3 data is!"; fi
-	-$(MKDIR) -p -m 0755 $(COPYDIR)/baseq3
+	@if [ ! -d $(COPYDIR)/$(GAME_DIRECTORY_NAME) ]; then echo "You need to set COPYDIR to where your Quake3 data is!"; fi
+	-$(MKDIR) -p -m 0755 $(COPYDIR)/$(GAME_DIRECTORY_NAME)
 	-$(MKDIR) -p -m 0755 $(COPYDIR)/missionpack
 
 ifneq ($(BUILD_CLIENT),0)
-	$(INSTALL) -s -m 0755 $(BR)/ioquake3.$(ARCH)$(BINEXT) $(COPYDIR)/ioquake3.$(ARCH)$(BINEXT)
+	$(INSTALL) -s -m 0755 $(BR)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT)
 endif
 
 # Don't copy the SMP until it's working together with SDL.
 #ifneq ($(BUILD_CLIENT_SMP),0)
-#	$(INSTALL) -s -m 0755 $(BR)/ioquake3-smp.$(ARCH)$(BINEXT) $(COPYDIR)/ioquake3-smp.$(ARCH)$(BINEXT)
+#	$(INSTALL) -s -m 0755 $(BR)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT)
 #endif
 
 ifneq ($(BUILD_SERVER),0)
-	@if [ -f $(BR)/ioq3ded.$(ARCH)$(BINEXT) ]; then \
-		$(INSTALL) -s -m 0755 $(BR)/ioq3ded.$(ARCH)$(BINEXT) $(COPYDIR)/ioq3ded.$(ARCH)$(BINEXT); \
+	@if [ -f $(BR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT) ]; then \
+		$(INSTALL) -s -m 0755 $(BR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT); \
 	fi
 endif
 
 ifneq ($(BUILD_GAME_SO),0)
-	$(INSTALL) -s -m 0755 $(BR)/baseq3/cgame$(ARCH).$(SHLIBEXT) \
-					$(COPYDIR)/baseq3/.
-	$(INSTALL) -s -m 0755 $(BR)/baseq3/qagame$(ARCH).$(SHLIBEXT) \
-					$(COPYDIR)/baseq3/.
-	$(INSTALL) -s -m 0755 $(BR)/baseq3/ui$(ARCH).$(SHLIBEXT) \
-					$(COPYDIR)/baseq3/.
+	$(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT) \
+					$(COPYDIR)/$(GAME_DIRECTORY_NAME)/.
+	$(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT) \
+					$(COPYDIR)/$(GAME_DIRECTORY_NAME)/.
+	$(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT) \
+					$(COPYDIR)/$(GAME_DIRECTORY_NAME)/.
   ifneq ($(BUILD_MISSIONPACK),0)
 	-$(MKDIR) -p -m 0755 $(COPYDIR)/missionpack
 	$(INSTALL) -s -m 0755 $(BR)/missionpack/cgame$(ARCH).$(SHLIBEXT) \
@@ -2144,10 +2185,10 @@ else
 endif
 
 dist:
-	rm -rf ioquake3-$(VERSION)
-	svn export . ioquake3-$(VERSION)
-	tar --owner=root --group=root --force-local -cjf ioquake3-$(VERSION).tar.bz2 ioquake3-$(VERSION)
-	rm -rf ioquake3-$(VERSION)
+	rm -rf $(GAME_CLIENT_NAME)-$(VERSION)
+	svn export . $(GAME_CLIENT_NAME)-$(VERSION)
+	tar --owner=root --group=root --force-local -cjf $(GAME_CLIENT_NAME)-$(VERSION).tar.bz2 $(GAME_CLIENT_NAME)-$(VERSION)
+	rm -rf $(GAME_CLIENT_NAME)-$(VERSION)
 
 #############################################################################
 # DEPENDENCIES
diff --git a/code/client/cl_cgame.c b/code/client/cl_cgame.c
index ef15798..900c33f 100644
--- a/code/client/cl_cgame.c
+++ b/code/client/cl_cgame.c
@@ -27,6 +27,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "libmumblelink.h"
 
+#ifndef USE_INTERNAL_SPEEX
+#  include <speex/speex.h>
+#  include <speex/speex_preprocess.h>
+#endif
+
 extern	botlib_export_t	*botlib_export;
 
 extern qboolean loadCamera(const char *name);
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index 01c044a..a4a2916 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -28,6 +28,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "libmumblelink.h"
 #endif
 
+#ifndef USE_INTERNAL_SPEEX
+#  include <speex/speex.h>
+#  include <speex/speex_preprocess.h>
+#endif
+
 #ifdef USE_MUMBLE
 cvar_t	*cl_useMumble;
 cvar_t	*cl_mumbleScale;
@@ -3290,7 +3295,13 @@ static void CL_SetServerInfo(serverInfo_t *server, const char *info, int ping) {
 			server->netType = atoi(Info_ValueForKey(info, "nettype"));
 			server->minPing = atoi(Info_ValueForKey(info, "minping"));
 			server->maxPing = atoi(Info_ValueForKey(info, "maxping"));
+#ifdef OPEN_ARENA
+			server->g_humanplayers = atoi(Info_ValueForKey(info, "g_humanplayers"));
+			server->g_needpass = atoi(Info_ValueForKey(info, "g_needpass"));
+#endif
+#ifndef STANDALONE
 			server->punkbuster = atoi(Info_ValueForKey(info, "punkbuster"));
+#endif
 		}
 		server->ping = ping;
 	}
@@ -3408,7 +3419,9 @@ void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) {
 	cls.localServers[i].game[0] = '\0';
 	cls.localServers[i].gameType = 0;
 	cls.localServers[i].netType = from.type;
+#ifndef STANDALONE
 	cls.localServers[i].punkbuster = 0;
+#endif
 									 
 	Q_strncpyz( info, MSG_ReadString( msg ), MAX_INFO_STRING );
 	if (strlen(info)) {
diff --git a/code/client/cl_ui.c b/code/client/cl_ui.c
index 56a226b..5fb1ee2 100644
--- a/code/client/cl_ui.c
+++ b/code/client/cl_ui.c
@@ -297,7 +297,13 @@ static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) {
 		Info_SetValueForKey( info, "gametype", va("%i",server->gameType));
 		Info_SetValueForKey( info, "nettype", va("%i",server->netType));
 		Info_SetValueForKey( info, "addr", NET_AdrToString(server->adr));
+#ifndef STANDALONE
 		Info_SetValueForKey( info, "punkbuster", va("%i", server->punkbuster));
+#endif
+#ifdef OPEN_ARENA
+		Info_SetValueForKey( info, "g_needpass", va("%i",server->g_needpass));
+		Info_SetValueForKey( info, "g_humanplayers", va("%i",server->g_humanplayers));
+#endif
 		Q_strncpyz(buf, info, buflen);
 	} else {
 		if (buf) {
@@ -971,6 +1112,12 @@ intptr_t CL_UISystemCalls( intptr_t *args ) {
 	case UI_SET_CDKEY:
 		CLUI_SetCDKey( VMA(1) );
 		return 0;
+#elif defined(OPEN_ARENA)
+	case UI_GET_CDKEY:
+		return 0;
+
+	case UI_SET_CDKEY:
+		return 0;
 #endif
 	
 	case UI_SET_PBCLSTATUS:
@@ -1056,6 +1203,9 @@ intptr_t CL_UISystemCalls( intptr_t *args ) {
 #ifndef STANDALONE
 	case UI_VERIFY_CDKEY:
 		return CL_CDKeyValidate(VMA(1), VMA(2));
+#elif defined(OPEN_ARENA)
+	case UI_VERIFY_CDKEY:
+	  return 1;
 #endif
 
 		
diff --git a/code/client/client.h b/code/client/client.h
index 5ee30c2..7e93272 100644
--- a/code/client/client.h
+++ b/code/client/client.h
@@ -35,8 +35,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #endif /* USE_CURL */
 
 #ifdef USE_VOIP
-#include "speex/speex.h"
-#include "speex/speex_preprocess.h"
+#  ifdef USE_INTERNAL_SPEEX
+#    include "speex/speex.h"
+#    include "speex/speex_preprocess.h"
+#  else
+#    include <speex/speex.h>
+#    include <speex/speex_preprocess.h>
+#  endif
 #endif
 
 // file full of random crap that gets used to create cl_guid
@@ -295,7 +300,13 @@ typedef struct {
 	int			maxPing;
 	int			ping;
 	qboolean	visible;
+#ifdef OPEN_ARENA
+	int		g_humanplayers;
+	int		g_needpass;
+#endif
+#ifndef STANDALONE
 	int			punkbuster;
+#endif
 } serverInfo_t;
 
 typedef struct {
diff --git a/code/client/snd_codec.c b/code/client/snd_codec.c
index 0483e8d..8745344 100644
--- a/code/client/snd_codec.c
+++ b/code/client/snd_codec.c
@@ -131,6 +131,69 @@ void S_CodecRegister(snd_codec_t *codec)
 	codecs = codec;
 }
 
+#ifdef OPEN_ARENA
+// STOLEN FROM IOSTVOY by thilo!!!!  HA HA HA but it works :(
+qboolean S_TheCheckExtension(char *filename)
+{
+	fileHandle_t hnd;
+	char fn[MAX_QPATH];
+	int stringlen = strlen(filename);
+	char *extptr;
+	
+	strncpy(fn, filename, stringlen+1);
+	extptr = strrchr(fn, '.');
+
+	if(!extptr)
+	{
+		extptr = &fn[stringlen];
+		
+		extptr[0] = '.';
+		extptr[1] = 'w';
+		extptr[2] = 'a';
+		extptr[3] = 'v';
+		extptr[4] = '\0';
+		
+		stringlen += 4;
+	}
+	
+	FS_FOpenFileRead(fn, &hnd, qtrue);
+
+	if(!hnd)
+	{
+		if(!strcmp(++extptr, "wav"))
+		{
+			extptr[0] = 'o';
+			extptr[1] = 'g';
+			extptr[2] = 'g';
+
+			FS_FOpenFileRead(fn, &hnd, qtrue);
+			
+			if(!hnd)
+				return qfalse;
+		}
+		else
+			return qfalse;
+	}
+	
+	FS_FCloseFile(hnd);
+	strcpy(filename, fn);
+
+	return qtrue;
+}
+
+qboolean S_TheGetFileName(char *filename)
+{
+	char fn[MAX_QPATH];
+
+	strncpy(fn, filename, sizeof(fn) - 10);
+
+	if(S_TheCheckExtension(filename))
+		return qtrue;
+	
+	return qfalse;
+}
+#endif
+
 /*
 =================
 S_CodecLoad
@@ -141,15 +204,25 @@ void *S_CodecLoad(const char *filename, snd_info_t *info)
 	snd_codec_t *codec;
 	char fn[MAX_QPATH];
 
+#ifdef OPEN_ARENA
+	// GO LOAD IT
+	strncpy(fn, filename, sizeof(fn));
+	if(!S_TheGetFileName(fn))
+		return NULL;
+	codec = S_FindCodecForFile(fn);
+#else
 	codec = S_FindCodecForFile(filename);
+#endif
 	if(!codec)
 	{
 		Com_Printf("Unknown extension for %s\n", filename);
 		return NULL;
 	}
 
+#ifndef OPEN_ARENA
 	strncpy(fn, filename, sizeof(fn));
 	COM_DefaultExtension(fn, sizeof(fn), codec->ext);
+#endif
 
 	return codec->load(fn, info);
 }
diff --git a/code/client/snd_dma.c b/code/client/snd_dma.c
index acda0f5..5cae6c5 100644
--- a/code/client/snd_dma.c
+++ b/code/client/snd_dma.c
@@ -399,7 +399,11 @@ void S_Base_BeginRegistration( void ) {
 		Com_Memset( s_knownSfx, 0, sizeof( s_knownSfx ) );
 		Com_Memset(sfxHash, 0, sizeof(sfx_t *)*LOOP_HASH);
 
+#ifdef OPEN_ARENA
+		S_Base_RegisterSound("sound/misc/silence.wav", qfalse);		// changed to a sound in baseoa
+#else
 		S_Base_RegisterSound("sound/feedback/hit.wav", qfalse);		// changed to a sound in baseq3
+#endif
 	}
 }
 
diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c
index b8ae488..c9c5ed9 100644
--- a/code/client/snd_openal.c
+++ b/code/client/snd_openal.c
@@ -384,7 +384,11 @@ qboolean S_AL_BufferInit( void )
 	numSfx = 0;
 
 	// Load the default sound, and lock it
+#ifdef OPEN_ARENA
+	default_sfx = S_AL_BufferFind("sound/misc/silence.wav");
+#else
 	default_sfx = S_AL_BufferFind("sound/feedback/hit.wav");
+#endif
 	S_AL_BufferUse(default_sfx);
 	knownSfx[default_sfx].isLocked = qtrue;
 
diff --git a/code/qcommon/common.c b/code/qcommon/common.c
index 7cdfa85..60c191f 100644
--- a/code/qcommon/common.c
+++ b/code/qcommon/common.c
@@ -32,13 +32,21 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #endif
 
 int demo_protocols[] =
+#ifdef OPEN_ARENA
+{ 66, 67, 68, 69, 70, 71, 0 };
+#else
 { 66, 67, 68, 0 };
+#endif
 
 #define MAX_NUM_ARGVS	50
 
 #define MIN_DEDICATED_COMHUNKMEGS 1
 #define MIN_COMHUNKMEGS		56
-#define DEF_COMHUNKMEGS		64
+#ifdef OPEN_ARENA
+#  define DEF_COMHUNKMEGS		128
+#else
+#  define DEF_COMHUNKMEGS		64
+#endif
 #define DEF_COMZONEMEGS		24
 #define XSTRING(x)				STRING(x)
 #define STRING(x)					#x
diff --git a/code/qcommon/q_platform.h b/code/qcommon/q_platform.h
index ed5d907..8f3781d 100644
--- a/code/qcommon/q_platform.h
+++ b/code/qcommon/q_platform.h
@@ -127,7 +127,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 //================================================================= LINUX ===
 
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD_kernel__)
 
 #include <endian.h>
 
diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h
index 54b8bfb..76bc626 100644
--- a/code/qcommon/q_shared.h
+++ b/code/qcommon/q_shared.h
@@ -26,7 +26,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // q_shared.h -- included first by ALL program modules.
 // A user mod should never modify this file
 
-#ifdef STANDALONE
+#ifdef OPEN_ARENA
+  #define PRODUCT_NAME			"ioq3+oa"
+  #define BASEGAME			"baseoa"
+  #define CLIENT_WINDOW_TITLE     	"OpenArena"
+  #define CLIENT_WINDOW_MIN_TITLE 	"OA"
+  #define GAMENAME_FOR_MASTER		"OpenArena"	// must NOT contain whitespaces
+#elif defined(STANDALONE)
   #define PRODUCT_NAME			"iofoo3"
   #define BASEGAME			"foobar"
   #define CLIENT_WINDOW_TITLE     	"changeme"
diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h
index 34cb2e9..e75fb48 100644
--- a/code/qcommon/qcommon.h
+++ b/code/qcommon/qcommon.h
@@ -232,17 +232,33 @@ PROTOCOL
 ==============================================================
 */
 
-#define	PROTOCOL_VERSION	68
+#ifdef OPEN_ARENA
+//Open Arena up to 0.7.6 used 68
+//Open Arena 0.7.7 uses 69
+//Open Arena 0.8.0 uses protocol 70
+//Open Arena 0.8.1+ uses protocol 71 (Shouldn't have been bumped but was it anyway)
+#  define	PROTOCOL_VERSION	71
+#else
+#  define	PROTOCOL_VERSION	68
+#endif
 // 1.31 - 67
 
 // maintain a list of compatible protocols for demo playing
 // NOTE: that stuff only works with two digits protocols
 extern int demo_protocols[];
 
-#define	UPDATE_SERVER_NAME	"update.quake3arena.com"
+#ifndef STANDALONE
+#  define	UPDATE_SERVER_NAME	"update.quake3arena.com"
+#else
+#  define	UPDATE_SERVER_NAME	""
+#endif
 // override on command line, config files etc.
-#ifndef MASTER_SERVER_NAME
-#define MASTER_SERVER_NAME	"master.quake3arena.com"
+#ifdef OPEN_ARENA
+#    define MASTER_SERVER_NAME	"dpmaster.deathmask.net"
+#else
+#  ifndef MASTER_SERVER_NAME
+#    define MASTER_SERVER_NAME	"master.quake3arena.com"
+#  endif
 #endif
 
 #ifndef STANDALONE
diff --git a/code/renderer/tr_backend.c b/code/renderer/tr_backend.c
index 30c9368..80153f7 100644
--- a/code/renderer/tr_backend.c
+++ b/code/renderer/tr_backend.c
@@ -944,6 +944,10 @@ const void	*RB_DrawSurfs( const void *data ) {
 	backEnd.refdef = cmd->refdef;
 	backEnd.viewParms = cmd->viewParms;
 
+#ifdef ENABLE_BLOOM
+	//TODO Maybe check for rdf_noworld stuff but q3mme has full 3d ui
+	backEnd.doneSurfaces = qtrue;
+#endif
 	RB_RenderDrawSurfList( cmd->drawSurfs, cmd->numDrawSurfs );
 
 	return (const void *)(cmd + 1);
@@ -1119,6 +1123,10 @@ const void	*RB_SwapBuffers( const void *data ) {
 
 	backEnd.projection2D = qfalse;
 
+#ifdef ENABLE_BLOOM
+	backEnd.doneBloom = qfalse;
+	backEnd.doneSurfaces = qfalse;
+#endif
 	return (const void *)(cmd + 1);
 }
 
@@ -1147,6 +1155,10 @@ void RB_ExecuteRenderCommands( const void *data ) {
 			data = RB_SetColor( data );
 			break;
 		case RC_STRETCH_PIC:
+#ifdef ENABLE_BLOOM
+			//Check if it's time for BLOOM!
+			R_BloomScreen();
+#endif
 			data = RB_StretchPic( data );
 			break;
 		case RC_DRAW_SURFS:
@@ -1156,6 +1168,10 @@ void RB_ExecuteRenderCommands( const void *data ) {
 			data = RB_DrawBuffer( data );
 			break;
 		case RC_SWAP_BUFFERS:
+#ifdef ENABLE_BLOOM
+			//Check if it's time for BLOOM!
+			R_BloomScreen();
+#endif
 			data = RB_SwapBuffers( data );
 			break;
 		case RC_SCREENSHOT:
diff --git a/code/renderer/tr_image_jpg.c b/code/renderer/tr_image_jpg.c
index 2e1a52a..548d5de 100644
--- a/code/renderer/tr_image_jpg.c
+++ b/code/renderer/tr_image_jpg.c
@@ -31,7 +31,122 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #define JPEG_INTERNALS
-#include "../jpeg-6b/jpeglib.h"
+
+#ifdef USE_INTERNAL_JPEG
+#  include "../jpeg-6b/jpeglib.h"
+#else
+#  include <jpeglib.h>
+#  include <jerror.h>
+
+#define INPUT_BUF_SIZE  4096	/* choose an efficiently fread'able size */
+/* Expanded data source object for stdio input */
+
+typedef struct {
+  struct jpeg_source_mgr pub;	/* public fields */
+
+  unsigned char *inbuf;		/* source stream */
+  size_t inbufbytes;
+  JOCTET * buffer;		/* start of buffer */
+  boolean start_of_file;	/* have we gotten any data yet? */
+} my_source_mgr;
+
+typedef my_source_mgr * my_src_ptr;
+
+void init_source (j_decompress_ptr cinfo)
+{
+  my_src_ptr src = (my_src_ptr) cinfo->src;
+
+  /* We reset the empty-input-file flag for each image,
+   * but we don't clear the input buffer.
+   * This is correct behavior for reading a series of images from one source.
+   */
+  src->start_of_file = TRUE;
+}
+
+boolean fill_input_buffer (j_decompress_ptr cinfo)
+{
+  my_src_ptr src = (my_src_ptr) cinfo->src;
+  size_t nbytes = MIN(src->inbufbytes, INPUT_BUF_SIZE);
+
+  if(!nbytes)
+  {
+    WARNMS(cinfo, JWRN_JPEG_EOF);
+    /* Insert a fake EOI marker */
+    src->buffer[0] = (JOCTET) 0xFF;
+    src->buffer[1] = (JOCTET) JPEG_EOI;
+    nbytes = 2;
+  }
+  else
+  {
+    memcpy( src->buffer, src->inbuf, nbytes);
+
+    src->inbuf += nbytes;
+    src->inbufbytes -= nbytes;
+  }
+
+  src->pub.next_input_byte = src->buffer;
+  src->pub.bytes_in_buffer = nbytes;
+  src->start_of_file = FALSE;
+
+  return TRUE;
+}
+
+void skip_input_data (j_decompress_ptr cinfo, long num_bytes)
+{
+  my_src_ptr src = (my_src_ptr) cinfo->src;
+
+  /* Just a dumb implementation for now.  Could use fseek() except
+   * it doesn't work on pipes.  Not clear that being smart is worth
+   * any trouble anyway --- large skips are infrequent.
+   */
+  if (num_bytes > 0) {
+    while (num_bytes > (long) src->pub.bytes_in_buffer) {
+      num_bytes -= (long) src->pub.bytes_in_buffer;
+      (void) fill_input_buffer(cinfo);
+      /* note we assume that fill_input_buffer will never return FALSE,
+       * so suspension need not be handled.
+       */
+    }
+    src->pub.next_input_byte += (size_t) num_bytes;
+    src->pub.bytes_in_buffer -= (size_t) num_bytes;
+  }
+}
+
+void term_source (j_decompress_ptr cinfo) {}
+
+void jpeg_mem_src (j_decompress_ptr cinfo, unsigned char *inbuf, size_t size)
+{
+  my_src_ptr src;
+
+  /* The source object and input buffer are made permanent so that a series
+   * of JPEG images can be read from the same file by calling jpeg_stdio_src
+   * only before the first one.  (If we discarded the buffer at the end of
+   * one image, we'd likely lose the start of the next one.)
+   * This makes it unsafe to use this manager and a different source
+   * manager serially with the same JPEG object.  Caveat programmer.
+   */
+  if (cinfo->src == NULL) {	/* first time for this JPEG object? */
+    cinfo->src = (struct jpeg_source_mgr *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+				  sizeof(my_source_mgr));
+    src = (my_src_ptr) cinfo->src;
+    src->buffer = (JOCTET *)
+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+				  INPUT_BUF_SIZE * sizeof(JOCTET));
+  }
+
+  src = (my_src_ptr) cinfo->src;
+  src->pub.init_source = init_source;
+  src->pub.fill_input_buffer = fill_input_buffer;
+  src->pub.skip_input_data = skip_input_data;
+  src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
+  src->pub.term_source = term_source;
+  src->inbuf = inbuf;
+  src->inbufbytes = size;
+  src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
+  src->pub.next_input_byte = NULL; /* until buffer loaded */
+}
+#endif
 
 void R_LoadJPG( const char *filename, unsigned char **pic, int *width, int *height ) {
   /* This struct contains the JPEG decompression parameters and pointers to
diff --git a/code/renderer/tr_init.c b/code/renderer/tr_init.c
index 0681919..8a1ded1 100644
--- a/code/renderer/tr_init.c
+++ b/code/renderer/tr_init.c
@@ -1083,6 +1083,10 @@ void R_Init( void ) {
 
 	R_Register();
 
+#ifdef ENABLE_BLOOM
+	R_BloomInit();
+#endif
+
 	max_polys = r_maxpolys->integer;
 	if (max_polys < MAX_POLYS)
 		max_polys = MAX_POLYS;
diff --git a/code/renderer/tr_local.h b/code/renderer/tr_local.h
index 897d54b..559e7c2 100644
--- a/code/renderer/tr_local.h
+++ b/code/renderer/tr_local.h
@@ -871,6 +871,10 @@ typedef struct {
 	qboolean	projection2D;	// if qtrue, drawstretchpic doesn't need to change modes
 	byte		color2D[4];
 	qboolean	vertexes2D;		// shader needs to be finished
+#ifdef ENABLE_BLOOM
+	qboolean	doneBloom;		// done bloom this frame
+	qboolean	doneSurfaces;   // done any 3d surfaces already
+#endif
 	trRefEntity_t	entity2D;	// currentEntity will point at this when doing 2D rendering
 } backEndState_t;
 
@@ -1328,6 +1332,9 @@ typedef struct shaderCommands_s
 
 extern	shaderCommands_t	tess;
 
+#ifdef ENABLE_BLOOM
+void RB_SetGL2D (void);
+#endif
 void RB_BeginSurface(shader_t *shader, int fogNum );
 void RB_EndSurface(void);
 void RB_CheckOverflow( int verts, int indexes );
@@ -1708,5 +1715,9 @@ void R_InitFreeType( void );
 void R_DoneFreeType( void );
 void RE_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font);
 
+#ifdef ENABLE_BLOOM
+void R_BloomInit( void );
+void R_BloomScreen( void );
+#endif
 
 #endif //TR_LOCAL_H
diff --git a/code/server/sv_ccmds.c b/code/server/sv_ccmds.c
index 01bc60d..8d23603 100644
--- a/code/server/sv_ccmds.c
+++ b/code/server/sv_ccmds.c
@@ -433,6 +433,14 @@ static void SV_Ban_f( void ) {
 		return;
 	}
 
+#ifdef STANDALONE
+	if(strlen(AUTHORIZE_SERVER_NAME) < 1)
+	{
+		Com_Printf("Ban function disabled due to lack of authorizing server.\n");
+		return;
+	}
+#endif
+
 	// look up the authorize server's IP
 	if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) {
 		Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME );
@@ -487,6 +495,14 @@ static void SV_BanNum_f( void ) {
 		return;
 	}
 
+#ifdef STANDALONE
+	if(strlen(AUTHORIZE_SERVER_NAME) < 1)
+	{
+		Com_Printf("Ban function disabled due to lack of authorizing server.\n");
+		return;
+	}
+#endif
+
 	// look up the authorize server's IP
 	if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) {
 		Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME );
diff --git a/code/server/sv_main.c b/code/server/sv_main.c
index 33554cd..02bceda 100644
--- a/code/server/sv_main.c
+++ b/code/server/sv_main.c
@@ -413,6 +413,12 @@ void SVC_Info( netadr_t from ) {
 		va("%i", sv_maxclients->integer - sv_privateClients->integer ) );
 	Info_SetValueForKey( infostring, "gametype", va("%i", sv_gametype->integer ) );
 	Info_SetValueForKey( infostring, "pure", va("%i", sv_pure->integer ) );
+#ifdef OPEN_ARENA
+	//Sago's things:
+	Info_SetValueForKey( infostring, "g_needpass", va("%i", (int)Cvar_VariableValue("g_needpass") ) );
+	Info_SetValueForKey( infostring, "g_humanplayers", va("%i", (int)Cvar_VariableValue("g_humanplayers") ) );
+#endif
+
 
 #ifdef USE_VOIP
 	if (sv_voip->integer) {
diff --git a/code/sys/sys_unix.c b/code/sys/sys_unix.c
index c05fda5..fed95e9 100644
--- a/code/sys/sys_unix.c
+++ b/code/sys/sys_unix.c
@@ -54,9 +54,17 @@ char *Sys_DefaultHomePath(void)
 		{
 			Q_strncpyz( homePath, p, sizeof( homePath ) );
 #ifdef MACOS_X
+#  ifdef OPEN_ARENA
+			Q_strcat( homePath, sizeof( homePath ), "/Library/Application Support/OpenArena" );
+#  else
 			Q_strcat( homePath, sizeof( homePath ), "/Library/Application Support/Quake3" );
+#  endif
 #else
+#  ifdef OPEN_ARENA
+			Q_strcat( homePath, sizeof( homePath ), "/.openarena" );
+#  else 
 			Q_strcat( homePath, sizeof( homePath ), "/.q3a" );
+#  endif
 #endif
 			if( mkdir( homePath, 0777 ) )
 			{
diff --git a/code/sys/sys_win32.c b/code/sys/sys_win32.c
index eeee856..12dc853 100644
--- a/code/sys/sys_win32.c
+++ b/code/sys/sys_win32.c
@@ -75,7 +75,11 @@ char *Sys_DefaultHomePath( void )
 			return NULL;
 		}
 		Q_strncpyz( homePath, szPath, sizeof( homePath ) );
+#ifdef OPEN_ARENA
+		Q_strcat( homePath, sizeof( homePath ), "\\OpenArena" );
+#else
 		Q_strcat( homePath, sizeof( homePath ), "\\Quake3" );
+#endif
 		FreeLibrary(shfolder);
 		if( !CreateDirectory( homePath, NULL ) )
 		{
diff --git a/misc/quake3.icns b/misc/quake3.icns
index 30e3b67..a0862fc 100644
Binary files a/misc/quake3.icns and b/misc/quake3.icns differ
diff --git a/misc/quake3.ico b/misc/quake3.ico
index 6106c27..ad4d2f1 100644
Binary files a/misc/quake3.ico and b/misc/quake3.ico differ
diff --git a/misc/quake3.png b/misc/quake3.png
index 94010a7..574e5c6 100644
Binary files a/misc/quake3.png and b/misc/quake3.png differ
diff --git a/misc/quake3.svg b/misc/quake3.svg
index 24c4b9f..425d2b7 100644
--- a/misc/quake3.svg
+++ b/misc/quake3.svg
@@ -1,67 +1,15 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.0"
-   width="64"
-   height="64"
-   id="svg1306">
-  <defs
-     id="defs1308">
-    <linearGradient
-       id="linearGradient2180">
-      <stop
-         style="stop-color:#ff0000;stop-opacity:1"
-         offset="0"
-         id="stop2182" />
-      <stop
-         style="stop-color:#590000;stop-opacity:1"
-         offset="1"
-         id="stop2184" />
-    </linearGradient>
-    <linearGradient
-       x1="14.860399"
-       y1="19.054131"
-       x2="15.042735"
-       y2="59"
-       id="linearGradient2190"
-       xlink:href="#linearGradient2180"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="14.860399"
-       y1="19.054131"
-       x2="15.042735"
-       y2="59"
-       id="linearGradient2194"
-       xlink:href="#linearGradient2180"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="32"
-       y1="64.091171"
-       x2="32"
-       y2="0"
-       id="linearGradient3077"
-       xlink:href="#linearGradient2180"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <g
-     id="layer1">
-    <g
-       id="g1327">
-      <path
-         d="M 34.538626,32.090265 L 32.538627,64 L 30.538626,32 L 32.538627,0 L 34.538626,32.090265 z "
-         style="opacity:1;fill:url(#linearGradient3077);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5261631;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path1329" />
-      <path
-         d="M 28.059562,59 L 25.612281,34.036677 C 25.612281,34.036677 2.1281775,31.218199 2.0010765,25.064561 C 1.9155925,21.016997 6.9421265,19.095215 9.6946005,19.095215 C 12.000721,19.095215 4.2082195,19.143464 4.1713675,24.287073 C 4.1405475,28.679913 29.3599,30.346963 29.3599,30.346963 L 28.059562,59 z "
-         style="fill:url(#linearGradient2190);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path1307" />
-      <path
-         d="M 36.940438,59 L 39.387719,34.036677 C 39.387719,34.036677 62.871823,31.218199 62.998924,25.064561 C 63.084408,21.016997 58.057873,19.095215 55.305399,19.095215 C 52.999279,19.095215 60.79178,19.143464 60.828632,24.287073 C 60.859452,28.679913 35.6401,30.346963 35.6401,30.346963 L 36.940438,59 z "
-         style="fill:url(#linearGradient2194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="path2192" />
-    </g>
-  </g>
-</svg>
+<?xml version="1.0" encoding="utf-8"?>

+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->

+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

+	 width="317.984px" height="239.988px" viewBox="0 0 317.984 239.988" enable-background="new 0 0 317.984 239.988"

+	 xml:space="preserve">

+<polygon stroke="#000000" points="160.232,156.905 149.096,134.604 160.232,108.905 171.368,134.604 "/>

+<path stroke="#000000" d="M196.093,223.061h36.675c-6.949-3.088-11.195-9.266-11.195-9.266l-61.094-200.64L99.386,214.012

+	c0,0-4.247,6.177-11.196,9.266h36.675c0,0-8.133-4.373-11.466-8.373l47.08-166.108l47.081,165.892

+	C204.226,218.688,196.093,223.061,196.093,223.061z"/>

+<path stroke="#000000" d="M159.803,41.445c-79.848,0-144.578,25.235-144.578,56.364c0,27.275,49.692,50.023,115.705,55.239

+	l6.145-21.681C69.945,128.203,14.779,111.32,20.631,90.325c6.435-23.087,62.31-46.087,139.172-46.087

+	c76.863,0,134.93,24.667,139.173,46.087c4.205,21.229-48.878,37.722-115.079,40.987l6.137,21.623

+	c65.333-5.419,114.347-28.039,114.347-55.126C304.381,66.681,239.651,41.445,159.803,41.445z"/>

+</svg>

[/code]

The required bloom file.  It's code/renderer/tr_bloom.c.  This is directly from openarena
[code]
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
// tr_bloom.c: 2D lighting post process effect

#ifdef ENABLE_BLOOM

#include "tr_local.h"

static cvar_t *r_bloom;
static cvar_t *r_bloom_sample_size;
static cvar_t *r_bloom_fast_sample;
static cvar_t *r_bloom_alpha;
static cvar_t *r_bloom_darken;
static cvar_t *r_bloom_intensity;
static cvar_t *r_bloom_diamond_size;

/* 
============================================================================== 
 
						LIGHT BLOOMS
 
============================================================================== 
*/ 

static float Diamond8x[8][8] =
{ 
	{ 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f, },
	{ 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, },
	{ 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, },
	{ 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, },
	{ 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, },
	{ 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, },
	{ 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, },
	{ 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f  }
};

static float Diamond6x[6][6] =
{ 
	{ 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, },
	{ 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, }, 
	{ 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, },
	{ 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, },
	{ 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, },
	{ 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f  }
};

static float Diamond4x[4][4] =
{  
	{ 0.3f, 0.4f, 0.4f, 0.3f, },
	{ 0.4f, 0.9f, 0.9f, 0.4f, },
	{ 0.4f, 0.9f, 0.9f, 0.4f, },
	{ 0.3f, 0.4f, 0.4f, 0.3f  }
};

static struct {
	struct {
		image_t	*texture;
		int		width, height;
		float	readW, readH;
	} effect;
	struct {
		image_t	*texture;
		int		width, height;
		float	readW, readH;
	} screen;
	struct {
		int		width, height;
	} work;
	qboolean started;
} bloom;


static void ID_INLINE R_Bloom_Quad( int width, int height, float texX, float texY, float texWidth, float texHeight ) {
	int x = 0;
	int y = 0;
	x = 0;
	y += glConfig.vidHeight - height;
	width += x;
	height += y;
	
	texWidth += texX;
	texHeight += texY;

	qglBegin( GL_QUADS );							
	qglTexCoord2f(	texX,						texHeight	);	
	qglVertex2f(	x,							y	);

	qglTexCoord2f(	texX,						texY	);				
	qglVertex2f(	x,							height	);	

	qglTexCoord2f(	texWidth,					texY	);				
	qglVertex2f(	width,						height	);	

	qglTexCoord2f(	texWidth,					texHeight	);	
	qglVertex2f(	width,						y	);				
	qglEnd ();
}


/*
=================
R_Bloom_InitTextures
=================
*/
static void R_Bloom_InitTextures( void )
{
	byte	*data;

	// find closer power of 2 to screen size 
	for (bloom.screen.width = 1;bloom.screen.width< glConfig.vidWidth;bloom.screen.width *= 2);
	for (bloom.screen.height = 1;bloom.screen.height < glConfig.vidHeight;bloom.screen.height *= 2);

	bloom.screen.readW = glConfig.vidWidth / (float)bloom.screen.width;
	bloom.screen.readH = glConfig.vidHeight / (float)bloom.screen.height;

	// find closer power of 2 to effect size 
	bloom.work.width = r_bloom_sample_size->integer;
	bloom.work.height = bloom.work.width * ( glConfig.vidWidth / glConfig.vidHeight );

	for (bloom.effect.width = 1;bloom.effect.width < bloom.work.width;bloom.effect.width *= 2);
	for (bloom.effect.height = 1;bloom.effect.height < bloom.work.height;bloom.effect.height *= 2);

	bloom.effect.readW = bloom.work.width / (float)bloom.effect.width;
	bloom.effect.readH = bloom.work.height / (float)bloom.effect.height;


	// disable blooms if we can't handle a texture of that size
	if( bloom.screen.width > glConfig.maxTextureSize ||
		bloom.screen.height > glConfig.maxTextureSize ||
		bloom.effect.width > glConfig.maxTextureSize ||
		bloom.effect.height > glConfig.maxTextureSize ||
		bloom.work.width > glConfig.vidWidth ||
		bloom.work.height > glConfig.vidHeight
	) {
		ri.Cvar_Set( "r_bloom", "0" );
		Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitBloomTextures' too high resolution for light bloom, effect disabled\n" );
		return;
	}

	data = ri.Hunk_AllocateTempMemory( bloom.screen.width * bloom.screen.height * 4 );
	Com_Memset( data, 0, bloom.screen.width * bloom.screen.height * 4 );
	bloom.screen.texture = R_CreateImage( "***bloom screen texture***", data, bloom.screen.width, bloom.screen.height, qfalse, qfalse, qfalse );
	ri.Hunk_FreeTempMemory( data );

	data = ri.Hunk_AllocateTempMemory( bloom.effect.width * bloom.effect.height * 4 );
	Com_Memset( data, 0, bloom.effect.width * bloom.effect.height * 4 );
	bloom.effect.texture = R_CreateImage( "***bloom effect texture***", data, bloom.effect.width, bloom.effect.height, qfalse, qfalse, qfalse );
	ri.Hunk_FreeTempMemory( data );
	bloom.started = qtrue;
}

/*
=================
R_InitBloomTextures
=================
*/
void R_InitBloomTextures( void )
{
	if( !r_bloom->integer )
		return;
	memset( &bloom, 0, sizeof( bloom ));
	R_Bloom_InitTextures ();
}

/*
=================
R_Bloom_DrawEffect
=================
*/
static void R_Bloom_DrawEffect( void )
{
	GL_Bind( bloom.effect.texture );
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
	qglColor4f( r_bloom_alpha->value, r_bloom_alpha->value, r_bloom_alpha->value, 1.0f );
	R_Bloom_Quad( glConfig.vidWidth, glConfig.vidHeight, 0, 0, bloom.effect.readW, bloom.effect.readW );
}


/*
=================
R_Bloom_GeneratexDiamonds
=================
*/
static void R_Bloom_WarsowEffect( void )
{
	int		i, j, k;
	float	intensity, scale, *diamond;


	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
	//Take the backup texture and downscale it
	GL_Bind( bloom.screen.texture );
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH );
	//Copy downscaled framebuffer into a texture
	GL_Bind( bloom.effect.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
	// darkening passes with repeated filter
	if( r_bloom_darken->integer ) {
		int i;
		GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );

		for( i = 0; i < r_bloom_darken->integer; i++ ) {
			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
				0, 0, 
				bloom.effect.readW, bloom.effect.readH );
		}
		qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
	}
	/* Copy the result to the effect texture */
	GL_Bind( bloom.effect.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );

	// bluring passes, warsow uses a repeated semi blend on a selectable diamond grid
	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE_MINUS_SRC_COLOR );
	if( r_bloom_diamond_size->integer > 7 || r_bloom_diamond_size->integer <= 3 ) {
		if( r_bloom_diamond_size->integer != 8 )
			ri.Cvar_Set( "r_bloom_diamond_size", "8" );
	} else if( r_bloom_diamond_size->integer > 5 ) {
		if( r_bloom_diamond_size->integer != 6 )
			ri.Cvar_Set( "r_bloom_diamond_size", "6" );
	} else if( r_bloom_diamond_size->integer > 3 ) {
		if( r_bloom_diamond_size->integer != 4 )
			ri.Cvar_Set( "r_bloom_diamond_size", "4" );
	}

	switch( r_bloom_diamond_size->integer ) {
		case 4:
			k = 2;
			diamond = &Diamond4x[0][0];
			scale = r_bloom_intensity->value * 0.8f;
			break;
		case 6:
			k = 3;
			diamond = &Diamond6x[0][0];
			scale = r_bloom_intensity->value * 0.5f;
			break;
		default:
//		case 8:
			k = 4;
			diamond = &Diamond8x[0][0];
			scale = r_bloom_intensity->value * 0.3f;
			break;
	}

	for( i = 0; i < r_bloom_diamond_size->integer; i++ ) {
		for( j = 0; j < r_bloom_diamond_size->integer; j++, diamond++ ) {
			float x, y;
			intensity =  *diamond * scale;
			if( intensity < 0.01f )
				continue;
			qglColor4f( intensity, intensity, intensity, 1.0 );
			x = (i - k) * ( 2 / 640.0f ) * bloom.effect.readW;
			y = (j - k) * ( 2 / 480.0f ) * bloom.effect.readH;

			R_Bloom_Quad( bloom.work.width, bloom.work.height, x, y, bloom.effect.readW, bloom.effect.readH );
		}
	}
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
}											

/*
=================
R_Bloom_BackupScreen
Backup the full original screen to a texture for downscaling and later restoration
=================
*/
static void R_Bloom_BackupScreen( void ) {
	GL_Bind( bloom.screen.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight );
}
/*
=================
R_Bloom_RestoreScreen
Restore the temporary framebuffer section we used with the backup texture
=================
*/
static void R_Bloom_RestoreScreen( void ) {
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
	GL_Bind( bloom.screen.texture );
	qglColor4f( 1, 1, 1, 1 );
	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0,
		bloom.work.width / (float)bloom.screen.width,
		bloom.work.height / (float)bloom.screen.height );
}
 

/*
=================
R_Bloom_DownsampleView
Scale the copied screen back to the sample size used for subsequent passes
=================
*/
#  if 0
static void R_Bloom_DownsampleView( void )
{
	// TODO, Provide option to control the color strength here /
//	qglColor4f( r_bloom_darken->value, r_bloom_darken->value, r_bloom_darken->value, 1.0f );
	qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
	GL_Bind( bloom.screen.texture );
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
	//Downscale it
	R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH );
#    if 1
	GL_Bind( bloom.effect.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
	// darkening passes
	if( r_bloom_darken->integer ) {
		int i;
		GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );

		for( i = 0; i < r_bloom_darken->integer; i++ ) {
			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
				0, 0, 
				bloom.effect.readW, bloom.effect.readH );
		}
		qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
	}
#    endif
	// Copy the result to the effect texture /
	GL_Bind( bloom.effect.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
}

static void R_Bloom_CreateEffect( void ) {
	int dir, x;
	int range;

	//First step will zero dst, rest will one add
	GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO );
//	GL_Bind( bloom.screen.texture );
	GL_Bind( bloom.effect.texture );
	range = 4;
	for (dir = 0;dir < 2;dir++)
	{
		// blend on at multiple vertical offsets to achieve a vertical blur
		// TODO: do offset blends using GLSL
		for (x = -range;x <= range;x++)
		{
			float xoffset, yoffset, r;
			if (!dir){
				xoffset = 0;
				yoffset = x*1.5;
			} else {
				xoffset = x*1.5;
				yoffset = 0;
			}
			xoffset /= bloom.work.width;
			yoffset /= bloom.work.height;
			// this r value looks like a 'dot' particle, fading sharply to
			// black at the edges
			// (probably not realistic but looks good enough)
			//r = ((range*range+1)/((float)(x*x+1)))/(range*2+1);
			//r = (dir ? 1.0f : brighten)/(range*2+1);
			r = 2.0f /(range*2+1)*(1 - x*x/(float)(range*range));
//			r *= r_bloom_darken->value;
			qglColor4f(r, r, r, 1);
			R_Bloom_Quad( bloom.work.width, bloom.work.height, 
				xoffset, yoffset, 
				bloom.effect.readW, bloom.effect.readH );
//				bloom.screen.readW, bloom.screen.readH );
			GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE );
		}
	}
	GL_Bind( bloom.effect.texture );
	qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height );
}
#  endif

/*
=================
R_BloomScreen
=================
*/
void R_BloomScreen( void )
{
	if( !r_bloom->integer )
		return;
	if ( backEnd.doneBloom )
		return;
	if ( !backEnd.doneSurfaces )
		return;
	backEnd.doneBloom = qtrue;
	if( !bloom.started ) {
		R_Bloom_InitTextures();
		if( !bloom.started )
			return;
	}

	if ( !backEnd.projection2D )
		RB_SetGL2D();
#  if 0
	// set up full screen workspace
	GL_TexEnv( GL_MODULATE );
	qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight );
	qglViewport( 0, 0, glConfig.vidWidth, glConfig.vidHeight );
	qglMatrixMode( GL_PROJECTION );
    qglLoadIdentity ();
	qglOrtho( 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1 );
	qglMatrixMode( GL_MODELVIEW );
    qglLoadIdentity ();

	GL_Cull( CT_TWO_SIDED );
#  endif

	qglColor4f( 1, 1, 1, 1 );

	//Backup the old screen in a texture
	R_Bloom_BackupScreen();
	// create the bloom texture using one of a few methods
	R_Bloom_WarsowEffect ();
//	R_Bloom_CreateEffect();
	// restore the screen-backup to the screen
	R_Bloom_RestoreScreen();
	// Do the final pass using the bloom texture for the final effect
	R_Bloom_DrawEffect ();
}


void R_BloomInit( void ) {
	memset( &bloom, 0, sizeof( bloom ));

	r_bloom = ri.Cvar_Get( "r_bloom", "0", CVAR_ARCHIVE );
	r_bloom_alpha = ri.Cvar_Get( "r_bloom_alpha", "0.3", CVAR_ARCHIVE );
	r_bloom_diamond_size = ri.Cvar_Get( "r_bloom_diamond_size", "8", CVAR_ARCHIVE );
	r_bloom_intensity = ri.Cvar_Get( "r_bloom_intensity", "1.3", CVAR_ARCHIVE );
	r_bloom_darken = ri.Cvar_Get( "r_bloom_darken", "4", CVAR_ARCHIVE );
	r_bloom_sample_size = ri.Cvar_Get( "r_bloom_sample_size", "128", CVAR_ARCHIVE|CVAR_LATCH );
	r_bloom_fast_sample = ri.Cvar_Get( "r_bloom_fast_sample", "0", CVAR_ARCHIVE|CVAR_LATCH );
}

#endif
[/code]

My Makefile.local
[code]
#This file defines the standard variables used by Open Arena.  

COPYDIR="/usr/local/games/openarena"

#We want openAL
USE_OPENAL=1

#Next we want to bind openAL on runtime. SDL sound will be used if openAL is not installed
USE_OPENAL_DLOPEN=1

## Unlike upstream, we shouldn't set these (Debian version)
# From Debian's build
USE_CURL_DLOPEN=0
USE_OPENAL=1
USE_OPENAL_DLOPEN=0
USE_VOIP=1
BUILD_CLIENT_SMP=1
#USE_LOCAL_HEADERS=0
DEFAULT_BASEDIR=/usr/share/games/openarena

# We want to build against the system's speex rather than this package's
USE_INTERNAL_SPEEX=0

# NOTE: I have to use the internal JPEG library for some strange reason.
# Debian's build disables it, but I get lots of graphics problems without it.
# This is using the latest ioq3 source.
USE_INTERNAL_JPEG=1

#We want vorbis support!
USE_CODEC_VORBIS=1

#Open Arena is a standalone game
BUILD_STANDALONE=1

#We don't want to build the game logic... only the engine
BUILD_GAME_SO = 0
BUILD_GAME_QVM = 0

# Required options for standalone
CFLAGS=-DOPEN_ARENA
USE_BLOOM=0
GAME_DEDICATED_NAME=oa_ded
GAME_CLIENT_NAME=openarena
GAME_DIRECTORY_NAME=baseoa
[/code]