2011-05-19 00:04:45 +02:00
// This file is part of Glest (www.glest.org)
//
2011-12-14 08:40:48 +01:00
// Copyright (C) 2001-2008 Marti<74> o Figueroa
2011-05-19 00:04:45 +02:00
//
// You can redistribute this code 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
// ==============================================================
# include "math_wrapper.h"
# include "main.h"
# include <string>
# include <cstdlib>
# include "game.h"
# include "main_menu.h"
# include "program.h"
# include "config.h"
# include "metrics.h"
# include "game_util.h"
# include "platform_util.h"
# include "platform_main.h"
# include "network_interface.h"
# include "ImageReaders.h"
# include "renderer.h"
# include "simple_threads.h"
# include <memory>
# include "font.h"
# include <curl/curl.h>
# include "menu_state_masterserver.h"
# include "checksum.h"
# include <algorithm>
# include "sound_renderer.h"
# include "font_gl.h"
# include "FileReader.h"
# include "cache_manager.h"
# include <iterator>
# include "core_data.h"
2011-06-07 04:37:58 +02:00
# include "font_text.h"
2011-12-01 03:31:00 +01:00
# include <locale.h>
2011-12-01 09:05:36 +01:00
# include "string_utils.h"
2012-03-17 09:20:17 +01:00
# include "auto_test.h"
2011-05-19 00:04:45 +02:00
// For gcc backtrace on crash!
# if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__FreeBSD__) && !defined(BSD)
//#include <mcheck.h>
# include <execinfo.h>
# include <cxxabi.h>
# include <signal.h>
# endif
# ifdef WIN32
# if defined(__WIN32__) && !defined(__GNUC__)
# include <eh.h>
# endif
# include <dbghelp.h>
# endif
2011-06-07 00:37:27 +02:00
# include <stdlib.h>
2011-05-19 00:04:45 +02:00
# include "leak_dumper.h"
# ifndef WIN32
2011-09-27 12:16:09 +02:00
# include <poll.h>
2011-05-19 00:04:45 +02:00
# define stricmp strcasecmp
# define strnicmp strncasecmp
# define _strnicmp strncasecmp
# endif
# ifdef WIN32
# ifndef _DEBUG
# ifndef __GNUC__
# define WIN32_STACK_TRACE
# endif
# endif
# endif
using namespace std ;
using namespace Shared : : Platform ;
using namespace Shared : : Util ;
using namespace Shared : : Graphics ;
using namespace Shared : : Graphics : : Gl ;
using namespace Shared : : Xml ;
2011-10-01 01:55:07 +02:00
using namespace Shared ;
2011-05-19 00:04:45 +02:00
namespace Glest { namespace Game {
2011-11-16 06:20:35 +01:00
bool disableheadless_console = false ;
2011-05-19 00:04:45 +02:00
bool disableBacktrace = false ;
bool gameInitialized = false ;
static string application_binary = " " ;
static string mg_app_name = " " ;
static string mailStringSupport = " " ;
static bool sdl_quitCalled = false ;
2012-03-28 00:44:16 +02:00
Program * mainProgram = NULL ;
2011-05-19 00:04:45 +02:00
FileCRCPreCacheThread * preCacheThread = NULL ;
string runtimeErrorMsg = " " ;
void cleanupCRCThread ( ) {
if ( preCacheThread ! = NULL ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
time_t elapsed = time ( NULL ) ;
preCacheThread - > signalQuit ( ) ;
for ( ; preCacheThread - > canShutdown ( false ) = = false & &
difftime ( time ( NULL ) , elapsed ) < = 45 ; ) {
//sleep(150);
}
2011-09-27 22:35:45 +02:00
if ( preCacheThread - > canShutdown ( false ) ) {
if ( preCacheThread - > shutdownAndWait ( ) = = true ) {
delete preCacheThread ;
}
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
2011-09-27 22:35:45 +02:00
else {
if ( preCacheThread - > shutdownAndWait ( ) = = true ) {
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ) SystemFlags : : OutputDebug ( SystemFlags : : debugNetwork , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
delete preCacheThread ;
//printf("Stopping broadcast thread [%p] - C\n",broadCastThread);
}
}
2011-05-19 00:04:45 +02:00
preCacheThread = NULL ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
static void cleanupProcessObjects ( ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-09-27 07:29:57 +02:00
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-09-27 07:29:57 +02:00
showCursor ( true ) ;
restoreVideoMode ( true ) ;
}
2011-05-19 00:04:45 +02:00
cleanupCRCThread ( ) ;
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-12-02 17:07:59 +01:00
if ( Renderer : : isEnded ( ) = = false ) {
Renderer : : getInstance ( ) . end ( ) ;
CoreData & coreData = CoreData : : getInstance ( ) ;
coreData . cleanup ( ) ;
}
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : Close ( ) ;
2011-10-18 03:29:08 +02:00
SystemFlags : : SHUTDOWN_PROGRAM_MODE = true ;
2011-10-15 03:03:24 +02:00
2011-10-18 16:01:55 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " start running threads = %lu \n " , Thread : : getThreadList ( ) . size ( ) ) ;
2011-10-15 03:03:24 +02:00
time_t elapsed = time ( NULL ) ;
for ( ; Thread : : getThreadList ( ) . size ( ) > 0 & &
difftime ( time ( NULL ) , elapsed ) < = 10 ; ) {
//sleep(0);
}
2011-10-18 16:01:55 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " end running threads = %lu \n " , Thread : : getThreadList ( ) . size ( ) ) ;
2011-09-28 08:57:42 +02:00
std : : map < int , Texture2D * > & crcPlayerTextureCache = CacheManager : : getCachedItem < std : : map < int , Texture2D * > > ( GameConstants : : playerTextureCacheLookupKey ) ;
//deleteMapValues(crcPlayerTextureCache.begin(),crcPlayerTextureCache.end());
crcPlayerTextureCache . clear ( ) ;
std : : map < string , Texture2D * > & crcFactionPreviewTextureCache = CacheManager : : getCachedItem < std : : map < string , Texture2D * > > ( GameConstants : : factionPreviewTextureCacheLookupKey ) ;
//deleteMapValues(crcFactionPreviewTextureCache.begin(),crcFactionPreviewTextureCache.end());
crcFactionPreviewTextureCache . clear ( ) ;
2011-10-01 01:55:07 +02:00
std : : map < string , vector < FileReader < Pixmap2D > const * > * > & list2d = FileReader < Pixmap2D > : : getFileReadersMap ( ) ;
//printf("list2d = %lu\n",list2d.size());
deleteMapValues ( list2d . begin ( ) , list2d . end ( ) ) ;
std : : map < string , vector < FileReader < Pixmap3D > const * > * > & list3d = FileReader < Pixmap3D > : : getFileReadersMap ( ) ;
//printf("list3d = %lu\n",list3d.size());
deleteMapValues ( list3d . begin ( ) , list3d . end ( ) ) ;
2011-05-19 00:04:45 +02:00
2011-10-15 03:03:24 +02:00
XmlIo : : getInstance ( ) . cleanup ( ) ;
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-10-18 03:29:08 +02:00
2011-10-01 01:55:07 +02:00
SystemFlags : : globalCleanupHTTP ( ) ;
CacheManager : : cleanupMutexes ( ) ;
2011-05-19 00:04:45 +02:00
}
# if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__)
void fatal ( const char * s , . . . ) // failure exit
{
static int errors = 0 ;
errors + + ;
if ( errors < = 5 ) { // print up to two extra recursive errors
defvformatstring ( msg , s , s ) ;
string errText = string ( msg ) + " [ " + runtimeErrorMsg + " ] " ;
//puts(msg);
string sErr = string ( mg_app_name ) + " fatal error " ;
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " %s \n " , errText . c_str ( ) ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " %s \n " , errText . c_str ( ) ) ;
if ( errors < = 1 ) { // avoid recursion
if ( SDL_WasInit ( SDL_INIT_VIDEO ) ) {
SDL_ShowCursor ( 1 ) ;
SDL_WM_GrabInput ( SDL_GRAB_OFF ) ;
2011-12-23 09:20:54 +01:00
//SDL_SetGamma(1, 1, 1);
2011-05-19 00:04:45 +02:00
}
# ifdef WIN32
LPWSTR wstr = Ansi2WideString ( errText . c_str ( ) ) ;
LPWSTR wstr1 = Ansi2WideString ( sErr . c_str ( ) ) ;
MessageBox ( NULL , wstr , wstr1 , MB_OK | MB_SYSTEMMODAL ) ;
delete [ ] wstr ;
delete [ ] wstr1 ;
# endif
//SDL_Quit();
}
}
// Now try to shutdown threads if possible
2012-03-28 00:44:16 +02:00
delete mainProgram ;
mainProgram = NULL ;
2011-05-19 00:04:45 +02:00
// END
if ( sdl_quitCalled = = false ) {
sdl_quitCalled = true ;
SDL_Quit ( ) ;
}
exit ( EXIT_FAILURE ) ;
}
void stackdumper ( unsigned int type , EXCEPTION_POINTERS * ep ) {
if ( ! ep ) fatal ( " unknown type " ) ;
EXCEPTION_RECORD * er = ep - > ExceptionRecord ;
CONTEXT * context = ep - > ContextRecord ;
stringType out , t ;
formatstring ( out ) ( " %s Exception: 0x%x [0x%x] \n \n " , mg_app_name , er - > ExceptionCode , er - > ExceptionCode = = EXCEPTION_ACCESS_VIOLATION ? er - > ExceptionInformation [ 1 ] : - 1 ) ;
STACKFRAME sf = { { context - > Eip , 0 , AddrModeFlat } , { } , { context - > Ebp , 0 , AddrModeFlat } , { context - > Esp , 0 , AddrModeFlat } , 0 } ;
SymInitialize ( GetCurrentProcess ( ) , NULL , TRUE ) ;
while ( : : StackWalk ( IMAGE_FILE_MACHINE_I386 , GetCurrentProcess ( ) , GetCurrentThread ( ) , & sf , context , NULL , : : SymFunctionTableAccess , : : SymGetModuleBase , NULL ) ) {
struct { IMAGEHLP_SYMBOL sym ; stringType n ; }
si = { { sizeof ( IMAGEHLP_SYMBOL ) , 0 , 0 , 0 , sizeof ( stringType ) } } ;
IMAGEHLP_LINE li = { sizeof ( IMAGEHLP_LINE ) } ;
DWORD off = 0 ;
DWORD dwDisp = 0 ;
if ( SymGetSymFromAddr ( GetCurrentProcess ( ) , ( DWORD ) sf . AddrPC . Offset , & off , & si . sym ) & &
SymGetLineFromAddr ( GetCurrentProcess ( ) , ( DWORD ) sf . AddrPC . Offset , & dwDisp , & li ) ) {
char * del = strrchr ( li . FileName , ' \\ ' ) ;
formatstring ( t ) ( " %s - %s [%d] \n " , si . sym . Name , del ? del + 1 : li . FileName , li . LineNumber + dwDisp ) ;
concatstring ( out , t ) ;
}
}
fatal ( out ) ;
}
# endif
// =====================================================
// class ExceptionHandler
// =====================================================
class ExceptionHandler : public PlatformExceptionHandler {
public :
virtual void handle ( ) {
2011-10-18 03:40:49 +02:00
string msg = " #1 An error occurred and " + string ( mg_app_name ) + " will close. \n Please report this bug to: " + string ( mailString ) ;
2011-05-19 00:04:45 +02:00
# ifdef WIN32
msg + = " , attaching the generated " + getCrashDumpFileName ( ) + " file. " ;
# endif
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " %s \n " , msg . c_str ( ) ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " %s \n " , msg . c_str ( ) ) ;
2012-03-28 00:44:16 +02:00
if ( mainProgram & & gameInitialized = = true ) {
mainProgram - > showMessage ( msg . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
}
message ( msg . c_str ( ) ) ;
}
# if defined(__GNUC__) && !defined(__FreeBSD__) && !defined(BSD)
static int getFileAndLine ( void * address , char * file , size_t flen ) {
int line = - 1 ;
2011-05-28 20:55:06 +02:00
const int maxbufSize = 1024 ;
static char buf [ maxbufSize + 1 ] = " " ;
2011-09-01 03:11:23 +02:00
//char *p=NULL;
2011-05-19 00:04:45 +02:00
// prepare command to be executed
// our program need to be passed after the -e parameter
//sprintf (buf, "/usr/bin/addr2line -C -e ./a.out -f -i %lx", addr);
2011-05-28 20:55:06 +02:00
sprintf ( buf , " addr2line -C -e %s -f -i %p " , application_binary . c_str ( ) , address ) ;
2011-05-19 00:04:45 +02:00
FILE * f = popen ( buf , " r " ) ;
if ( f = = NULL ) {
perror ( buf ) ;
return 0 ;
}
// get function name
2011-05-28 20:55:06 +02:00
char * ret = fgets ( buf , maxbufSize , f ) ;
if ( ret = = NULL ) {
pclose ( f ) ;
return 0 ;
}
2011-05-19 00:04:45 +02:00
// get file and line
2011-05-28 20:55:06 +02:00
ret = fgets ( buf , maxbufSize , f ) ;
if ( ret = = NULL ) {
pclose ( f ) ;
return 0 ;
}
2011-05-19 00:04:45 +02:00
2011-05-28 20:55:06 +02:00
if ( strlen ( buf ) > 0 & & buf [ 0 ] ! = ' ? ' ) {
//int l;
2011-05-19 00:04:45 +02:00
char * p = buf ;
// file name is until ':'
2011-05-28 20:55:06 +02:00
while ( * p ! = 0 & & * p ! = ' : ' ) {
2011-05-19 00:04:45 +02:00
p + + ;
}
* p + + = 0 ;
// after file name follows line number
strcpy ( file , buf ) ;
sscanf ( p , " %d " , & line ) ;
}
else {
2011-05-28 20:55:06 +02:00
strcpy ( file , " unknown " ) ;
2011-05-19 00:04:45 +02:00
line = 0 ;
}
pclose ( f ) ;
return line ;
}
# endif
2011-10-03 20:39:21 +02:00
static void logError ( const char * msg , bool confirmToConsole ) {
2011-10-03 20:34:59 +02:00
string errorLogFile = " error.log " ;
if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
errorLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + errorLogFile ;
}
else {
string userData = Config : : getInstance ( ) . getString ( " UserData_Root " , " " ) ;
if ( userData ! = " " ) {
endPathWithSlash ( userData ) ;
}
errorLogFile = userData + errorLogFile ;
}
2011-10-18 04:02:37 +02:00
2011-10-18 04:11:55 +02:00
//printf("Attempting to write error to file [%s]\n",errorLogFile.c_str());
2011-10-18 04:02:37 +02:00
2011-10-03 20:34:59 +02:00
# if defined(WIN32) && !defined(__MINGW32__)
FILE * fp = _wfopen ( utf8_decode ( errorLogFile ) . c_str ( ) , L " w " ) ;
std : : ofstream logFile ( fp ) ;
# else
std : : ofstream logFile ;
logFile . open ( errorLogFile . c_str ( ) , ios_base : : out | ios_base : : trunc ) ;
# endif
if ( logFile . is_open ( ) = = true ) {
time_t curtime = time ( NULL ) ;
struct tm * loctime = localtime ( & curtime ) ;
char szBuf2 [ 100 ] = " " ;
strftime ( szBuf2 , 100 , " %Y-%m-%d %H:%M:%S " , loctime ) ;
logFile < < " [ " < < szBuf2 < < " ] Runtime Error information: " < < std : : endl ;
logFile < < " ====================================================== " < < std : : endl ;
logFile < < ( msg ! = NULL ? msg : " null " ) < < std : : endl ;
logFile . close ( ) ;
# if defined(WIN32) && !defined(__MINGW32__)
if ( fp ) {
fclose ( fp ) ;
}
# endif
2011-10-03 20:39:21 +02:00
if ( confirmToConsole = = true ) {
printf ( " Error saved to logfile [%s] \n " , errorLogFile . c_str ( ) ) ;
fflush ( stdout ) ;
}
2011-10-03 20:34:59 +02:00
}
2011-10-18 04:11:55 +02:00
else {
if ( confirmToConsole = = true ) {
printf ( " COULD NOT SAVE TO ERROR logfile [%s] \n " , errorLogFile . c_str ( ) ) ;
fflush ( stdout ) ;
}
}
2011-10-03 20:39:21 +02:00
}
static void handleRuntimeError ( const char * msg ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-10-05 23:46:41 +02:00
static bool inErrorNow = false ;
if ( inErrorNow = = true ) {
printf ( " \n ** Already in error handler, msg [%s] \n " , msg ) ;
fflush ( stdout ) ;
abort ( ) ;
return ;
}
inErrorNow = true ;
2011-10-03 20:39:21 +02:00
logError ( msg , true ) ;
2011-10-03 20:34:59 +02:00
2012-03-28 00:44:16 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] program = %p gameInitialized = %d msg [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , mainProgram , gameInitialized , msg ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] [%s] gameInitialized = %d, program = %p \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , gameInitialized , mainProgram ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%s] gameInitialized = %d, program = %p \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , gameInitialized , mainProgram ) ;
2011-05-19 00:04:45 +02:00
string errMsg = ( msg ! = NULL ? msg : " null " ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
# if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__FreeBSD__) && !defined(BSD)
if ( disableBacktrace = = false & & sdl_quitCalled = = false ) {
errMsg + = " \n Stack Trace: \n " ;
//errMsg += "To find line #'s use:\n";
//errMsg += "readelf --debug-dump=decodedline %s | egrep 0xaddress-of-stack\n";
2012-03-28 00:44:16 +02:00
const size_t max_depth = 25 ;
2011-05-19 00:04:45 +02:00
void * stack_addrs [ max_depth ] ;
size_t stack_depth = backtrace ( stack_addrs , max_depth ) ;
char * * stack_strings = backtrace_symbols ( stack_addrs , stack_depth ) ;
//for (size_t i = 1; i < stack_depth; i++) {
// errMsg += string(stack_strings[i]) + "\n";
//}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
char szBuf [ 8096 ] = " " ;
2011-05-19 00:04:45 +02:00
for ( size_t i = 1 ; i < stack_depth ; i + + ) {
void * lineAddress = stack_addrs [ i ] ; //getStackAddress(stackIndex);
2012-03-28 00:44:16 +02:00
size_t sz = 8096 ; // just a guess, template names will go much wider
2011-05-19 00:04:45 +02:00
char * function = static_cast < char * > ( malloc ( sz ) ) ;
char * begin = 0 ;
char * end = 0 ;
// find the parentheses and address offset surrounding the mangled name
for ( char * j = stack_strings [ i ] ; * j ; + + j ) {
if ( * j = = ' ( ' ) {
begin = j ;
}
else if ( * j = = ' + ' ) {
end = j ;
}
}
if ( begin & & end ) {
* begin + + = ' \0 ' ;
* end = ' \0 ' ;
// found our mangled name, now in [begin, end)
int status ;
char * ret = abi : : __cxa_demangle ( begin , function , & sz , & status ) ;
if ( ret ) {
// return value may be a realloc() of the input
function = ret ;
}
else {
// demangling failed, just pretend it's a C function with no args
strncpy ( function , begin , sz ) ;
strncat ( function , " () " , sz ) ;
function [ sz - 1 ] = ' \0 ' ;
}
//fprintf(out, " %s:%s\n", stack.strings[i], function);
sprintf ( szBuf , " %s:%s address [%p] " , stack_strings [ i ] , function , lineAddress ) ;
}
else {
// didn't find the mangled name, just print the whole line
//fprintf(out, " %s\n", stack.strings[i]);
sprintf ( szBuf , " %s address [%p] " , stack_strings [ i ] , lineAddress ) ;
}
errMsg + = string ( szBuf ) ;
2012-03-28 00:44:16 +02:00
char file [ 8096 ] = " " ;
int line = getFileAndLine ( lineAddress , file , 8096 ) ;
2011-05-19 00:04:45 +02:00
if ( line > = 0 ) {
errMsg + = " line: " + intToStr ( line ) ;
}
errMsg + = " \n " ;
free ( function ) ;
}
free ( stack_strings ) ; // malloc()ed by backtrace_symbols
}
# endif
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-10-03 20:39:21 +02:00
logError ( errMsg . c_str ( ) , false ) ;
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugError , " In [%s::%s Line: %d] [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , errMsg . c_str ( ) ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , errMsg . c_str ( ) ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
//abort();
2012-03-28 00:44:16 +02:00
if ( mainProgram & & gameInitialized = = true ) {
2011-05-19 00:04:45 +02:00
//printf("\nprogram->getState() [%p]\n",program->getState());
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
if ( mainProgram - > getState ( ) ! = NULL ) {
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
mainProgram - > showMessage ( errMsg . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
for ( ; GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false & & mainProgram - > isMessageShowing ( ) ; ) {
2011-05-19 00:04:45 +02:00
//program->getState()->render();
Window : : handleEvent ( ) ;
2012-03-28 00:44:16 +02:00
mainProgram - > loop ( ) ;
2011-10-05 23:46:41 +02:00
//printf("\nhandle error #1\n");
2011-05-19 00:04:45 +02:00
}
}
else {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
mainProgram - > showMessage ( errMsg . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2012-03-28 00:44:16 +02:00
for ( ; GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false & & mainProgram - > isMessageShowing ( ) ; ) {
2011-05-19 00:04:45 +02:00
//program->renderProgramMsgBox();
Window : : handleEvent ( ) ;
2012-03-28 00:44:16 +02:00
mainProgram - > loop ( ) ;
2011-10-05 23:46:41 +02:00
//printf("\nhandle error #2\n");
2011-05-19 00:04:45 +02:00
}
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
else {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
string err = " #2 An error occurred and " ;
if ( sdl_quitCalled = = false ) {
err + = mg_app_name ;
}
err + = " will close. \n Error msg = [ " + errMsg + " ] \n \n Please report this bug to " ;
if ( sdl_quitCalled = = false ) {
err + = mailStringSupport ;
}
# ifdef WIN32
err + = string ( " , attaching the generated " ) + getCrashDumpFileName ( ) + string ( " file. " ) ;
# endif
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
message ( err ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
// Now try to shutdown threads if possible
2012-03-28 00:44:16 +02:00
delete mainProgram ;
mainProgram = NULL ;
2011-05-19 00:04:45 +02:00
// END
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
# ifdef WIN32
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-09-27 07:29:57 +02:00
showCursor ( true ) ;
restoreVideoMode ( true ) ;
}
2011-05-19 00:04:45 +02:00
runtimeErrorMsg = errMsg ;
2011-10-05 23:46:41 +02:00
inErrorNow = false ;
2011-05-19 00:04:45 +02:00
throw runtimeErrorMsg ;
# endif
//printf("In [%s::%s Line: %d] [%s] gameInitialized = %d\n",__FILE__,__FUNCTION__,__LINE__,msg,gameInitialized);
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
cleanupProcessObjects ( ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( sdl_quitCalled = = false ) {
sdl_quitCalled = true ;
SDL_Quit ( ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-10-05 23:46:41 +02:00
inErrorNow = false ;
2011-05-19 00:04:45 +02:00
abort ( ) ;
}
static int DisplayMessage ( const char * msg , bool exitApp ) {
2011-12-05 06:26:48 +01:00
//printf("In [%s::%s Line: %d] msg [%s] exitApp = %d\n",__FILE__,__FUNCTION__,__LINE__,msg,exitApp);
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
2012-03-28 00:44:16 +02:00
if ( mainProgram & & gameInitialized = = true ) {
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
2012-03-28 00:44:16 +02:00
mainProgram - > showMessage ( msg ) ;
2011-05-19 00:04:45 +02:00
}
else {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
message ( msg ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
if ( exitApp = = true ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " %s \n " , msg ) ;
// Now try to shutdown threads if possible
2012-03-28 00:44:16 +02:00
delete mainProgram ;
mainProgram = NULL ;
2011-05-19 00:04:45 +02:00
// END
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
cleanupProcessObjects ( ) ;
if ( sdl_quitCalled = = false ) {
sdl_quitCalled = true ;
SDL_Quit ( ) ;
}
exit ( - 1 ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] msg [%s] exitApp = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , msg , exitApp ) ;
return 0 ;
}
} ;
# if defined(__GNUC__) && !defined(__FreeBSD__) && !defined(BSD)
void handleSIGSEGV ( int sig ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " In [%s::%s Line: %d] Error detected: signal %d: \n " , __FILE__ , __FUNCTION__ , __LINE__ , sig ) ;
printf ( " %s " , szBuf ) ;
2011-11-23 09:00:09 +01:00
//abort();
2011-05-19 00:04:45 +02:00
2011-11-23 20:12:06 +01:00
ExceptionHandler : : handleRuntimeError ( szBuf ) ;
2011-05-19 00:04:45 +02:00
}
# endif
// =====================================================
// class MainWindow
// =====================================================
2011-09-27 12:16:09 +02:00
MainWindow : : MainWindow ( Program * program ) : WindowGl ( ) {
2011-05-19 00:04:45 +02:00
this - > program = program ;
2011-10-25 20:39:11 +02:00
this - > popupMenu . setEnabled ( false ) ;
this - > popupMenu . setVisible ( false ) ;
2011-10-26 00:40:28 +02:00
this - > triggerLanguageToggle = false ;
this - > triggerLanguage = " " ;
2011-12-02 17:07:59 +01:00
this - > cancelLanguageSelection = - 1 ;
2011-05-19 00:04:45 +02:00
}
2011-10-26 00:40:28 +02:00
2011-05-19 00:04:45 +02:00
MainWindow : : ~ MainWindow ( ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
delete program ;
program = NULL ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
void MainWindow : : eventMouseDown ( int x , int y , MouseButton mouseButton ) {
const Metrics & metrics = Metrics : : getInstance ( ) ;
int vx = metrics . toVirtualX ( x ) ;
int vy = metrics . toVirtualY ( getH ( ) - y ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventMouseDown] ERROR, program == NULL! " ) ;
}
2011-10-25 20:39:11 +02:00
//printf("eventMouseDown popupMenu.getVisible() = %d\n",popupMenu.getVisible());
if ( popupMenu . getVisible ( ) = = true & & popupMenu . mouseClick ( vx , vy ) ) {
std : : pair < int , string > result = popupMenu . mouseClickedMenuItem ( vx , vy ) ;
//printf("In popup callback menuItemSelected [%s] menuIndexSelected = %d\n",result.second.c_str(),result.first);
popupMenu . setEnabled ( false ) ;
popupMenu . setVisible ( false ) ;
//printf("result.first = %d [%s] cancelLanguageSelection = %d\n",result.first,result.second.c_str(),cancelLanguageSelection);
// Exit game
if ( result . first ! = cancelLanguageSelection ) {
2011-10-26 00:40:28 +02:00
//toggleLanguage(result.second);
this - > triggerLanguageToggle = true ;
this - > triggerLanguage = result . second ;
2011-10-25 20:39:11 +02:00
}
return ;
}
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
switch ( mouseButton ) {
case mbLeft :
program - > mouseDownLeft ( vx , vy ) ;
break ;
case mbRight :
//program->mouseDownRight(vx, vy);
break ;
case mbCenter :
//program->mouseDownCenter(vx, vy);
break ;
default :
break ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
ProgramState * programState = program - > getState ( ) ;
if ( programState ! = NULL ) {
switch ( mouseButton ) {
case mbLeft :
programState - > mouseDownLeft ( vx , vy ) ;
break ;
case mbRight :
programState - > mouseDownRight ( vx , vy ) ;
break ;
case mbCenter :
programState - > mouseDownCenter ( vx , vy ) ;
break ;
default :
break ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
void MainWindow : : eventMouseUp ( int x , int y , MouseButton mouseButton ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
const Metrics & metrics = Metrics : : getInstance ( ) ;
int vx = metrics . toVirtualX ( x ) ;
int vy = metrics . toVirtualY ( getH ( ) - y ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventMouseUp] ERROR, program == NULL! " ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
ProgramState * programState = program - > getState ( ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( programState ! = NULL ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
switch ( mouseButton ) {
case mbLeft :
programState - > mouseUpLeft ( vx , vy ) ;
break ;
case mbRight :
programState - > mouseUpRight ( vx , vy ) ;
break ;
case mbCenter :
programState - > mouseUpCenter ( vx , vy ) ;
break ;
default :
break ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
void MainWindow : : eventMouseDoubleClick ( int x , int y , MouseButton mouseButton ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
const Metrics & metrics = Metrics : : getInstance ( ) ;
int vx = metrics . toVirtualX ( x ) ;
int vy = metrics . toVirtualY ( getH ( ) - y ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventMouseDoubleClick] ERROR, program == NULL! " ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
ProgramState * programState = program - > getState ( ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( programState ! = NULL ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
switch ( mouseButton ) {
case mbLeft :
programState - > mouseDoubleClickLeft ( vx , vy ) ;
break ;
case mbRight :
programState - > mouseDoubleClickRight ( vx , vy ) ;
break ;
case mbCenter :
programState - > mouseDoubleClickCenter ( vx , vy ) ;
break ;
default :
break ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
void MainWindow : : eventMouseMove ( int x , int y , const MouseState * ms ) {
const Metrics & metrics = Metrics : : getInstance ( ) ;
int vx = metrics . toVirtualX ( x ) ;
int vy = metrics . toVirtualY ( getH ( ) - y ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventMouseMove] ERROR, program == NULL! " ) ;
}
program - > eventMouseMove ( vx , vy , ms ) ;
ProgramState * programState = program - > getState ( ) ;
if ( programState ! = NULL ) {
programState - > mouseMove ( vx , vy , ms ) ;
}
}
void MainWindow : : eventMouseWheel ( int x , int y , int zDelta ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
const Metrics & metrics = Metrics : : getInstance ( ) ;
int vx = metrics . toVirtualX ( x ) ;
int vy = metrics . toVirtualY ( getH ( ) - y ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventMouseMove] ERROR, program == NULL! " ) ;
}
ProgramState * programState = program - > getState ( ) ;
if ( programState ! = NULL ) {
programState - > eventMouseWheel ( vx , vy , zDelta ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
2011-10-25 20:39:11 +02:00
void MainWindow : : render ( ) {
if ( popupMenu . getVisible ( ) = = true ) {
Renderer & renderer = Renderer : : getInstance ( ) ;
renderer . renderPopupMenu ( & popupMenu ) ;
//printf("Render lang popup\n");
}
}
void MainWindow : : showLanguages ( ) {
Lang & lang = Lang : : getInstance ( ) ;
//PopupMenu popupMenu;
std : : vector < string > menuItems ;
vector < string > langResults ;
string data_path = getGameReadWritePath ( GameConstants : : path_data_CacheLookupKey ) ;
2011-11-02 18:17:28 +01:00
string userDataPath = getGameCustomCoreDataPath ( data_path , " " ) ;
findAll ( userDataPath + " data/lang/*.lng " , langResults , true , false ) ;
2011-10-25 20:39:11 +02:00
for ( unsigned int i = 0 ; i < langResults . size ( ) ; + + i ) {
string testLanguage = langResults [ i ] ;
menuItems . push_back ( testLanguage ) ;
}
2011-11-02 18:17:28 +01:00
vector < string > langResults2 ;
findAll ( data_path + " data/lang/*.lng " , langResults2 , true ) ;
if ( langResults2 . empty ( ) & & langResults . empty ( ) ) {
throw runtime_error ( " There are no lang files " ) ;
}
for ( unsigned int i = 0 ; i < langResults2 . size ( ) ; + + i ) {
string testLanguage = langResults2 [ i ] ;
if ( std : : find ( menuItems . begin ( ) , menuItems . end ( ) , testLanguage ) = = menuItems . end ( ) ) {
menuItems . push_back ( testLanguage ) ;
}
}
2011-12-01 00:35:54 +01:00
menuItems . push_back ( lang . get ( " Exit " ) ) ;
2011-10-25 20:39:11 +02:00
cancelLanguageSelection = menuItems . size ( ) - 1 ;
popupMenu . setW ( 100 ) ;
popupMenu . setH ( 100 ) ;
popupMenu . init ( lang . get ( " GameMenuTitle " ) , menuItems ) ;
popupMenu . setEnabled ( true ) ;
popupMenu . setVisible ( true ) ;
}
void MainWindow : : toggleLanguage ( string language ) {
popupMenu . setEnabled ( false ) ;
popupMenu . setVisible ( false ) ;
2011-10-26 00:40:28 +02:00
this - > triggerLanguageToggle = false ;
this - > triggerLanguage = " " ;
2011-10-25 20:39:11 +02:00
Lang & lang = Lang : : getInstance ( ) ;
string currentLanguage = lang . getLanguage ( ) ;
string newLanguageSelected = language ;
if ( language = = " " ) {
newLanguageSelected = currentLanguage ;
vector < string > langResults ;
string data_path = getGameReadWritePath ( GameConstants : : path_data_CacheLookupKey ) ;
2011-11-02 18:17:28 +01:00
string userDataPath = getGameCustomCoreDataPath ( data_path , " " ) ;
findAll ( userDataPath + " data/lang/*.lng " , langResults , true , false ) ;
vector < string > langResults2 ;
findAll ( data_path + " data/lang/*.lng " , langResults2 , true ) ;
if ( langResults2 . empty ( ) & & langResults . empty ( ) ) {
throw runtime_error ( " There are no lang files " ) ;
}
for ( unsigned int i = 0 ; i < langResults2 . size ( ) ; + + i ) {
string testLanguage = langResults2 [ i ] ;
if ( std : : find ( langResults . begin ( ) , langResults . end ( ) , testLanguage ) = = langResults . end ( ) ) {
langResults . push_back ( testLanguage ) ;
}
2011-10-25 20:39:11 +02:00
}
for ( unsigned int i = 0 ; i < langResults . size ( ) ; + + i ) {
string testLanguage = langResults [ i ] ;
if ( testLanguage = = currentLanguage ) {
if ( i + 1 < langResults . size ( ) ) {
newLanguageSelected = langResults [ i + 1 ] ;
}
else {
newLanguageSelected = langResults [ 0 ] ;
}
break ;
}
}
}
if ( newLanguageSelected ! = currentLanguage ) {
lang . loadStrings ( newLanguageSelected ) ;
program - > reloadUI ( ) ;
program - > consoleAddLine ( lang . get ( " Language " ) + " " + newLanguageSelected ) ;
}
}
2011-06-26 03:55:08 +02:00
void MainWindow : : eventKeyDown ( SDL_KeyboardEvent key ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , key . keysym . sym ) ;
2011-05-19 00:04:45 +02:00
2011-06-28 03:25:14 +02:00
//SDL_keysym keystate = Window::getKeystate();
SDL_keysym keystate = key . keysym ;
2011-12-03 05:58:36 +01:00
//printf("keystate.mod = %d key = %d lalt [%d] ralt [%d] alt [%d]\n",keystate.mod,key.keysym.unicode,(keystate.mod & KMOD_LALT),(keystate.mod & KMOD_RALT),(keystate.mod & KMOD_ALT));
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] key = [%c][%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , key , key ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventKeyDown] ERROR, program == NULL! " ) ;
}
2011-10-25 20:39:11 +02:00
if ( popupMenu . getVisible ( ) = = true & & isKeyPressed ( SDLK_ESCAPE , key ) = = true ) {
this - > popupMenu . setEnabled ( false ) ;
this - > popupMenu . setVisible ( false ) ;
return ;
}
2011-05-19 00:04:45 +02:00
//{
//Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
//printf("----------------------- key [%d] CameraModeLeft [%d]\n",key,configKeys.getCharKey("CameraModeLeft"));
//}
program - > keyDown ( key ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( keystate . mod & ( KMOD_LALT | KMOD_RALT ) ) {
2011-06-26 03:55:08 +02:00
//if(key == vkReturn) {
if ( isKeyPressed ( SDLK_RETURN , key ) = = true ) {
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] ALT-ENTER pressed \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
// This stupidity only required in win32.
// We reload the textures so that the canvas paints textures properly
# ifdef WIN32
if ( Window : : getAllowAltEnterFullscreenToggle ( ) = = true ) {
Renderer & renderer = Renderer : : getInstance ( ) ;
renderer . reinitAll ( ) ;
}
# endif
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
}
if ( program ! = NULL & & program - > isInSpecialKeyCaptureEvent ( ) = = false ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
Config & configKeys = Config : : getInstance ( std : : pair < ConfigType , ConfigType > ( cfgMainKeys , cfgUserKeys ) ) ;
2011-06-26 03:55:08 +02:00
//if(key == configKeys.getCharKey("HotKeyShowDebug")) {
if ( isKeyPressed ( configKeys . getSDLKey ( " HotKeyShowDebug " ) , key ) = = true ) {
2011-11-15 05:48:57 +01:00
//printf("debug key pressed keystate.mod = %d [%d]\n",keystate.mod,keystate.mod & (KMOD_LALT | KMOD_RALT));
2011-05-19 00:04:45 +02:00
Renderer & renderer = Renderer : : getInstance ( ) ;
//if(keystate.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
if ( keystate . mod & ( KMOD_LALT | KMOD_RALT ) ) {
renderer . cycleShowDebugUILevel ( ) ;
}
else {
bool showDebugUI = renderer . getShowDebugUI ( ) ;
renderer . setShowDebugUI ( ! showDebugUI ) ;
}
}
2011-10-25 20:39:11 +02:00
else if ( keystate . mod & ( KMOD_LCTRL | KMOD_RCTRL ) & &
isKeyPressed ( configKeys . getSDLKey ( " SwitchLanguage " ) , key ) = = true ) {
if ( keystate . mod & ( KMOD_LSHIFT | KMOD_RSHIFT ) ) {
2011-10-26 00:40:28 +02:00
//toggleLanguage("");
this - > triggerLanguageToggle = true ;
this - > triggerLanguage = " " ;
2011-10-25 20:39:11 +02:00
}
else {
showLanguages ( ) ;
}
}
2011-06-26 03:55:08 +02:00
//else if(key == configKeys.getCharKey("ReloadINI")) {
else if ( isKeyPressed ( configKeys . getSDLKey ( " ReloadINI " ) , key ) = = true ) {
2011-05-19 00:04:45 +02:00
Config & config = Config : : getInstance ( ) ;
config . reload ( ) ;
}
2011-06-26 03:55:08 +02:00
//else if(key == configKeys.getCharKey("Screenshot")) {
else if ( isKeyPressed ( configKeys . getSDLKey ( " Screenshot " ) , key ) = = true ) {
2011-05-19 00:04:45 +02:00
string userData = Config : : getInstance ( ) . getString ( " UserData_Root " , " " ) ;
if ( userData ! = " " ) {
endPathWithSlash ( userData ) ;
}
string path = userData + GameConstants : : folder_path_screenshots ;
if ( isdir ( path . c_str ( ) ) = = true ) {
Config & config = Config : : getInstance ( ) ;
string fileFormat = config . getString ( " ScreenShotFileType " , " jpg " ) ;
unsigned int queueSize = Renderer : : getInstance ( ) . getSaveScreenQueueSize ( ) ;
for ( int i = 0 ; i < 5000 ; + + i ) {
path = userData + GameConstants : : folder_path_screenshots ;
path + = string ( " screen " ) + intToStr ( i + queueSize ) + string ( " . " ) + fileFormat ;
# ifdef WIN32
FILE * f = _wfopen ( utf8_decode ( path ) . c_str ( ) , L " rb " ) ;
# else
FILE * f = fopen ( path . c_str ( ) , " rb " ) ;
# endif
if ( f = = NULL ) {
Lang & lang = Lang : : getInstance ( ) ;
char szBuf [ 1024 ] = " " ;
if ( lang . get ( " ScreenshotSavedTo " ) . length ( ) > 0 & & lang . get ( " ScreenshotSavedTo " ) [ 0 ] ! = ' ? ' ) {
sprintf ( szBuf , lang . get ( " ScreenshotSavedTo " ) . c_str ( ) , path . c_str ( ) ) ;
}
else {
sprintf ( szBuf , " Screenshot will be saved to: %s " , path . c_str ( ) ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] %s \n " , __FILE__ , __FUNCTION__ , __LINE__ , szBuf ) ;
if ( Config : : getInstance ( ) . getBool ( " DisableScreenshotConsoleText " , " false " ) = = false ) {
program - > consoleAddLine ( szBuf ) ;
}
Renderer : : getInstance ( ) . saveScreen ( path ) ;
break ;
}
else {
fclose ( f ) ;
}
}
}
}
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
2011-06-26 03:55:08 +02:00
void MainWindow : : eventKeyUp ( SDL_KeyboardEvent key ) {
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , key ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventKeyUp] ERROR, program == NULL! " ) ;
}
program - > keyUp ( key ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , key ) ;
}
2011-06-26 03:55:08 +02:00
void MainWindow : : eventKeyPress ( SDL_KeyboardEvent c ) {
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , c ) ;
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventKeyPress] ERROR, program == NULL! " ) ;
}
program - > keyPress ( c ) ;
if ( program ! = NULL & & program - > isInSpecialKeyCaptureEvent ( ) = = false ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
Config & configKeys = Config : : getInstance ( std : : pair < ConfigType , ConfigType > ( cfgMainKeys , cfgUserKeys ) ) ;
2011-06-26 03:55:08 +02:00
//if(c == configKeys.getCharKey("HotKeyToggleOSMouseEnabled")) {
if ( isKeyPressed ( configKeys . getSDLKey ( " HotKeyToggleOSMouseEnabled " ) , c ) = = true ) {
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
bool showCursorState = false ;
int state = SDL_ShowCursor ( SDL_QUERY ) ;
if ( state = = SDL_DISABLE ) {
showCursorState = true ;
}
showCursor ( showCursorState ) ;
Renderer & renderer = Renderer : : getInstance ( ) ;
renderer . setNo2DMouseRendering ( showCursorState ) ;
Window : : lastShowMouseState = SDL_ShowCursor ( SDL_QUERY ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] Window::lastShowMouseState = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , Window : : lastShowMouseState ) ;
}
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] [%d] \n " , __FILE__ , __FUNCTION__ , __LINE__ , c ) ;
}
2011-06-26 03:55:08 +02:00
void MainWindow : : eventActivate ( bool active ) {
2011-05-19 00:04:45 +02:00
if ( ! active ) {
//minimize();
}
}
2011-06-26 03:55:08 +02:00
void MainWindow : : eventResize ( SizeState sizeState ) {
2011-05-19 00:04:45 +02:00
if ( program = = NULL ) {
throw runtime_error ( " In [MainWindow::eventResize] ERROR, program == NULL! " ) ;
}
program - > resize ( sizeState ) ;
}
void MainWindow : : eventClose ( ) {
delete program ;
program = NULL ;
}
void MainWindow : : setProgram ( Program * program ) {
this - > program = program ;
}
// =====================================================
// Main
// =====================================================
SystemFlags debugger ;
void print_SDL_version ( const char * preamble , SDL_version * v ) {
printf ( " %s %u.%u.%u \n " , preamble , v - > major , v - > minor , v - > patch ) ;
}
int setupGameItemPaths ( int argc , char * * argv , Config * config ) {
// Setup path cache for files and folders used in the game
std : : map < string , string > & pathCache = CacheManager : : getCachedItem < std : : map < string , string > > ( GameConstants : : pathCacheLookupKey ) ;
//GAME_ARG_DATA_PATH
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_DATA_PATH ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_DATA_PATH ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_DATA_PATH ] ) , & foundParamIndIndex ) ;
}
string customPath = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( customPath , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string customPathValue = paramPartTokens [ 1 ] ;
2011-06-12 05:44:50 +02:00
Properties : : applyTagsToValue ( customPathValue ) ;
2011-06-10 23:18:22 +02:00
if ( customPathValue ! = " " ) {
endPathWithSlash ( customPathValue ) ;
}
2011-05-19 00:04:45 +02:00
pathCache [ GameConstants : : path_data_CacheLookupKey ] = customPathValue ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using custom data path [%s] \n " , customPathValue . c_str ( ) ) ;
}
else {
printf ( " \n Invalid path specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , false ) ;
return - 1 ;
}
}
else if ( config ! = NULL ) {
if ( config - > getString ( " DataPath " , " " ) ! = " " ) {
2011-06-10 23:18:22 +02:00
string customPathValue = config - > getString ( " DataPath " , " " ) ;
if ( customPathValue ! = " " ) {
endPathWithSlash ( customPathValue ) ;
}
2011-05-19 00:04:45 +02:00
pathCache [ GameConstants : : path_data_CacheLookupKey ] = config - > getString ( " DataPath " , " " ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using ini specified data path [%s] \n " , config - > getString ( " DataPath " , " " ) . c_str ( ) ) ;
}
}
//GAME_ARG_INI_PATH
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_INI_PATH ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_INI_PATH ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_INI_PATH ] ) , & foundParamIndIndex ) ;
}
string customPath = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( customPath , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string customPathValue = paramPartTokens [ 1 ] ;
2011-06-12 05:44:50 +02:00
Properties : : applyTagsToValue ( customPathValue ) ;
2011-05-19 00:04:45 +02:00
pathCache [ GameConstants : : path_ini_CacheLookupKey ] = customPathValue ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using custom ini path [%s] \n " , customPathValue . c_str ( ) ) ;
}
else {
printf ( " \n Invalid path specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , false ) ;
return - 1 ;
}
}
//GAME_ARG_LOG_PATH
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LOG_PATH ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LOG_PATH ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LOG_PATH ] ) , & foundParamIndIndex ) ;
}
string customPath = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( customPath , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string customPathValue = paramPartTokens [ 1 ] ;
2011-06-12 05:44:50 +02:00
Properties : : applyTagsToValue ( customPathValue ) ;
2011-05-19 00:04:45 +02:00
pathCache [ GameConstants : : path_logs_CacheLookupKey ] = customPathValue ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using custom logs path [%s] \n " , customPathValue . c_str ( ) ) ;
}
else {
printf ( " \n Invalid path specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , false ) ;
return - 1 ;
}
}
else if ( config ! = NULL ) {
if ( config - > getString ( " LogPath " , " " ) ! = " " ) {
pathCache [ GameConstants : : path_logs_CacheLookupKey ] = config - > getString ( " LogPath " , " " ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using ini specified logs path [%s] \n " , config - > getString ( " LogPath " , " " ) . c_str ( ) ) ;
}
}
2011-06-07 04:37:58 +02:00
Text : : DEFAULT_FONT_PATH = pathCache [ GameConstants : : path_data_CacheLookupKey ] ;
2011-05-19 00:04:45 +02:00
return 0 ;
}
void setupLogging ( Config & config , bool haveSpecialOutputCommandLineOption ) {
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSystem ) . enabled = config . getBool ( " DebugMode " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled = config . getBool ( " DebugNetwork " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPerformance ) . enabled = config . getBool ( " DebugPerformance " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugWorldSynch ) . enabled = config . getBool ( " DebugWorldSynch " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugUnitCommands ) . enabled = config . getBool ( " DebugUnitCommands " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . enabled = config . getBool ( " DebugPathFinder " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugLUA ) . enabled = config . getBool ( " DebugLUA " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSound ) . enabled = config . getBool ( " DebugSound " , " false " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugError ) . enabled = config . getBool ( " DebugError " , " true " ) ;
string userData = config . getString ( " UserData_Root " , " " ) ;
if ( userData ! = " " ) {
endPathWithSlash ( userData ) ;
}
string debugLogFile = config . getString ( " DebugLogFile " , " " ) ;
if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugLogFile ;
}
else {
debugLogFile = userData + debugLogFile ;
}
//printf("debugLogFile [%s]\n",debugLogFile.c_str());
string debugWorldSynchLogFile = config . getString ( " DebugLogFileWorldSynch " , " " ) ;
if ( debugWorldSynchLogFile = = " " ) {
debugWorldSynchLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugWorldSynchLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugWorldSynchLogFile ;
}
else {
debugWorldSynchLogFile = userData + debugWorldSynchLogFile ;
}
string debugPerformanceLogFile = config . getString ( " DebugLogFilePerformance " , " " ) ;
if ( debugPerformanceLogFile = = " " ) {
debugPerformanceLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugPerformanceLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugPerformanceLogFile ;
}
else {
debugPerformanceLogFile = userData + debugPerformanceLogFile ;
}
string debugNetworkLogFile = config . getString ( " DebugLogFileNetwork " , " " ) ;
if ( debugNetworkLogFile = = " " ) {
debugNetworkLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugNetworkLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugNetworkLogFile ;
}
else {
debugNetworkLogFile = userData + debugNetworkLogFile ;
}
string debugUnitCommandsLogFile = config . getString ( " DebugLogFileUnitCommands " , " " ) ;
if ( debugUnitCommandsLogFile = = " " ) {
debugUnitCommandsLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugUnitCommandsLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugUnitCommandsLogFile ;
}
else {
debugUnitCommandsLogFile = userData + debugUnitCommandsLogFile ;
}
string debugPathFinderLogFile = config . getString ( " DebugLogFilePathFinder " , " " ) ;
if ( debugPathFinderLogFile = = " " ) {
debugPathFinderLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugPathFinderLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugPathFinderLogFile ;
}
else {
debugPathFinderLogFile = userData + debugPathFinderLogFile ;
}
string debugLUALogFile = config . getString ( " DebugLogFileLUA " , " " ) ;
if ( debugLUALogFile = = " " ) {
debugLUALogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugLUALogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugLUALogFile ;
}
else {
debugLUALogFile = userData + debugLUALogFile ;
}
string debugSoundLogFile = config . getString ( " DebugLogFileSound " , " " ) ;
if ( debugSoundLogFile = = " " ) {
debugSoundLogFile = debugLogFile ;
}
else if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
debugSoundLogFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + debugSoundLogFile ;
}
else {
debugSoundLogFile = userData + debugSoundLogFile ;
}
string debugErrorLogFile = config . getString ( " DebugLogFileError " , " " ) ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSystem ) . debugLogFileName = debugLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . debugLogFileName = debugNetworkLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPerformance ) . debugLogFileName = debugPerformanceLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugWorldSynch ) . debugLogFileName = debugWorldSynchLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugUnitCommands ) . debugLogFileName = debugUnitCommandsLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . debugLogFileName = debugPathFinderLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugLUA ) . debugLogFileName = debugLUALogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSound ) . debugLogFileName = debugSoundLogFile ;
SystemFlags : : getSystemSettingType ( SystemFlags : : debugError ) . debugLogFileName = debugErrorLogFile ;
if ( haveSpecialOutputCommandLineOption = = false ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " --- Startup log settings are --- \n debugSystem [%d][%s] \n debugNetwork [%d][%s] \n debugPerformance [%d][%s] \n debugWorldSynch [%d][%s] \n debugUnitCommands[%d][%s] \n debugPathFinder[%d][%s] \n debugLUA [%d][%s] \n debugSound [%d][%s] \n debugError [%d][%s] \n " ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSystem ) . enabled ,
debugLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugNetwork ) . enabled ,
debugNetworkLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPerformance ) . enabled ,
debugPerformanceLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugWorldSynch ) . enabled ,
debugWorldSynchLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugUnitCommands ) . enabled ,
debugUnitCommandsLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . enabled ,
debugPathFinderLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugLUA ) . enabled ,
debugLUALogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugSound ) . enabled ,
debugSoundLogFile . c_str ( ) ,
SystemFlags : : getSystemSettingType ( SystemFlags : : debugError ) . enabled ,
debugErrorLogFile . c_str ( ) ) ;
}
}
2012-04-03 21:35:22 +02:00
void runTilesetValidationForPath ( string tilesetPath , string tilesetName ,
World & world , bool purgeUnusedFiles , bool purgeDuplicateFiles ,
bool showDuplicateFiles , bool svnPurgeFiles , double & purgedMegaBytes ) {
string file = tilesetPath + tilesetName + " / " + tilesetName + " .xml " ;
Checksum checksum ;
bool techtree_errors = false ;
std : : map < string , vector < pair < string , string > > > loadedFileList ;
vector < string > pathList ;
pathList . push_back ( tilesetPath ) ;
world . loadTileset ( pathList , tilesetName , & checksum , loadedFileList ) ;
// Fixup paths with ..
{
std : : map < string , vector < pair < string , string > > > newLoadedFileList ;
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = loadedFileList . begin ( ) ;
iterMap ! = loadedFileList . end ( ) ; + + iterMap ) {
string loadedFile = iterMap - > first ;
replaceAll ( loadedFile , " // " , " / " ) ;
replaceAll ( loadedFile , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( loadedFile ) ;
if ( newLoadedFileList . find ( loadedFile ) ! = newLoadedFileList . end ( ) ) {
for ( unsigned int xx1 = 0 ; xx1 < iterMap - > second . size ( ) ; + + xx1 ) {
pair < string , string > & newVal = iterMap - > second [ xx1 ] ;
replaceAll ( newVal . first , " // " , " / " ) ;
replaceAll ( newVal . first , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . first ) ;
replaceAll ( newVal . second , " // " , " / " ) ;
replaceAll ( newVal . second , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . second ) ;
newLoadedFileList [ loadedFile ] . push_back ( newVal ) ;
}
}
else {
for ( unsigned int xx1 = 0 ; xx1 < iterMap - > second . size ( ) ; + + xx1 ) {
pair < string , string > & newVal = iterMap - > second [ xx1 ] ;
replaceAll ( newVal . first , " // " , " / " ) ;
replaceAll ( newVal . first , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . first ) ;
replaceAll ( newVal . second , " // " , " / " ) ;
replaceAll ( newVal . second , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . second ) ;
}
newLoadedFileList [ loadedFile ] = iterMap - > second ;
}
}
loadedFileList = newLoadedFileList ;
}
// Validate the faction setup to ensure we don't have any bad associations
// std::vector<std::string> resultErrors = world.validateFactionTypes();
// Now check for unused files in the techtree
std : : map < string , vector < pair < string , string > > > foundFileList ;
for ( unsigned int i = 0 ; i < pathList . size ( ) ; + + i ) {
string path = pathList [ i ] ;
endPathWithSlash ( path ) ;
path = path + tilesetName + " / " ;
replaceAll ( path , " // " , " / " ) ;
replaceAll ( path , " \\ \\ " , " \\ " ) ;
vector < string > foundFiles = getFolderTreeContentsListRecursively ( path + " *. " , " " ) ;
for ( unsigned int j = 0 ; j < foundFiles . size ( ) ; + + j ) {
string file = foundFiles [ j ] ;
replaceAll ( file , " // " , " / " ) ;
replaceAll ( file , " \\ \\ " , " \\ " ) ;
replaceAll ( file , " // " , " / " ) ;
replaceAll ( file , " \\ \\ " , " \\ " ) ;
foundFileList [ file ] . push_back ( make_pair ( path , path ) ) ;
}
}
printf ( " Found tileset filecount = %lu, used = %lu \n " , ( unsigned long ) foundFileList . size ( ) , ( unsigned long ) loadedFileList . size ( ) ) ;
int purgeCount = 0 ;
bool foundUnusedFile = false ;
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = foundFileList . begin ( ) ;
iterMap ! = foundFileList . end ( ) ; + + iterMap ) {
string foundFile = iterMap - > first ;
replaceAll ( foundFile , " // " , " / " ) ;
replaceAll ( foundFile , " \\ \\ " , " \\ " ) ;
if ( loadedFileList . find ( foundFile ) = = loadedFileList . end ( ) ) {
if ( foundUnusedFile = = false ) {
printf ( " \n Warning, unused files were detected - START: \n ===================== \n " ) ;
}
foundUnusedFile = true ;
printf ( " [%s] \n " , foundFile . c_str ( ) ) ;
string fileName = extractFileFromDirectoryPath ( foundFile ) ;
if ( loadedFileList . find ( fileName ) ! = loadedFileList . end ( ) ) {
printf ( " possible match on [%s] ? \n " , loadedFileList . find ( fileName ) - > first . c_str ( ) ) ;
}
else if ( purgeUnusedFiles = = true ) {
off_t fileSize = getFileSize ( foundFile ) ;
// convert to MB
purgedMegaBytes + = ( ( double ) fileSize / 1048576.0 ) ;
purgeCount + + ;
if ( svnPurgeFiles = = true ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " svn delete \" %s \" " , foundFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
}
else {
removeFile ( foundFile ) ;
}
}
}
}
if ( foundUnusedFile = = true ) {
if ( purgedMegaBytes > 0 ) {
printf ( " Purged %.2f MB (%d) in files \n " , purgedMegaBytes , purgeCount ) ;
}
printf ( " \n Warning, unused files were detected - END: \n " ) ;
}
if ( showDuplicateFiles = = true ) {
std : : map < int32 , vector < string > > mapDuplicateFiles ;
// Now check for duplicate data content
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = loadedFileList . begin ( ) ;
iterMap ! = loadedFileList . end ( ) ; + + iterMap ) {
string fileName = iterMap - > first ;
Checksum checksum ;
checksum . addFile ( fileName ) ;
int32 crcValue = checksum . getSum ( ) ;
mapDuplicateFiles [ crcValue ] . push_back ( fileName ) ;
}
double duplicateMegaBytesPurged = 0 ;
int duplicateCountPurged = 0 ;
double duplicateMegaBytes = 0 ;
int duplicateCount = 0 ;
bool foundDuplicates = false ;
for ( std : : map < int32 , vector < string > > : : iterator iterMap = mapDuplicateFiles . begin ( ) ;
iterMap ! = mapDuplicateFiles . end ( ) ; + + iterMap ) {
vector < string > & fileList = iterMap - > second ;
if ( fileList . size ( ) > 1 ) {
if ( foundDuplicates = = false ) {
foundDuplicates = true ;
printf ( " \n Warning, duplicate files were detected - START: \n ===================== \n " ) ;
}
map < string , int > parentList ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
if ( idx > 0 ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
// convert to MB
duplicateMegaBytes + = ( ( double ) fileSize / 1048576.0 ) ;
duplicateCount + + ;
}
else {
printf ( " \n " ) ;
}
printf ( " [%s] \n " , duplicateFile . c_str ( ) ) ;
std : : map < string , vector < pair < string , string > > > : : iterator iterFind = loadedFileList . find ( duplicateFile ) ;
if ( iterFind ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx = 0 ; jdx < iterFind - > second . size ( ) ; jdx + + ) {
parentList [ iterFind - > second [ jdx ] . first ] + + ;
}
}
}
for ( map < string , int > : : iterator iterMap1 = parentList . begin ( ) ;
iterMap1 ! = parentList . end ( ) ; + + iterMap1 ) {
if ( iterMap1 = = parentList . begin ( ) ) {
printf ( " \t Parents: \n " ) ;
}
printf ( " \t [%s] \n " , iterMap1 - > first . c_str ( ) ) ;
}
if ( purgeDuplicateFiles = = true ) {
//printf("\nPurge Duplicate Files detected - START:\n=====================\n");
string newCommonFileName = " " ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
if ( idx = = 0 ) {
newCommonFileName = " $COMMONDATAPATH/sounds/ " + extractFileFromDirectoryPath ( duplicateFile ) ;
string expandedNewCommonFileName = newCommonFileName ;
std : : map < string , string > mapExtraTagReplacementValues ;
mapExtraTagReplacementValues = Properties : : getTagReplacementValues ( & mapExtraTagReplacementValues ) ;
Properties : : applyTagsToValue ( expandedNewCommonFileName , & mapExtraTagReplacementValues ) ;
createDirectoryPaths ( extractDirectoryPathFromFile ( expandedNewCommonFileName ) ) ;
if ( svnPurgeFiles = = true ) {
copyFileTo ( duplicateFile , expandedNewCommonFileName ) ;
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " svn delete \" %s \" " , duplicateFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
printf ( " *** Duplicate file: \n [%s] \n was svn deleted and copied to: \n [%s] \n " , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
}
else {
//int result = 0;
int result = rename ( duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
if ( result ! = 0 ) {
char szBuf [ 4096 ] = " " ;
char * errmsg = strerror ( errno ) ;
sprintf ( szBuf , " !!! Error [%s] Could not rename [%s] to [%s]! " , errmsg , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
else {
printf ( " *** Duplicate file: \n [%s] \n was renamed to: \n [%s] \n " , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
}
}
}
else {
if ( svnPurgeFiles = = true ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " svn delete \" %s \" " , duplicateFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
printf ( " *** Duplicate file: \n [%s] \n was svn deleted \n " , duplicateFile . c_str ( ) ) ;
}
else {
removeFile ( duplicateFile ) ;
}
printf ( " *** Duplicate file: \n [%s] \n was removed \n " , duplicateFile . c_str ( ) ) ;
// convert to MB
duplicateMegaBytesPurged + = ( ( double ) fileSize / 1048576.0 ) ;
duplicateCountPurged + + ;
}
}
}
std : : map < string , int > mapUniqueParentList ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
std : : map < string , vector < pair < string , string > > > : : iterator iterFind2 = loadedFileList . find ( duplicateFile ) ;
if ( iterFind2 ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx1 = 0 ; jdx1 < iterFind2 - > second . size ( ) ; jdx1 + + ) {
string parentFile = iterFind2 - > second [ jdx1 ] . first ;
string searchText = iterFind2 - > second [ jdx1 ] . second ;
if ( mapUniqueParentList . find ( parentFile ) = = mapUniqueParentList . end ( ) ) {
printf ( " *** Searching parent file: \n [%s] \n for duplicate file reference: \n [%s] \n to replace with newname: \n [%s] \n " , parentFile . c_str ( ) , searchText . c_str ( ) , newCommonFileName . c_str ( ) ) ;
bool foundText = searchAndReplaceTextInFile ( parentFile , searchText , newCommonFileName , false ) ;
printf ( " foundText = %d \n " , foundText ) ;
if ( foundText = = false ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " Error finding text [%s] in file [%s] " , searchText . c_str ( ) , parentFile . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
mapUniqueParentList [ parentFile ] + + ;
}
}
}
}
}
//printf("\nPurge Duplicate Files detected - END:\n=====================\n");
}
else {
//printf("\nPurge Duplicate Files DISABLED - START:\n=====================\n");
string newCommonFileName = " " ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
if ( idx = = 0 ) {
newCommonFileName = " $COMMONDATAPATH/sounds/ " + extractFileFromDirectoryPath ( duplicateFile ) ;
break ;
}
}
}
//printf("\nPurge Duplicate Files #2 DISABLED [%lu] - START:\n=====================\n",fileList.size());
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
std : : map < string , vector < pair < string , string > > > : : iterator iterFind4 = loadedFileList . find ( duplicateFile ) ;
if ( iterFind4 ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx = 0 ; jdx < iterFind4 - > second . size ( ) ; jdx + + ) {
string parentFile = iterFind4 - > second [ jdx ] . first ;
string searchText = iterFind4 - > second [ jdx ] . second ;
//printf("*** Searching parent file:\n[%s]\nfor duplicate file reference:\n[%s]\nto replace with newname:\n[%s]\n",parentFile.c_str(),searchText.c_str(),newCommonFileName.c_str());
bool foundText = searchAndReplaceTextInFile ( parentFile , searchText , newCommonFileName , true ) ;
//printf("foundText = %d\n",foundText);
if ( foundText = = false ) {
char szBuf [ 8096 ] = " " ;
sprintf ( szBuf , " Error finding text \n [%s] \n in file \n [%s] \n new Common File [%s] \n " , searchText . c_str ( ) , parentFile . c_str ( ) , newCommonFileName . c_str ( ) ) ;
printf ( " \n \n ================================================= \n %s " , szBuf ) ;
throw runtime_error ( szBuf ) ;
}
}
}
}
}
//printf("\nPurge Duplicate Files DISABLED - END:\n=====================\n");
}
}
}
if ( foundDuplicates = = true ) {
printf ( " Duplicates %.2f MB (%d) in files \n " , duplicateMegaBytes , duplicateCount ) ;
printf ( " Duplicates purged %.2f MB (%d) in files \n " , duplicateMegaBytesPurged , duplicateCountPurged ) ;
printf ( " \n Warning, duplicate files were detected - END: \n " ) ;
}
}
if ( techtree_errors = = false ) {
printf ( " \n Validation found NO ERRORS for tilesetPath [%s] tilesetName [%s]: \n " , tilesetPath . c_str ( ) , tilesetName . c_str ( ) ) ;
}
printf ( " ---------------------------------------------------------------- " ) ;
}
2011-05-19 00:04:45 +02:00
void runTechValidationForPath ( string techPath , string techName ,
2011-09-01 01:10:43 +02:00
const std : : vector < string > & filteredFactionList , World & world ,
2011-07-09 21:28:01 +02:00
bool purgeUnusedFiles , bool purgeDuplicateFiles , bool showDuplicateFiles ,
bool svnPurgeFiles , double & purgedMegaBytes ) {
2011-09-01 01:10:43 +02:00
//Config &config = Config::getInstance();
2011-05-19 00:04:45 +02:00
vector < string > factionsList ;
findDirs ( techPath + techName + " /factions/ " , factionsList , false , false ) ;
2011-09-01 01:10:43 +02:00
if ( factionsList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
Checksum checksum ;
set < string > factions ;
for ( int j = 0 ; j < factionsList . size ( ) ; + + j ) {
2011-09-01 20:08:56 +02:00
if ( filteredFactionList . empty ( ) = = true | |
2011-05-19 00:04:45 +02:00
std : : find ( filteredFactionList . begin ( ) , filteredFactionList . end ( ) , factionsList [ j ] ) ! = filteredFactionList . end ( ) ) {
factions . insert ( factionsList [ j ] ) ;
}
}
printf ( " \n ---------------------------------------------------------------- " ) ;
printf ( " \n Checking techPath [%s] techName [%s] total faction count = %d \n " , techPath . c_str ( ) , techName . c_str ( ) , ( int ) factionsList . size ( ) ) ;
for ( int j = 0 ; j < factionsList . size ( ) ; + + j ) {
2011-09-01 20:08:56 +02:00
if ( filteredFactionList . empty ( ) = = true | |
2011-05-19 00:04:45 +02:00
std : : find ( filteredFactionList . begin ( ) , filteredFactionList . end ( ) , factionsList [ j ] ) ! = filteredFactionList . end ( ) ) {
printf ( " Using faction [%s] \n " , factionsList [ j ] . c_str ( ) ) ;
}
}
2011-09-01 01:10:43 +02:00
if ( factions . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
bool techtree_errors = false ;
std : : map < string , vector < pair < string , string > > > loadedFileList ;
//vector<string> pathList = config.getPathListForType(ptTechs,"");
vector < string > pathList ;
pathList . push_back ( techPath ) ;
world . loadTech ( pathList , techName , factions , & checksum , loadedFileList ) ;
// Fixup paths with ..
{
std : : map < string , vector < pair < string , string > > > newLoadedFileList ;
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = loadedFileList . begin ( ) ;
iterMap ! = loadedFileList . end ( ) ; + + iterMap ) {
string loadedFile = iterMap - > first ;
replaceAll ( loadedFile , " // " , " / " ) ;
replaceAll ( loadedFile , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( loadedFile ) ;
if ( newLoadedFileList . find ( loadedFile ) ! = newLoadedFileList . end ( ) ) {
for ( unsigned int xx1 = 0 ; xx1 < iterMap - > second . size ( ) ; + + xx1 ) {
2012-03-10 18:46:10 +01:00
pair < string , string > & newVal = iterMap - > second [ xx1 ] ;
replaceAll ( newVal . first , " // " , " / " ) ;
replaceAll ( newVal . first , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . first ) ;
replaceAll ( newVal . second , " // " , " / " ) ;
replaceAll ( newVal . second , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . second ) ;
newLoadedFileList [ loadedFile ] . push_back ( newVal ) ;
2011-05-19 00:04:45 +02:00
}
}
else {
2012-03-10 18:46:10 +01:00
for ( unsigned int xx1 = 0 ; xx1 < iterMap - > second . size ( ) ; + + xx1 ) {
pair < string , string > & newVal = iterMap - > second [ xx1 ] ;
replaceAll ( newVal . first , " // " , " / " ) ;
replaceAll ( newVal . first , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . first ) ;
replaceAll ( newVal . second , " // " , " / " ) ;
replaceAll ( newVal . second , " \\ \\ " , " \\ " ) ;
updatePathClimbingParts ( newVal . second ) ;
}
2011-05-19 00:04:45 +02:00
newLoadedFileList [ loadedFile ] = iterMap - > second ;
}
}
loadedFileList = newLoadedFileList ;
}
// Validate the faction setup to ensure we don't have any bad associations
std : : vector < std : : string > resultErrors = world . validateFactionTypes ( ) ;
2011-09-01 01:10:43 +02:00
if ( resultErrors . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
techtree_errors = true ;
// Display the validation errors
string errorText = " \n Errors were detected: \n ===================== \n " ;
for ( int i = 0 ; i < resultErrors . size ( ) ; + + i ) {
if ( i > 0 ) {
errorText + = " \n " ;
}
errorText = errorText + resultErrors [ i ] ;
}
errorText + = " \n ===================== \n " ;
//throw runtime_error(errorText);
printf ( " %s " , errorText . c_str ( ) ) ;
}
// Validate the faction resource setup to ensure we don't have any bad associations
printf ( " \n Checking resources, count = %d \n " , world . getTechTree ( ) - > getResourceTypeCount ( ) ) ;
for ( int i = 0 ; i < world . getTechTree ( ) - > getResourceTypeCount ( ) ; + + i ) {
printf ( " Found techtree resource [%s] \n " , world . getTechTree ( ) - > getResourceType ( i ) - > getName ( ) . c_str ( ) ) ;
}
resultErrors = world . validateResourceTypes ( ) ;
2011-09-01 01:10:43 +02:00
if ( resultErrors . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
techtree_errors = true ;
// Display the validation errors
string errorText = " \n Errors were detected: \n ===================== \n " ;
for ( int i = 0 ; i < resultErrors . size ( ) ; + + i ) {
if ( i > 0 ) {
errorText + = " \n " ;
}
errorText = errorText + resultErrors [ i ] ;
}
errorText + = " \n ===================== \n " ;
//throw runtime_error(errorText);
printf ( " %s " , errorText . c_str ( ) ) ;
}
// Now check for unused files in the techtree
std : : map < string , vector < pair < string , string > > > foundFileList ;
for ( unsigned int i = 0 ; i < pathList . size ( ) ; + + i ) {
string path = pathList [ i ] ;
endPathWithSlash ( path ) ;
path = path + techName + " / " ;
2012-03-10 18:46:10 +01:00
replaceAll ( path , " // " , " / " ) ;
replaceAll ( path , " \\ \\ " , " \\ " ) ;
2011-05-19 00:04:45 +02:00
vector < string > foundFiles = getFolderTreeContentsListRecursively ( path + " *. " , " " ) ;
for ( unsigned int j = 0 ; j < foundFiles . size ( ) ; + + j ) {
string file = foundFiles [ j ] ;
2012-03-10 18:46:10 +01:00
replaceAll ( file , " // " , " / " ) ;
replaceAll ( file , " \\ \\ " , " \\ " ) ;
2011-05-19 00:04:45 +02:00
if ( file . find ( " loading_screen " ) ! = string : : npos | |
2011-06-09 02:59:03 +02:00
file . find ( " preview_screen " ) ! = string : : npos | |
file . find ( " hud " ) ! = string : : npos ) {
2011-05-19 00:04:45 +02:00
continue ;
}
if ( file . find ( " /factions/ " ) ! = string : : npos ) {
bool includeFaction = false ;
for ( set < string > : : iterator it = factions . begin ( ) ; it ! = factions . end ( ) ; + + it ) {
string currentFaction = * it ;
if ( file . find ( " /factions/ " + currentFaction ) ! = string : : npos ) {
includeFaction = true ;
break ;
}
}
if ( includeFaction = = false ) {
continue ;
}
}
replaceAll ( file , " // " , " / " ) ;
replaceAll ( file , " \\ \\ " , " \\ " ) ;
foundFileList [ file ] . push_back ( make_pair ( path , path ) ) ;
}
}
printf ( " Found techtree filecount = %lu, used = %lu \n " , ( unsigned long ) foundFileList . size ( ) , ( unsigned long ) loadedFileList . size ( ) ) ;
// for( std::map<string,vector<string> >::iterator iterMap = loadedFileList.begin();
// iterMap != loadedFileList.end(); ++iterMap) {
// string foundFile = iterMap->first;
//
// if(foundFile.find("golem_ack1.wav") != string::npos) {
// printf("FOUND file [%s]\n",foundFile.c_str());
// }
// }
int purgeCount = 0 ;
bool foundUnusedFile = false ;
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = foundFileList . begin ( ) ;
iterMap ! = foundFileList . end ( ) ; + + iterMap ) {
string foundFile = iterMap - > first ;
2012-03-10 18:46:10 +01:00
replaceAll ( foundFile , " // " , " / " ) ;
replaceAll ( foundFile , " \\ \\ " , " \\ " ) ;
2011-05-19 00:04:45 +02:00
if ( loadedFileList . find ( foundFile ) = = loadedFileList . end ( ) ) {
if ( foundUnusedFile = = false ) {
printf ( " \n Warning, unused files were detected - START: \n ===================== \n " ) ;
}
foundUnusedFile = true ;
printf ( " [%s] \n " , foundFile . c_str ( ) ) ;
string fileName = extractFileFromDirectoryPath ( foundFile ) ;
if ( loadedFileList . find ( fileName ) ! = loadedFileList . end ( ) ) {
printf ( " possible match on [%s] ? \n " , loadedFileList . find ( fileName ) - > first . c_str ( ) ) ;
}
else if ( purgeUnusedFiles = = true ) {
off_t fileSize = getFileSize ( foundFile ) ;
// convert to MB
purgedMegaBytes + = ( ( double ) fileSize / 1048576.0 ) ;
purgeCount + + ;
if ( svnPurgeFiles = = true ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " svn delete \" %s \" " , foundFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
}
else {
removeFile ( foundFile ) ;
}
}
}
}
if ( foundUnusedFile = = true ) {
if ( purgedMegaBytes > 0 ) {
printf ( " Purged %.2f MB (%d) in files \n " , purgedMegaBytes , purgeCount ) ;
}
printf ( " \n Warning, unused files were detected - END: \n " ) ;
}
2011-07-09 21:28:01 +02:00
if ( showDuplicateFiles = = true ) {
std : : map < int32 , vector < string > > mapDuplicateFiles ;
// Now check for duplicate data content
for ( std : : map < string , vector < pair < string , string > > > : : iterator iterMap = loadedFileList . begin ( ) ;
2011-09-01 01:10:43 +02:00
iterMap ! = loadedFileList . end ( ) ; + + iterMap ) {
2011-07-09 21:28:01 +02:00
string fileName = iterMap - > first ;
Checksum checksum ;
checksum . addFile ( fileName ) ;
int32 crcValue = checksum . getSum ( ) ;
// if(crcValue == 0) {
// char szBuf[4096]="";
// sprintf(szBuf,"Error calculating CRC for file [%s]",fileName.c_str());
// throw runtime_error(szBuf);
// }
// else {
// printf("** CRC for file [%s] is [%d] and has %d parents\n",fileName.c_str(),crcValue,(int)iterMap->second.size());
// }
mapDuplicateFiles [ crcValue ] . push_back ( fileName ) ;
}
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
double duplicateMegaBytesPurged = 0 ;
int duplicateCountPurged = 0 ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
double duplicateMegaBytes = 0 ;
int duplicateCount = 0 ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
bool foundDuplicates = false ;
for ( std : : map < int32 , vector < string > > : : iterator iterMap = mapDuplicateFiles . begin ( ) ;
2011-09-01 01:10:43 +02:00
iterMap ! = mapDuplicateFiles . end ( ) ; + + iterMap ) {
2011-07-09 21:28:01 +02:00
vector < string > & fileList = iterMap - > second ;
if ( fileList . size ( ) > 1 ) {
if ( foundDuplicates = = false ) {
foundDuplicates = true ;
printf ( " \n Warning, duplicate files were detected - START: \n ===================== \n " ) ;
2011-05-19 00:04:45 +02:00
}
2011-07-09 21:28:01 +02:00
map < string , int > parentList ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
if ( idx > 0 ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
// convert to MB
duplicateMegaBytes + = ( ( double ) fileSize / 1048576.0 ) ;
duplicateCount + + ;
}
else {
printf ( " \n " ) ;
}
printf ( " [%s] \n " , duplicateFile . c_str ( ) ) ;
std : : map < string , vector < pair < string , string > > > : : iterator iterFind = loadedFileList . find ( duplicateFile ) ;
if ( iterFind ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx = 0 ; jdx < iterFind - > second . size ( ) ; jdx + + ) {
parentList [ iterFind - > second [ jdx ] . first ] + + ;
}
2011-05-19 00:04:45 +02:00
}
}
2011-07-09 21:28:01 +02:00
for ( map < string , int > : : iterator iterMap1 = parentList . begin ( ) ;
2011-09-01 01:10:43 +02:00
iterMap1 ! = parentList . end ( ) ; + + iterMap1 ) {
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
if ( iterMap1 = = parentList . begin ( ) ) {
printf ( " \t Parents: \n " ) ;
}
printf ( " \t [%s] \n " , iterMap1 - > first . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
}
2011-07-09 21:28:01 +02:00
if ( purgeDuplicateFiles = = true ) {
2012-03-10 07:44:57 +01:00
//printf("\nPurge Duplicate Files detected - START:\n=====================\n");
2011-07-09 21:28:01 +02:00
string newCommonFileName = " " ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
if ( idx = = 0 ) {
newCommonFileName = " $COMMONDATAPATH/sounds/ " + extractFileFromDirectoryPath ( duplicateFile ) ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
string expandedNewCommonFileName = newCommonFileName ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
std : : map < string , string > mapExtraTagReplacementValues ;
2012-03-10 18:46:10 +01:00
string techCommonData = techPath + techName + " /commondata/ " ;
replaceAll ( techCommonData , " // " , " / " ) ;
mapExtraTagReplacementValues [ " $COMMONDATAPATH " ] = techCommonData ;
2011-07-09 21:28:01 +02:00
mapExtraTagReplacementValues = Properties : : getTagReplacementValues ( & mapExtraTagReplacementValues ) ;
Properties : : applyTagsToValue ( expandedNewCommonFileName , & mapExtraTagReplacementValues ) ;
createDirectoryPaths ( extractDirectoryPathFromFile ( expandedNewCommonFileName ) ) ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
if ( svnPurgeFiles = = true ) {
copyFileTo ( duplicateFile , expandedNewCommonFileName ) ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " svn delete \" %s \" " , duplicateFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
printf ( " *** Duplicate file: \n [%s] \n was svn deleted and copied to: \n [%s] \n " , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
}
else {
//int result = 0;
int result = rename ( duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
if ( result ! = 0 ) {
char szBuf [ 4096 ] = " " ;
char * errmsg = strerror ( errno ) ;
sprintf ( szBuf , " !!! Error [%s] Could not rename [%s] to [%s]! " , errmsg , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
else {
printf ( " *** Duplicate file: \n [%s] \n was renamed to: \n [%s] \n " , duplicateFile . c_str ( ) , expandedNewCommonFileName . c_str ( ) ) ;
}
2011-05-19 00:04:45 +02:00
}
}
else {
2011-07-09 21:28:01 +02:00
if ( svnPurgeFiles = = true ) {
2011-05-19 00:04:45 +02:00
char szBuf [ 4096 ] = " " ;
2011-07-09 21:28:01 +02:00
sprintf ( szBuf , " svn delete \" %s \" " , duplicateFile . c_str ( ) ) ;
bool svnOk = executeShellCommand ( szBuf , 0 ) ;
if ( svnOk = = false ) {
throw runtime_error ( " Call to command failed [ " + string ( szBuf ) + " ] " ) ;
}
printf ( " *** Duplicate file: \n [%s] \n was svn deleted \n " , duplicateFile . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
}
else {
2011-07-09 21:28:01 +02:00
removeFile ( duplicateFile ) ;
2011-05-19 00:04:45 +02:00
}
2011-07-09 21:28:01 +02:00
printf ( " *** Duplicate file: \n [%s] \n was removed \n " , duplicateFile . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
// convert to MB
duplicateMegaBytesPurged + = ( ( double ) fileSize / 1048576.0 ) ;
duplicateCountPurged + + ;
}
2011-05-19 00:04:45 +02:00
}
}
2011-07-09 21:28:01 +02:00
std : : map < string , int > mapUniqueParentList ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
std : : map < string , vector < pair < string , string > > > : : iterator iterFind2 = loadedFileList . find ( duplicateFile ) ;
if ( iterFind2 ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx1 = 0 ; jdx1 < iterFind2 - > second . size ( ) ; jdx1 + + ) {
string parentFile = iterFind2 - > second [ jdx1 ] . first ;
string searchText = iterFind2 - > second [ jdx1 ] . second ;
if ( mapUniqueParentList . find ( parentFile ) = = mapUniqueParentList . end ( ) ) {
printf ( " *** Searching parent file: \n [%s] \n for duplicate file reference: \n [%s] \n to replace with newname: \n [%s] \n " , parentFile . c_str ( ) , searchText . c_str ( ) , newCommonFileName . c_str ( ) ) ;
bool foundText = searchAndReplaceTextInFile ( parentFile , searchText , newCommonFileName , false ) ;
printf ( " foundText = %d \n " , foundText ) ;
if ( foundText = = false ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " Error finding text [%s] in file [%s] " , searchText . c_str ( ) , parentFile . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
mapUniqueParentList [ parentFile ] + + ;
2011-05-19 00:04:45 +02:00
}
}
}
}
}
2012-03-10 07:44:57 +01:00
//printf("\nPurge Duplicate Files detected - END:\n=====================\n");
2011-05-19 00:04:45 +02:00
}
2011-07-09 21:28:01 +02:00
else {
2012-03-10 07:44:57 +01:00
//printf("\nPurge Duplicate Files DISABLED - START:\n=====================\n");
2011-07-09 21:28:01 +02:00
string newCommonFileName = " " ;
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
off_t fileSize = getFileSize ( duplicateFile ) ;
if ( idx = = 0 ) {
newCommonFileName = " $COMMONDATAPATH/sounds/ " + extractFileFromDirectoryPath ( duplicateFile ) ;
break ;
}
2011-05-19 00:04:45 +02:00
}
}
2012-03-10 07:44:57 +01:00
//printf("\nPurge Duplicate Files #2 DISABLED [%lu] - START:\n=====================\n",fileList.size());
2011-07-09 21:28:01 +02:00
for ( unsigned int idx = 0 ; idx < fileList . size ( ) ; + + idx ) {
string duplicateFile = fileList [ idx ] ;
string fileExt = extractExtension ( duplicateFile ) ;
if ( fileExt = = " wav " | | fileExt = = " ogg " ) {
std : : map < string , vector < pair < string , string > > > : : iterator iterFind4 = loadedFileList . find ( duplicateFile ) ;
if ( iterFind4 ! = loadedFileList . end ( ) ) {
for ( unsigned int jdx = 0 ; jdx < iterFind4 - > second . size ( ) ; jdx + + ) {
string parentFile = iterFind4 - > second [ jdx ] . first ;
string searchText = iterFind4 - > second [ jdx ] . second ;
2012-03-10 18:46:10 +01:00
//replaceAll(parentFile, "//", "/");
//replaceAll(parentFile, "\\\\", "\\");
2011-07-09 21:28:01 +02:00
//printf("*** Searching parent file:\n[%s]\nfor duplicate file reference:\n[%s]\nto replace with newname:\n[%s]\n",parentFile.c_str(),searchText.c_str(),newCommonFileName.c_str());
bool foundText = searchAndReplaceTextInFile ( parentFile , searchText , newCommonFileName , true ) ;
//printf("foundText = %d\n",foundText);
if ( foundText = = false ) {
2012-03-10 07:44:57 +01:00
string techCommonData = techPath + techName + " /commondata/ " ;
replaceAll ( techCommonData , " // " , " / " ) ;
//printf("ERROR techCommonData check\n[%s]\n[%s]\n",techCommonData.c_str(),searchText.c_str());
if ( StartsWith ( searchText , techCommonData ) = = true ) {
replaceAll ( searchText , techCommonData , " $COMMONDATAPATH/ " ) ;
foundText = searchAndReplaceTextInFile ( parentFile , searchText , newCommonFileName , true ) ;
}
if ( foundText = = false ) {
//printf("Error finding text [%s] in file [%s]",searchText.c_str(),parentFile.c_str());
char szBuf [ 8096 ] = " " ;
sprintf ( szBuf , " Error finding text \n [%s] \n in file \n [%s] \n new Common File [%s] \n " , searchText . c_str ( ) , parentFile . c_str ( ) , newCommonFileName . c_str ( ) ) ;
printf ( " \n \n ================================================= \n %s " , szBuf ) ;
throw runtime_error ( szBuf ) ;
}
2011-07-09 21:28:01 +02:00
}
2011-05-19 00:04:45 +02:00
}
}
}
}
2012-03-10 07:44:57 +01:00
//printf("\nPurge Duplicate Files DISABLED - END:\n=====================\n");
2011-05-19 00:04:45 +02:00
}
}
}
2011-07-09 21:28:01 +02:00
if ( foundDuplicates = = true ) {
printf ( " Duplicates %.2f MB (%d) in files \n " , duplicateMegaBytes , duplicateCount ) ;
printf ( " Duplicates purged %.2f MB (%d) in files \n " , duplicateMegaBytesPurged , duplicateCountPurged ) ;
2011-05-19 00:04:45 +02:00
2011-07-09 21:28:01 +02:00
printf ( " \n Warning, duplicate files were detected - END: \n " ) ;
}
2011-05-19 00:04:45 +02:00
}
if ( techtree_errors = = false ) {
printf ( " \n Validation found NO ERRORS for techPath [%s] techName [%s] factions checked (count = %d): \n " , techPath . c_str ( ) , techName . c_str ( ) , ( int ) factions . size ( ) ) ;
for ( set < string > : : iterator it = factions . begin ( ) ; it ! = factions . end ( ) ; + + it ) {
printf ( " Faction [%s] \n " , ( * it ) . c_str ( ) ) ;
}
}
}
printf ( " ---------------------------------------------------------------- " ) ;
}
}
void runTechValidationReport ( int argc , char * * argv ) {
//disableBacktrace=true;
printf ( " ====== Started Validation ====== \n " ) ;
bool purgeDuplicateFiles = false ;
2011-07-09 21:28:01 +02:00
bool showDuplicateFiles = true ;
2011-05-19 00:04:45 +02:00
bool purgeUnusedFiles = false ;
bool svnPurgeFiles = false ;
double purgedMegaBytes = 0 ;
Config & config = Config : : getInstance ( ) ;
// Did the user pass a specific scenario to validate?
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_SCENARIO ] ) + string ( " = " ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_SCENARIO ] ) + string ( " = " ) , & foundParamIndIndex ) ;
string filterList = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( filterList , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
vector < string > optionList ;
string validateScenarioName = paramPartTokens [ 1 ] ;
printf ( " Filtering scenario: %s \n " , validateScenarioName . c_str ( ) ) ;
if ( paramPartTokens . size ( ) > = 3 ) {
if ( paramPartTokens [ 2 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused scenario files will be deleted! \n " ) ;
}
}
{
printf ( " \n ---------------- Loading scenario inside world ---------------- \n " ) ;
World world ;
double purgedMegaBytes = 0 ;
std : : vector < string > filteredFactionList ;
vector < string > scenarioPaths = config . getPathListForType ( ptScenarios ) ;
for ( int idx = 0 ; idx < scenarioPaths . size ( ) ; idx + + ) {
string & scenarioPath = scenarioPaths [ idx ] ;
endPathWithSlash ( scenarioPath ) ;
//printf("techPath [%s]\n",techPath.c_str());
vector < string > scenarioList ;
findDirs ( scenarioPath , scenarioList , false , false ) ;
for ( int idx2 = 0 ; idx2 < scenarioList . size ( ) ; idx2 + + ) {
string & scenarioName = scenarioList [ idx2 ] ;
//printf("Found Scenario [%s] looking for [%s]\n",scenarioName.c_str(),validateScenarioName.c_str());
if ( scenarioName = = validateScenarioName ) {
string file = scenarioPath + scenarioName + " / " + scenarioName + " .xml " ;
XmlTree xmlTree ;
xmlTree . load ( file , Properties : : getTagReplacementValues ( ) ) ;
const XmlNode * scenarioNode = xmlTree . getRootNode ( ) ;
string techName = scenarioNode - > getChild ( " tech-tree " ) - > getAttribute ( " value " ) - > getValue ( ) ;
// Self Contained techtree?
string scenarioTechtree = scenarioPath + scenarioName + " / " + techName + " / " + techName + " .xml " ;
if ( fileExists ( scenarioTechtree ) = = true ) {
string techPath = scenarioPath + scenarioName + " / " ;
printf ( " Found Scenario [%s] with custom techtree [%s] validating... \n " , scenarioName . c_str ( ) , techName . c_str ( ) ) ;
runTechValidationForPath ( techPath , techName , filteredFactionList ,
2011-07-09 21:28:01 +02:00
world , purgeUnusedFiles , showDuplicateFiles , false , false , purgedMegaBytes ) ;
2011-05-19 00:04:45 +02:00
}
//
//
// runTechValidationForPath(techPath, techName, filteredFactionList,
// world, purgeUnusedFiles,purgedMegaBytes);
}
}
}
printf ( " \n ====== Finished Validation ====== \n " ) ;
}
return ;
}
else {
printf ( " \n Invalid missing scenario specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return ;
}
}
// Did the user pass a specific list of factions to validate?
std : : vector < string > filteredFactionList ;
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_FACTIONS ] ) + string ( " = " ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_FACTIONS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
string filterList = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( filterList , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
string factionList = paramPartTokens [ 1 ] ;
Tokenize ( factionList , filteredFactionList , " , " ) ;
2011-09-01 01:10:43 +02:00
if ( filteredFactionList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
printf ( " Filtering factions and only looking for the following: \n " ) ;
for ( int idx = 0 ; idx < filteredFactionList . size ( ) ; + + idx ) {
filteredFactionList [ idx ] = trim ( filteredFactionList [ idx ] ) ;
printf ( " %s \n " , filteredFactionList [ idx ] . c_str ( ) ) ;
}
}
if ( paramPartTokens . size ( ) > = 3 ) {
if ( paramPartTokens [ 2 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused faction files will be deleted! \n " ) ;
}
}
}
}
vector < string > results ;
findDirs ( config . getPathListForType ( ptTechs ) , results ) ;
vector < string > techTreeFiles = results ;
// Did the user pass a specific list of techtrees to validate?
std : : vector < string > filteredTechTreeList ;
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_TECHTREES ] ) + string ( " = " ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_TECHTREES ] ) + string ( " = " ) , & foundParamIndIndex ) ;
string filterList = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( filterList , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
string techtreeList = paramPartTokens [ 1 ] ;
Tokenize ( techtreeList , filteredTechTreeList , " , " ) ;
2011-09-01 01:10:43 +02:00
if ( filteredTechTreeList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
printf ( " Filtering techtrees and only looking for the following: \n " ) ;
for ( int idx = 0 ; idx < filteredTechTreeList . size ( ) ; + + idx ) {
filteredTechTreeList [ idx ] = trim ( filteredTechTreeList [ idx ] ) ;
printf ( " %s \n " , filteredTechTreeList [ idx ] . c_str ( ) ) ;
}
}
if ( paramPartTokens . size ( ) > = 3 ) {
if ( paramPartTokens [ 2 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused techtree files will be deleted! \n " ) ;
}
else if ( paramPartTokens [ 2 ] = = " purgeduplicates " ) {
purgeDuplicateFiles = true ;
printf ( " *NOTE All duplicate techtree files will be merged! \n " ) ;
}
else if ( paramPartTokens [ 2 ] = = " svndelete " ) {
svnPurgeFiles = true ;
printf ( " *NOTE All unused / duplicate techtree files will be removed from svn! \n " ) ;
}
2011-07-09 21:28:01 +02:00
else if ( paramPartTokens [ 2 ] = = " hideduplicates " ) {
showDuplicateFiles = false ;
printf ( " *NOTE All duplicate techtree files will NOT be shown! \n " ) ;
}
2011-05-19 00:04:45 +02:00
}
if ( paramPartTokens . size ( ) > = 4 ) {
if ( paramPartTokens [ 3 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused techtree files will be deleted! \n " ) ;
}
else if ( paramPartTokens [ 3 ] = = " purgeduplicates " ) {
purgeDuplicateFiles = true ;
printf ( " *NOTE All duplicate techtree files will be merged! \n " ) ;
}
else if ( paramPartTokens [ 3 ] = = " svndelete " ) {
svnPurgeFiles = true ;
printf ( " *NOTE All unused / duplicate techtree files will be removed from svn! \n " ) ;
}
2011-07-09 21:28:01 +02:00
else if ( paramPartTokens [ 3 ] = = " hideduplicates " ) {
showDuplicateFiles = false ;
printf ( " *NOTE All duplicate techtree files will NOT be shown! \n " ) ;
}
2011-05-19 00:04:45 +02:00
}
if ( paramPartTokens . size ( ) > = 5 ) {
if ( paramPartTokens [ 4 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused techtree files will be deleted! \n " ) ;
}
else if ( paramPartTokens [ 4 ] = = " purgeduplicates " ) {
purgeDuplicateFiles = true ;
printf ( " *NOTE All duplicate techtree files will be merged! \n " ) ;
}
else if ( paramPartTokens [ 4 ] = = " svndelete " ) {
svnPurgeFiles = true ;
printf ( " *NOTE All unused / duplicate techtree files will be removed from svn! \n " ) ;
}
2011-07-09 21:28:01 +02:00
else if ( paramPartTokens [ 4 ] = = " hideduplicates " ) {
showDuplicateFiles = false ;
printf ( " *NOTE All duplicate techtree files will NOT be shown! \n " ) ;
}
2011-05-19 00:04:45 +02:00
}
}
}
{
printf ( " \n ---------------- Loading factions inside world ---------------- " ) ;
World world ;
vector < string > techPaths = config . getPathListForType ( ptTechs ) ;
for ( int idx = 0 ; idx < techPaths . size ( ) ; idx + + ) {
string & techPath = techPaths [ idx ] ;
endPathWithSlash ( techPath ) ;
//printf("techPath [%s]\n",techPath.c_str());
for ( int idx2 = 0 ; idx2 < techTreeFiles . size ( ) ; idx2 + + ) {
string & techName = techTreeFiles [ idx2 ] ;
2011-09-01 20:08:56 +02:00
if ( filteredTechTreeList . empty ( ) = = true | |
2011-05-19 00:04:45 +02:00
std : : find ( filteredTechTreeList . begin ( ) , filteredTechTreeList . end ( ) , techName ) ! = filteredTechTreeList . end ( ) ) {
runTechValidationForPath ( techPath , techName , filteredFactionList ,
2011-07-09 21:28:01 +02:00
world , purgeUnusedFiles , purgeDuplicateFiles ,
showDuplicateFiles , svnPurgeFiles , purgedMegaBytes ) ;
2011-05-19 00:04:45 +02:00
}
}
}
printf ( " \n ====== Finished Validation ====== \n " ) ;
}
}
2012-04-03 21:35:22 +02:00
void runTilesetValidationReport ( int argc , char * * argv ) {
//disableBacktrace=true;
printf ( " ====== Started Validation ====== \n " ) ;
bool showDuplicateFiles = true ;
bool purgeUnusedFiles = false ;
double purgedMegaBytes = 0 ;
Config & config = Config : : getInstance ( ) ;
// Did the user pass a specific tileset to validate?
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_TILESET ] ) + string ( " = " ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_VALIDATE_TILESET ] ) + string ( " = " ) , & foundParamIndIndex ) ;
string filterList = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( filterList , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
vector < string > optionList ;
string validateTilesetName = paramPartTokens [ 1 ] ;
printf ( " Filtering tileset: %s \n " , validateTilesetName . c_str ( ) ) ;
if ( paramPartTokens . size ( ) > = 3 ) {
if ( paramPartTokens [ 2 ] = = " purgeunused " ) {
purgeUnusedFiles = true ;
printf ( " *NOTE All unused tileset files will be deleted! \n " ) ;
}
}
{
printf ( " \n ---------------- Loading tileset inside world ---------------- \n " ) ;
World world ;
double purgedMegaBytes = 0 ;
std : : vector < string > filteredFactionList ;
vector < string > tilesetPaths = config . getPathListForType ( ptTilesets ) ;
for ( int idx = 0 ; idx < tilesetPaths . size ( ) ; idx + + ) {
string & tilesetPath = tilesetPaths [ idx ] ;
endPathWithSlash ( tilesetPath ) ;
vector < string > tilesetList ;
findDirs ( tilesetPath , tilesetList , false , false ) ;
for ( int idx2 = 0 ; idx2 < tilesetList . size ( ) ; idx2 + + ) {
string & tilesetName = tilesetList [ idx2 ] ;
if ( tilesetName = = validateTilesetName ) {
runTilesetValidationForPath ( tilesetPath , tilesetName ,
world , purgeUnusedFiles , showDuplicateFiles ,
false , false , purgedMegaBytes ) ;
}
}
}
printf ( " \n ====== Finished Validation ====== \n " ) ;
}
return ;
}
else {
printf ( " \n Invalid missing tileset specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
return ;
}
}
else {
printf ( " \n Invalid missing tileset specified on commandline \n \n " ) ;
return ;
}
}
2011-05-19 00:04:45 +02:00
void ShowINISettings ( int argc , char * * argv , Config & config , Config & configKeys ) {
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_INI_SETTINGS ] ) = = true ) {
vector < string > filteredPropertyList ;
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_INI_SETTINGS ] ) + string ( " = " ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_INI_SETTINGS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
string filterList = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( filterList , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
string tokenList = paramPartTokens [ 1 ] ;
Tokenize ( tokenList , filteredPropertyList , " , " ) ;
2011-09-01 01:10:43 +02:00
if ( filteredPropertyList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
printf ( " Filtering properties and only looking for the following: \n " ) ;
for ( int idx = 0 ; idx < filteredPropertyList . size ( ) ; + + idx ) {
filteredPropertyList [ idx ] = trim ( filteredPropertyList [ idx ] ) ;
printf ( " %s \n " , filteredPropertyList [ idx ] . c_str ( ) ) ;
}
}
}
}
printf ( " \n Main settings report \n " ) ;
printf ( " ==================== \n " ) ;
vector < pair < string , string > > mergedMainSettings = config . getMergedProperties ( ) ;
vector < pair < string , string > > mergedKeySettings = configKeys . getMergedProperties ( ) ;
// Figure out the max # of tabs we need to format display nicely
int tabCount = 1 ;
for ( int i = 0 ; i < mergedMainSettings . size ( ) ; + + i ) {
const pair < string , string > & nameValue = mergedMainSettings [ i ] ;
bool displayProperty = false ;
2011-09-01 01:10:43 +02:00
if ( filteredPropertyList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
if ( find ( filteredPropertyList . begin ( ) , filteredPropertyList . end ( ) , nameValue . first ) ! = filteredPropertyList . end ( ) ) {
displayProperty = true ;
}
}
else {
displayProperty = true ;
}
if ( displayProperty = = true ) {
int requredTabs = ( nameValue . first . length ( ) / 8 ) + 1 ;
if ( nameValue . first . length ( ) % 8 ) {
requredTabs + + ;
}
if ( requredTabs > tabCount ) {
tabCount = requredTabs ;
}
}
}
for ( int i = 0 ; i < mergedKeySettings . size ( ) ; + + i ) {
const pair < string , string > & nameValue = mergedKeySettings [ i ] ;
bool displayProperty = false ;
2011-09-01 01:10:43 +02:00
if ( filteredPropertyList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
if ( find ( filteredPropertyList . begin ( ) , filteredPropertyList . end ( ) , nameValue . first ) ! = filteredPropertyList . end ( ) ) {
displayProperty = true ;
}
}
else {
displayProperty = true ;
}
if ( displayProperty = = true ) {
int requredTabs = ( nameValue . first . length ( ) / 8 ) + 1 ;
if ( nameValue . first . length ( ) % 8 ) {
requredTabs + + ;
}
if ( requredTabs > tabCount ) {
tabCount = requredTabs ;
}
}
}
// Output the properties
for ( int i = 0 ; i < mergedMainSettings . size ( ) ; + + i ) {
const pair < string , string > & nameValue = mergedMainSettings [ i ] ;
bool displayProperty = false ;
2011-09-01 01:10:43 +02:00
if ( filteredPropertyList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
if ( find ( filteredPropertyList . begin ( ) , filteredPropertyList . end ( ) , nameValue . first ) ! = filteredPropertyList . end ( ) ) {
displayProperty = true ;
}
}
else {
displayProperty = true ;
}
if ( displayProperty = = true ) {
printf ( " Property Name [%s] " , nameValue . first . c_str ( ) ) ;
int tabs = ( nameValue . first . length ( ) / 8 ) + 1 ;
for ( int j = 0 ; j < ( tabCount - tabs ) ; + + j ) {
printf ( " \t " ) ;
}
printf ( " Value [%s] \n " , nameValue . second . c_str ( ) ) ;
}
}
printf ( " \n \n Main key binding settings report \n " ) ;
printf ( " ==================================== \n " ) ;
for ( int i = 0 ; i < mergedKeySettings . size ( ) ; + + i ) {
const pair < string , string > & nameValue = mergedKeySettings [ i ] ;
bool displayProperty = false ;
2011-09-01 01:10:43 +02:00
if ( filteredPropertyList . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
if ( find ( filteredPropertyList . begin ( ) , filteredPropertyList . end ( ) , nameValue . first ) ! = filteredPropertyList . end ( ) ) {
displayProperty = true ;
}
}
else {
displayProperty = true ;
}
if ( displayProperty = = true ) {
printf ( " Property Name [%s] " , nameValue . first . c_str ( ) ) ;
int tabs = ( nameValue . first . length ( ) / 8 ) + 1 ;
for ( int j = 0 ; j < ( tabCount - tabs ) ; + + j ) {
printf ( " \t " ) ;
}
printf ( " Value [%s] \n " , nameValue . second . c_str ( ) ) ;
}
}
}
}
void CheckForDuplicateData ( ) {
Config & config = Config : : getInstance ( ) ;
string duplicateWarnings = " " ;
{
2011-12-05 06:26:48 +01:00
vector < string > results ;
string scenarioDir = " " ;
vector < string > pathList = config . getPathListForType ( ptMaps , scenarioDir ) ;
vector < string > invalidMapList ;
vector < string > maps = MapPreview : : findAllValidMaps ( pathList , scenarioDir , false , true , & invalidMapList ) ;
std : : sort ( maps . begin ( ) , maps . end ( ) ) ;
if ( maps . empty ( ) = = true ) {
throw runtime_error ( " No maps were found! " ) ;
}
2012-03-28 08:25:57 +02:00
else if ( invalidMapList . empty ( ) = = false ) {
2011-12-05 06:26:48 +01:00
string errorMsg = " Warning invalid maps were detected (will be ignored): \n " ;
for ( int i = 0 ; i < invalidMapList . size ( ) ; + + i ) {
char szBuf [ 4096 ] = " " ;
sprintf ( szBuf , " map [%s] \n " , invalidMapList [ i ] . c_str ( ) ) ;
errorMsg + = szBuf ;
}
duplicateWarnings + = errorMsg ;
}
2011-05-19 00:04:45 +02:00
vector < string > duplicateMapsToRename ;
for ( int i = 0 ; i < maps . size ( ) ; + + i ) {
string map1 = maps [ i ] ;
for ( int j = 0 ; j < maps . size ( ) ; + + j ) {
if ( i ! = j ) {
string map2 = maps [ j ] ;
//printf("i = %d map1 [%s] j = %d map2 [%s]\n",i,map1.c_str(),j,map2.c_str());
if ( map1 = = map2 ) {
if ( std : : find ( duplicateMapsToRename . begin ( ) , duplicateMapsToRename . end ( ) , map1 ) = = duplicateMapsToRename . end ( ) ) {
duplicateMapsToRename . push_back ( map1 ) ;
}
}
}
}
}
2011-09-01 01:10:43 +02:00
if ( duplicateMapsToRename . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
string errorMsg = " Warning duplicate maps were detected and renamed: \n " ;
for ( int i = 0 ; i < duplicateMapsToRename . size ( ) ; + + i ) {
2011-12-05 06:26:48 +01:00
string currentPath = pathList [ 1 ] ;
2011-05-19 00:04:45 +02:00
endPathWithSlash ( currentPath ) ;
string oldFile = currentPath + duplicateMapsToRename [ i ] ;
string newFile = currentPath + duplicateMapsToRename [ i ] ;
string ext = extractExtension ( newFile ) ;
newFile = newFile . substr ( 0 , newFile . length ( ) - ext . length ( ) - 1 ) ;
newFile = newFile + " _custom. " + ext ;
char szBuf [ 4096 ] = " " ;
int result = rename ( oldFile . c_str ( ) , newFile . c_str ( ) ) ;
if ( result ! = 0 ) {
char * errmsg = strerror ( errno ) ;
sprintf ( szBuf , " Error [%s] \n Could not rename [%s] to [%s]! " , errmsg , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
else {
sprintf ( szBuf , " map [%s] in [%s] \n was renamed to [%s] " , duplicateMapsToRename [ i ] . c_str ( ) , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
}
errorMsg + = szBuf ;
}
duplicateWarnings + = errorMsg ;
}
}
{
//tilesets
std : : vector < std : : string > tileSets ;
vector < string > tilesetPaths = config . getPathListForType ( ptTilesets ) ;
findDirs ( tilesetPaths , tileSets , false , true ) ;
if ( tileSets . empty ( ) ) {
throw runtime_error ( " No tilesets were found! " ) ;
}
vector < string > duplicateTilesetsToRename ;
for ( int i = 0 ; i < tileSets . size ( ) ; + + i ) {
string tileSet1 = tileSets [ i ] ;
for ( int j = 0 ; j < tileSets . size ( ) ; + + j ) {
if ( i ! = j ) {
string tileSet2 = tileSets [ j ] ;
if ( tileSet1 = = tileSet2 ) {
if ( std : : find ( duplicateTilesetsToRename . begin ( ) , duplicateTilesetsToRename . end ( ) , tileSet1 ) = = duplicateTilesetsToRename . end ( ) ) {
duplicateTilesetsToRename . push_back ( tileSet1 ) ;
}
}
}
}
}
2011-09-01 01:10:43 +02:00
if ( duplicateTilesetsToRename . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
string errorMsg = " Warning duplicate tilesets were detected and renamed: \n " ;
for ( int i = 0 ; i < duplicateTilesetsToRename . size ( ) ; + + i ) {
string currentPath = tilesetPaths [ 1 ] ;
endPathWithSlash ( currentPath ) ;
string oldFile = currentPath + duplicateTilesetsToRename [ i ] ;
string newFile = currentPath + duplicateTilesetsToRename [ i ] ;
newFile = newFile + " _custom " ;
char szBuf [ 4096 ] = " " ;
int result = rename ( oldFile . c_str ( ) , newFile . c_str ( ) ) ;
if ( result ! = 0 ) {
char * errmsg = strerror ( errno ) ;
sprintf ( szBuf , " Error [%s] \n Could not rename [%s] to [%s]! " , errmsg , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
else {
sprintf ( szBuf , " tileset [%s] in [%s] \n was renamed to [%s] " , duplicateTilesetsToRename [ i ] . c_str ( ) , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
string tilesetName = extractFileFromDirectoryPath ( oldFile ) ;
oldFile = newFile + " / " + tilesetName + " .xml " ;
newFile = newFile + " / " + tilesetName + " _custom.xml " ;
//printf("\n\n\n###### RENAME [%s] to [%s]\n\n",oldFile.c_str(),newFile.c_str());
2011-09-01 01:10:43 +02:00
rename ( oldFile . c_str ( ) , newFile . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
}
errorMsg + = szBuf ;
}
duplicateWarnings + = errorMsg ;
}
}
{
vector < string > techPaths = config . getPathListForType ( ptTechs ) ;
vector < string > techTrees ;
findDirs ( techPaths , techTrees , false , true ) ;
if ( techTrees . empty ( ) ) {
throw runtime_error ( " No tech-trees were found! " ) ;
}
vector < string > duplicateTechtreesToRename ;
for ( int i = 0 ; i < techTrees . size ( ) ; + + i ) {
string techtree1 = techTrees [ i ] ;
for ( int j = 0 ; j < techTrees . size ( ) ; + + j ) {
if ( i ! = j ) {
string techtree2 = techTrees [ j ] ;
if ( techtree1 = = techtree2 ) {
if ( std : : find ( duplicateTechtreesToRename . begin ( ) , duplicateTechtreesToRename . end ( ) , techtree1 ) = = duplicateTechtreesToRename . end ( ) ) {
duplicateTechtreesToRename . push_back ( techtree1 ) ;
}
}
}
}
}
2011-09-01 01:10:43 +02:00
if ( duplicateTechtreesToRename . empty ( ) = = false ) {
2011-05-19 00:04:45 +02:00
string errorMsg = " Warning duplicate techtrees were detected and renamed: \n " ;
for ( int i = 0 ; i < duplicateTechtreesToRename . size ( ) ; + + i ) {
string currentPath = techPaths [ 1 ] ;
endPathWithSlash ( currentPath ) ;
string oldFile = currentPath + duplicateTechtreesToRename [ i ] ;
string newFile = currentPath + duplicateTechtreesToRename [ i ] ;
newFile = newFile + " _custom " ;
char szBuf [ 4096 ] = " " ;
int result = rename ( oldFile . c_str ( ) , newFile . c_str ( ) ) ;
if ( result ! = 0 ) {
char * errmsg = strerror ( errno ) ;
sprintf ( szBuf , " Error [%s] \n Could not rename [%s] to [%s]! " , errmsg , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
throw runtime_error ( szBuf ) ;
}
else {
sprintf ( szBuf , " techtree [%s] in [%s] \n was renamed to [%s] " , duplicateTechtreesToRename [ i ] . c_str ( ) , oldFile . c_str ( ) , newFile . c_str ( ) ) ;
string tilesetName = extractFileFromDirectoryPath ( oldFile ) ;
oldFile = newFile + " / " + tilesetName + " .xml " ;
newFile = newFile + " / " + tilesetName + " _custom.xml " ;
//printf("\n\n\n###### RENAME [%s] to [%s]\n\n",oldFile.c_str(),newFile.c_str());
2011-09-01 01:10:43 +02:00
rename ( oldFile . c_str ( ) , newFile . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
}
errorMsg + = szBuf ;
}
duplicateWarnings + = errorMsg ;
}
}
if ( duplicateWarnings ! = " " ) {
2012-03-28 00:44:16 +02:00
if ( mainProgram ) {
mainProgram - > getState ( ) - > setForceMouseRender ( true ) ;
2011-05-19 00:04:45 +02:00
}
ExceptionHandler : : DisplayMessage ( duplicateWarnings . c_str ( ) , false ) ;
}
}
int glestMain ( int argc , char * * argv ) {
# ifdef SL_LEAK_DUMP
AllocRegistry memoryLeaks = AllocRegistry : : getInstance ( ) ;
# endif
application_binary = executable_path ( argv [ 0 ] , true ) ;
mg_app_name = GameConstants : : application_name ;
mailStringSupport = mailString ;
SystemFlags : : ENABLE_THREADED_LOGGING = false ;
disableBacktrace = false ;
bool foundInvalidArgs = false ;
preCacheThread = NULL ;
Properties : : setApplicationPath ( executable_path ( argv [ 0 ] ) ) ;
2011-11-02 18:17:28 +01:00
Properties : : setGameVersion ( glestVersionString ) ;
2011-05-19 00:04:45 +02:00
ServerSocket : : setMaxPlayerCount ( GameConstants : : maxPlayers ) ;
SystemFlags : : VERBOSE_MODE_ENABLED = false ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VERBOSE_MODE ] ) = = true ) {
SystemFlags : : VERBOSE_MODE_ENABLED = true ;
}
//vector<string> results;
//findAll("/home/softcoder/Code/megaglest/trunk/mk/linux//äöüß/maps/*.gbm", results, false, true);
//findAll("C:\\Documents and Settings\\SoftCoder\\Application Data\\人間五\\maps\\*", results, false, true);
//for(unsigned int i = 0; i < results.size(); ++i) {
// string file = results[i];
// printf("FILE: [%s]\n",file.c_str());
//}
//return -1;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_DISABLE_BACKTRACE ] ) = = true ) {
disableBacktrace = true ;
}
// UErrorCode status = U_ZERO_ERROR;
// u_init(&status);
// if (U_SUCCESS(status)) {
// printf("everything is OK\n");
// }
// else {
// printf("error %s opening resource\n", u_errorName(status));
// }
// TEST:
//string testfile = "/home/softcoder/Code/megaglest/trunk/mk/linux/techs/megapack/factions/egypt/units/desert_camp/../../upgrades/spear_weapons/images/piercing.bmp";
//updatePathClimbingParts(testfile);
//return -1;
//CHANGED relative path from [/home/softcoder/Code/megaglest/trunk/mk/linux/techs/megapack/factions/egypt/units/desert_camp/../../upgrades/spear_weapons/images/piercing.bmp] to [/home/softcoder/Code/megaglest/trunk/mk/linux/techs/megapack/factions/egypt/units/desert_camp/upgrades/spear_weapons/images/piercing.bmp]
# if defined(CUSTOM_DATA_INSTALL_PATH)
2012-01-24 08:39:16 +01:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " \n \n CUSTOM_DATA_INSTALL_PATH = [%s] \n \n " , formatPath ( TOSTRING ( CUSTOM_DATA_INSTALL_PATH ) ) . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
# endif
const int knownArgCount = sizeof ( GAME_ARGS ) / sizeof ( GAME_ARGS [ 0 ] ) ;
for ( int idx = 1 ; idx < argc ; + + idx ) {
if ( hasCommandArgument ( knownArgCount , ( char * * ) & GAME_ARGS [ 0 ] , argv [ idx ] , NULL , 0 , true ) = = false ) {
foundInvalidArgs = true ;
printf ( " \n Invalid argument: %s " , argv [ idx ] ) ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_HELP ] ) = = true | |
foundInvalidArgs = = true ) {
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
return - 1 ;
}
2011-09-27 07:29:57 +02:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) ) = = true ) {
2011-12-02 23:04:02 +01:00
//isMasterServerModeEnabled = true;
//Window::setMasterserverMode(isMasterServerModeEnabled);
GlobalStaticFlags : : setIsNonGraphicalModeEnabled ( true ) ;
2011-09-27 20:44:01 +02:00
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
2011-11-16 06:20:35 +01:00
string headless_command_list = paramPartTokens [ 1 ] ;
vector < string > paramHeadlessCommandList ;
Tokenize ( headless_command_list , paramHeadlessCommandList , " , " ) ;
for ( unsigned int i = 0 ; i < paramHeadlessCommandList . size ( ) ; + + i ) {
string headless_command = paramHeadlessCommandList [ i ] ;
if ( headless_command = = " exit " ) {
2011-12-02 02:41:48 +01:00
printf ( " Forcing quit after game has completed [%s] \n " , headless_command . c_str ( ) ) ;
2011-11-16 06:20:35 +01:00
Program : : setWantShutdownApplicationAfterGame ( true ) ;
}
else if ( headless_command = = " vps " ) {
printf ( " Disabled reading from console [%s] \n " , headless_command . c_str ( ) ) ;
disableheadless_console = true ;
}
}
2011-09-27 20:44:01 +02:00
}
2011-09-27 07:29:57 +02:00
}
2011-05-19 00:04:45 +02:00
//off_t fileSize = getFileSize(argv[0]);
//double fSize = ((double)fileSize / 1048576.0);
//printf("[%ld] [%.2f]\n",fileSize,fSize);
//return -1;
# ifdef WIN32
SocketManager winSockManager ;
# endif
bool haveSpecialOutputCommandLineOption = false ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_OPENGL_INFO ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SDL_INFO ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LUA_INFO ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_CURL_INFO ] ) = = true | |
2012-03-14 01:21:59 +01:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_XERCES_INFO ] ) = = true | |
2011-05-19 00:04:45 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VERSION ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_INI_SETTINGS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TECHTREES ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_FACTIONS ] ) = = true | |
2012-04-02 08:07:32 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_SCENARIO ] ) = = true | |
2012-04-03 21:35:22 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TILESET ] ) = = true | |
2012-04-02 08:07:32 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_MAPS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TECHTRESS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_SCENARIOS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TILESETS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TUTORIALS ] ) = = true ) {
2011-05-19 00:04:45 +02:00
haveSpecialOutputCommandLineOption = true ;
}
if ( haveSpecialOutputCommandLineOption = = false | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VERSION ] ) = = true ) {
2011-12-20 08:00:23 +01:00
printf ( " %s %s " , extractFileFromDirectoryPath ( argv [ 0 ] ) . c_str ( ) , getNetworkPlatformFreeVersionString ( ) . c_str ( ) ) ;
printf ( " \n Compiled using: %s on: %s " , getCompilerNameString ( ) . c_str ( ) , getCompileDateTime ( ) . c_str ( ) ) ;
printf ( " \n SVN: [%s] " , getSVNRevisionString ( ) . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
# ifdef USE_STREFLOP
2011-11-01 21:07:18 +01:00
//# define STREFLOP_NO_DENORMALS
// streflop_init<streflop::Simple>();
2012-02-11 16:20:40 +01:00
const char * instruction_set = " [none] " ;
const char * denormals = " [denormals] " ;
# if defined(STREFLOP_SSE)
instruction_set = " [SSE] " ;
# elif defined(STREFLOP_X87)
instruction_set = " [X87] " ;
# elif defined(STREFLOP_SOFT)
instruction_set = " [SOFTFLOAT] " ;
# endif
# if defined(STREFLOP_NO_DENORMALS)
denormals = " [no-denormals] " ;
# endif
printf ( " - using STREFLOP %s - %s \n " , instruction_set , denormals ) ;
2011-05-19 00:04:45 +02:00
# endif
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SDL_INFO ] ) = = true ) {
SDL_version ver ;
// Prints the compile time version
SDL_VERSION ( & ver ) ;
print_SDL_version ( " SDL compile-time version " , & ver ) ;
// Prints the run-time version
ver = * SDL_Linked_Version ( ) ;
print_SDL_version ( " SDL runtime version " , & ver ) ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LUA_INFO ] ) = = true ) {
printf ( " LUA version: %s \n " , LUA_RELEASE ) ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_CURL_INFO ] ) = = true ) {
curl_version_info_data * curlVersion = curl_version_info ( CURLVERSION_NOW ) ;
printf ( " CURL version: %s \n " , curlVersion - > version ) ;
}
2012-03-14 01:21:59 +01:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_XERCES_INFO ] ) = = true ) {
printf ( " XERCES version: %s \n " , XERCES_FULLVERSIONDOT ) ;
}
2011-05-19 00:04:45 +02:00
if ( ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VERSION ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SDL_INFO ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LUA_INFO ] ) = = true | |
2012-03-14 01:21:59 +01:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_CURL_INFO ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_XERCES_INFO ] ) = = true ) & &
2011-05-19 00:04:45 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_OPENGL_INFO ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TECHTREES ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_FACTIONS ] ) = = false & &
2012-04-02 08:07:32 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_SCENARIO ] ) = = false & &
2012-04-03 21:35:22 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TILESET ] ) = = false & &
2012-04-02 08:07:32 +02:00
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_MAPS ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TECHTRESS ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_SCENARIOS ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TILESETS ] ) = = false & &
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TUTORIALS ] ) = = false ) {
2011-05-19 00:04:45 +02:00
return - 1 ;
}
2011-11-23 19:02:00 +01:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MOD ] ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MOD ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MOD ] ) , & foundParamIndIndex ) ;
}
string scenarioName = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( scenarioName , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string autoloadModName = paramPartTokens [ 1 ] ;
if ( Properties : : applyTagsToValue ( autoloadModName ) = = true ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Property key [%s] now has value [%s] \n " , Config : : ACTIVE_MOD_PROPERTY_NAME , autoloadModName . c_str ( ) ) ;
}
Config : : setCustomRuntimeProperty ( Config : : ACTIVE_MOD_PROPERTY_NAME , autoloadModName ) ;
printf ( " Setting mod active [%s] \n " , autoloadModName . c_str ( ) ) ;
}
else {
printf ( " \n Invalid mod pathname specified on commandline [%s] mod [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
return - 1 ;
}
}
2011-05-19 00:04:45 +02:00
SystemFlags : : init ( haveSpecialOutputCommandLineOption ) ;
//SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled = true;
//SystemFlags::getSystemSettingType(SystemFlags::debugNetwork).enabled = true;
MainWindow * mainWindow = NULL ;
Program * program = NULL ;
ExceptionHandler exceptionHandler ;
exceptionHandler . install ( getCrashDumpFileName ( ) ) ;
2011-11-11 19:15:46 +01:00
int shutdownFadeSoundMilliseconds = 1000 ;
2011-10-22 00:07:34 +02:00
Chrono chronoshutdownFadeSound ;
SimpleTaskThread * soundThreadManager = NULL ;
2011-05-19 00:04:45 +02:00
try {
// Setup paths to game items (like data, logs, ini etc)
int setupResult = setupGameItemPaths ( argc , argv , NULL ) ;
if ( setupResult ! = 0 ) {
return setupResult ;
}
// Attempt to read ini files
Config & config = Config : : getInstance ( ) ;
setupGameItemPaths ( argc , argv , & config ) ;
2011-11-27 01:07:55 +01:00
Socket : : disableNagle = config . getBool ( " DisableNagle " , " false " ) ;
if ( Socket : : disableNagle ) {
printf ( " *WARNING users wants to disable the socket nagle algorithm. \n " ) ;
}
Socket : : DEFAULT_SOCKET_SENDBUF_SIZE = config . getInt ( " DefaultSocketSendBufferSize " , intToStr ( Socket : : DEFAULT_SOCKET_SENDBUF_SIZE ) . c_str ( ) ) ;
if ( Socket : : DEFAULT_SOCKET_SENDBUF_SIZE > = 0 ) {
printf ( " *WARNING users wants to set default socket send buffer size to: %d \n " , Socket : : DEFAULT_SOCKET_SENDBUF_SIZE ) ;
}
Socket : : DEFAULT_SOCKET_RECVBUF_SIZE = config . getInt ( " DefaultSocketReceiveBufferSize " , intToStr ( Socket : : DEFAULT_SOCKET_RECVBUF_SIZE ) . c_str ( ) ) ;
if ( Socket : : DEFAULT_SOCKET_RECVBUF_SIZE > = 0 ) {
printf ( " *WARNING users wants to set default socket receive buffer size to: %d \n " , Socket : : DEFAULT_SOCKET_RECVBUF_SIZE ) ;
}
2011-10-22 00:36:36 +02:00
shutdownFadeSoundMilliseconds = config . getInt ( " ShutdownFadeSoundMilliseconds " , intToStr ( shutdownFadeSoundMilliseconds ) . c_str ( ) ) ;
2011-05-19 00:04:45 +02:00
string userData = config . getString ( " UserData_Root " , " " ) ;
2012-03-15 23:09:11 +01:00
if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
userData = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ;
}
if ( userData ! = " " ) {
endPathWithSlash ( userData ) ;
}
2011-05-19 00:04:45 +02:00
2012-03-15 23:09:11 +01:00
if ( userData ! = " " ) {
2011-05-19 00:04:45 +02:00
if ( isdir ( userData . c_str ( ) ) = = false ) {
createDirectoryPaths ( userData ) ;
}
}
string crcCachePath = userData + " cache/ " ;
if ( isdir ( crcCachePath . c_str ( ) ) = = false ) {
createDirectoryPaths ( crcCachePath ) ;
}
setCRCCacheFilePath ( crcCachePath ) ;
2012-03-15 23:09:11 +01:00
string savedGamePath = userData + " saved/ " ;
if ( isdir ( savedGamePath . c_str ( ) ) = = false ) {
createDirectoryPaths ( savedGamePath ) ;
//printf("savedGamePath = [%s]\n",savedGamePath.c_str());
}
2011-05-19 00:04:45 +02:00
string tempDataPath = userData + " temp/ " ;
if ( isdir ( tempDataPath . c_str ( ) ) = = true ) {
removeFolder ( tempDataPath ) ;
}
createDirectoryPaths ( tempDataPath ) ;
2012-03-26 09:02:54 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_PORTS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_PORTS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_PORTS ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string portsToUse = paramPartTokens [ 1 ] ;
vector < string > paramPartPortsTokens ;
Tokenize ( portsToUse , paramPartPortsTokens , " , " ) ;
if ( paramPartPortsTokens . size ( ) > = 2 & & paramPartPortsTokens [ 1 ] . length ( ) > 0 ) {
int internalPort = strToInt ( paramPartPortsTokens [ 0 ] ) ;
int externalPort = strToInt ( paramPartPortsTokens [ 1 ] ) ;
printf ( " Forcing internal port# %d, external port# %d \n " , internalPort , externalPort ) ;
config . setInt ( " ServerPort " , internalPort ) ;
config . setInt ( " MasterServerExternalPort " , externalPort ) ;
config . setInt ( " FTPServerPort " , internalPort + 1 ) ;
if ( paramPartPortsTokens . size ( ) > = 3 & & paramPartPortsTokens [ 2 ] . length ( ) > 0 ) {
int statusPort = strToInt ( paramPartPortsTokens [ 2 ] ) ;
printf ( " Forcing status port# %d \n " , statusPort ) ;
config . setInt ( " ServerAdminPort " , statusPort ) ;
}
}
else {
printf ( " \n Invalid ports specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
else {
printf ( " \n Invalid missing ports specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2012-03-25 08:55:43 +02:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_STATUS ] ) ) = = true ) {
Ip ip ( " localhost " ) ;
int port = Config : : getInstance ( ) . getInt ( " ServerAdminPort " , intToStr ( GameConstants : : serverAdminPort ) . c_str ( ) ) ;
ClientSocket clientSocket ;
clientSocket . setBlock ( false ) ;
clientSocket . connect ( ip , port ) ;
if ( clientSocket . isConnected ( ) = = true ) {
clientSocket . setBlock ( true ) ;
char szBuf [ 8096 ] = " " ;
clientSocket . receive ( & szBuf [ 0 ] , 8095 , false ) ;
std : : cout < < szBuf < < std : : endl ;
}
return 0 ;
}
2011-09-26 01:57:42 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_DISABLE_SOUND ] ) = = true | |
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) ) = = true ) {
2011-05-19 00:04:45 +02:00
config . setString ( " FactorySound " , " None " ) ;
2011-09-26 01:57:42 +02:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) ) = = true ) {
2011-12-02 23:04:02 +01:00
//Logger::getInstance().setMasterserverMode(true);
//Model::setMasterserverMode(true);
//Shared::Sound::Sound::setMasterserverMode(true);
2011-09-26 01:57:42 +02:00
}
2011-05-19 00:04:45 +02:00
}
bool enableATIHacks = config . getBool ( " EnableATIHacks " , " false " ) ;
if ( enableATIHacks = = true ) {
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " **WARNING** Enabling ATI video card hacks \n " ) ;
TextureGl : : setEnableATIHacks ( enableATIHacks ) ;
}
2011-11-18 20:53:56 +01:00
if ( config . getBool ( " ForceFTGLFonts " , " false " ) = = true | | hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_FORCE_FTGLFONTS ] ) = = true ) {
Font : : forceFTGLFonts = true ;
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("**WARNING** Forcing Legacy Fonts Enabled\n");
printf ( " **WARNING** Forcing use of FTGL Fonts \n " ) ;
}
else {
Renderer : : renderText3DEnabled = config . getBool ( " Enable3DFontRendering " , intToStr ( Renderer : : renderText3DEnabled ) . c_str ( ) ) ;
}
2011-06-08 09:18:06 +02:00
if ( config . getBool ( " EnableLegacyFonts " , " false " ) = = true | | hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_ENABLE_LEGACYFONTS ] ) = = true ) {
Font : : forceLegacyFonts = true ;
2011-06-11 12:31:24 +02:00
Renderer : : renderText3DEnabled = false ;
2011-11-02 00:51:28 +01:00
//if(SystemFlags::VERBOSE_MODE_ENABLED) printf("**WARNING** Forcing Legacy Fonts Enabled\n");
printf ( " **WARNING** Forcing Legacy Fonts Enabled \n " ) ;
2011-06-08 09:18:06 +02:00
}
2011-06-11 12:31:24 +02:00
else {
Renderer : : renderText3DEnabled = config . getBool ( " Enable3DFontRendering " , intToStr ( Renderer : : renderText3DEnabled ) . c_str ( ) ) ;
}
2011-06-10 05:09:19 +02:00
2011-07-09 01:14:26 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_RESOLUTION ] ) = = true ) {
2011-06-11 10:52:49 +02:00
int foundParamIndIndex = - 1 ;
2011-07-09 01:14:26 +02:00
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_RESOLUTION ] ) + string ( " = " ) , & foundParamIndIndex ) ;
2011-06-11 10:52:49 +02:00
if ( foundParamIndIndex < 0 ) {
2011-07-09 01:14:26 +02:00
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_RESOLUTION ] ) , & foundParamIndIndex ) ;
2011-06-11 10:52:49 +02:00
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string settings = paramPartTokens [ 1 ] ;
2011-07-09 01:14:26 +02:00
printf ( " Forcing resolution [%s] \n " , settings . c_str ( ) ) ;
2011-06-11 10:52:49 +02:00
paramPartTokens . clear ( ) ;
Tokenize ( settings , paramPartTokens , " x " ) ;
if ( paramPartTokens . size ( ) > = 2 ) {
int newScreenWidth = strToInt ( paramPartTokens [ 0 ] ) ;
config . setInt ( " ScreenWidth " , newScreenWidth ) ;
int newScreenHeight = strToInt ( paramPartTokens [ 1 ] ) ;
config . setInt ( " ScreenHeight " , newScreenHeight ) ;
}
else {
2011-07-09 01:14:26 +02:00
printf ( " \n Invalid missing resolution settings specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
2011-06-11 10:52:49 +02:00
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
else {
2011-07-09 01:14:26 +02:00
printf ( " \n Invalid missing resolution setting specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
2011-06-11 10:52:49 +02:00
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2011-07-09 01:14:26 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_COLORBITS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_COLORBITS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_COLORBITS ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string settings = paramPartTokens [ 1 ] ;
printf ( " Forcing colorbits [%s] \n " , settings . c_str ( ) ) ;
int newColorBits = strToInt ( settings ) ;
config . setInt ( " ColorBits " , newColorBits ) ;
}
else {
printf ( " \n Invalid missing colorbits settings specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_DEPTHBITS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_DEPTHBITS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_DEPTHBITS ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string settings = paramPartTokens [ 1 ] ;
printf ( " Forcing depthbits [%s] \n " , settings . c_str ( ) ) ;
int newDepthBits = strToInt ( settings ) ;
config . setInt ( " DepthBits " , newDepthBits ) ;
}
else {
printf ( " \n Invalid missing depthbits setting specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_FULLSCREEN ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_FULLSCREEN ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_FULLSCREEN ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string settings = paramPartTokens [ 1 ] ;
printf ( " Forcing fullscreen [%s] \n " , settings . c_str ( ) ) ;
bool newFullScreenMode = strToBool ( settings ) ;
config . setBool ( " Windowed " , ! newFullScreenMode ) ;
}
else {
printf ( " \n Invalid missing fullscreen setting specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2011-12-23 09:20:54 +01:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SET_GAMMA ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SET_GAMMA ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SET_GAMMA ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string settings = paramPartTokens [ 1 ] ;
printf ( " Forcing gamma [%s] \n " , settings . c_str ( ) ) ;
float newGammaValue = strToFloat ( settings ) ;
config . setFloat ( " GammaValue " , newGammaValue ) ;
}
else {
printf ( " \n Invalid missing gamma setting specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2011-05-19 00:04:45 +02:00
// Set some statics based on ini entries
SystemFlags : : ENABLE_THREADED_LOGGING = config . getBool ( " ThreadedLogging " , " true " ) ;
FontGl : : setDefault_fontType ( config . getString ( " DefaultFont " , FontGl : : getDefault_fontType ( ) . c_str ( ) ) ) ;
UPNP_Tools : : isUPNP = ! config . getBool ( " DisableUPNP " , " false " ) ;
Texture : : useTextureCompression = config . getBool ( " EnableTextureCompression " , " false " ) ;
2011-06-07 04:37:58 +02:00
2011-05-19 00:04:45 +02:00
// 256 for English
// 30000 for Chinese
2011-05-25 23:11:12 +02:00
Font : : charCount = config . getInt ( " FONT_CHARCOUNT " , intToStr ( Font : : charCount ) . c_str ( ) ) ;
Font : : fontTypeName = config . getString ( " FONT_TYPENAME " , Font : : fontTypeName . c_str ( ) ) ;
Font : : fontIsMultibyte = config . getBool ( " FONT_MULTIBYTE " , intToStr ( Font : : fontIsMultibyte ) . c_str ( ) ) ;
2011-06-09 07:54:04 +02:00
Font : : fontIsRightToLeft = config . getBool ( " FONT_RIGHTTOLEFT " , intToStr ( Font : : fontIsRightToLeft ) . c_str ( ) ) ;
2011-06-30 01:48:48 +02:00
Font : : baseSize = config . getInt ( " FONT_BASE_SIZE " , intToStr ( Font : : baseSize ) . c_str ( ) ) ;
2011-07-02 03:56:06 +02:00
Font : : scaleFontValue = config . getFloat ( " FONT_SCALE_SIZE " , floatToStr ( Font : : scaleFontValue ) . c_str ( ) ) ;
Font : : scaleFontValueCenterHFactor = config . getFloat ( " FONT_SCALE_CENTERH_FACTOR " , floatToStr ( Font : : scaleFontValueCenterHFactor ) . c_str ( ) ) ;
2011-07-02 20:33:59 +02:00
Font : : langHeightText = config . getString ( " FONT_HEIGHT_TEXT " , Font : : langHeightText . c_str ( ) ) ;
2011-06-09 07:54:04 +02:00
2011-05-19 00:04:45 +02:00
// Example values:
// DEFAULT_CHARSET (English) = 1
// GB2312_CHARSET (Chinese) = 134
Shared : : Platform : : charSet = config . getInt ( " FONT_CHARSET " , intToStr ( Shared : : Platform : : charSet ) . c_str ( ) ) ;
if ( config . getBool ( " No2DMouseRendering " , " false " ) = = false ) {
showCursor ( false ) ;
}
if ( config . getInt ( " DEFAULT_HTTP_TIMEOUT " , intToStr ( SystemFlags : : DEFAULT_HTTP_TIMEOUT ) . c_str ( ) ) > = 0 ) {
SystemFlags : : DEFAULT_HTTP_TIMEOUT = config . getInt ( " DEFAULT_HTTP_TIMEOUT " , intToStr ( SystemFlags : : DEFAULT_HTTP_TIMEOUT ) . c_str ( ) ) ;
}
bool allowAltEnterFullscreenToggle = config . getBool ( " AllowAltEnterFullscreenToggle " , boolToStr ( Window : : getAllowAltEnterFullscreenToggle ( ) ) . c_str ( ) ) ;
Window : : setAllowAltEnterFullscreenToggle ( allowAltEnterFullscreenToggle ) ;
if ( config . getBool ( " noTeamColors " , " false " ) = = true ) {
MeshCallbackTeamColor : : noTeamColors = true ;
}
// Setup debug logging etc
setupLogging ( config , haveSpecialOutputCommandLineOption ) ;
2011-06-09 07:54:04 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] Font::charCount = %d, Font::fontTypeName [%s] Shared::Platform::charSet = %d, Font::fontIsMultibyte = %d, fontIsRightToLeft = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , Font : : charCount , Font : : fontTypeName . c_str ( ) , Shared : : Platform : : charSet , Font : : fontIsMultibyte , Font : : fontIsRightToLeft ) ;
2011-05-19 00:04:45 +02:00
NetworkInterface : : setDisplayMessageFunction ( ExceptionHandler : : DisplayMessage ) ;
MenuStateMasterserver : : setDisplayMessageFunction ( ExceptionHandler : : DisplayMessage ) ;
# ifdef USE_STREFLOP
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " %s, STREFLOP enabled. \n " , getNetworkVersionString ( ) . c_str ( ) ) ;
# else
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " %s, STREFLOP NOT enabled. \n " , getNetworkVersionString ( ) . c_str ( ) ) ;
# endif
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugUnitCommands , " START \n " ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugPathFinder , " START \n " ) ;
// Setup hotkeys from key ini files
Config & configKeys = Config : : getInstance (
std : : pair < ConfigType , ConfigType > ( cfgMainKeys , cfgUserKeys ) ,
std : : pair < string , string > ( Config : : glestkeys_ini_filename , Config : : glestuserkeys_ini_filename ) ,
std : : pair < bool , bool > ( true , false ) ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_INI_SETTINGS ] ) = = true ) {
ShowINISettings ( argc , argv , config , configKeys ) ;
return - 1 ;
}
//setVBOSupported(false);
// Explicitly disable VBO's
if ( config . getBool ( " DisableVBO " , " false " ) = = true | | hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_DISABLE_VBO ] ) = = true ) {
setVBOSupported ( false ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " **WARNING** Disabling VBO's \n " ) ;
}
if ( config . getBool ( " EnableVSynch " , " false " ) = = true ) {
Window : : setTryVSynch ( true ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " **ENABLED OPENGL VSYNCH** \n " ) ;
}
//float pingTime = Socket::getAveragePingMS("soft-haus.com");
//printf("Ping time = %f\n",pingTime);
// Load the language strings
Lang & lang = Lang : : getInstance ( ) ;
string language = config . getString ( " Lang " ) ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_LANGUAGE ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_LANGUAGE ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_LANGUAGE ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
language = paramPartTokens [ 1 ] ;
printf ( " Forcing language [%s] \n " , language . c_str ( ) ) ;
}
else {
printf ( " \n Invalid missing language specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2011-12-01 03:31:00 +01:00
else {
2011-12-01 09:05:36 +01:00
# ifdef _WIN32
2012-01-20 05:15:13 +01:00
int localeBufferSize = GetLocaleInfo ( LOCALE_SYSTEM_DEFAULT , LOCALE_SISO639LANGNAME , NULL , 0 ) ;
wchar_t * sysLocale = new wchar_t [ localeBufferSize ] ;
2011-12-01 09:05:36 +01:00
GetLocaleInfo ( LOCALE_SYSTEM_DEFAULT , LOCALE_SISO639LANGNAME , sysLocale , localeBufferSize ) ;
//String langValue(sysLocale);
//const char *lang_locale = langValue.c_str();
2012-01-20 05:15:13 +01:00
char langValue [ 1024 ] = " " ;
2011-12-01 09:05:36 +01:00
wcstombs ( langValue , sysLocale , 1023 ) ;
const char * lang_locale = & langValue [ 0 ] ;
# else
const char * lang_locale = setlocale ( LC_ALL , " " ) ;
# endif
2011-12-01 03:31:00 +01:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Locale is: [%s] \n " , lang_locale ) ;
if ( lang_locale ! = NULL & & strlen ( lang_locale ) > = 2 ) {
if ( config . getBool ( " AutoLocaleLanguageDetect " , " true " ) = = true ) {
language = lang_locale ;
language = language . substr ( 0 , 2 ) ;
printf ( " Auto setting language [%s] \n " , language . c_str ( ) ) ;
2011-12-01 09:05:36 +01:00
config . setString ( " AutoLocaleLanguageDetect " , " false " ) ;
config . save ( ) ;
2011-12-01 03:31:00 +01:00
}
}
}
2011-05-19 00:04:45 +02:00
2012-03-17 09:20:17 +01:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTO_TEST ] ) ) = = true | |
Config : : getInstance ( ) . getBool ( " AutoTest " , " false " ) = = true ) {
printf ( " Running in auto test mode \n " ) ;
}
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTO_TEST ] ) ) = = true ) {
Config : : getInstance ( ) . setBool ( " AutoTest " , " true " ) ;
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTO_TEST ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTO_TEST ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
vector < string > paramPartTokens2 ;
Tokenize ( paramPartTokens [ 1 ] , paramPartTokens2 , " , " ) ;
if ( paramPartTokens2 . size ( ) > = 1 & & paramPartTokens2 [ 0 ] . length ( ) > 0 ) {
string newMaxSeconds = paramPartTokens2 [ 0 ] ;
time_t newTimeMaxSeconds = strToInt ( newMaxSeconds ) ;
AutoTest : : setMaxGameTime ( newTimeMaxSeconds ) ;
//printf("#1 Forcing font [%s] paramPartTokens.size() = %d, paramValue [%s]\n",newfont.c_str(),paramPartTokens.size(),paramValue.c_str());
printf ( " Forcing maximum game time to [%ld] seconds (%.2f minutes) \n " , newTimeMaxSeconds , ( ( double ) newTimeMaxSeconds / 60.0 ) ) ;
}
if ( paramPartTokens2 . size ( ) > = 3 & & paramPartTokens2 [ 2 ] . length ( ) > 0 ) {
string autoTestCmd = paramPartTokens2 [ 2 ] ;
if ( autoTestCmd = = " exit " ) {
printf ( " Detected auto test command [%s], will exit after game. \n " , autoTestCmd . c_str ( ) ) ;
AutoTest : : setWantExitGameWhenDone ( true ) ;
}
else {
printf ( " WARNING: Detected and UNKNOWN auto test command [%s]. \n " , autoTestCmd . c_str ( ) ) ;
}
}
if ( paramPartTokens2 . size ( ) > = 2 & & paramPartTokens2 [ 1 ] . length ( ) > 0 ) {
string newGameSettingsFileToLoad = paramPartTokens2 [ 1 ] ;
printf ( " About to auto test using game settings file [%s] \n " , newGameSettingsFileToLoad . c_str ( ) ) ;
AutoTest : : setLoadGameSettingsFile ( newGameSettingsFileToLoad ) ;
}
}
}
2011-11-01 18:38:51 +01:00
Renderer & renderer = Renderer : : getInstance ( ) ;
2011-11-15 19:38:13 +01:00
lang . loadStrings ( language , false , true ) ;
2011-07-02 03:56:06 +02:00
2011-07-02 20:33:59 +02:00
if ( lang . hasString ( " FONT_HEIGHT_TEXT " ) ) {
Font : : langHeightText = config . getString ( " FONT_HEIGHT_TEXT " , Font : : langHeightText . c_str ( ) ) ;
}
2011-10-03 04:45:43 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_FONT_BASESIZE ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_FONT_BASESIZE ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_FONT_BASESIZE ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string newfontBaseSize = paramPartTokens [ 1 ] ;
//printf("#1 Forcing font [%s] paramPartTokens.size() = %d, paramValue [%s]\n",newfont.c_str(),paramPartTokens.size(),paramValue.c_str());
printf ( " Forcing font base size[%s] \n " , newfontBaseSize . c_str ( ) ) ;
Font : : baseSize = strToInt ( newfontBaseSize ) ;
}
else {
printf ( " \n Invalid missing font base size specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-10-03 04:45:43 +02:00
return - 1 ;
}
}
2011-06-09 07:54:04 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] Font::charCount = %d, Font::fontTypeName [%s] Shared::Platform::charSet = %d, Font::fontIsMultibyte = %d, Font::fontIsRightToLeft = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , Font : : charCount , Font : : fontTypeName . c_str ( ) , Shared : : Platform : : charSet , Font : : fontIsMultibyte , Font : : fontIsRightToLeft ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " Using Font::charCount = %d, Font::fontTypeName [%s] Shared::Platform::charSet = %d, Font::fontIsMultibyte = %d, Font::fontIsRightToLeft = %d \n " , Font : : charCount , Font : : fontTypeName . c_str ( ) , Shared : : Platform : : charSet , Font : : fontIsMultibyte , Font : : fontIsRightToLeft ) ;
2011-05-23 21:50:17 +02:00
2011-06-12 05:44:50 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_USE_FONT ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_FONT ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_USE_FONT ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string newfont = paramPartTokens [ 1 ] ;
//printf("#1 Forcing font [%s] paramPartTokens.size() = %d, paramValue [%s]\n",newfont.c_str(),paramPartTokens.size(),paramValue.c_str());
Properties : : applyTagsToValue ( newfont ) ;
printf ( " Forcing font [%s] \n " , newfont . c_str ( ) ) ;
# if defined(WIN32)
string newEnvValue = " MEGAGLEST_FONT= " + newfont ;
_putenv ( newEnvValue . c_str ( ) ) ;
# else
setenv ( " MEGAGLEST_FONT " , newfont . c_str ( ) , 1 ) ;
# endif
}
else {
printf ( " \n Invalid missing font specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
return - 1 ;
}
}
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_MAP_CRC ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_MAP_CRC ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_MAP_CRC ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemName = paramPartTokens [ 1 ] ;
string file = Map : : getMapPath ( itemName , " " , false ) ;
if ( file ! = " " ) {
Checksum checksum ;
checksum . addFile ( file ) ;
int32 crcValue = checksum . getSum ( ) ;
printf ( " CRC value for map [%s] file [%s] is [%d] \n " , itemName . c_str ( ) , file . c_str ( ) , crcValue ) ;
}
else {
printf ( " Map [%s] was NOT FOUND \n " , itemName . c_str ( ) ) ;
}
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
else {
printf ( " \n Invalid missing map specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_TILESET_CRC ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_TILESET_CRC ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_TILESET_CRC ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemName = paramPartTokens [ 1 ] ;
int32 crcValue = getFolderTreeContentsCheckSumRecursively ( config . getPathListForType ( ptTilesets , " " ) , string ( " / " ) + itemName + string ( " /* " ) , " .xml " , NULL , true ) ;
if ( crcValue ! = 0 ) {
printf ( " CRC value for tileset [%s] is [%d] \n " , itemName . c_str ( ) , crcValue ) ;
}
else {
printf ( " Tileset [%s] was NOT FOUND \n " , itemName . c_str ( ) ) ;
}
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
else {
printf ( " \n Invalid missing tileset specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_TECHTREE_CRC ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_TECHTREE_CRC ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_TECHTREE_CRC ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemName = paramPartTokens [ 1 ] ;
int32 crcValue = getFolderTreeContentsCheckSumRecursively ( config . getPathListForType ( ptTechs , " " ) , " / " + itemName + " /* " , " .xml " , NULL , true ) ;
if ( crcValue ! = 0 ) {
printf ( " CRC value for techtree [%s] is [%d] \n " , itemName . c_str ( ) , crcValue ) ;
}
else {
printf ( " Techtree [%s] was NOT FOUND \n " , itemName . c_str ( ) ) ;
}
return - 1 ;
}
else {
printf ( " \n Invalid missing techtree specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_SCENARIO_CRC ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_SCENARIO_CRC ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_SCENARIO_CRC ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemName = paramPartTokens [ 1 ] ;
int32 crcValue = getFolderTreeContentsCheckSumRecursively ( config . getPathListForType ( ptScenarios , " " ) , " / " + itemName + " /* " , " .xml " , NULL , true ) ;
if ( crcValue ! = 0 ) {
printf ( " CRC value for scenario [%s] is [%d] \n " , itemName . c_str ( ) , crcValue ) ;
}
else {
printf ( " Scenario [%s] was NOT FOUND \n " , itemName . c_str ( ) ) ;
}
return - 1 ;
}
else {
printf ( " \n Invalid missing scenario specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SHOW_PATH_CRC ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_PATH_CRC ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_SHOW_PATH_CRC ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 3 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemName = paramPartTokens [ 1 ] ;
string itemNameFilter = paramPartTokens [ 2 ] ;
//printf("\n\nitemName [%s] itemNameFilter [%s]\n",itemName.c_str(),itemNameFilter.c_str());
int32 crcValue = getFolderTreeContentsCheckSumRecursively ( itemName , itemNameFilter , NULL , true ) ;
printf ( " CRC value for path [%s] filter [%s] is [%d] \n " , itemName . c_str ( ) , itemNameFilter . c_str ( ) , crcValue ) ;
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
else {
if ( paramPartTokens . size ( ) < 2 ) {
printf ( " \n Invalid missing path and filter specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
}
if ( paramPartTokens . size ( ) < 3 ) {
printf ( " \n Invalid missing filter specified on commandline [%s] value [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 3 ? paramPartTokens [ 2 ] . c_str ( ) : NULL ) ) ;
}
//printParameterHelp(argv[0],false);
2011-11-01 22:47:34 +01:00
2011-05-19 00:04:45 +02:00
return - 1 ;
}
}
2012-04-02 08:07:32 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_MAPS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_MAPS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_MAPS ] ) , & foundParamIndIndex ) ;
}
vector < string > pathList = config . getPathListForType ( ptMaps , " " ) ;
vector < string > maps = MapPreview : : findAllValidMaps ( pathList , " " , false , true ) ;
std : : sort ( maps . begin ( ) , maps . end ( ) ) ;
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemNameFilter = paramPartTokens [ 1 ] ;
printf ( " Using filter for maps list [%s] \n " , itemNameFilter . c_str ( ) ) ;
vector < string > filteredMaps ;
for ( unsigned int i = 0 ; i < maps . size ( ) ; + + i ) {
string mapName = maps [ i ] ;
if ( itemNameFilter . find ( " * " ) ! = itemNameFilter . npos ) {
if ( StartsWith ( mapName , itemNameFilter . substr ( 0 , itemNameFilter . find ( " * " ) ) ) = = true ) {
filteredMaps . push_back ( mapName ) ;
}
}
else if ( mapName = = itemNameFilter ) {
filteredMaps . push_back ( mapName ) ;
}
}
maps = filteredMaps ;
}
printf ( " Maps found: \n =========================================== \n " ) ;
for ( unsigned int i = 0 ; i < maps . size ( ) ; + + i ) {
string mapName = maps [ i ] ;
printf ( " %s \n " , mapName . c_str ( ) ) ;
}
printf ( " =========================================== \n Total: %lu \n " , maps . size ( ) ) ;
return - 1 ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TECHTRESS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TECHTRESS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TECHTRESS ] ) , & foundParamIndIndex ) ;
}
vector < string > pathList = config . getPathListForType ( ptTechs , " " ) ;
vector < string > results ;
findDirs ( pathList , results ) ;
bool showfactions = false ;
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string cmd = paramPartTokens [ 1 ] ;
if ( cmd = = " showfactions " ) {
showfactions = true ;
}
else {
throw runtime_error ( " unknown command for techtreelist [ " + cmd + " ] " ) ;
}
printf ( " Using special command for techtree list [%s] \n " , cmd . c_str ( ) ) ;
}
printf ( " Techtrees found: \n =========================================== \n " ) ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
for ( unsigned int j = 0 ; j < pathList . size ( ) ; + + j ) {
string techPath = pathList [ j ] ;
if ( techPath ! = " " ) {
endPathWithSlash ( techPath ) ;
}
vector < string > results2 ;
findDirs ( techPath + name + " /factions " , results2 , false , true ) ;
if ( results2 . empty ( ) = = false ) {
string downloadArchive = techPath + name + " .7z " ;
//printf("dl [%s] [%s]\n",name.c_str(),downloadArchive.c_str());
if ( fileExists ( downloadArchive ) = = true ) {
off_t fileSize = getFileSize ( downloadArchive ) ;
// convert to MB
double megaBytes = ( ( double ) fileSize / 1048576.0 ) ;
printf ( " %s [download archive %.2fMB] \n " , name . c_str ( ) , megaBytes ) ;
}
else {
printf ( " %s \n " , name . c_str ( ) ) ;
}
if ( showfactions = = true ) {
printf ( " --> Factions: \n " ) ;
for ( unsigned int k = 0 ; k < results2 . size ( ) ; + + k ) {
string name2 = results2 [ k ] ;
printf ( " --> %s \n " , name2 . c_str ( ) ) ;
}
printf ( " --> Total Factions: %lu \n " , results2 . size ( ) ) ;
break ;
}
}
}
}
printf ( " =========================================== \n Total Techtrees: %lu \n " , results . size ( ) ) ;
return - 1 ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_SCENARIOS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_SCENARIOS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_SCENARIOS ] ) , & foundParamIndIndex ) ;
}
vector < string > pathList = config . getPathListForType ( ptScenarios , " " ) ;
vector < string > results ;
findDirs ( pathList , results ) ;
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemNameFilter = paramPartTokens [ 1 ] ;
printf ( " Using filter for scenarios list [%s] \n " , itemNameFilter . c_str ( ) ) ;
vector < string > filtered ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
if ( itemNameFilter . find ( " * " ) ! = itemNameFilter . npos ) {
if ( StartsWith ( name , itemNameFilter . substr ( 0 , itemNameFilter . find ( " * " ) ) ) = = true ) {
filtered . push_back ( name ) ;
}
}
else if ( name = = itemNameFilter ) {
filtered . push_back ( name ) ;
}
}
results = filtered ;
}
printf ( " Scenarios found: \n =========================================== \n " ) ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
printf ( " %s \n " , name . c_str ( ) ) ;
}
printf ( " =========================================== \n Total: %lu \n " , results . size ( ) ) ;
return - 1 ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TILESETS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TILESETS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TILESETS ] ) , & foundParamIndIndex ) ;
}
vector < string > pathList = config . getPathListForType ( ptTilesets , " " ) ;
vector < string > results ;
findDirs ( pathList , results ) ;
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemNameFilter = paramPartTokens [ 1 ] ;
printf ( " Using filter for tilesets list [%s] \n " , itemNameFilter . c_str ( ) ) ;
vector < string > filtered ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
if ( itemNameFilter . find ( " * " ) ! = itemNameFilter . npos ) {
if ( StartsWith ( name , itemNameFilter . substr ( 0 , itemNameFilter . find ( " * " ) ) ) = = true ) {
filtered . push_back ( name ) ;
}
}
else if ( name = = itemNameFilter ) {
filtered . push_back ( name ) ;
}
}
results = filtered ;
}
printf ( " Tilesets found: \n =========================================== \n " ) ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
for ( unsigned int j = 0 ; j < pathList . size ( ) ; + + j ) {
string tilesetPath = pathList [ j ] ;
if ( tilesetPath ! = " " ) {
endPathWithSlash ( tilesetPath ) ;
}
if ( fileExists ( tilesetPath + name + " / " + name + " .xml " ) = = true ) {
string downloadArchive = tilesetPath + name + " .7z " ;
//printf("dl [%s] [%s]\n",name.c_str(),downloadArchive.c_str());
if ( fileExists ( downloadArchive ) = = true ) {
off_t fileSize = getFileSize ( downloadArchive ) ;
// convert to MB
double megaBytes = ( ( double ) fileSize / 1048576.0 ) ;
printf ( " %s [download archive %.2fMB] \n " , name . c_str ( ) , megaBytes ) ;
}
else {
printf ( " %s \n " , name . c_str ( ) ) ;
}
break ;
}
}
}
printf ( " =========================================== \n Total: %lu \n " , results . size ( ) ) ;
return - 1 ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_LIST_TUTORIALS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TUTORIALS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LIST_TUTORIALS ] ) , & foundParamIndIndex ) ;
}
vector < string > pathList = config . getPathListForType ( ptTutorials , " " ) ;
vector < string > results ;
findDirs ( pathList , results ) ;
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string itemNameFilter = paramPartTokens [ 1 ] ;
printf ( " Using filter for tutorials list [%s] \n " , itemNameFilter . c_str ( ) ) ;
vector < string > filtered ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
if ( itemNameFilter . find ( " * " ) ! = itemNameFilter . npos ) {
if ( StartsWith ( name , itemNameFilter . substr ( 0 , itemNameFilter . find ( " * " ) ) ) = = true ) {
filtered . push_back ( name ) ;
}
}
else if ( name = = itemNameFilter ) {
filtered . push_back ( name ) ;
}
}
results = filtered ;
}
printf ( " Tutorials found: \n =========================================== \n " ) ;
for ( unsigned int i = 0 ; i < results . size ( ) ; + + i ) {
string name = results [ i ] ;
for ( unsigned int j = 0 ; j < pathList . size ( ) ; + + j ) {
string tutorialsPath = pathList [ j ] ;
if ( tutorialsPath ! = " " ) {
endPathWithSlash ( tutorialsPath ) ;
}
if ( fileExists ( tutorialsPath + name + " / " + name + " .xml " ) = = true ) {
string downloadArchive = tutorialsPath + name + " .7z " ;
//printf("dl [%s] [%s]\n",name.c_str(),downloadArchive.c_str());
if ( fileExists ( downloadArchive ) = = true ) {
off_t fileSize = getFileSize ( downloadArchive ) ;
// convert to MB
double megaBytes = ( ( double ) fileSize / 1048576.0 ) ;
printf ( " %s [download archive %.2fMB] \n " , name . c_str ( ) , megaBytes ) ;
}
else {
printf ( " %s \n " , name . c_str ( ) ) ;
}
break ;
}
}
}
printf ( " =========================================== \n Total: %lu \n " , results . size ( ) ) ;
return - 1 ;
}
2011-05-19 00:04:45 +02:00
//vector<string> techPaths;
//vector<string> techDataPaths = config.getPathListForType(ptTechs);
//findDirs(techDataPaths, techPaths);
//int32 techCRC = getFolderTreeContentsCheckSumRecursively(techDataPaths, string("/") + "megapack" + string("/*"), ".xml", NULL, true);
//return -1;
//
//removeFolder("/home/softcoder/Code/megaglest/trunk/mk/linux/mydata/tilesets/mother_board");
//return -1;
//
2011-11-01 22:47:34 +01:00
program = new Program ( ) ;
2012-03-28 00:44:16 +02:00
mainProgram = program ;
2012-03-13 02:34:14 +01:00
renderer . setProgram ( program ) ;
2011-05-19 00:04:45 +02:00
2012-03-28 00:44:16 +02:00
if ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . enabled = = true ) {
renderer . setAllowRenderUnitTitles ( SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . enabled ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugPathFinder , " In [%s::%s Line: %d] renderer.setAllowRenderUnitTitles = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , SystemFlags : : getSystemSettingType ( SystemFlags : : debugPathFinder ) . enabled ) ;
}
renderer . setAllowRenderUnitTitles ( true ) ;
string screenShotsPath = userData + GameConstants : : folder_path_screenshots ;
if ( isdir ( screenShotsPath . c_str ( ) ) = = false ) {
createDirectoryPaths ( screenShotsPath ) ;
}
// Cache Player textures - START
string data_path = getGameReadWritePath ( GameConstants : : path_data_CacheLookupKey ) ;
std : : map < int , Texture2D * > & crcPlayerTextureCache = CacheManager : : getCachedItem < std : : map < int , Texture2D * > > ( GameConstants : : playerTextureCacheLookupKey ) ;
for ( int index = 0 ; index < GameConstants : : maxPlayers ; + + index ) {
//string playerTexture = data_path + "data/core/faction_textures/faction" + intToStr(index) + ".tga";
string playerTexture = getGameCustomCoreDataPath ( data_path , " data/core/faction_textures/faction " + intToStr ( index ) + " .tga " ) ;
if ( fileExists ( playerTexture ) = = true ) {
Texture2D * texture = Renderer : : getInstance ( ) . newTexture2D ( rsGlobal ) ;
if ( texture ) {
texture - > load ( playerTexture ) ;
}
crcPlayerTextureCache [ index ] = texture ;
}
else {
crcPlayerTextureCache [ index ] = NULL ;
}
}
// Cache Player textures - END
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-11-01 22:47:34 +01:00
mainWindow = new MainWindow ( program ) ;
2011-05-19 00:04:45 +02:00
mainWindow - > setUseDefaultCursorOnly ( config . getBool ( " No2DMouseRendering " , " false " ) ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-09-16 02:34:14 +02:00
GameSettings startupGameSettings ;
2011-05-19 00:04:45 +02:00
//parse command line
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_SERVER ] ) = = true ) {
program - > initServer ( mainWindow , false , true ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-05-19 00:04:45 +02:00
}
2011-09-24 09:46:56 +02:00
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_MASTERSERVER_MODE ] ) ) = = true ) {
program - > initServer ( mainWindow , false , true , true ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-09-24 09:46:56 +02:00
}
2011-05-19 00:04:45 +02:00
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTOSTART_LASTGAME ] ) ) = = true ) {
program - > initServer ( mainWindow , true , false ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-05-19 00:04:45 +02:00
}
2012-03-13 00:08:22 +01:00
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTOSTART_LAST_SAVED_GAME ] ) ) = = true ) {
2012-03-15 16:57:21 +01:00
string fileName = " " ;
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_AUTOSTART_LAST_SAVED_GAME ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex > = 0 ) {
string loadfileName = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( loadfileName , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
fileName = paramPartTokens [ 1 ] ;
2012-03-19 22:35:54 +01:00
if ( fileExists ( fileName ) = = false ) {
// Save the file now
string saveGameFile = " saved/ " + fileName ;
if ( getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) ! = " " ) {
saveGameFile = getGameReadWritePath ( GameConstants : : path_logs_CacheLookupKey ) + saveGameFile ;
}
else {
2012-03-28 00:44:16 +02:00
// string userData = config.getString("UserData_Root","");
// if(userData != "") {
// endPathWithSlash(userData);
// }
2012-03-19 22:35:54 +01:00
saveGameFile = userData + saveGameFile ;
}
if ( fileExists ( saveGameFile ) = = true ) {
fileName = saveGameFile ;
}
}
2012-03-15 16:57:21 +01:00
if ( fileExists ( fileName ) = = false ) {
char szBuf [ 8096 ] = " " ;
sprintf ( szBuf , " File specified for loading a saved game cannot be found: [%s] " , fileName . c_str ( ) ) ;
printf ( " \n \n ====================================================================================== \n %s \n ====================================================================================== \n \n \n " , szBuf ) ;
throw runtime_error ( szBuf ) ;
}
}
}
program - > initSavedGame ( mainWindow , false , fileName ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2012-03-13 00:08:22 +01:00
}
2011-09-16 02:34:14 +02:00
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_PREVIEW_MAP ] ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_PREVIEW_MAP ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_PREVIEW_MAP ] ) , & foundParamIndIndex ) ;
}
string mapName = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( mapName , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string autoloadMapName = paramPartTokens [ 1 ] ;
GameSettings * gameSettings = & startupGameSettings ;
2011-12-02 17:07:59 +01:00
//int factionCount= 0;
2011-09-16 02:34:14 +02:00
gameSettings - > setMap ( autoloadMapName ) ;
gameSettings - > setTileset ( " forest " ) ;
gameSettings - > setTech ( " megapack " ) ;
gameSettings - > setDefaultUnits ( false ) ;
gameSettings - > setDefaultResources ( false ) ;
gameSettings - > setDefaultVictoryConditions ( true ) ;
gameSettings - > setFogOfWar ( false ) ;
gameSettings - > setAllowObservers ( true ) ;
gameSettings - > setPathFinderType ( pfBasic ) ;
for ( int i = 0 ; i < GameConstants : : maxPlayers ; + + i ) {
ControlType ct = ctClosed ;
gameSettings - > setNetworkPlayerStatuses ( i , 0 ) ;
gameSettings - > setFactionControl ( i , ct ) ;
gameSettings - > setStartLocationIndex ( i , i ) ;
gameSettings - > setResourceMultiplierIndex ( i , 10 ) ;
gameSettings - > setNetworkPlayerName ( i , " Closed " ) ;
}
ControlType ct = ctHuman ;
gameSettings - > setNetworkPlayerStatuses ( 0 , 0 ) ;
gameSettings - > setFactionControl ( 0 , ct ) ;
gameSettings - > setFactionTypeName ( 0 , formatString ( GameConstants : : OBSERVER_SLOTNAME ) ) ;
gameSettings - > setTeam ( 0 , GameConstants : : maxPlayers + fpt_Observer - 1 ) ;
gameSettings - > setStartLocationIndex ( 0 , 0 ) ;
gameSettings - > setNetworkPlayerName ( 0 , GameConstants : : OBSERVER_SLOTNAME ) ;
gameSettings - > setFactionCount ( 1 ) ;
Config & config = Config : : getInstance ( ) ;
gameSettings - > setEnableServerControlledAI ( config . getBool ( " ServerControlledAI " , " true " ) ) ;
gameSettings - > setNetworkFramePeriod ( config . getInt ( " NetworkSendFrameCount " , " 20 " ) ) ;
program - > initServer ( mainWindow , gameSettings ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-09-16 02:34:14 +02:00
}
else {
printf ( " \n Invalid map name specified on commandline [%s] map [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
delete mainWindow ;
return - 1 ;
}
}
2011-05-19 00:04:45 +02:00
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_CLIENT ] ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_CLIENT ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_CLIENT ] ) , & foundParamIndIndex ) ;
}
string serverToConnectTo = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( serverToConnectTo , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string autoConnectServer = paramPartTokens [ 1 ] ;
2012-03-28 00:44:16 +02:00
2011-05-19 00:04:45 +02:00
program - > initClient ( mainWindow , autoConnectServer ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-05-19 00:04:45 +02:00
}
else {
printf ( " \n Invalid host specified on commandline [%s] host [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
delete mainWindow ;
return - 1 ;
}
}
else if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LOADSCENARIO ] ) ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LOADSCENARIO ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_LOADSCENARIO ] ) , & foundParamIndIndex ) ;
}
string scenarioName = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( scenarioName , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string autoloadScenarioName = paramPartTokens [ 1 ] ;
2012-03-28 00:44:16 +02:00
2011-05-19 00:04:45 +02:00
program - > initScenario ( mainWindow , autoloadScenarioName ) ;
2012-03-29 02:43:03 +02:00
gameInitialized = true ;
2011-05-19 00:04:45 +02:00
}
else {
printf ( " \n Invalid scenario name specified on commandline [%s] scenario [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
delete mainWindow ;
return - 1 ;
}
}
else {
program - > initNormal ( mainWindow ) ;
}
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
// Initialize Renderer
2011-11-01 18:38:51 +01:00
//Renderer &renderer= Renderer::getInstance();
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] OpenGL Info: \n %s \n " , __FILE__ , __FUNCTION__ , __LINE__ , renderer . getGlInfo ( ) . c_str ( ) ) ;
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_OPENGL_INFO ] ) = = true ) {
//Renderer &renderer= Renderer::getInstance();
printf ( " %s " , renderer . getGlInfo ( ) . c_str ( ) ) ;
printf ( " %s " , renderer . getGlMoreInfo ( ) . c_str ( ) ) ;
delete mainWindow ;
return - 1 ;
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_CONVERT_MODELS ] ) = = true ) {
int foundParamIndIndex = - 1 ;
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_CONVERT_MODELS ] ) + string ( " = " ) , & foundParamIndIndex ) ;
if ( foundParamIndIndex < 0 ) {
hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_CONVERT_MODELS ] ) , & foundParamIndIndex ) ;
}
string paramValue = argv [ foundParamIndIndex ] ;
vector < string > paramPartTokens ;
Tokenize ( paramValue , paramPartTokens , " = " ) ;
if ( paramPartTokens . size ( ) > = 2 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
string modelFile = paramPartTokens [ 1 ] ;
printf ( " About to convert model(s) [%s] \n " , modelFile . c_str ( ) ) ;
string textureFormat = " " ;
if ( paramPartTokens . size ( ) > = 3 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
textureFormat = paramPartTokens [ 2 ] ;
printf ( " About to convert using texture format [%s] \n " , textureFormat . c_str ( ) ) ;
}
bool keepsmallest = false ;
if ( paramPartTokens . size ( ) > = 4 & & paramPartTokens [ 1 ] . length ( ) > 0 ) {
keepsmallest = ( paramPartTokens [ 3 ] = = " keepsmallest " ) ;
printf ( " About to convert using keepsmallest = %d \n " , keepsmallest ) ;
}
2012-03-03 19:40:18 +01:00
//CoreData::getInstance().load();
2011-05-19 00:04:45 +02:00
showCursor ( true ) ;
mainWindow - > setUseDefaultCursorOnly ( true ) ;
const Metrics & metrics = Metrics : : getInstance ( ) ;
renderer . clearBuffers ( ) ;
renderer . clearZBuffer ( ) ;
renderer . reset2d ( ) ;
2012-03-03 19:40:18 +01:00
if ( CoreData : : getInstance ( ) . getMenuFontBig3D ( ) ! = NULL ) {
renderer . renderText3D (
" Please wait, converting models... " ,
CoreData : : getInstance ( ) . getMenuFontBig3D ( ) ,
Vec3f ( 1.f , 1.f , 0.f ) , ( metrics . getScreenW ( ) / 2 ) - 400 ,
( metrics . getScreenH ( ) / 2 ) , true ) ;
}
else {
renderer . renderText (
" Please wait, converting models... " ,
CoreData : : getInstance ( ) . getMenuFontBig ( ) ,
Vec3f ( 1.f , 1.f , 0.f ) , ( metrics . getScreenW ( ) / 2 ) - 400 ,
( metrics . getScreenH ( ) / 2 ) , true ) ;
}
2011-05-19 00:04:45 +02:00
renderer . swapBuffers ( ) ;
std : : vector < string > models ;
if ( isdir ( modelFile . c_str ( ) ) = = true ) {
models = getFolderTreeContentsListRecursively ( modelFile , " .g3d " ) ;
}
else {
models . push_back ( modelFile ) ;
}
sleep ( 0 ) ;
Window : : handleEvent ( ) ;
SDL_PumpEvents ( ) ;
char szTextBuf [ 1024 ] = " " ;
for ( unsigned int i = 0 ; i < models . size ( ) ; + + i ) {
string & file = models [ i ] ;
bool modelLoadedOk = false ;
renderer . clearBuffers ( ) ;
renderer . clearZBuffer ( ) ;
renderer . reset2d ( ) ;
sprintf ( szTextBuf , " Please wait, converting models [%d of %lu] ... " , i , ( long int ) models . size ( ) ) ;
2012-03-03 19:40:18 +01:00
if ( CoreData : : getInstance ( ) . getMenuFontBig3D ( ) ! = NULL ) {
renderer . renderText3D (
szTextBuf ,
CoreData : : getInstance ( ) . getMenuFontBig3D ( ) ,
Vec3f ( 1.f , 1.f , 0.f ) , ( metrics . getScreenW ( ) / 2 ) - 400 ,
( metrics . getScreenH ( ) / 2 ) , true ) ;
}
else {
renderer . renderText (
szTextBuf ,
CoreData : : getInstance ( ) . getMenuFontBig ( ) ,
Vec3f ( 1.f , 1.f , 0.f ) , ( metrics . getScreenW ( ) / 2 ) - 400 ,
( metrics . getScreenH ( ) / 2 ) , true ) ;
}
2011-05-19 00:04:45 +02:00
renderer . swapBuffers ( ) ;
sleep ( 0 ) ;
Window : : handleEvent ( ) ;
SDL_PumpEvents ( ) ;
Model * model = renderer . newModel ( rsGlobal ) ;
try {
printf ( " About to load model [%s] [%d of %lu] \n " , file . c_str ( ) , i , ( long int ) models . size ( ) ) ;
model - > load ( file ) ;
modelLoadedOk = true ;
}
catch ( const exception & ex ) {
printf ( " ERROR loading model [%s] message [%s] \n " , file . c_str ( ) , ex . what ( ) ) ;
}
if ( modelLoadedOk = = true ) {
printf ( " About to save converted model [%s] \n " , file . c_str ( ) ) ;
model - > save ( file , textureFormat , keepsmallest ) ;
}
Renderer : : getInstance ( ) . endModel ( rsGlobal , model ) ;
}
delete mainWindow ;
return - 1 ;
}
else {
printf ( " \n Invalid model specified on commandline [%s] texture [%s] \n \n " , argv [ foundParamIndIndex ] , ( paramPartTokens . size ( ) > = 2 ? paramPartTokens [ 1 ] . c_str ( ) : NULL ) ) ;
printParameterHelp ( argv [ 0 ] , foundInvalidArgs ) ;
delete mainWindow ;
return - 1 ;
}
}
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TECHTREES ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_FACTIONS ] ) = = true | |
hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_SCENARIO ] ) = = true ) {
runTechValidationReport ( argc , argv ) ;
delete mainWindow ;
return - 1 ;
}
2012-04-03 21:35:22 +02:00
if ( hasCommandArgument ( argc , argv , GAME_ARGS [ GAME_ARG_VALIDATE_TILESET ] ) = = true ) {
runTilesetValidationReport ( argc , argv ) ;
delete mainWindow ;
return - 1 ;
}
2011-05-19 00:04:45 +02:00
gameInitialized = true ;
// Setup the screenshots folder
2012-03-28 00:44:16 +02:00
// if(userData != "") {
// endPathWithSlash(userData);
// }
2011-05-19 00:04:45 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
CheckForDuplicateData ( ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
//throw "BLAH!";
// START Test out SIGSEGV error handling
//int *foo = (int*)-1; // make a bad pointer
//printf("%d\n", *foo); // causes segfault
// END
bool startCRCPrecacheThread = config . getBool ( " PreCacheCRCThread " , " true " ) ;
//printf("### In [%s::%s Line: %d] precache thread enabled = %d SystemFlags::VERBOSE_MODE_ENABLED = %d\n",__FILE__,__FUNCTION__,__LINE__,startCRCPrecacheThread,SystemFlags::VERBOSE_MODE_ENABLED);
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] precache thread enabled = %d \n " , __FILE__ , __FUNCTION__ , __LINE__ , startCRCPrecacheThread ) ;
if ( startCRCPrecacheThread = = true ) {
vector < string > techDataPaths = config . getPathListForType ( ptTechs ) ;
preCacheThread = new FileCRCPreCacheThread ( ) ;
preCacheThread - > setUniqueID ( __FILE__ ) ;
preCacheThread - > setTechDataPaths ( techDataPaths ) ;
//preCacheThread->setFileCRCPreCacheThreadCallbackInterface(&preCacheThreadGame);
preCacheThread - > start ( ) ;
}
// test
//Shared::Platform::MessageBox(NULL,"Mark's test.","Test",0);
//throw runtime_error("test!");
//ExceptionHandler::DisplayMessage("test!", false);
//Lang &lang= Lang::getInstance();
//string test = lang.get("ExitGameServer?");
//printf("[%s]",test.c_str());
//time_t lastTextureLoadEvent = time(NULL);
2011-09-27 12:16:09 +02:00
// Check for commands being input from stdin
string command = " " ;
2011-11-16 06:20:35 +01:00
# ifndef WIN32
2011-09-27 12:16:09 +02:00
pollfd cinfd [ 1 ] ;
2011-11-16 06:20:35 +01:00
# else
HANDLE h = 0 ;
# endif
if ( disableheadless_console = = false ) {
# ifndef WIN32
// Theoretically this should always be 0, but one fileno call isn't going to hurt, and if
// we try to run somewhere that stdin isn't fd 0 then it will still just work
cinfd [ 0 ] . fd = fileno ( stdin ) ;
cinfd [ 0 ] . events = POLLIN ;
# else
h = GetStdHandle ( STD_INPUT_HANDLE ) ;
2012-01-20 05:15:13 +01:00
//DWORD dwMode;
//GetConsoleMode(h, &dwMode);
//SetConsoleMode(h, dwMode & ~ENABLE_MOUSE_INPUT);
FlushConsoleInputBuffer ( h ) ;
2011-11-16 06:20:35 +01:00
# endif
}
2011-09-27 12:16:09 +02:00
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = true ) {
2011-09-27 12:16:09 +02:00
printf ( " Headless server is now running... \n " ) ;
}
2011-10-03 20:34:59 +02:00
//throw runtime_error("Test!");
2011-05-19 00:04:45 +02:00
//main loop
2011-09-27 20:44:01 +02:00
while ( program - > isShutdownApplicationEnabled ( ) = = false & & Window : : handleEvent ( ) ) {
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = true ) {
2011-11-16 06:20:35 +01:00
if ( disableheadless_console = = false ) {
2011-09-27 12:16:09 +02:00
# ifndef WIN32
2011-11-16 06:20:35 +01:00
int pollresult = poll ( cinfd , 1 , 0 ) ;
int pollerror = errno ;
if ( pollresult )
2011-09-27 12:16:09 +02:00
# else
2011-11-16 06:20:35 +01:00
// This is problematic because input on Windows is not line-buffered so this will return
// even if getline may block. I haven't found a good way to fix it, so for the moment
// I just strongly suggest only running the server from the Python frontend, which does
// line buffer input. This does work okay as long as the user doesn't enter characters
// without pressing enter, and then try to end the server another way (say a remote
// console command), in which case we'll still be waiting for the stdin EOL and hang.
2012-01-20 05:15:13 +01:00
DWORD saveMode ;
GetConsoleMode ( h , & saveMode ) ;
DWORD dwMode = saveMode ;
dwMode & = ~ ENABLE_MOUSE_INPUT ;
dwMode & = ~ ENABLE_WINDOW_INPUT ;
SetConsoleMode ( h , dwMode ) ;
bool gotData = ( WaitForSingleObject ( h , 0 ) = = WAIT_OBJECT_0 ) ;
SetConsoleMode ( h , saveMode ) ;
if ( gotData = = true )
2011-09-27 12:16:09 +02:00
# endif
2011-11-16 06:20:35 +01:00
{
2011-11-16 05:03:17 +01:00
2012-01-20 05:15:13 +01:00
bool skip = true ;
# ifdef WIN32
DWORD nNumberOfCharsToRead = 1024 ;
DWORD nRead = 0 ;
INPUT_RECORD irInRec [ 1025 ] ;
PeekConsoleInput ( h , & irInRec [ 0 ] , nNumberOfCharsToRead , & nRead ) ;
for ( int i = 0 ; i < nRead ; + + i ) {
INPUT_RECORD & inr = irInRec [ i ] ;
//printf("inr.EventType = %d\n",inr.EventType);
if ( inr . EventType = = KEY_EVENT ) {
if ( inr . Event . KeyEvent . bKeyDown ) {
char cHoldKey = inr . Event . KeyEvent . uChar . AsciiChar ;
if ( cHoldKey = = ' \r ' ) {
skip = false ;
break ;
}
}
}
2011-11-16 06:20:35 +01:00
}
2012-01-20 05:15:13 +01:00
# else
skip = false ;
# endif
if ( skip = = false ) {
getline ( cin , command ) ;
cin . clear ( ) ;
printf ( " server command [%s] \n " , command . c_str ( ) ) ;
if ( command = = " quit " ) {
break ;
}
2011-11-16 05:03:17 +01:00
# ifndef WIN32
2012-01-20 05:15:13 +01:00
if ( cinfd [ 0 ] . revents & POLLNVAL ) {
printf ( " invalid file descriptor \n " ) ;
}
if ( cinfd [ 0 ] . revents & POLLERR ) {
printf ( " error in file descriptor \n " ) ;
}
if ( cinfd [ 0 ] . revents & POLLHUP ) {
printf ( " hang up in file descriptor \n " ) ;
}
2011-12-01 20:45:46 +01:00
2012-01-20 05:15:13 +01:00
if ( pollresult < 0 ) {
printf ( " pollresult = %d errno = %d [%s] \n " , pollresult , pollerror , strerror ( pollerror ) ) ;
2011-11-16 05:03:17 +01:00
2012-01-20 05:15:13 +01:00
cinfd [ 0 ] . fd = fileno ( stdin ) ;
cinfd [ 0 ] . events = POLLIN ;
}
2011-11-16 05:03:17 +01:00
# endif
2012-01-20 05:15:13 +01:00
}
2011-11-16 06:20:35 +01:00
}
2011-09-27 12:16:09 +02:00
}
//printf("looping\n");
}
2011-05-19 00:04:45 +02:00
program - > loop ( ) ;
2011-10-25 20:39:11 +02:00
2011-05-19 00:04:45 +02:00
// Because OpenGL really doesn't do multi-threading well
// if(difftime(time(NULL),lastTextureLoadEvent) >= 3) {
// lastTextureLoadEvent = time(NULL);
// vector<Texture2D *> textureList = preCacheThread->getPendingTextureList(1);
// for(unsigned int i = 0; i < textureList.size(); ++i) {
// Texture2D * factionLogo = textureList[i];
// if(factionLogo != NULL) {
// printf("\n\n\n\n|||||||||||||||||||||||||| Load texture [%s]\n",factionLogo->getPath().c_str());
// //Renderer::findFactionLogoTexture(factionLogo);
// renderer.initTexture(rsGlobal,factionLogo);
// }
// }
// }
}
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = true ) {
2011-09-27 12:16:09 +02:00
printf ( " \n Headless server is about to quit... \n " ) ;
}
2011-05-19 00:04:45 +02:00
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] starting normal application shutdown \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-10-22 00:07:34 +02:00
soundThreadManager = program - > getSoundThreadManager ( true ) ;
if ( soundThreadManager ) {
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
soundRenderer . stopAllSounds ( shutdownFadeSoundMilliseconds ) ;
chronoshutdownFadeSound . start ( ) ;
}
}
2011-05-19 00:04:45 +02:00
cleanupCRCThread ( ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
showCursor ( true ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
}
2011-10-22 00:07:34 +02:00
catch ( const exception & e ) {
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-11-02 18:17:28 +01:00
soundThreadManager = ( program ! = NULL ? program - > getSoundThreadManager ( true ) : NULL ) ;
2011-10-22 00:07:34 +02:00
if ( soundThreadManager ) {
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
soundRenderer . stopAllSounds ( shutdownFadeSoundMilliseconds ) ;
chronoshutdownFadeSound . start ( ) ;
}
}
2011-05-19 00:04:45 +02:00
ExceptionHandler : : handleRuntimeError ( e . what ( ) ) ;
}
2011-10-22 00:07:34 +02:00
catch ( const char * e ) {
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-11-02 18:17:28 +01:00
soundThreadManager = ( program ! = NULL ? program - > getSoundThreadManager ( true ) : NULL ) ;
2011-10-22 00:07:34 +02:00
if ( soundThreadManager ) {
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
soundRenderer . stopAllSounds ( shutdownFadeSoundMilliseconds ) ;
chronoshutdownFadeSound . start ( ) ;
}
}
2011-05-19 00:04:45 +02:00
ExceptionHandler : : handleRuntimeError ( e ) ;
}
2011-10-22 00:07:34 +02:00
catch ( const string & ex ) {
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-11-02 18:17:28 +01:00
soundThreadManager = ( program ! = NULL ? program - > getSoundThreadManager ( true ) : NULL ) ;
2011-10-22 00:07:34 +02:00
if ( soundThreadManager ) {
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
soundRenderer . stopAllSounds ( shutdownFadeSoundMilliseconds ) ;
chronoshutdownFadeSound . start ( ) ;
}
}
2011-05-19 00:04:45 +02:00
ExceptionHandler : : handleRuntimeError ( ex . c_str ( ) ) ;
}
2011-10-22 00:07:34 +02:00
catch ( . . . ) {
2011-12-02 23:04:02 +01:00
if ( GlobalStaticFlags : : getIsNonGraphicalModeEnabled ( ) = = false ) {
2011-11-02 18:17:28 +01:00
soundThreadManager = ( program ! = NULL ? program - > getSoundThreadManager ( true ) : NULL ) ;
2011-10-22 00:07:34 +02:00
if ( soundThreadManager ) {
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
soundRenderer . stopAllSounds ( shutdownFadeSoundMilliseconds ) ;
chronoshutdownFadeSound . start ( ) ;
}
}
2011-05-19 00:04:45 +02:00
ExceptionHandler : : handleRuntimeError ( " Unknown error! " ) ;
}
cleanupCRCThread ( ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
delete mainWindow ;
mainWindow = NULL ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
//showCursor(true);
//restoreVideoMode(true);
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
GraphicComponent : : clearRegisteredComponents ( ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2011-10-22 00:07:34 +02:00
if ( soundThreadManager ) {
2011-11-11 19:15:46 +01:00
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
if ( Config : : getInstance ( ) . getString ( " FactorySound " , " " ) ! = " None " & &
soundRenderer . isVolumeTurnedOff ( ) = = false ) {
//printf("chronoshutdownFadeSound.getMillis() = %llu\n",chronoshutdownFadeSound.getMillis());
for ( ; chronoshutdownFadeSound . getMillis ( ) < = shutdownFadeSoundMilliseconds ; ) {
sleep ( 10 ) ;
}
2011-10-22 00:07:34 +02:00
}
BaseThread : : shutdownAndWait ( soundThreadManager ) ;
delete soundThreadManager ;
soundThreadManager = NULL ;
}
2011-05-19 00:04:45 +02:00
return 0 ;
}
int glestMainWrapper ( int argc , char * * argv ) {
2011-12-01 03:31:00 +01:00
2011-06-06 23:38:25 +02:00
//setlocale(LC_ALL, "zh_TW.UTF-8");
//setlocale(LC_ALL, "");
2011-05-19 00:04:45 +02:00
# if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__FreeBSD__) && !defined(BSD)
//#ifdef DEBUG
//printf("MTRACE will be called...\n");
//mtrace ();
//#endif
# endif
# ifdef WIN32_STACK_TRACE
__try {
# endif
//application_binary= executable_path(argv[0],true);
//printf("\n\nargv0 [%s] application_binary [%s]\n\n",argv[0],application_binary.c_str());
# if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__FreeBSD__) && !defined(BSD)
2011-10-06 20:04:59 +02:00
if ( hasCommandArgument ( argc , argv , string ( GAME_ARGS [ GAME_ARG_DISABLE_SIGSEGV_HANDLER ] ) ) = = false ) {
signal ( SIGSEGV , handleSIGSEGV ) ;
}
2011-05-19 00:04:45 +02:00
// http://developerweb.net/viewtopic.php?id=3013
//signal(SIGPIPE, SIG_IGN);
# endif
2011-11-23 09:00:09 +01:00
initSpecialStrings ( ) ;
2011-05-19 00:04:45 +02:00
int result = glestMain ( argc , argv ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
cleanupProcessObjects ( ) ;
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
if ( sdl_quitCalled = = false ) {
sdl_quitCalled = true ;
SDL_Quit ( ) ;
}
if ( SystemFlags : : VERBOSE_MODE_ENABLED ) printf ( " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
return result ;
# ifdef WIN32_STACK_TRACE
} __except ( stackdumper ( 0 , GetExceptionInformation ( ) ) , EXCEPTION_CONTINUE_SEARCH ) { return 0 ; }
# endif
}
} } //end namespace
MAIN_FUNCTION ( Glest : : Game : : glestMainWrapper )