merge from upstream

This commit is contained in:
Will 2013-12-04 23:37:04 +01:00
commit 03c0197437
14 changed files with 553 additions and 206 deletions

3
.gitignore vendored
View File

@ -85,3 +85,6 @@ data/glest_game/lua/
# #
/source/windows_deps_2012
/source/windows_deps_2010
/source/windows_deps_2010_old

View File

@ -9,6 +9,7 @@ OUTFILE=./cppcheck.log
CPUS=`lscpu -p | grep -cv '^#'` CPUS=`lscpu -p | grep -cv '^#'`
if [ "$CPUS" = '' ]; then CPUS=1; fi if [ "$CPUS" = '' ]; then CPUS=1; fi
#~/cppcheck-1.62/cppcheck ../../source/ -i ../../source/win32_deps -i ../../source/configurator -i ../../source/shared_lib/sources/libircclient -i ../../source/shared_lib/sources/platform/miniupnpc -j $CPUS --enable=all --force --verbose 2> $OUTFILE
cppcheck ../../source/ -i ../../source/win32_deps -i ../../source/configurator -i ../../source/shared_lib/sources/libircclient -i ../../source/shared_lib/sources/platform/miniupnpc -j $CPUS --enable=all --force --verbose 2> $OUTFILE cppcheck ../../source/ -i ../../source/win32_deps -i ../../source/configurator -i ../../source/shared_lib/sources/libircclient -i ../../source/shared_lib/sources/platform/miniupnpc -j $CPUS --enable=all --force --verbose 2> $OUTFILE
echo "Results from cppcheck were written to $OUTFILE" echo "Results from cppcheck were written to $OUTFILE"

View File

@ -43,39 +43,44 @@ ECHO Setting up Visual Studio 2010 environment vars...
REM Ensure ultifds HP doesn't mess the build up REM Ensure ultifds HP doesn't mess the build up
SET Platform= SET Platform=
if "%DevEnvDir%." == "." goto SETVCVARS if "%DevEnvDir%." == "." goto SETVCVARS
GOTO SVNSECTION GOTO GITSECTION
:SETVCVARS :SETVCVARS
IF EXIST "%VS100COMNTOOLS%..\..\" GOTO VC_Common IF EXIST "%VS100COMNTOOLS%..\..\" GOTO VC_Common
IF EXIST "\Program Files\Microsoft Visual Studio 10.0\" GOTO VC_32 IF EXIST "\Program Files\Microsoft Visual Studio 10.0\" GOTO VC_32
IF EXIST "\Program Files (x86)\Microsoft Visual Studio 10.0\" GOTO VC_64 IF EXIST "\Program Files (x86)\Microsoft Visual Studio 10.0\" GOTO VC_64
goto SVNSECTION goto GITSECTION
:VC_Common :VC_Common
call "%VS100COMNTOOLS%..\..\vc\vcvarsall.bat" call "%VS100COMNTOOLS%..\..\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:VC_32 :VC_32
ECHO 32 bit Windows detected... ECHO 32 bit Windows detected...
call "\Program Files\Microsoft Visual Studio 10.0\vc\vcvarsall.bat" call "\Program Files\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:VC_64 :VC_64
ECHO 64 bit Windows detected... ECHO 64 bit Windows detected...
call "\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat" call "\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:SVNSECTION :GITSECTION
rem Update from SVN to latest rev rem Update from GIT to latest rev
ECHO -------------------------------- ECHO --------------------------------
Echo Updating Code from SVN to latest Revision... Echo Updating Code from GIT to latest Revision...
svn update ..\..\ cd ..\..\
git pull
set SVNVERSION=. set GITVERSION_SHA1=.
for /f "delims=" %%a in ('svnversion ..\..\ -n') do @set SVNVERSION=%%a set GITVERSION_REV=.
ECHO Will build using SVN Revision: [%SVNVERSION%] set GET_GIT_SHA1="git log -1 --format=%%h"
for /f "delims=" %%a in ('%GET_GIT_SHA1%') do @set GITVERSION_SHA1=%%a
for /f "delims=" %%a in ('git rev-list HEAD --count') do @set GITVERSION_REV=%%a
ECHO Will build using GIT Revision: [%GITVERSION_REV%.%GITVERSION_SHA1%]
cd mk\windoze
rem pause rem pause
ECHO -------------------------------- ECHO --------------------------------
@ -88,12 +93,12 @@ ECHO --------------------------------
Echo Building Mega-Glest using Visual Studio 2010... Echo Building Mega-Glest using Visual Studio 2010...
set CL= set CL=
del ..\..\source\glest_game\facilities\svnversion.h del ..\..\source\glest_game\facilities\gitversion.h
if not "%SVNVERSION%" == "." set CL=/DSVNVERSIONHEADER if not "%GITVERSION_SHA1%" == "." set CL=/DGITVERSIONHEADER
if not "%SVNVERSION%" == "." echo building with CL [%CL%] if not "%GITVERSION_SHA1%" == "." echo building with CL [%CL%]
if not "%SVNVERSION%" == "." echo #define SVNVERSION "%SVNVERSION%" > ..\..\source\glest_game\facilities\svnversion.h if not "%GITVERSION_SHA1%" == "." echo #define GITVERSION "%GITVERSION_REV%.%GITVERSION_SHA1%" > ..\..\source\glest_game\facilities\gitversion.h
if not "%SVNVERSION%" == "." copy /b ..\..\source\glest_game\facilities\game_util.cpp +,, if not "%GITVERSION_SHA1%" == "." copy /b ..\..\source\glest_game\facilities\game_util.cpp +,,
set msBuildMaxCPU= set msBuildMaxCPU=
SET BuildInParallel=false SET BuildInParallel=false

View File

