now engine can be optionally built as library, there's an example wrapper of how to use it
building server is now disabled by default, saves users some headaches
--- a/CMakeLists.txt Fri Jun 04 20:50:24 2010 +0000
+++ b/CMakeLists.txt Sat Jun 05 14:07:58 2010 +0000
@@ -39,6 +39,14 @@
# MESSAGE(FATAL_ERROR "In-tree-build detected!")
#ENDIF (${CMAKE_SOURCE_DIR} MATCHES ${CMAKE_BINARY_DIR})
+#set some safe values
+IF(NOT WITH_SERVER)
+ SET(WITH_SERVER 0)
+ENDIF(NOT WITH_SERVER)
+IF(NOT BUILD_ENGINE_LIBRARY)
+ SET(BUILD_ENGINE_LIBRARY 0)
+ENDIF(NOT BUILD_ENGINE_LIBRARY)
+
if(APPLE)
set(CMAKE_FIND_FRAMEWORK "FIRST")
@@ -92,17 +100,18 @@
set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX10.4u.sdk/")
if(current_macosx_version MATCHES "10.4")
find_package(SDL_mixer REQUIRED)
- set(pascal_compiler_flags_cmn "-k-dylib_file @loader_path/Frameworks/smpeg.framework/Versions/A/smpeg:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/smpeg.framework/Versions/A/smpeg" ${pascal_compiler_flags_cmn})
- set(pascal_compiler_flags_cmn "-k-dylib_file @loader_path/Frameworks/mikmod.framework/Versions/A/mikmod:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/mikmod.framework/Versions/A/mikmod" ${pascal_compiler_flags_cmn})
+ set(pascal_compiler_flags_cmn "-k-dylib_file @loader_path/Frameworks/smpeg.framework/Versions/A/smpeg:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/smpeg.framework/Versions/A/smpeg" "-k-dylib_file @loader_path/Frameworks/mikmod.framework/Versions/A/mikmod:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/mikmod.framework/Versions/A/mikmod" ${pascal_compiler_flags_cmn})
set(CMAKE_C_FLAGS "-dylib_file @loader_path/Frameworks/smpeg.framework/Versions/A/smpeg:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/smpeg.framework/Versions/A/smpeg -dylib_file @loader_path/Frameworks/mikmod.framework/Versions/A/mikmod:${SDLMIXER_LIBRARY}/Versions/A/Frameworks/mikmod.framework/Versions/A/mikmod")
endif()
else()
set(CMAKE_OSX_SYSROOT "/Developer/SDKs/MacOSX${minimum_macosx}.sdk/")
endif()
- #1.set deployment target; 2.link with libsdlmain.a; 3.link with liblua.a (which requires readline)
+ #1.set deployment target; 2.link with libsdlmain.a (when building an executable); 3.link with liblua.a (which requires readline)
set(pascal_compiler_flags_cmn "-k-macosx_version_min" "-k${minimum_macosx}" "-XR${CMAKE_OSX_SYSROOT}" ${pascal_compiler_flags_cmn})
- set(pascal_compiler_flags_cmn "-k${CMAKE_BINARY_DIR}/bin/libSDLmain.a" ${pascal_compiler_flags_cmn})
+ if(NOT BUILD_ENGINE_LIBRARY)
+ set(pascal_compiler_flags_cmn "-k${CMAKE_BINARY_DIR}/bin/libSDLmain.a" ${pascal_compiler_flags_cmn})
+ endif()
set(pascal_compiler_flags_cmn "-k${CMAKE_BINARY_DIR}/bin/liblua.a" "-k-lreadline" ${pascal_compiler_flags_cmn})
else(APPLE)
set(target_dir "bin")
@@ -161,6 +170,7 @@
set(HEDGEWARS_PROTO_VER 32)
if(WITH_SERVER)
+ message(STATUS "Server is going to be built! Make sure you have GHC installed")
set(HAVE_NETSERVER true)
add_subdirectory(gameServer)
else(WITH_SERVER)
--- a/cocoaTouch/GameSetup.m Fri Jun 04 20:50:24 2010 +0000
+++ b/cocoaTouch/GameSetup.m Sat Jun 05 14:07:58 2010 +0000
@@ -397,7 +397,7 @@
CGRect screenBounds = [[UIScreen mainScreen] bounds];
NSString *wSize = [[NSString alloc] initWithFormat:@"%d", (int) screenBounds.size.width];
NSString *hSize = [[NSString alloc] initWithFormat:@"%d", (int) screenBounds.size.height];
- const char **gameArgs = (const char**) malloc(sizeof(char *) * 8);
+ const char **gameArgs = (const char**) malloc(sizeof(char *) * 9);
/*
size_t size;
@@ -435,6 +435,7 @@
gameArgs[5] = [[[self.systemSettings objectForKey:@"alternate"] stringValue] UTF8String]; //cAltDamage
gameArgs[6] = [wSize UTF8String]; //cScreenHeight
gameArgs[7] = [hSize UTF8String]; //cScreenWidth
+ gameArgs[8] = NULL; //recordFileName
[wSize release];
[hSize release];
--- a/cocoaTouch/MapConfigViewController.h Fri Jun 04 20:50:24 2010 +0000
+++ b/cocoaTouch/MapConfigViewController.h Sat Jun 05 14:07:58 2010 +0000
@@ -65,6 +65,6 @@
-(void) setLabelText:(NSString *)str;
-(void) setButtonImage:(UIImage *)img;
--(uint8_t *)engineProtocol:(NSInteger) port;
+-(const uint8_t *)engineProtocol:(NSInteger) port;
@end
--- a/cocoaTouch/MapConfigViewController.m Fri Jun 04 20:50:24 2010 +0000
+++ b/cocoaTouch/MapConfigViewController.m Sat Jun 05 14:07:58 2010 +0000
@@ -33,10 +33,10 @@
return SDLNet_TCP_Send(csd, [string UTF8String], length);
}
--(uint8_t *)engineProtocol:(NSInteger) port {
+-(const uint8_t *)engineProtocol:(NSInteger) port {
IPaddress ip;
BOOL serverQuit = NO;
- uint8_t map[128*32];
+ static uint8_t map[128*32];
if (SDLNet_Init() < 0) {
NSLog(@"SDLNet_Init: %s", SDLNet_GetError());
@@ -93,7 +93,7 @@
// select the port for IPC and launch the preview generation through engineProtocol:
int port = randomPort();
- uint8_t *map = [self engineProtocol:port];
+ const uint8_t *map = [self engineProtocol:port];
uint8_t mapExp[128*32*8];
// draw the buffer (1 pixel per component, 0= transparent 1= color)
--- a/cocoaTouch/otherSrc/CommodityFunctions.m Fri Jun 04 20:50:24 2010 +0000
+++ b/cocoaTouch/otherSrc/CommodityFunctions.m Sat Jun 05 14:07:58 2010 +0000
@@ -7,7 +7,6 @@
//
#import "CommodityFunctions.h"
-#import "SDL_uikitappdelegate.h"
#import <mach/mach.h>
#import <mach/mach_host.h>
--- a/hedgewars/CMakeLists.txt Fri Jun 04 20:50:24 2010 +0000
+++ b/hedgewars/CMakeLists.txt Sat Jun 05 14:07:58 2010 +0000
@@ -11,24 +11,24 @@
#if the headers are not installed, the newer apis won't be activated
find_file(sdlmixer_h SDL_mixer.h ${SDLMIXER_INCLUDE_DIR})
if(sdlmixer_h)
-file(STRINGS ${sdlmixer_h} sdlmixer_version_tmp REGEX "SDL_MIXER_PATCHLEVEL[\t' ']+[0-9]+")
-string(REGEX MATCH ".([0-9]+)" sdlmixer_version "${sdlmixer_version_tmp}")
+ file(STRINGS ${sdlmixer_h} sdlmixer_version_tmp REGEX "SDL_MIXER_PATCHLEVEL[\t' ']+[0-9]+")
+ string(REGEX MATCH ".([0-9]+)" sdlmixer_version "${sdlmixer_version_tmp}")
-if(sdlmixer_version GREATER 9)
-message(STATUS "Enabling enhanced SDL_Mixer calls")
-set(pascal_compiler_flags_cmn "-dSDL_MIXER_NEWER" ${pascal_compiler_flags_cmn})
-endif()
+ if(sdlmixer_version GREATER 9)
+ message(STATUS "Enabling enhanced SDL_Mixer calls")
+ set(pascal_compiler_flags_cmn "-dSDL_MIXER_NEWER" ${pascal_compiler_flags_cmn})
+ endif()
endif()
find_file(sdlimage_h SDL_image.h ${SDLIMAGE_INCLUDE_DIR})
if(sdlimage_h)
-file(STRINGS ${sdlimage_h} sdlimage_version_tmp REGEX "SDL_IMAGE_PATCHLEVEL[\t' ']+[0-9]+")
-string(REGEX MATCH ".([0-9]+)" sdlimage_version "${sdlimage_version_tmp}")
+ file(STRINGS ${sdlimage_h} sdlimage_version_tmp REGEX "SDL_IMAGE_PATCHLEVEL[\t' ']+[0-9]+")
+ string(REGEX MATCH ".([0-9]+)" sdlimage_version "${sdlimage_version_tmp}")
-if(sdlimage_version GREATER 7)
-message(STATUS "Enabling enhanced SDL_Image calls")
-set(pascal_compiler_flags_cmn "-dSDL_IMAGE_NEWER" ${pascal_compiler_flags_cmn})
-endif()
+ if(sdlimage_version GREATER 7)
+ message(STATUS "Enabling enhanced SDL_Image calls")
+ set(pascal_compiler_flags_cmn "-dSDL_IMAGE_NEWER" ${pascal_compiler_flags_cmn})
+ endif()
endif()
#SOURCE AND PROGRAMS SECTION
@@ -78,6 +78,14 @@
${CMAKE_CURRENT_BINARY_DIR}/config.inc
)
+if(BUILD_ENGINE_LIBRARY)
+ message(STATUS "Engine will be built as library (experimental)")
+ set(hwengine_project ${hedgewars_SOURCE_DIR}/hedgewars/hwLibrary.pas)
+ set(engine_sources ${hwengine_project} PascalExports.pas ${engine_sources})
+ set(pascal_compiler_flags_cmn "-dHWLIBRARY" "-k-no_order_inits" ${pascal_compiler_flags_cmn})
+endif(BUILD_ENGINE_LIBRARY)
+
+
find_program(fpc_executable ${fpc_tryexe})
if(fpc_executable)
@@ -133,8 +141,8 @@
#DEPENDECIES AND EXECUTABLES SECTION
-IF(NOT APPLE)
-#here is the standard command for any system
+IF(NOT APPLE OR BUILD_ENGINE_LIBRARY)
+ #here is the command for standard executables or for shared library
add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/hwengine${CMAKE_EXECUTABLE_SUFFIX}"
COMMAND "${pascal_compiler}"
ARGS ${pascal_compiler_flags}
@@ -145,7 +153,6 @@
#let's build sdlmain, which is absent from the framework
find_package(SDL REQUIRED)
-# set(CMAKE_OSX_ARCHITECTURES "x86_64;i386;ppc7400")
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
include_directories(${SDL_INCLUDE_DIR})
--- a/hedgewars/hwengine.pas Fri Jun 04 20:50:24 2010 +0000
+++ b/hedgewars/hwengine.pas Sat Jun 05 14:07:58 2010 +0000
@@ -73,7 +73,7 @@
var isTerminated: boolean = false;
alsoShutdownFrontend: boolean = false;
{$IFDEF HWLIBRARY}
-type arrayofpchar = array[0..7] of PChar;
+type arrayofpchar = array[0..8] of PChar;
procedure initEverything;
procedure freeEverything;
@@ -265,6 +265,7 @@
val(gameArgs[7], cScreenWidth);
cInitHeight:= cScreenHeight;
cInitWidth:= cScreenWidth;
+ recordFileName:= gameArgs[8];
{$ENDIF}
for p:= Succ(Low(TPathType)) to High(TPathType) do
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/wrapper.c Sat Jun 05 14:07:58 2010 +0000
@@ -0,0 +1,32 @@
+/*
+ This is an experimental main to use with hwLibary
+ - create the library with `cmake . -DBUILD_ENGINE_LIBRARY=1' and `make hwengine'
+ - compile this file with `gcc libhwLibrary.dylib libSDLmain.a wrapper.c -o wrapper -framework Cocoa -framework SDL'
+ (in Mac OS X, but this command line shouldn't be much different in other OSes; make sure to set the correct files/paths)
+ - this executable expect a save file "Save.hws" and the data folder "Data" to be in the same launching directory
+ */
+
+#import <stdio.h>
+#import <stdlib.h>
+
+extern void Game (const char **);
+
+int SDL_main (int argc, const char **argv) {
+
+ const char **gameArgs = (const char**) malloc(sizeof(char *) * 9);
+
+ gameArgs[0] = "wrapper"; //UserNick
+ gameArgs[1] = "0"; //ipcPort
+ gameArgs[2] = "0"; //isSoundEnabled
+ gameArgs[3] = "0"; //isMusicEnabled
+ gameArgs[4] = "en.txt"; //cLocaleFName
+ gameArgs[5] = "0"; //cAltDamage
+ gameArgs[6] = "768"; //cScreenHeight
+ gameArgs[7] = "1024"; //cScreenHeight
+ gameArgs[8] = "Save.hws"; //recordFileName
+
+ Game(gameArgs);
+ free(gameArgs);
+
+ return 0;
+}