diff --git a/GNUmakefile b/GNUmakefile
index 3a8ab3528..8ae2efab5 100755
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -11,6 +11,17 @@ ifeq ($(GNUSTEP_HOST_OS),mingw32)
endif
GNUSTEP_OBJ_DIR_BASENAME := $(GNUSTEP_OBJ_DIR_NAME)
+# decide whether we are building legacy or modern based on gcc version,
+# which is available to all dev environments
+GCCVERSION := $(shell gcc --version | grep ^gcc | sed 's/^.* //g')
+ifeq ($(GCCVERSION),4.7.1)
+ $(info Compiling legacy build)
+ modern = no
+else
+ $(info Compiling modern build)
+ modern = yes
+endif
+
ifeq ($(GNUSTEP_HOST_OS),mingw32)
vpath %.rc src/SDL/OOResourcesWin
@@ -23,18 +34,33 @@ ifeq ($(GNUSTEP_HOST_OS),mingw32)
JS_IMPORT_LIBRARY = js32ECMAv5
endif
- ADDITIONAL_INCLUDE_DIRS = -I$(WIN_DEPS_DIR)/include -I$(JS_INC_DIR) -Isrc/SDL -Isrc/Core -Isrc/BSDCompat -Isrc/Core/Scripting -Isrc/Core/Materials -Isrc/Core/Entities -Isrc/Core/OXPVerifier -Isrc/Core/Debug -Isrc/Core/Tables -Isrc/Core/MiniZip -Isrc/SDL/EXRSnapshotSupport
- ADDITIONAL_OBJC_LIBS = -L$(WIN_DEPS_DIR)/lib -lglu32 -lopengl32 -lopenal32.dll -lpng14.dll -lmingw32 -lSDLmain -lSDL -lvorbisfile.dll -lvorbis.dll -lz -lgnustep-base -l$(JS_IMPORT_LIBRARY) -lshlwapi -ldwmapi -lwinmm -mwindows
- ADDITIONAL_CFLAGS = -DWIN32 -DNEED_STRLCPY `sdl-config --cflags` -mtune=generic -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
+ ifeq ($(modern),yes)
+ SPEECH_LIBRARY_NAME = espeak-ng
+ OPENAL_LIBRARY_NAME = openal
+ LIBPNG_LIBRARY_NAME = png
+ else
+ SPEECH_LIBRARY_NAME = espeak
+ OPENAL_LIBRARY_NAME = openal32
+ LIBPNG_LIBRARY_NAME = png14
+ endif
+
+ ADDITIONAL_INCLUDE_DIRS = -Isrc/SDL -Isrc/Core -Isrc/BSDCompat -Isrc/Core/Scripting -Isrc/Core/Materials -Isrc/Core/Entities -Isrc/Core/OXPVerifier -Isrc/Core/Debug -Isrc/Core/Tables -Isrc/Core/MiniZip -Isrc/SDL/EXRSnapshotSupport
+ ADDITIONAL_OBJC_LIBS = -lglu32 -lopengl32 -l$(OPENAL_LIBRARY_NAME).dll -l$(LIBPNG_LIBRARY_NAME).dll -lmingw32 -lSDLmain -lSDL -lvorbisfile.dll -lvorbis.dll -lz -lgnustep-base -l$(JS_IMPORT_LIBRARY) -lshlwapi -ldwmapi -lwinmm -mwindows
+ ADDITIONAL_CFLAGS = -DWIN32 -DNEED_STRLCPY `sdl-config --cflags` -mtune=generic -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -DNTDDI_VERSION=0x0A00000F
# note the vpath stuff above isn't working for me, so adding src/SDL and src/Core explicitly
- ADDITIONAL_OBJCFLAGS = -DLOADSAVEGUI -DWIN32 -DXP_WIN -Wno-import -std=gnu99 `sdl-config --cflags` -mtune=generic -DWINVER=0x0601 -D_WIN32_WINNT=0x0601
+ ADDITIONAL_OBJCFLAGS = -DLOADSAVEGUI -DWIN32 -DXP_WIN -Wno-import -std=gnu99 `sdl-config --cflags` -mtune=generic -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -DNTDDI_VERSION=0x0A00000F
# oolite_LIB_DIRS += -L$(GNUSTEP_LOCAL_ROOT)/lib -L$(WIN_DEPS_DIR)/lib -L$(JS_LIB_DIR)
ifeq ($(ESPEAK),yes)
- ADDITIONAL_OBJC_LIBS += -lespeak.dll
+ ADDITIONAL_OBJC_LIBS += -l$(SPEECH_LIBRARY_NAME).dll
ADDITIONAL_OBJCFLAGS +=-DHAVE_LIBESPEAK=1
GNUSTEP_OBJ_DIR_NAME := $(GNUSTEP_OBJ_DIR_NAME).spk
endif
+
+ ifneq ($(modern),yes)
+ ADDITIONAL_INCLUDE_DIRS += -I$(WIN_DEPS_DIR)/include -I$(JS_INC_DIR)
+ ADDITIONAL_OBJC_LIBS += -L$(WIN_DEPS_DIR)/lib
+ endif
else
LIBJS_DIR = deps/Linux-deps/x86_64/mozilla
LIBJS_INC_DIR = deps/Linux-deps/x86_64/mozilla/include
@@ -74,11 +100,10 @@ else
endif
endif
-# Add flag if building with GNUStep and Clang
-ifneq '' '$(GNUSTEP_HOST_OS)'
- ifneq '' '$(findstring clang++,$(CXX))'
- ADDITIONAL_OBJCFLAGS += -fobjc-runtime=gnustep-1.9
- endif
+# Add specific flag if building modern
+ifeq ($(modern),yes)
+ ADDITIONAL_CFLAGS += -DOOLITE_MODERN_BUILD=1
+ ADDITIONAL_OBJCFLAGS += -DOOLITE_MODERN_BUILD=1
endif
OBJC_PROGRAM_NAME = oolite
diff --git a/GNUmakefile.postamble b/GNUmakefile.postamble
index 5d9745929..e4eb71de7 100644
--- a/GNUmakefile.postamble
+++ b/GNUmakefile.postamble
@@ -44,7 +44,16 @@ after-all::
$(CP) $(CP_FLAGS) Schemata $(PROGDIR)/Resources
ifeq ($(ESPEAK),yes)
ifeq ($(GNUSTEP_HOST_OS),mingw32)
- $(CP) $(CP_FLAGS) deps/Cross-platform-deps/espeak-data $(PROGDIR)/Resources
+ ifeq ($(modern),yes)
+ $(CP) $(CP_FLAGS) $(MINGW_PREFIX)/share/espeak-ng-data $(PROGDIR)/Resources
+ # replace f2 voice and set the default voice as well
+ $(RM) $(PROGDIR)/Resources/espeak-ng-data/voices/!v/f2
+ # copy required files from the existing cross-platform-deps repo
+ $(CP) $(CP_FLAGS) deps/Cross-platform-deps/espeak-data/voices/!v/f2 $(PROGDIR)/Resources/espeak-ng-data/voices/!v/f2
+ $(CP) $(CP_FLAGS) deps/Cross-platform-deps/espeak-data/voices/default $(PROGDIR)/Resources/espeak-ng-data/voices/default
+ else
+ $(CP) $(CP_FLAGS) deps/Cross-platform-deps/espeak-data $(PROGDIR)/Resources
+ endif
else
ifeq ($(use_deps),yes)
$(CP) $(CP_FLAGS) deps/Cross-platform-deps/espeak-data $(PROGDIR)/Resources
@@ -57,10 +66,14 @@ ifeq ($(strip),yes)
$(STRIP) $(PROGDIR)/$(DEST_BIN)
endif
ifeq ($(GNUSTEP_HOST_OS),mingw32)
- ifeq ($(GNUSTEP_HOST_CPU),x86_64)
- $(CP) $(CP_FLAGS) deps/Windows-deps/x86_64/DLLs/*.dll $(PROGDIR)
+ ifeq ($(modern),yes)
+ ldd $(PROGDIR)/oolite.exe | grep $(MINGW_PREFIX) | awk '{print $$3}' | xargs -I {} $(CP) $(CP_FLAGS) {} $(PROGDIR)
else
- $(CP) $(CP_FLAGS) deps/Windows-deps/x86/DLLs/*.dll $(PROGDIR)
+ ifeq ($(GNUSTEP_HOST_CPU),x86_64)
+ $(CP) $(CP_FLAGS) deps/Windows-deps/x86_64/DLLs/*.dll $(PROGDIR)
+ else
+ $(CP) $(CP_FLAGS) deps/Windows-deps/x86/DLLs/*.dll $(PROGDIR)
+ endif
endif
ifeq ($(debug),yes)
$(RM) $(PROGDIR)/js32ECMAv5.dll
diff --git a/Makefile b/Makefile
index 456e1ee7e..ea24d4e56 100755
--- a/Makefile
+++ b/Makefile
@@ -236,7 +236,11 @@ pkg-debclean:
# And here are our Windows packager targets
#
+ifneq '' '$(MINGW_PREFIX)'
+NSIS=$(MINGW_PREFIX)/bin/makensis
+else
NSIS=/nsis/makensis.exe
+endif
NSISVERSIONS=installers/win32/OoliteVersions.nsh
# Passing arguments cause problems with some versions of NSIS.
diff --git a/files.make b/files.make
index 894e91781..d40b8b1bc 100644
--- a/files.make
+++ b/files.make
@@ -258,6 +258,7 @@ OOLITE_MISC_FILES = \
AIGraphViz.m \
GameController.m \
GameController+SDLFullScreen.m \
+ NSUserDefaults+Override.m \
OOJoystickManager.m \
OOJoystickProfile.m \
OOSDLJoystickManager.m \
diff --git a/src/Cocoa/Info-Oolite.plist b/src/Cocoa/Info-Oolite.plist
index 465e4e0ed..9b46c3508 100644
--- a/src/Cocoa/Info-Oolite.plist
+++ b/src/Cocoa/Info-Oolite.plist
@@ -70,7 +70,7 @@
CFBundleIconFile
oolite-icon
CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
+ OoliteDefaults
CFBundleInfoDictionaryVersion
6.0
CFBundleName
diff --git a/src/Core/GameController.m b/src/Core/GameController.m
index 90da44240..565fa74d9 100644
--- a/src/Core/GameController.m
+++ b/src/Core/GameController.m
@@ -646,7 +646,7 @@ - (NSURL *) snapshotsURLCreatingIfNeeded:(BOOL)create
NSFileManager *fmgr = [NSFileManager defaultManager];
if (![fmgr fileExistsAtPath:path])
{
- [fmgr createDirectoryAtPath:path attributes:nil];
+ [fmgr oo_createDirectoryAtPath:path attributes:nil];
}
}
return url;
diff --git a/src/Core/NSFileManagerOOExtensions.m b/src/Core/NSFileManagerOOExtensions.m
index 57e403e2f..00edc8930 100644
--- a/src/Core/NSFileManagerOOExtensions.m
+++ b/src/Core/NSFileManagerOOExtensions.m
@@ -172,13 +172,13 @@ - (NSArray *) oo_directoryContentsAtPath:(NSString *)path
- (BOOL) oo_createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes
{
-#if OOLITE_WINDOWS
- return [self createDirectoryAtPath:path attributes:attributes];
-#else
+ #if OOLITE_WINDOWS && !OOLITE_MODERN_BUILD
+ return [self createDirectoryAtPath:path attributes:attributes];
+ #else
// has been in GNUStep since 2008, so it's probably safe to use now.
// .... why do I say things like that, of course it's not safe - CIM
return [self createDirectoryAtPath:path withIntermediateDirectories:YES attributes:attributes error:NULL];
-#endif
+ #endif
}
@@ -217,7 +217,7 @@ - (BOOL) chdirToSnapshotPath
if (![self changeCurrentDirectoryPath: savedir])
{
// it probably doesn't exist.
- if (![self createDirectoryAtPath: savedir attributes: nil])
+ if (![self oo_createDirectoryAtPath: savedir attributes: nil])
{
OOLog(@"savedSnapshot.defaultPath.create.failed", @"Unable to create directory %@", savedir);
return NO;
diff --git a/src/Core/NSUserDefaults+Override.h b/src/Core/NSUserDefaults+Override.h
new file mode 100644
index 000000000..885a4d4d2
--- /dev/null
+++ b/src/Core/NSUserDefaults+Override.h
@@ -0,0 +1,38 @@
+/*
+
+NSUserDefaults+Override.h
+
+Oolite
+Copyright (C) 2004-2025 Giles C Williams and contributors
+
+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., 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+*/
+
+#import "OOCocoa.h"
+
+#if OOLITE_MODERN_BUILD
+
+#import
+
+@interface NSUserDefaults (Override)
+
+- (BOOL) writeDictionary: (NSDictionary*)dict
+ toFile: (NSString*)file;
+
+@end
+
+#endif
diff --git a/src/Core/NSUserDefaults+Override.m b/src/Core/NSUserDefaults+Override.m
new file mode 100644
index 000000000..9a537f948
--- /dev/null
+++ b/src/Core/NSUserDefaults+Override.m
@@ -0,0 +1,76 @@
+/*
+
+NSUserDefaults+Override.m
+
+Oolite
+Copyright (C) 2004-2025 Giles C Williams and contributors
+
+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., 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+*/
+
+
+#import "NSUserDefaults+Override.h"
+#import
+#import
+#import
+
+#if OOLITE_MODERN_BUILD
+
+@implementation NSUserDefaults (Override)
+
+- (BOOL) writeDictionary: (NSDictionary*)dict
+ toFile: (NSString*)file
+{
+ if ([file length] == 0)
+ {
+ NSLog(@"Defaults database filename is empty when writing");
+ }
+ else if (nil == dict)
+ {
+ NSFileManager *mgr = [NSFileManager defaultManager];
+
+ return [mgr removeFileAtPath: file handler: nil];
+ }
+ else
+ {
+ NSData *data;
+ NSString *err;
+
+ err = nil;
+ data = [NSPropertyListSerialization dataFromPropertyList: dict
+ format: NSPropertyListOpenStepFormat
+ errorDescription: &err];
+ if (data == nil)
+ {
+ NSLog(@"Failed to serialize defaults database for writing: %@", err);
+ }
+ else if ([data writeToFile: file atomically: YES] == NO)
+ {
+ NSLog(@"Failed to write defaults database to file: %@", file);
+ }
+ else
+ {
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+@end
+
+#endif // OOLITE_MODERN_BUILD
diff --git a/src/Core/OOCache.m b/src/Core/OOCache.m
index 8652ab858..09a7a02ff 100644
--- a/src/Core/OOCache.m
+++ b/src/Core/OOCache.m
@@ -126,6 +126,33 @@ - (id) copy;
typedef struct OOCacheImpl OOCacheImpl;
typedef struct OOCacheNode OOCacheNode;
+struct OOCacheImpl
+{
+ // Splay tree root
+ OOCacheNode *root;
+
+ // Ends of age list
+ OOCacheNode *oldest, *youngest;
+
+ unsigned count;
+ NSString *name;
+};
+
+
+struct OOCacheNode
+{
+ // Payload
+ id key;
+ id value;
+
+ // Splay tree
+ OOCacheNode *leftChild, *rightChild;
+
+ // Age list
+ OOCacheNode *younger, *older;
+};
+
+
enum { kCountUnknown = -1U };
@@ -389,32 +416,6 @@ - (void)loadFromArray:(NSArray *)array
/***** Most of the implementation. In C. Because I'm inconsistent and slightly m. *****/
-struct OOCacheImpl
-{
- // Splay tree root
- OOCacheNode *root;
-
- // Ends of age list
- OOCacheNode *oldest, *youngest;
-
- unsigned count;
- NSString *name;
-};
-
-
-struct OOCacheNode
-{
- // Payload
- id key;
- id value;
-
- // Splay tree
- OOCacheNode *leftChild, *rightChild;
-
- // Age list
- OOCacheNode *younger, *older;
-};
-
static OOCacheNode *CacheNodeAllocate(id key, id value);
static void CacheNodeFree(OOCacheImpl *cache, OOCacheNode *node);
static id CacheNodeGetValue(OOCacheNode *node);
diff --git a/src/Core/OOCocoa.h b/src/Core/OOCocoa.h
index 4a29a8020..333a52964 100644
--- a/src/Core/OOCocoa.h
+++ b/src/Core/OOCocoa.h
@@ -48,6 +48,14 @@ MA 02110-1301, USA.
#ifdef GNUSTEP
#define OOLITE_GNUSTEP 1
+ #if (((GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION >= 31) || (GNUSTEP_BASE_MAJOR_VERSION > 1)) && !OOLITE_MODERN_BUILD)
+ #error Oolite legacy build cannot be generated using GNUstep 1.31 or higher.
+ #endif
+
+ #if ((GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION < 28) && OOLITE_MODERN_BUILD)
+ #error Oolite modern build cannot be generated using GNUstep earlier than 1.28.
+ #endif
+
#if (GNUSTEP_BASE_MAJOR_VERSION == 1 && GNUSTEP_BASE_MINOR_VERSION >= 20) || (GNUSTEP_BASE_MAJOR_VERSION > 1)
#define OOLITE_GNUSTEP_1_20 1
#else
diff --git a/src/Core/OOOXZManager.m b/src/Core/OOOXZManager.m
index 4089f838f..28b2f83b8 100644
--- a/src/Core/OOOXZManager.m
+++ b/src/Core/OOOXZManager.m
@@ -580,6 +580,7 @@ - (void) setProgressStatus:(NSString *)new
- (BOOL) updateManifests
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self dataURL]]];
+ [request setHTTPShouldHandleCookies:NO];
if (_downloadStatus != OXZ_DOWNLOAD_NONE)
{
return NO;
diff --git a/src/Core/OOOpenGLExtensionManager.h b/src/Core/OOOpenGLExtensionManager.h
index 6650b8fcd..a243ada17 100644
--- a/src/Core/OOOpenGLExtensionManager.h
+++ b/src/Core/OOOpenGLExtensionManager.h
@@ -198,88 +198,88 @@ OOINLINE BOOL OOShadersSupported(void)
#if OO_SHADERS
// Shader functions
-PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
-PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
-PFNGLUNIFORM1IARBPROC glUniform1iARB;
-PFNGLUNIFORM1FARBPROC glUniform1fARB;
-PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
-PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
-PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
-PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
-PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
-PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
-PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
-PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
-PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
-PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
-PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
-PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
-PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
-PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
-PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
-PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
-PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
-PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
+extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
+extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
+extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
+extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
+extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
+extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
+extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
+extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
+extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
+extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
+extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
+extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
+extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
+extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
+extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
+extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
+extern PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
+extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
+extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
+extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
+extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
+extern PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
#endif // OO_SHADERS
#if OO_SHADERS || OO_MULTITEXTURE
-PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
+extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
#endif
#if OO_MULTITEXTURE
-PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
+extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
#endif
#if OO_USE_VBO
-PFNGLGENBUFFERSARBPROC glGenBuffersARB;
-PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
-PFNGLBINDBUFFERARBPROC glBindBufferARB;
-PFNGLBUFFERDATAARBPROC glBufferDataARB;
+extern PFNGLGENBUFFERSARBPROC glGenBuffersARB;
+extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
+extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
+extern PFNGLBUFFERDATAARBPROC glBufferDataARB;
#endif
#if OO_USE_FBO
-PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
-PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
-PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
-PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
-PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
-PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
-PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
-PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
-PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
-PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
-PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
-PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
-PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
-PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
-PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
-PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
-PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
-PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
-PFNGLGENBUFFERSPROC glGenBuffers;
-PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
-PFNGLBINDBUFFERPROC glBindBuffer;
-PFNGLBUFFERDATAPROC glBufferData;
-PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
-PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
-PFNGLUSEPROGRAMPROC glUseProgram;
-PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
-PFNGLUNIFORM1IPROC glUniform1i;
-PFNGLACTIVETEXTUREPROC glActiveTexture;
-PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
-PFNGLUNIFORM1FPROC glUniform1f;
-PFNGLUNIFORM2FVPROC glUniform2fv;
-PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
-PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
-PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
-PFNGLDELETEBUFFERSPROC glDeleteBuffers;
-PFNGLDRAWBUFFERSPROC glDrawBuffers;
-PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
-PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
-PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
-PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
-PFNGLCLAMPCOLORPROC glClampColor;
+extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
+extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
+extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
+extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
+extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
+extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
+extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
+extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
+extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
+extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
+extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLGENBUFFERSPROC glGenBuffers;
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLBINDBUFFERPROC glBindBuffer;
+extern PFNGLBUFFERDATAPROC glBufferData;
+extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
+extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
+extern PFNGLUSEPROGRAMPROC glUseProgram;
+extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
+extern PFNGLUNIFORM1IPROC glUniform1i;
+extern PFNGLACTIVETEXTUREPROC glActiveTexture;
+extern PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
+extern PFNGLUNIFORM1FPROC glUniform1f;
+extern PFNGLUNIFORM2FVPROC glUniform2fv;
+extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;
+extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
+extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLCLAMPCOLORPROC glClampColor;
#endif
#endif // OOLITE_WINDOWS
diff --git a/src/Core/OXPVerifier/OOOXPVerifier.m b/src/Core/OXPVerifier/OOOXPVerifier.m
index 0cf4487b8..c3c8d906f 100644
--- a/src/Core/OXPVerifier/OOOXPVerifier.m
+++ b/src/Core/OXPVerifier/OOOXPVerifier.m
@@ -34,7 +34,19 @@ of this software and associated documentation files (the "Software"), to deal
#if OO_OXP_VERIFIER_ENABLED
#if OOLITE_WINDOWS
+
+#ifdef __OBJC__
+#pragma push_macro("interface")
+#undef interface
+#define interface struct
+#endif
+
#include
+
+#ifdef __OBJC__
+#pragma pop_macro("interface")
+#endif
+
#include
#endif
diff --git a/src/Core/Universe.m b/src/Core/Universe.m
index 75341a815..37b2ee413 100644
--- a/src/Core/Universe.m
+++ b/src/Core/Universe.m
@@ -780,7 +780,7 @@ - (id) initWithGameView:(MyOpenGLView *)inGameView
});
#elif OOLITE_ESPEAK
int volume = [OOSound masterVolume] * 100;
- espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 100, NULL, 0);
+ espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 100, "Resources", 0);
espeak_SetParameter(espeakPUNCTUATION, espeakPUNCT_NONE, 0);
espeak_SetParameter(espeakVOLUME, volume, 0);
espeak_voices = espeak_ListVoices(NULL);