@ -50,7 +50,7 @@ ECHO Setting up Visual Studio 2012 environment vars...
REM Ensure ultifds HP doesn't mess the build up REM Ensure ultifds HP doesn't mess the build up
SET Platform= SET Platform=
if "%DevEnvDir%." == "." goto SETVCVARS if "%DevEnvDir%." == "." goto SETVCVARS
GOTO SVNSECTION GOTO GITSECTION
:SETVCVARS :SETVCVARS
@ -61,45 +61,50 @@ IF EXIST "\Program Files (x86)\Microsoft Visual Studio 11.0\" GOTO VC_64_12
rem IF EXIST "%VS100COMNTOOLS%..\..\" GOTO VC_Common rem IF EXIST "%VS100COMNTOOLS%..\..\" GOTO VC_Common
rem IF EXIST "\Program Files\Microsoft Visual Studio 10.0\" GOTO VC_32 rem IF EXIST "\Program Files\Microsoft Visual Studio 10.0\" GOTO VC_32
rem IF EXIST "\Program Files (x86)\Microsoft Visual Studio 10.0\" GOTO VC_64 rem IF EXIST "\Program Files (x86)\Microsoft Visual Studio 10.0\" GOTO VC_64
goto SVNSECTION goto GITSECTION
:VC_Common_12 :VC_Common_12
call "%VS110COMNTOOLS%..\..\vc\vcvarsall.bat" %VCVARS_PLATFORM% call "%VS110COMNTOOLS%..\..\vc\vcvarsall.bat" %VCVARS_PLATFORM%
goto SVNSECTION goto GITSECTION
:VC_32_12 :VC_32_12
ECHO 32 bit Windows detected... ECHO 32 bit Windows detected...
call "\Program Files\Microsoft Visual Studio 11.0\vc\vcvarsall.bat" %VCVARS_PLATFORM% call "\Program Files\Microsoft Visual Studio 11.0\vc\vcvarsall.bat" %VCVARS_PLATFORM%
goto SVNSECTION goto GITSECTION
:VC_64_12 :VC_64_12
ECHO 64 bit Windows detected... ECHO 64 bit Windows detected...
call "\Program Files (x86)\Microsoft Visual Studio 11.0\vc\vcvarsall.bat" %VCVARS_PLATFORM% call "\Program Files (x86)\Microsoft Visual Studio 11.0\vc\vcvarsall.bat" %VCVARS_PLATFORM%
goto SVNSECTION goto GITSECTION
:VC_Common :VC_Common
rem call "%VS100COMNTOOLS%..\..\vc\vcvarsall.bat" rem call "%VS100COMNTOOLS%..\..\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:VC_32 :VC_32
ECHO 32 bit Windows detected... ECHO 32 bit Windows detected...
rem call "\Program Files\Microsoft Visual Studio 10.0\vc\vcvarsall.bat" rem call "\Program Files\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:VC_64 :VC_64
ECHO 64 bit Windows detected... ECHO 64 bit Windows detected...
rem call "\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat" rem call "\Program Files (x86)\Microsoft Visual Studio 10.0\vc\vcvarsall.bat"
goto SVNSECTION goto GITSECTION
:SVNSECTION :GITSECTION
rem Update from SVN to latest rev rem Update from GIT to latest rev
ECHO -------------------------------- ECHO --------------------------------
Echo Updating Code from SVN to latest Revision... Echo Updating Code from GIT to latest Revision...
svn update ..\..\ cd ..\..\
git pull
set SVNVERSION=. set GITVERSION_SHA1=.
for /f "delims=" %%a in ('svnversion ..\..\ -n') do @set SVNVERSION=%%a set GITVERSION_REV=.
ECHO Will build using SVN Revision: [%SVNVERSION%] set GET_GIT_SHA1="git log -1 --format=%%h"
for /f "delims=" %%a in ('%GET_GIT_SHA1%') do @set GITVERSION_SHA1=%%a
for /f "delims=" %%a in ('git rev-list HEAD --count') do @set GITVERSION_REV=%%a
ECHO Will build using GIT Revision: [%GITVERSION_REV%.%GITVERSION_SHA1%]
cd mk\windoze
rem pause rem pause
ECHO -------------------------------- ECHO --------------------------------
@ -127,12 +132,12 @@ rem set CL=/D_USING_V110_SDK71_ %CL%
rem set PlatformToolset=v110_xp rem set PlatformToolset=v110_xp
rem set PlatformToolset=V110 rem set PlatformToolset=V110
del ..\..\source\glest_game\facilities\svnversion.h del ..\..\source\glest_game\facilities\gitversion.h
if not "%SVNVERSION%" == "." set CL=/DSVNVERSIONHEADER if not "%GITVERSION_SHA1%" == "." set CL=/DGITVERSIONHEADER
if not "%SVNVERSION%" == "." echo building with CL [%CL%] if not "%GITVERSION_SHA1%" == "." echo building with CL [%CL%]
if not "%SVNVERSION%" == "." echo #define SVNVERSION "%SVNVERSION%" > ..\..\source\glest_game\facilities\svnversion.h if not "%GITVERSION_SHA1%" == "." echo #define GITVERSION "%GITVERSION_REV%.%GITVERSION_SHA1%" > ..\..\source\glest_game\facilities\gitversion.h
if not "%SVNVERSION%" == "." copy /b ..\..\source\glest_game\facilities\game_util.cpp +,, if not "%GITVERSION_SHA1%" == "." copy /b ..\..\source\glest_game\facilities\game_util.cpp +,,
rem set VisualStudioVersion=11.0 rem set VisualStudioVersion=11.0
set msBuildMaxCPU= set msBuildMaxCPU=

View File

