diff --git a/project/jni/application/ja2/AndroidAppSettings.cfg b/project/jni/application/ja2/AndroidAppSettings.cfg new file mode 100644 index 000000000..1260f8532 --- /dev/null +++ b/project/jni/application/ja2/AndroidAppSettings.cfg @@ -0,0 +1,262 @@ +# The application settings for Android libSDL port + +# Specify application name (e.x. My Application) +AppName="JaggedAlliance2" + +# Specify reversed site name of application (e.x. com.mysite.myapp) +AppFullName=com.opensourced.ja2 + +# Application version code (integer) +AppVersionCode=2347 + +# Application user-visible version name (string) +AppVersionName="0.12.10" + +# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...' +# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu +# If the URL in in the form ':dir/file.dat:http://URL/' it will be downloaded as binary BLOB to the application dir and not unzipped +# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir - +# these files are put inside .apk package by build system +# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS +AppDataDownloadUrl="!!JaggedAllianceData|ja2.zip" + +# Reset SDL config when updating application to the new version (y) / (n) +ResetSdlConfigForThisVersion=y + +# Delete application data files when upgrading (specify file/dir paths separated by spaces) +DeleteFilesOnUpgrade="" + +# Here you may type readme text, which will be shown during startup. Format is: +# Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/ +ReadmeText='' + +# libSDL version to use (1.2/1.3/2.0) +LibSdlVersion=1.2 + +# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape +ScreenOrientation=h + +# Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only +# with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32) +VideoDepthBpp=16 + +# Enable OpenGL depth buffer (needed only for 3-d applications, small speed decrease) (y) or (n) +NeedDepthBuffer=n + +# Enable OpenGL stencil buffer (needed only for 3-d applications, small speed decrease) (y) or (n) +NeedStencilBuffer=n + +# Try to use GLES 2.x context - will revert to GLES 1.X if unsupported by device +# you need this option only if you're developing 3-d app (y) or (n) +NeedGles2=n + +# Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL, +# this will allow small speed optimization. Enable this even when you're using SDL_HWSURFACE. (y) or (n) +SwVideoMode=y + +# Application video output will be resized to fit into native device screen (y)/(n) +SdlVideoResize=y + +# Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n) +SdlVideoResizeKeepAspect=n + +# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer +InhibitSuspend=y + +# Create Android service, so the app is less likely to be killed while in background +CreateService= + +# Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread - +# enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n) +CompatibilityHacksForceScreenUpdate=n + +# Application does not call SDL_Flip() or SDL_UpdateRects() after mouse click (ScummVM and all Amiga emulators do that) - +# force screen update by moving mouse cursor a little after each click (y) or (n) +CompatibilityHacksForceScreenUpdateMouseClick=y + +# Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n) +CompatibilityHacksStaticInit= + +# On-screen Android soft text input emulates hardware keyboard, this will only work with Hackers Keyboard app (y)/(n) +CompatibilityHacksTextInputEmulatesHwKeyboard= + +# Hack for broken devices: prevent audio chopping, by sleeping a bit after pushing each audio chunk (y)/(n) +CompatibilityHacksPreventAudioChopping= + +# Hack for broken apps: application ignores audio buffer size returned by SDL (y)/(n) +CompatibilityHacksAppIgnoresAudioBufferSize= + +# Hack for VCMI: preload additional shared libraries before aplication start +CompatibilityHacksAdditionalPreloadedSharedLibraries="" + +# Hack for Free Heroes 2, which redraws the screen inside SDL_PumpEvents(): slow and compatible SDL event queue - +# do not use it with accelerometer/gyroscope, or your app may freeze at random (y)/(n) +CompatibilityHacksSlowCompatibleEventQueue= + +# Save and restore OpenGL state when drawing on-screen keyboard for apps that use SDL_OPENGL +CompatibilityHacksTouchscreenKeyboardSaveRestoreOpenGLState= + +# Application uses SDL_UpdateRects() properly, and does not draw in any region outside those rects. +# This improves drawing speed, but I know only one application that does that, and it's written by me (y)/(n) +CompatibilityHacksProperUsageOfSDL_UpdateRects= + +# Application uses mouse (y) or (n), this will show mouse emulation dialog to the user +AppUsesMouse=y + +# Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n) +AppNeedsTwoButtonMouse=y + +# Right mouse button can do long-press/drag&drop action, necessary for some games (y) or (n) +# If you disable it, swiping with two fingers will send mouse wheel events +RightMouseButtonLongPress= + +# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n) +ShowMouseCursor= + +# Generate more touch events, by default SDL generates one event per one video frame, this is useful for drawing apps (y) or (n) +GenerateSubframeTouchEvents= + +# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n) +ForceRelativeMouseMode=n + +# Show on-screen dpad/joystick, that will act as arrow keys (y) or (n) +AppNeedsArrowKeys=y + +# On-screen dpad/joystick will appear under finger when it touches the screen (y) or (n) +# Joystick always follows finger, so moving mouse requires touching the screen with other finger +FloatingScreenJoystick= + +# Application needs text input (y) or (n), enables button for text input on screen +AppNeedsTextInput=y + +# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1 +# This will disable AppNeedsArrowKeys option +AppUsesJoystick=n + +# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n) +AppUsesSecondJoystick=n + +# Application uses third on-screen joystick, as SDL joystick 0 axes 20-21 (y)/(n) +AppUsesThirdJoystick= + +# Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7 +AppUsesAccelerometer= + +# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4 +AppUsesGyroscope= + +# Use gyroscope to move mouse cursor (y) or (n), it eats battery, and can be disabled in settings, do not use with AppUsesGyroscope setting +MoveMouseWithGyroscope= + +# Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0 +AppUsesMultitouch=n + +# Application records audio (it will use any available source, such a s microphone) +# API is defined in file SDL_android.h: int SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec); void SDL_ANDROID_CloseAudioRecording(void); +# This option will add additional permission to Android manifest (y)/(n) +AppRecordsAudio= + +# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n) +AccessSdCard= + +# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n) +AccessInternet= + +# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n) +ImmersiveMode= + +# Application implements Android-specific routines to put to background, and will not draw anything to screen +# between SDL_ACTIVEEVENT lost / gained notifications - you should check for them +# rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n) +# This option is reported to be buggy, sometimes failing to restore video state +NonBlockingSwapBuffers=n + +# Redefine common hardware keys to SDL keysyms +# BACK hardware key is available on all devices, MENU is available on pre-ICS devices, other keys may be absent +# SEARCH and CALL by default return same keycode as DPAD_CENTER - one of those keys is available on most devices +# Use word NO_REMAP if you want to preserve native functionality for certain key (volume keys are 3-rd and 4-th) +# Keys: TOUCHSCREEN (works only when AppUsesMouse=n), DPAD_CENTER/SEARCH, VOLUMEUP, VOLUMEDOWN, MENU, BACK, CAMERA +RedefinedKeys="LCTRL RETURN KP_PLUS KP_MINUS LCTRL" + +# Number of virtual keyboard keys (currently 6 is maximum) +AppTouchscreenKeyboardKeysAmount=5 + +# Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right) +RedefinedKeysScreenKb="LCTRL RETURN KP_PLUS KP_MINUS LCTRL" + +# Names for on-screen keyboard keys, such as Fire, Jump, Run etc, separated by spaces, they are used in SDL config menu +RedefinedKeysScreenKbNames="" + +# On-screen keys theme +# 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick) +# 1 = Simple Theme by Beholder (white, with gamepad joystick) +# 2 = Sun by Sirea (yellow, with round joystick) +# 3 = Keen by Gerstrong (multicolor, with round joystick) +TouchscreenKeysTheme=2 + +# Redefine gamepad keys to SDL keysyms, button order is: +# A B X Y L1 R1 L2 R2 LThumb RThumb +RedefinedKeysGamepad="" + +# How long to show startup menu button, in msec, 0 to disable startup menu +StartupMenuButtonTimeout=3000 + +# Menu items to hide from startup menu, available menu items: +# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced +HiddenMenuOptions='SettingsMenuMisc.OptionalDownloadConfig' + +# Menu items to show at startup - this is Java code snippet, leave empty for default +# new SettingsMenuMisc.ShowReadme(), (AppUsesMouse \&\& \! ForceRelativeMouseMode \? new SettingsMenuMouse.DisplaySizeConfig(true) : new SettingsMenu.DummyMenu()), new SettingsMenuMisc.OptionalDownloadConfig(true), new SettingsMenuMisc.GyroscopeCalibration() +# Available menu items: +# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout SettingsMenuKeyboard.ScreenKeyboardAdvanced +FirstStartMenuOptions='' + +# Specify architectures to compile, 'all' or 'y' to compile for all architectures. +# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips +MultiABI='armeabi-v7a' + +# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower +AppMinimumRAM=0 + +# Optional shared libraries to compile - removing some of them will save space +# MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed +# Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2 +CompiledLibraries="jpeg png boost_filesystem boost_system" + +# Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n) +CustomBuildScript=y + +# Aditional CFLAGS for application +AppCflags='' + +# Additional LDFLAGS for application +AppLdflags='' + +# If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable +AppOverlapsSystemHeaders= + +# Build only following subdirs (empty will build all dirs, ignored with custom script) +AppSubdirsBuild='' + +# Exclude these files from build +AppBuildExclude='' + +# Application command line parameters, including app name as 0-th param +AppCmdline='ja2 -resversion ENGLISH' + +# Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens +# Minimum screen size that application supports: (s)mall / (m)edium / (l)arge +MinimumScreenSize= + +# Your AdMob Publisher ID, (n) if you don't want advertisements +AdmobPublisherId= + +# Your AdMob test device ID, to receive a test ad +AdmobTestDeviceId= + +# Your AdMob banner size (BANNER/FULL_BANNER/LEADERBOARD/MEDIUM_RECTANGLE/SMART_BANNER/WIDE_SKYSCRAPER/FULL_WIDTH:Height/Width:AUTO_HEIGHT/Width:Height) +AdmobBannerSize= + +# Google Play Game Services application ID, required for cloud saves to work +GooglePlayGameServicesId= + diff --git a/project/jni/application/ja2/AndroidBuild.sh b/project/jni/application/ja2/AndroidBuild.sh new file mode 100755 index 000000000..c921742e1 --- /dev/null +++ b/project/jni/application/ja2/AndroidBuild.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +[ -e src-$1 ] || { + git clone --depth 1 https://bitbucket.org/gennady/ja2-stracciatella.git src-$1 || exit 1 + patch -p1 -d src-$1 < ja2.patch || exit 1 +} || exit 1 + +../setEnvironment-$1.sh sh -c "make -j4 -C src-$1 WITH_LPTHREAD=0" && cp -f src-$1/ja2 libapplication-$1.so diff --git a/project/jni/application/ja2/AndroidData/ja2.zip b/project/jni/application/ja2/AndroidData/ja2.zip new file mode 100644 index 000000000..4418fad56 Binary files /dev/null and b/project/jni/application/ja2/AndroidData/ja2.zip differ diff --git a/project/jni/application/ja2/icon.png b/project/jni/application/ja2/icon.png new file mode 100644 index 000000000..9f82422e6 Binary files /dev/null and b/project/jni/application/ja2/icon.png differ diff --git a/project/jni/application/ja2/ja2.patch b/project/jni/application/ja2/ja2.patch new file mode 100644 index 000000000..f0b7ac9b9 --- /dev/null +++ b/project/jni/application/ja2/ja2.patch @@ -0,0 +1,516 @@ +diff --git a/Makefile b/Makefile +index a21c6b5..8a65a69 100644 +--- a/Makefile ++++ b/Makefile +@@ -55,7 +55,7 @@ endif + endif + + CFLAGS += $(CFLAGS_SDL) +-LDFLAGS += $(LDFLAGS_SDL) ++LDFLAGS += $(LDFLAGS_SDL) -lboost_filesystem -lboost_system + + ############################################################ + # MinGW settings for building on Windows and for +@@ -98,7 +98,8 @@ CFLAGS += -I Build/Utils + CFLAGS += -I sgp + CFLAGS += -I src + CFLAGS += -I _build/lib-MicroIni/include +-CFLAGS += -I _build/lib-boost ++#CFLAGS += -I _build/lib-boost ++CFLAGS += -I ../../../boost/include + CFLAGS += -I _build/lib-rapidjson + CFLAGS += -I _build/lib-slog + CFLAGS += -I _build/lib-smacker/libsmacker +@@ -522,15 +523,15 @@ SRCS += _build/lib-MicroIni/src/MicroIni/Line.cpp + SRCS += _build/lib-MicroIni/src/MicroIni/Section.cpp + SRCS += _build/lib-MicroIni/src/MicroIni/Value.cpp + +-SRCS += _build/lib-boost/libs/system/src/error_code.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/codecvt_error_category.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/operations.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/path.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/path_traits.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/portability.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/unique_path.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/utf8_codecvt_facet.cpp +-SRCS += _build/lib-boost/libs/filesystem/src/windows_file_codecvt.cpp ++#SRCS += _build/lib-boost/libs/system/src/error_code.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/codecvt_error_category.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/operations.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/path.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/path_traits.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/portability.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/unique_path.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/utf8_codecvt_facet.cpp ++#SRCS += _build/lib-boost/libs/filesystem/src/windows_file_codecvt.cpp + + SRCS += _build/lib-slog/slog/slog.c + +diff --git a/_build/lib-slog/slog/slog.c b/_build/lib-slog/slog/slog.c +index 87ceb53..3799dbc 100644 +--- a/_build/lib-slog/slog/slog.c ++++ b/_build/lib-slog/slog/slog.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + #if defined(_MSC_VER) + /* Visual Studio */ +@@ -152,6 +153,8 @@ void SLOG_LogMessage(SLOGLevel level, const char *tag, const char *format, ...) + + buf[size] = 0; + ++ __android_log_print(ANDROID_LOG_INFO, "JA2", "%s", buf); ++ + if(logToConsole) + { + write(s_consoleFD, buf, size); +diff --git a/ja2config.h b/ja2config.h +index cb3f1f9..d2659ec 100644 +--- a/ja2config.h ++++ b/ja2config.h +@@ -1,3 +1,3 @@ + /* location of externalized data, mods, unittests files, etc */ + /* when empty - the same directory as ja2 binary */ +-#define EXTRA_DATA_DIR "" ++#define EXTRA_DATA_DIR "." +diff --git a/sgp/Debug.cc b/sgp/Debug.cc +index 3ce95c3..c9c00f1 100644 +--- a/sgp/Debug.cc ++++ b/sgp/Debug.cc +@@ -1,4 +1,5 @@ + #include "Debug.h" ++#include "Logger.h" + + #if defined ( SGP_DEBUG ) || defined ( FORCE_ASSERTS_ON ) + +@@ -38,8 +39,9 @@ BOOLEAN InitializeDebugManager(void) + + void DebugMsg(TopicID uiTopicId, DebugLevel uiDebugLevel, const char* strMessage) + { +- fprintf(stderr, "%s\n", strMessage); ++ printf("%s\n", strMessage); + ++/* + //add _NO_DEBUG_TXT to your SGP preprocessor definitions to avoid this f**king huge file from + //slowly growing behind the scenes!!!! + #ifndef _NO_DEBUG_TXT +@@ -50,6 +52,7 @@ void DebugMsg(TopicID uiTopicId, DebugLevel uiDebugLevel, const char* strMessage + fclose(OutFile); + } + #endif ++*/ + } + + +@@ -67,9 +70,8 @@ static void _DebugRecordToDebugger(BOOLEAN gfState) + + void _DebugMessage(const char* pString, UINT32 uiLineNum, const char* pSourceFile) + { +- char ubOutputString[512]; +- sprintf(ubOutputString, "{ %ld } %s [Line %d in %s]\n", GetClock(), pString, uiLineNum, pSourceFile); +- ++ printf("{ %ld } %s [Line %d in %s]\n", GetClock(), pString, uiLineNum, pSourceFile); ++/* + if (gfRecordToDebugger) + { + fputs(ubOutputString, stderr); +@@ -86,17 +88,17 @@ void _DebugMessage(const char* pString, UINT32 uiLineNum, const char* pSourceFil + } + } + #endif ++*/ + } + + + void _FailMessage(const char *pString, UINT32 uiLineNum, const char *pSourceFile) + { +- char ubOutputString[512]; + if (pString != NULL) +- sprintf(ubOutputString, "{ %ld } Assertion Failure [Line %d in %s]: %s\n", GetClock(), uiLineNum, pSourceFile, pString); ++ printf("{ %ld } Assertion Failure [Line %d in %s]: %s\n", GetClock(), uiLineNum, pSourceFile, pString); + else +- sprintf(ubOutputString, "{ %ld } Assertion Failure [Line %d in %s]\n", GetClock(), uiLineNum, pSourceFile); +- ++ printf("{ %ld } Assertion Failure [Line %d in %s]\n", GetClock(), uiLineNum, pSourceFile); ++/* + //Output to debugger + if (gfRecordToDebugger) + fputs(ubOutputString, stderr); +@@ -113,7 +115,7 @@ void _FailMessage(const char *pString, UINT32 uiLineNum, const char *pSourceFile + } + } + #endif +- ++*/ + SDL_Quit(); + abort(); + } +diff --git a/sgp/Debug.h b/sgp/Debug.h +index 05717f9..6285a33 100644 +--- a/sgp/Debug.h ++++ b/sgp/Debug.h +@@ -9,6 +9,7 @@ + #define DEBUG_PRINT_GAME_CYCLE_TIME (0) /**< Flag telling to print how much time every game cycle takes. */ + + ++#define SGP_DEBUG 1 + #if defined ( SGP_DEBUG ) || defined ( FORCE_ASSERTS_ON ) + + // If DEBUG_ is defined, we need to initialize all the debug macros. Otherwise all the +diff --git a/sgp/FileMan.cc b/sgp/FileMan.cc +index 38d8b36..a5de49f 100644 +--- a/sgp/FileMan.cc ++++ b/sgp/FileMan.cc +@@ -104,6 +104,7 @@ std::string FileMan::findConfigFolderAndSwitchIntoIt() + } + #else + const char* home = getenv("HOME"); ++ return home; // Do not create extra dirs on Android + if (home == NULL) + { + const struct passwd* const passwd = getpwuid(getuid()); +@@ -152,6 +153,7 @@ std::string FileMan::findConfigFolderAndSwitchIntoIt() + int FileMan::openFileCaseInsensitive(const std::string &folderPath, const char *filename, int mode) + { + std::string path = FileMan::joinPaths(folderPath, filename); ++ SLOGD(TAG, "%s: open file %s\n", __func__, path.c_str()); + int d = open(path.c_str(), mode); + if (d < 0) + { +diff --git a/sgp/FileMan.h b/sgp/FileMan.h +index a7f96cb..6d7a64f 100644 +--- a/sgp/FileMan.h ++++ b/sgp/FileMan.h +@@ -11,7 +11,7 @@ + # define WIN32_LEAN_AND_MEAN + # include + #else +-# include ++//# include + #endif + + /* Delete the file at path. Returns true iff deleting the file succeeded or +diff --git a/sgp/LibraryDataBase.cc b/sgp/LibraryDataBase.cc +index 2205166..039a202 100644 +--- a/sgp/LibraryDataBase.cc ++++ b/sgp/LibraryDataBase.cc +@@ -1,5 +1,8 @@ + #include + #include ++#ifdef WITH_UNITTESTS ++#include "gtest/gtest.h" ++#endif + + #include "Types.h" + #include "FileMan.h" +diff --git a/sgp/Logger.h b/sgp/Logger.h +index 771e515..d7995d3 100644 +--- a/sgp/Logger.h ++++ b/sgp/Logger.h +@@ -6,6 +6,7 @@ + * General logging + ***********************************************************/ + ++#include "../../../android_debug.h" + /** Available log levels. */ + enum + { +@@ -16,7 +17,7 @@ enum + }; + + /** Current log level. */ +-#define LOG_LEVEL (LOGLEVEL_INFO) ++#define LOG_LEVEL (LOGLEVEL_DEBUG) + + #if LOG_LEVEL >= LOGLEVEL_ERROR + #define LOG_ERROR printf +diff --git a/sgp/Platform.h b/sgp/Platform.h +index 263f9b1..57d377c 100644 +--- a/sgp/Platform.h ++++ b/sgp/Platform.h +@@ -12,7 +12,7 @@ + #define PATH_SEPARATOR '\\' + #define PATH_SEPARATOR_STR "\\" + #else +-#define CASE_SENSITIVE_FS 1 ++#define CASE_SENSITIVE_FS 0 // SD card on Android is case-insensitive + #define PATH_SEPARATOR '/' + #define PATH_SEPARATOR_STR "/" + #endif +diff --git a/sgp/SGP.cc b/sgp/SGP.cc +index d156d73..66d7cf0 100644 +--- a/sgp/SGP.cc ++++ b/sgp/SGP.cc +@@ -13,6 +13,9 @@ + + #include + #include ++#ifdef WITH_UNITTESTS ++#include "gtest/gtest.h" ++#endif + + #include "Button_System.h" + #include "Debug.h" +@@ -49,9 +52,6 @@ + #include "slog/slog.h" + #define TAG "SGP" + +-#ifdef WITH_UNITTESTS +-#include "gtest/gtest.h" +-#endif + + #if defined _WIN32 + # define WIN32_LEAN_AND_MEAN +@@ -318,7 +318,7 @@ static BOOLEAN ParseParameters(int argc, char* const argv[], + int main(int argc, char* argv[]) + try + { +- std::string exeFolder = FileMan::getParentPath(argv[0], true); ++ //std::string exeFolder = FileMan::getParentPath(argv[0], true); + + #if defined BROKEN_SWPRINTF + if (setlocale(LC_CTYPE, "UTF-8") == NULL) +@@ -361,10 +361,12 @@ try + setGameVersion(version); + + //////////////////////////////////////////////////////////// ++ SLOGD(TAG, "Starting %s:%d\n", __FILE__,__LINE__); + + SDL_Init(SDL_INIT_VIDEO); + SDL_EnableUNICODE(SDL_ENABLE); + ++ SLOGD(TAG, "Starting %s:%d\n", __FILE__,__LINE__); + #ifdef __APPLE__ + // Enable 3-button mouse support if the user haven't instructed + // otherwise +@@ -380,6 +382,7 @@ try + freopen("CON", "w", stderr); + #endif + ++ SLOGD(TAG, "Starting %s:%d\n", __FILE__,__LINE__); + #ifdef SGP_DEBUG + // Initialize the Debug Manager - success doesn't matter + InitializeDebugManager(); +@@ -398,7 +401,7 @@ try + if(extraDataDir.empty()) + { + // use location of the exe file +- extraDataDir = exeFolder; ++ //extraDataDir = exeFolder; + } + + std::string externalizedDataPath = FileMan::joinPaths(extraDataDir, "externalized"); +@@ -428,6 +431,7 @@ try + else + #endif + { ++ SLOGD(TAG, "Starting %s:%d\n", __FILE__,__LINE__); + cm = new DefaultContentManager(version, + configFolderPath, + gameResRootPath, externalizedDataPath); +@@ -775,7 +779,7 @@ static void WriteDefaultConfigFile(const char* ConfigFile) + #ifdef _WIN32 + fprintf(IniFile, "data_dir = C:\\Program Files\\Jagged Alliance 2"); + #else +- fprintf(IniFile, "data_dir = /some/place/where/the/data/is"); ++ fprintf(IniFile, "data_dir = ."); + #endif + fclose(IniFile); + fprintf(stderr, "Please edit \"%s\" to point to the binary data.\n", ConfigFile); +diff --git a/src/DefaultContentManager.cc b/src/DefaultContentManager.cc +index b7e4971..25bec4b 100644 +--- a/src/DefaultContentManager.cc ++++ b/src/DefaultContentManager.cc +@@ -602,8 +602,10 @@ const AmmoTypeModel* DefaultContentManager::getAmmoType(uint8_t index) + + bool DefaultContentManager::loadWeapons() + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + AutoSGPFile f(openGameResForReading("weapons.json")); + std::string jsonData = FileMan::fileReadText(f); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + rapidjson::Document document; + if (document.Parse<0>(jsonData.c_str()).HasParseError()) +@@ -613,6 +615,7 @@ bool DefaultContentManager::loadWeapons() + } + else + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + if(document.IsArray()) { + const rapidjson::Value& a = document; + for (rapidjson::SizeType i = 0; i < a.Size(); i++) +@@ -632,6 +635,7 @@ bool DefaultContentManager::loadWeapons() + } + } + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + return true; + } +@@ -675,8 +679,11 @@ bool DefaultContentManager::loadMagazines() + + bool DefaultContentManager::loadCalibres() + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + AutoSGPFile f(openGameResForReading("calibres.json")); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + std::string jsonData = FileMan::fileReadText(f); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + rapidjson::Document document; + if (document.Parse<0>(jsonData.c_str()).HasParseError()) +@@ -686,6 +693,7 @@ bool DefaultContentManager::loadCalibres() + } + else + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + if(document.IsArray()) { + const rapidjson::Value& a = document; + for (rapidjson::SizeType i = 0; i < a.Size(); i++) +@@ -703,19 +711,23 @@ bool DefaultContentManager::loadCalibres() + } + } + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + BOOST_FOREACH(const CalibreModel* calibre, m_calibres) + { + m_calibreMap.insert(std::make_pair(std::string(calibre->internalName), calibre)); + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + return true; + } + + bool DefaultContentManager::loadAmmoTypes() + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + AutoSGPFile f(openGameResForReading("ammo_types.json")); + std::string jsonData = FileMan::fileReadText(f); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + rapidjson::Document document; + if (document.Parse<0>(jsonData.c_str()).HasParseError()) +@@ -725,6 +737,7 @@ bool DefaultContentManager::loadAmmoTypes() + } + else + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + if(document.IsArray()) { + const rapidjson::Value& a = document; + for (rapidjson::SizeType i = 0; i < a.Size(); i++) +@@ -742,12 +755,14 @@ bool DefaultContentManager::loadAmmoTypes() + } + } + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + BOOST_FOREACH(const AmmoTypeModel* ammoType, m_ammoTypes) + { + m_ammoTypeMap.insert(std::make_pair(std::string(ammoType->internalName), ammoType)); + } + ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + return true; + } + +@@ -755,8 +770,10 @@ bool DefaultContentManager::readWeaponTable( + const char *fileName, + std::vector > & weaponTable) + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + AutoSGPFile f(openGameResForReading(fileName)); + std::string jsonData = FileMan::fileReadText(f); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + rapidjson::Document document; + if (document.Parse<0>(jsonData.c_str()).HasParseError()) +@@ -764,6 +781,7 @@ bool DefaultContentManager::readWeaponTable( + SLOGE(TAG, "Failed to parse %s", fileName); + return false; + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + if(document.IsArray()) + { +@@ -780,6 +798,7 @@ bool DefaultContentManager::readWeaponTable( + } + } + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + return true; + } +@@ -796,12 +815,14 @@ const std::vector > & DefaultContentManager::get + + bool DefaultContentManager::loadArmyGunChoice() + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + return readWeaponTable("army-gun-choice-normal.json", mNormalGunChoice) + && readWeaponTable("army-gun-choice-extended.json", mExtendedGunChoice); + } + + void DefaultContentManager::loadStringRes(const char *name, std::vector &strings) const + { ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + std::string fullName(name); + + switch(m_gameVersion) +@@ -819,6 +840,7 @@ void DefaultContentManager::loadStringRes(const char *name, std::vector json(readJsonDataFile(fullName.c_str())); +@@ -828,12 +850,15 @@ void DefaultContentManager::loadStringRes(const char *name, std::vectorgetInternalName(), item)); + } ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + loadAllDealersInventory(); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + boost::shared_ptr game_json(readJsonDataFile("game.json")); + m_gamePolicy = new DefaultGamePolicy(game_json.get()); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + boost::shared_ptr imp_json(readJsonDataFile("imp.json")); + m_impPolicy = new DefaultIMPPolicy(imp_json.get(), this); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + loadStringRes("strings/ammo-calibre", m_calibreNames); + loadStringRes("strings/ammo-calibre-bobbyray", m_calibreNamesBobbyRay); + + loadStringRes("strings/new-strings", m_newStrings); ++ SLOGD(TAG, "%s:%d\n", __FILE__,__LINE__); + + return result; + }