@ -272,7 +272,7 @@
<RuntimeTypeInfo>true</RuntimeTypeInfo> <RuntimeTypeInfo>true</RuntimeTypeInfo>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies>dsound.lib;dxguid.lib;glew32s.lib;libogg_static.lib;libvorbis_static.lib;libvorbisfile_static.lib;opengl32.lib;glu32.lib;wsock32.lib;libglest.lib;mmc.lib;lua.lib;xerces-c_static_3.lib;Dbghelp.lib;libpng15.lib;jpeg.lib;zlibstat.lib;sdl.lib;sdlmain.lib;winmm.lib;openal64.lib;iphlpapi.lib;libstreflop.lib;libcurl.lib;ws2_32.lib;libircclient.lib;freetype244MT.lib;ftgl_static.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>dsound.lib;dxguid.lib;glew32s.lib;libogg_static.lib;libvorbis_static.lib;libvorbisfile_static.lib;opengl32.lib;glu32.lib;wsock32.lib;libglest.lib;mmc.lib;lua.lib;xerces-c_static_3.lib;Dbghelp.lib;libpng15.lib;jpeg.lib;zlibstat.lib;sdl.lib;sdlmain.lib;winmm.lib;openal64.lib;iphlpapi.lib;libcurl.lib;ws2_32.lib;libircclient.lib;freetype244MT.lib;ftgl_static.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>../../../source/windows_deps_2012/lib;../../../build/$(Configuration)/libglest;$(DXSDK_DIR)/lib/x64;../../../source/windows_deps_2012/Microsoft DirectX SDK %28November 2007%29/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>../../../source/windows_deps_2012/lib;../../../build/$(Configuration)/libglest;$(DXSDK_DIR)/lib/x64;../../../source/windows_deps_2012/Microsoft DirectX SDK %28November 2007%29/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreSpecificDefaultLibraries>;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>

View File

@ -194,6 +194,7 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\..\source\tests\shared_lib\graphics\font_test.cpp" /> <ClCompile Include="..\..\..\source\tests\shared_lib\graphics\font_test.cpp" />
<ClCompile Include="..\..\..\source\tests\shared_lib\graphics\math_util_test.cpp" /> <ClCompile Include="..\..\..\source\tests\shared_lib\graphics\math_util_test.cpp" />
<ClCompile Include="..\..\..\source\tests\shared_lib\graphics\model_test.cpp" />
<ClCompile Include="..\..\..\source\tests\shared_lib\util\util_test.cpp" /> <ClCompile Include="..\..\..\source\tests\shared_lib\util\util_test.cpp" />
<ClCompile Include="..\..\..\source\tests\shared_lib\xml\xml_parser_test.cpp" /> <ClCompile Include="..\..\..\source\tests\shared_lib\xml\xml_parser_test.cpp" />
<ClCompile Include="..\..\..\source\tests\test_runner.cpp" /> <ClCompile Include="..\..\..\source\tests\test_runner.cpp" />

View File

@ -36,7 +36,7 @@ const string glestVersionString = "v3.9.0";
const string GIT_RawRev = string(GITVERSION); const string GIT_RawRev = string(GITVERSION);
const string GIT_Rev = string("Rev: ") + string(GITVERSION); const string GIT_Rev = string("Rev: ") + string(GITVERSION);
#else #else
const string GIT_RawRev = "$4790$"; const string GIT_RawRev = "$4446.1a8673f$";
const string GIT_Rev = "$Rev$"; const string GIT_Rev = "$Rev$";
#endif #endif

View File

@ -430,6 +430,8 @@ Game::~Game() {
world.end(); //must die before selection because of referencers world.end(); //must die before selection because of referencers
BaseColorPickEntity::resetUniqueColors();
if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] aiInterfaces.size() = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,aiInterfaces.size()); if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] aiInterfaces.size() = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,aiInterfaces.size());
delete videoPlayer; delete videoPlayer;
@ -1001,6 +1003,8 @@ void Game::load(int loadTypes) {
SoundRenderer &soundRenderer= SoundRenderer::getInstance(); SoundRenderer &soundRenderer= SoundRenderer::getInstance();
soundRenderer.stopAllSounds(fadeMusicMilliseconds); soundRenderer.stopAllSounds(fadeMusicMilliseconds);
BaseColorPickEntity::resetUniqueColors();
Config &config = Config::getInstance(); Config &config = Config::getInstance();
Logger &logger= Logger::getInstance(); Logger &logger= Logger::getInstance();
@ -2608,6 +2612,8 @@ void Game::update() {
aiInterfaces.clear(); aiInterfaces.clear();
gui.end(); //selection must be cleared before deleting units gui.end(); //selection must be cleared before deleting units
world.end(); //must die before selection because of referencers world.end(); //must die before selection because of referencers
BaseColorPickEntity::resetUniqueColors();
// MUST DO THIS LAST!!!! Because objects above have pointers to things like // MUST DO THIS LAST!!!! Because objects above have pointers to things like
// unit particles and fade them out etc and this end method deletes the original // unit particles and fade them out etc and this end method deletes the original
// object pointers. // object pointers.
@ -2632,6 +2638,7 @@ void Game::update() {
soundRenderer.stopAllSounds(fadeMusicMilliseconds); soundRenderer.stopAllSounds(fadeMusicMilliseconds);
world.endScenario(); world.endScenario();
BaseColorPickEntity::resetUniqueColors();
Renderer &renderer= Renderer::getInstance(); Renderer &renderer= Renderer::getInstance();
renderer.endScenario(); renderer.endScenario();
@ -5268,7 +5275,12 @@ string Game::getDebugStats(std::map<int,string> &factionDebugInfo) {
str+= "ExploredCellsLookupItemCache: " + world.getExploredCellsLookupItemCacheStats()+"\n"; str+= "ExploredCellsLookupItemCache: " + world.getExploredCellsLookupItemCacheStats()+"\n";
str+= "FowAlphaCellsLookupItemCache: " + world.getFowAlphaCellsLookupItemCacheStats()+"\n"; str+= "FowAlphaCellsLookupItemCache: " + world.getFowAlphaCellsLookupItemCacheStats()+"\n";
str += "Selection type: "+toLower(Config::getInstance().getString("SelectionType",Config::colorPicking))+"\n"; const string selectionType = toLower(Config::getInstance().getString("SelectionType",Config::colorPicking));
str += "Selection type: " + toLower(selectionType) + "\n";
if(selectionType == Config::colorPicking) {
str += "Color picking used color list size: " + intToStr(BaseColorPickEntity::getUsedColorIDListSize()) +"\n";
}
//str+= "AllFactionsCacheStats: " + world.getAllFactionsCacheStats()+"\n"; //str+= "AllFactionsCacheStats: " + world.getAllFactionsCacheStats()+"\n";
//str+= "AttackWarningCount: " + intToStr(world.getUnitUpdater()->getAttackWarningCount()) + "\n"; //str+= "AttackWarningCount: " + intToStr(world.getUnitUpdater()->getAttackWarningCount()) + "\n";
@ -5588,7 +5600,10 @@ void Game::render2d() {
// ==================== misc ==================== // ==================== misc ====================
void Game::checkWinner() { void Game::checkWinner() {
if(gameOver == false) { // lookup int is team #, value is players alive on team
std::map<int, int> teamsAlive = getTeamsAlive();
if(gameOver == false || teamsAlive.size() > 1) {
if(gameSettings.getDefaultVictoryConditions()) { if(gameSettings.getDefaultVictoryConditions()) {
checkWinnerStandard(); checkWinnerStandard();
} }
@ -5663,55 +5678,62 @@ void Game::setEndGameTeamWinnersAndLosers() {
} }
} }
void Game::checkWinnerStandard() { std::map<int, int> Game::getTeamsAlive() {
if(world.getFactionCount() <= 0) { std::map<int, int> teamsAlive;
return; for (int factionIndex = 0; factionIndex < world.getFactionCount(); ++factionIndex) {
if (factionIndex != world.getThisFactionIndex()) {
//if(hasBuilding(world.getFaction(i))) {
if (factionLostGame(world.getFaction(factionIndex)) == false) {
teamsAlive[world.getFaction(factionIndex)->getTeam()] =
teamsAlive[world.getFaction(factionIndex)->getTeam()] + 1;
}
}
} }
if(this->masterserverMode == true || world.getThisFaction()->getPersonalityType() == fpt_Observer) { // did some team win
// lookup int is team #, value is players alive on team return teamsAlive;
std::map<int,int> teamsAlive; }
for(int i = 0; i < world.getFactionCount(); ++i) {
if(i != world.getThisFactionIndex()) { void Game::checkWinnerStandardHeadlessOrObserver() {
//if(hasBuilding(world.getFaction(i))) { // lookup int is team #, value is players alive on team
if(factionLostGame(world.getFaction(i)) == false) { std::map<int, int> teamsAlive = getTeamsAlive();
teamsAlive[world.getFaction(i)->getTeam()] = teamsAlive[world.getFaction(i)->getTeam()] + 1;
// did some team win
if (teamsAlive.size() <= 1) {
if (this->masterserverMode == true) {
printf("Game finished...\n");
}
for (int factionIndex = 0; factionIndex < world.getFactionCount(); ++factionIndex) {
Faction* faction = world.getFaction(factionIndex);
if (factionIndex != world.getThisFactionIndex() &&
teamsAlive.find(faction->getTeam()) != teamsAlive.end()) {
world.getStats()->setVictorious(factionIndex);
if (this->masterserverMode == true) {
printf("Player: %s is on the winning team #: %d\n",
this->gameSettings.getNetworkPlayerName(factionIndex).c_str(),
faction->getTeam());
} }
} }
} }
bool wasGameOverAlready = gameOver;
gameOver = true;
// did some team win // Only need to process this once
if(teamsAlive.size() <= 1) { if(wasGameOverAlready == false) {
if(this->masterserverMode == true) { if (this->gameSettings.isNetworkGame() == false ||
printf("Game finished...\n"); this->gameSettings.getEnableObserverModeAtEndGame()
} == true) {
for(int i=0; i< world.getFactionCount(); ++i) {
Faction *faction = world.getFaction(i);
if(i != world.getThisFactionIndex() && teamsAlive.find(faction->getTeam()) != teamsAlive.end()) {
world.getStats()->setVictorious(i);
if(this->masterserverMode == true) {
printf("Player: %s is on the winning team #: %d\n",this->gameSettings.getNetworkPlayerName(i).c_str(),faction->getTeam());
}
}
}
gameOver= true;
if( this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame() == true) {
// Let the happy winner view everything left in the world // Let the happy winner view everything left in the world
// This caused too much LAG for network games // This caused too much LAG for network games
if(this->gameSettings.isNetworkGame() == false) { if (this->gameSettings.isNetworkGame() == false) {
Renderer::getInstance().setPhotoMode(true); Renderer::getInstance().setPhotoMode(true);
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT); gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
} }
// END // END
} }
scriptManager.onGameOver(true); scriptManager.onGameOver(true);
if (world.getFactionCount() == 1 &&
if(world.getFactionCount() == 1 && world.getFaction(0)->getPersonalityType() == fpt_Observer) { world.getFaction(0)->getPersonalityType() == fpt_Observer) {
//printf("!!!!!!!!!!!!!!!!!!!!"); //printf("!!!!!!!!!!!!!!!!!!!!");
//gameCamera.setMoveY(100.0); //gameCamera.setMoveY(100.0);
gameCamera.zoom(-300); gameCamera.zoom(-300);
//gameCamera.update(); //gameCamera.update();
@ -5721,23 +5743,121 @@ void Game::checkWinnerStandard() {
} }
} }
} }
else { }
//lose
bool lose= false; void Game::checkWinnerStandardPlayer() {
//if(hasBuilding(world.getThisFaction()) == false) { //lose
if(factionLostGame(world.getThisFaction()) == true) { bool lose = false;
lose= true; //if(hasBuilding(world.getThisFaction()) == false) {
for(int i=0; i<world.getFactionCount(); ++i) { if (factionLostGame(world.getThisFaction()) == true) {
if(world.getFaction(i)->getPersonalityType() != fpt_Observer) { lose = true;
if(world.getFaction(i)->isAlly(world.getThisFaction()) == false) { for (int factionIndex = 0; factionIndex < world.getFactionCount(); ++factionIndex) {
world.getStats()->setVictorious(i); if (world.getFaction(factionIndex)->getPersonalityType() != fpt_Observer) {
if (world.getFaction(factionIndex)->isAlly(world.getThisFaction()) == false) {
world.getStats()->setVictorious(factionIndex);
}
}
}
bool wasGameOverAlready = gameOver;
gameOver = true;
// Only need to process losing once
if(wasGameOverAlready == false) {
if (this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame()
== true) {
// Let the poor user watch everything unfold
// This caused too much LAG for network games
if (this->gameSettings.isNetworkGame() == false) {
Renderer::getInstance().setPhotoMode(true);
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
}
// END
// but don't let him cheat via teamchat
chatManager.setDisableTeamMode(true);
}
scriptManager.onGameOver(!lose);
showLoseMessageBox();
}
}
//win
if (lose == false) {
bool win = true;
for (int factionIndex = 0; factionIndex < world.getFactionCount(); ++factionIndex) {
if (factionIndex != world.getThisFactionIndex()) {
if (world.getFaction(factionIndex)->getPersonalityType() != fpt_Observer) {
//if(hasBuilding(world.getFaction(i)) &&
if (factionLostGame(world.getFaction(factionIndex)) == false &&
world.getFaction(factionIndex)->isAlly(world.getThisFaction()) == false) {
win = false;
} }
} }
} }
gameOver= true; }
//if win
if (win) {
for (int factionIndex = 0; factionIndex < world.getFactionCount(); ++factionIndex) {
if (world.getFaction(factionIndex)->getPersonalityType() != fpt_Observer) {
if (world.getFaction(factionIndex)->isAlly(world.getThisFaction())) {
world.getStats()->setVictorious(factionIndex);
}
}
}
bool wasGameOverAlready = gameOver;
gameOver = true;
// Only need to process winning once
if(wasGameOverAlready == false) {
if (this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame() == true) {
// Let the happy winner view everything left in the world
//world.setFogOfWar(false);
// This caused too much LAG for network games
if (this->gameSettings.isNetworkGame() == false) {
Renderer::getInstance().setPhotoMode(true);
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
}
// END
}
scriptManager.onGameOver(win);
showWinMessageBox();
}
}
}
}
void Game::checkWinnerStandard() {
if(world.getFactionCount() <= 0) {
return;
}
if(this->masterserverMode == true ||
world.getThisFaction()->getPersonalityType() == fpt_Observer) {
checkWinnerStandardHeadlessOrObserver();
}
else {
checkWinnerStandardPlayer();
}
}
void Game::checkWinnerScripted() {
if(scriptManager.getIsGameOver()) {
bool wasGameOverAlready = gameOver;
gameOver= true;
for(int i= 0; i<world.getFactionCount(); ++i) {
if(scriptManager.getPlayerModifiers(i)->getWinner()) {
world.getStats()->setVictorious(i);
}
}
// Only need to process winning once
if(wasGameOverAlready == false) {
if( this->gameSettings.isNetworkGame() == false || if( this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame() == true) { this->gameSettings.getEnableObserverModeAtEndGame() == true) {
// Let the poor user watch everything unfold // Let the happy winner view everything left in the world
//world.setFogOfWar(false);
// This caused too much LAG for network games // This caused too much LAG for network games
if(this->gameSettings.isNetworkGame() == false) { if(this->gameSettings.isNetworkGame() == false) {
@ -5745,95 +5865,20 @@ void Game::checkWinnerStandard() {
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT); gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
} }
// END // END
// but don't let him cheat via teamchat
chatManager.setDisableTeamMode(true);
} }
scriptManager.onGameOver(!lose); if(this->masterserverMode == true || world.getThisFaction()->getPersonalityType() == fpt_Observer) {
showLoseMessageBox();
}
//win
if(lose == false) {
bool win= true;
for(int i = 0; i < world.getFactionCount(); ++i) {
if(i != world.getThisFactionIndex()) {
if(world.getFaction(i)->getPersonalityType() != fpt_Observer) {
//if(hasBuilding(world.getFaction(i)) &&
if(factionLostGame(world.getFaction(i)) == false &&
world.getFaction(i)->isAlly(world.getThisFaction()) == false) {
win= false;
}
}
}
}
//if win
if(win) {
for(int i=0; i< world.getFactionCount(); ++i) {
if(world.getFaction(i)->getPersonalityType() != fpt_Observer) {
if(world.getFaction(i)->isAlly(world.getThisFaction())) {
world.getStats()->setVictorious(i);
}
}
}
gameOver= true;
if( this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame() == true) {
// Let the happy winner view everything left in the world
//world.setFogOfWar(false);
// This caused too much LAG for network games
if(this->gameSettings.isNetworkGame() == false) {
Renderer::getInstance().setPhotoMode(true);
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
}
// END
}
scriptManager.onGameOver(win);
showWinMessageBox(); showWinMessageBox();
} }
} else {
} scriptManager.onGameOver(scriptManager.getPlayerModifiers(world.getThisFactionIndex())->getWinner());
}
void Game::checkWinnerScripted() { if(scriptManager.getPlayerModifiers(world.getThisFactionIndex())->getWinner()){
if(scriptManager.getIsGameOver()) { showWinMessageBox();
gameOver= true; }
for(int i= 0; i<world.getFactionCount(); ++i) { else {
if(scriptManager.getPlayerModifiers(i)->getWinner()) { showLoseMessageBox();
world.getStats()->setVictorious(i); }
}
}
if( this->gameSettings.isNetworkGame() == false ||
this->gameSettings.getEnableObserverModeAtEndGame() == true) {
// Let the happy winner view everything left in the world
//world.setFogOfWar(false);
// This caused too much LAG for network games
if(this->gameSettings.isNetworkGame() == false) {
Renderer::getInstance().setPhotoMode(true);
gameCamera.setMaxHeight(PHOTO_MODE_MAXHEIGHT);
}
// END
}
if(this->masterserverMode == true || world.getThisFaction()->getPersonalityType() == fpt_Observer) {
showWinMessageBox();
}
else {
scriptManager.onGameOver(scriptManager.getPlayerModifiers(world.getThisFactionIndex())->getWinner());
if(scriptManager.getPlayerModifiers(world.getThisFactionIndex())->getWinner()){
showWinMessageBox();
}
else{
showLoseMessageBox();
} }
} }
} }
@ -5845,10 +5890,10 @@ bool Game::factionLostGame(int factionIndex) {
bool Game::factionLostGame(const Faction *faction) { bool Game::factionLostGame(const Faction *faction) {
if(faction != NULL) { if(faction != NULL) {
for(int i=0; i<faction->getUnitCount(); ++i) { for(int factionIndex=0; factionIndex<faction->getUnitCount(); ++factionIndex) {
const UnitType *ut = faction->getUnit(i)->getType(); const UnitType *ut = faction->getUnit(factionIndex)->getType();
if(ut->getCountInVictoryConditions() == ucvcNotSet) { if(ut->getCountInVictoryConditions() == ucvcNotSet) {
if(faction->getUnit(i)->getType()->hasSkillClass(scBeBuilt)) { if(faction->getUnit(factionIndex)->getType()->hasSkillClass(scBeBuilt)) {
return false; return false;
} }
} }

View File

@ -395,6 +395,9 @@ private:
int startIndex, int endIndex, bool onlyNetworkUnassigned); int startIndex, int endIndex, bool onlyNetworkUnassigned);
void processNetworkSynchChecksIfRequired(); void processNetworkSynchChecksIfRequired();
Stats getEndGameStats(); Stats getEndGameStats();
void checkWinnerStandardHeadlessOrObserver();
void checkWinnerStandardPlayer();
std::map<int, int> getTeamsAlive();
}; };
}}//end namespace }}//end namespace

View File

@ -261,8 +261,11 @@ class BaseColorPickEntity {
public: public:
BaseColorPickEntity(); BaseColorPickEntity();
virtual ~BaseColorPickEntity() {} virtual ~BaseColorPickEntity() {
recycleUniqueColor();
}
//static const int COLOR_COMPONENTS = 3;
static const int COLOR_COMPONENTS = 4; static const int COLOR_COMPONENTS = 4;
static void init(int bufferSize); static void init(int bufferSize);
static void beginPicking(); static void beginPicking();
@ -275,16 +278,40 @@ public:
string getColorDescription() const; string getColorDescription() const;
virtual string getUniquePickName() const = 0; virtual string getUniquePickName() const = 0;
private: static void resetUniqueColors();
unsigned char uniqueColorID[COLOR_COMPONENTS];
static unsigned nextColorID; static void setUsingLoopMethod(bool value) { using_loop_method = value; }
static const unsigned k, p;
static Mutex mutexNextColorID; static void setTrackColorUse(bool value) { trackColorUse = value; }
unsigned char * getUniqueColorID() { return &uniqueColorID[0]; }
bool get_next_assign_color(unsigned char *assign_to);
static int getUsedColorIDListSize() { return (int)usedColorIDList.size(); }
private:
unsigned char uniqueColorID[COLOR_COMPONENTS];
static unsigned char nextColorID[COLOR_COMPONENTS];
static unsigned int nextColorRGB;
static const unsigned int k, p;
//static Mutex mutexNextColorID;
static bool using_loop_method;
static bool trackColorUse;
static map<string,bool> usedColorIDList;
static vector<vector<unsigned char> > nextColorIDReuseList;
static auto_ptr<PixelBufferWrapper> pbo; static auto_ptr<PixelBufferWrapper> pbo;
void assign_color(); void assign_color();
void assign_color_using_prime(unsigned char *assign_to);
void assign_color_using_loop(unsigned char *assign_to);
void recycleUniqueColor();
}; };
}}//end namespace }}//end namespace

View File

@ -1826,35 +1826,183 @@ PixelBufferWrapper::~PixelBufferWrapper() {
cleanup(); cleanup();
} }
const unsigned BaseColorPickEntity::p = 64007; // ---------------------------------------------------------------------------
const unsigned BaseColorPickEntity::k = 43067;
unsigned BaseColorPickEntity::nextColorID = BaseColorPickEntity::k; const unsigned int BaseColorPickEntity::p = 64007;
Mutex BaseColorPickEntity::mutexNextColorID; const unsigned int BaseColorPickEntity::k = 43067;
unsigned int BaseColorPickEntity::nextColorRGB = BaseColorPickEntity::k;
//Mutex BaseColorPickEntity::mutexNextColorID;
unsigned char BaseColorPickEntity::nextColorID[COLOR_COMPONENTS] = { 1, 1, 1, 0 };
auto_ptr<PixelBufferWrapper> BaseColorPickEntity::pbo; auto_ptr<PixelBufferWrapper> BaseColorPickEntity::pbo;
map<string,bool> BaseColorPickEntity::usedColorIDList;
bool BaseColorPickEntity::trackColorUse = true;
vector<vector<unsigned char> > BaseColorPickEntity::nextColorIDReuseList;
bool BaseColorPickEntity::using_loop_method = false;
BaseColorPickEntity::BaseColorPickEntity() { BaseColorPickEntity::BaseColorPickEntity() {
assign_color(); uniqueColorID[0] = 0;
uniqueColorID[1] = 0;
uniqueColorID[2] = 0;
uniqueColorID[3] = 0;
assign_color();
}
bool BaseColorPickEntity::get_next_assign_color(unsigned char *assign_to) {
//MutexSafeWrapper safeMutex(&mutexNextColorID);
if(assign_to == NULL) {
throw megaglest_runtime_error("assign_to == NULL");
}
if(BaseColorPickEntity::using_loop_method == true) {
assign_color_using_loop(assign_to);
}
else {
assign_color_using_prime(assign_to);
}
bool isDuplicate = false;
if(BaseColorPickEntity::trackColorUse == true) {
string color_key = getColorDescription();
//printf("Assigned color [%s]\n",color_key.c_str());
if(usedColorIDList.find(color_key) == usedColorIDList.end()) {
usedColorIDList[color_key] = true;
//printf("Color added to used list [%s] usedColorIDList = %d nextColorIDReuseList = %d!\n",color_key.c_str(),(int)usedColorIDList.size(),(int)nextColorIDReuseList.size());
}
else {
isDuplicate = true;
printf("Line ref: %d *WARNING* color [%s] used count: %d using_loop: %d ALREADY in history list!\n",__LINE__,color_key.c_str(),(int)usedColorIDList.size(),BaseColorPickEntity::using_loop_method);
}
}
return isDuplicate;
} }
void BaseColorPickEntity::assign_color() { void BaseColorPickEntity::assign_color() {
get_next_assign_color(&uniqueColorID[0]);
MutexSafeWrapper safeMutex(&mutexNextColorID); }
nextColorID = (nextColorID * k) % p; void BaseColorPickEntity::assign_color_using_prime(unsigned char *assign_to) {
nextColorRGB = (nextColorRGB * k) % p;
// nextColorID is a 16-bit (hi)colour (for players with 16-bit display depths) // nextColorID is a 16-bit (hi)colour (for players with 16-bit display depths)
// we expand it to true-color for use with OpenGL // we expand it to true-color for use with OpenGL
const unsigned const unsigned int
r = (nextColorID >> 11) & ((1<<5)-1), r = (nextColorRGB >> 11) & ((1<<5)-1),
g = (nextColorID >> 5) & ((1<<6)-1), g = (nextColorRGB >> 5) & ((1<<6)-1),
b = nextColorID & ((1<<5)-1); b = nextColorRGB & ((1<<5)-1);
uniqueColorID[0] = r << 3; assign_to[0] = r << 3;
uniqueColorID[1] = g << 2; assign_to[1] = g << 2;
uniqueColorID[2] = b << 3; assign_to[2] = b << 3;
} }
void BaseColorPickEntity::assign_color_using_loop(unsigned char *assign_to) {
if(nextColorIDReuseList.empty() == false) {
//printf("Color being reused [%u.%u.%u] usedColorIDList = %d nextColorIDReuseList = %d!\n",nextColorIDReuseList.back()[0],nextColorIDReuseList.back()[1],nextColorIDReuseList.back()[2],(int)usedColorIDList.size(),(int)nextColorIDReuseList.size());
assign_to[0] = nextColorIDReuseList.back()[0];
assign_to[1] = nextColorIDReuseList.back()[1];
assign_to[2] = nextColorIDReuseList.back()[2];
nextColorIDReuseList.pop_back();
string color_key = getColorDescription();
if(usedColorIDList.find(color_key) == usedColorIDList.end()) {
//usedColorIDList[color_key] = true;
//printf("Color added to used list [%s] usedColorIDList = %d nextColorIDReuseList = %d!\n",color_key.c_str(),(int)usedColorIDList.size(),(int)nextColorIDReuseList.size());
}
else {
printf("Line ref: %d *WARNING* color [%s] ALREADY FOUND in history list!\n",__LINE__,color_key.c_str());
assign_color_using_loop(assign_to);
}
}
else {
assign_to[0] = nextColorID[0];
assign_to[1] = nextColorID[1];
assign_to[2] = nextColorID[2];
const int colorSpacing = 8;
if((int)(nextColorID[0] + colorSpacing) <= 255) {
nextColorID[0] += colorSpacing;
}
else {
nextColorID[0] = 1;
if((int)(nextColorID[1] + colorSpacing) <= 255) {
nextColorID[1] += colorSpacing;
}
else {
nextColorID[1] = 1;
if((int)(nextColorID[2] + colorSpacing) <= 255) {
nextColorID[2] += colorSpacing;
}
else {
printf("Color rolled over on 3rd level usedColorIDList = %d!\n",(int)usedColorIDList.size());
nextColorID[0] = 1;
nextColorID[1] = 1;
nextColorID[2] = 1;
// nextColorID[2] = 1;
// nextColorID[3]+=colorSpacing;
//
// if(nextColorID[3] > 255) {
// nextColorID[0] = 1;
// nextColorID[1] = 1;
// nextColorID[2] = 1;
// nextColorID[3] = 1;
// }
}
}
}
}
}
void BaseColorPickEntity::recycleUniqueColor() {
//MutexSafeWrapper safeMutex(&mutexNextColorID);
vector<unsigned char> reUseColor;
reUseColor.push_back(uniqueColorID[0]);
reUseColor.push_back(uniqueColorID[1]);
reUseColor.push_back(uniqueColorID[2]);
nextColorIDReuseList.push_back(reUseColor);
//printf("RECYCLE Color [%u.%u.%u] usedColorIDList = %d nextColorIDReuseList = %d!\n",reUseColor[0],reUseColor[1],reUseColor[2],(int)usedColorIDList.size(),(int)nextColorIDReuseList.size());
if(usedColorIDList.empty() == false) {
string color_key = getColorDescription();
if(usedColorIDList.find(color_key) != usedColorIDList.end()) {
usedColorIDList.erase(color_key);
//printf("REMOVING used Color [%s] usedColorIDList = %d nextColorIDReuseList = %d!\n",color_key.c_str(),(int)usedColorIDList.size(),(int)nextColorIDReuseList.size());
}
else {
printf("Line ref: %d *WARNING* color [%s] used count: %d NOT FOUND in history list!\n",__LINE__,color_key.c_str(),(int)usedColorIDList.size());
}
}
}
void BaseColorPickEntity::resetUniqueColors() {
//MutexSafeWrapper safeMutex(&mutexNextColorID);
BaseColorPickEntity::nextColorRGB = BaseColorPickEntity::k;
BaseColorPickEntity::nextColorID[0] = 1;
BaseColorPickEntity::nextColorID[1] = 1;
BaseColorPickEntity::nextColorID[2] = 1;
usedColorIDList.clear();
nextColorIDReuseList.clear();
}
void BaseColorPickEntity::init(int bufferSize) { void BaseColorPickEntity::init(int bufferSize) {
if(BaseColorPickEntity::pbo.get() == NULL) { if(BaseColorPickEntity::pbo.get() == NULL) {
BaseColorPickEntity::pbo.reset(new PixelBufferWrapper(2,bufferSize)); BaseColorPickEntity::pbo.reset(new PixelBufferWrapper(2,bufferSize));

View File

@ -33,6 +33,15 @@ using namespace Shared::PlatformCommon;
namespace Shared{ namespace Platform{ namespace Shared{ namespace Platform{
// Example values:
// DEFAULT_CHARSET (English) = 1
// GB2312_CHARSET (Chinese) = 134
#ifdef WIN32
DWORD PlatformContextGl::charSet = DEFAULT_CHARSET;
#else
int PlatformContextGl::charSet = 1;
#endif
// ====================================== // ======================================
// class PlatformContextGl // class PlatformContextGl
// ====================================== // ======================================

View File

@ -28,14 +28,6 @@ using namespace Shared::Util;
namespace Shared { namespace Platform { namespace Shared { namespace Platform {
// Example values:
// DEFAULT_CHARSET (English) = 1
// GB2312_CHARSET (Chinese) = 134
#ifdef WIN32
DWORD PlatformContextGl::charSet = DEFAULT_CHARSET;
#else
int PlatformContextGl::charSet = 1;
#endif
// ====================================== // ======================================
// Global Fcs // Global Fcs

View File

@ -0,0 +1,108 @@
// ==============================================================
// This file is part of MegaGlest Unit Tests (www.megaglest.org)
//
// Copyright (C) 2013 Mark Vejvoda
//
// 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 <cppunit/extensions/HelperMacros.h>
#include <memory>
#include "model.h"
#include <vector>
#include <algorithm>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
using namespace Shared::Graphics;
class TestBaseColorPickEntity : public BaseColorPickEntity {
public:
virtual string getUniquePickName() const {
return getColorDescription();
}
};
//
// Tests for font class
//
class ModelTest : public CppUnit::TestFixture {
// Register the suite of tests for this fixture
CPPUNIT_TEST_SUITE( ModelTest );
CPPUNIT_TEST( test_ColorPicking_loop );
CPPUNIT_TEST( test_ColorPicking_prime );
CPPUNIT_TEST_SUITE_END();
// End of Fixture registration
public:
void test_ColorPicking_loop() {
BaseColorPickEntity::setTrackColorUse(true);
BaseColorPickEntity::setUsingLoopMethod(true);
BaseColorPickEntity::resetUniqueColors();
TestBaseColorPickEntity colorPicker;
// This is the max color count this algorithm supports
const int MAX_SUPPORTED_COLORS_USING_THIS_METHOD = 32767;
for(unsigned int i = 0; i < MAX_SUPPORTED_COLORS_USING_THIS_METHOD; ++i) {
bool duplicate = colorPicker.get_next_assign_color(colorPicker.getUniqueColorID());
CPPUNIT_ASSERT_EQUAL( false,duplicate );
}
BaseColorPickEntity::resetUniqueColors();
TestBaseColorPickEntity colorPicker2;
// This is a test to prove when the algorithm fails
const int MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL = 32768;
for(unsigned int i = 0; i < MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL; ++i) {
bool duplicate = colorPicker2.get_next_assign_color(colorPicker2.getUniqueColorID());
CPPUNIT_ASSERT_EQUAL( (i+1 >= MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL),duplicate );
}
BaseColorPickEntity::resetUniqueColors();
BaseColorPickEntity::setTrackColorUse(false);
}
void test_ColorPicking_prime() {
BaseColorPickEntity::setTrackColorUse(true);
BaseColorPickEntity::setUsingLoopMethod(false);
BaseColorPickEntity::resetUniqueColors();
TestBaseColorPickEntity colorPicker;
// This is the max color count this algorithm supports
const int MAX_SUPPORTED_COLORS_USING_THIS_METHOD = 64005;
for(unsigned int i = 0; i < MAX_SUPPORTED_COLORS_USING_THIS_METHOD; ++i) {
bool duplicate = colorPicker.get_next_assign_color(colorPicker.getUniqueColorID());
CPPUNIT_ASSERT_EQUAL( false,duplicate );
}
BaseColorPickEntity::resetUniqueColors();
TestBaseColorPickEntity colorPicker2;
// This is a test to prove when the algorithm fails
const int MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL = 64006;
for(unsigned int i = 0; i < MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL; ++i) {
bool duplicate = colorPicker2.get_next_assign_color(colorPicker2.getUniqueColorID());
CPPUNIT_ASSERT_EQUAL( (i+1 >= MAX_SUPPORTED_COLORS_USING_THIS_METHOD_FAIL),duplicate );
}
BaseColorPickEntity::resetUniqueColors();
BaseColorPickEntity::setTrackColorUse(false);
}
};
// Test Suite Registrations
CPPUNIT_TEST_SUITE_REGISTRATION( ModelTest );
//