- attempt to use streflop for random number generation to fix AI synch issues on corss platform

This commit is contained in:
Mark Vejvoda
2010-06-01 00:32:24 +00:00
parent 22439457b4
commit b8a05be21e
3 changed files with 63 additions and 13 deletions

View File

@@ -73,8 +73,10 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b
vector<string> teamItems, controlItems, results; vector<string> teamItems, controlItems, results;
//create //create
buttonReturn.init(350, 180, 125); buttonReturn.init(300, 180, 125);
buttonPlayNow.init(525, 180, 125); buttonRestoreLastSettings.init(440, 180, 125);
buttonPlayNow.init(580, 180, 125);
//map listBox //map listBox
// put them all in a set, to weed out duplicates (gbm & mgm with same name) // put them all in a set, to weed out duplicates (gbm & mgm with same name)
@@ -162,6 +164,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b
//texts //texts
buttonReturn.setText(lang.get("Return")); buttonReturn.setText(lang.get("Return"));
buttonPlayNow.setText(lang.get("PlayNow")); buttonPlayNow.setText(lang.get("PlayNow"));
buttonRestoreLastSettings.setText(lang.get("ReloadLastGameSettings"));
controlItems.push_back(lang.get("Closed")); controlItems.push_back(lang.get("Closed"));
controlItems.push_back(lang.get("CpuEasy")); controlItems.push_back(lang.get("CpuEasy"));
@@ -238,13 +241,8 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b
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__);
// Ensure we have set the gamesettings at least once // Ensure we have set the gamesettings at least once
GameSettings gameSettings = loadGameSettingsFromFile("lastCustomGamSettings.mgg"); GameSettings gameSettings;
if(gameSettings.getMap() == "") {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
loadGameSettings(&gameSettings); loadGameSettings(&gameSettings);
}
ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface(); ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface();
serverInterface->setGameSettings(&gameSettings,false); serverInterface->setGameSettings(&gameSettings,false);
@@ -305,7 +303,6 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
mainMessageBox.setEnabled(false); mainMessageBox.setEnabled(false);
} }
} }
saveGameSettingsToFile("lastCustomGamSettings.mgg");
} }
else if(buttonReturn.mouseClick(x,y)){ else if(buttonReturn.mouseClick(x,y)){
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__);
@@ -322,7 +319,6 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
} }
*/ */
saveGameSettingsToFile("lastCustomGamSettings.mgg");
returnToParentMenu(); returnToParentMenu();
} }
else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) { else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) {
@@ -374,6 +370,26 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){
} }
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__);
} }
else if(buttonRestoreLastSettings.mouseClick(x,y) && buttonRestoreLastSettings.getEnabled()) {
// Ensure we have set the gamesettings at least once
GameSettings gameSettings = loadGameSettingsFromFile("lastCustomGamSettings.mgg");
if(gameSettings.getMap() == "") {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__);
loadGameSettings(&gameSettings);
}
ServerInterface* serverInterface= NetworkManager::getInstance().getServerInterface();
serverInterface->setGameSettings(&gameSettings,false);
needToRepublishToMasterserver = true;
if(hasNetworkGameSettings() == true)
{
needToSetChangedGameSettings = true;
lastSetChangedGameSettings = time(NULL);
}
}
else if(listBoxMap.mouseClick(x, y)){ else if(listBoxMap.mouseClick(x, y)){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", mapFiles[listBoxMap.getSelectedItemIndex()].c_str()); SystemFlags::OutputDebug(SystemFlags::debugSystem,"%s\n", mapFiles[listBoxMap.getSelectedItemIndex()].c_str());
@@ -511,6 +527,7 @@ void MenuStateCustomGame::mouseMove(int x, int y, const MouseState *ms){
} }
buttonReturn.mouseMove(x, y); buttonReturn.mouseMove(x, y);
buttonPlayNow.mouseMove(x, y); buttonPlayNow.mouseMove(x, y);
buttonRestoreLastSettings.mouseMove(x, y);
for(int i=0; i<GameConstants::maxPlayers; ++i){ for(int i=0; i<GameConstants::maxPlayers; ++i){
listBoxControls[i].mouseMove(x, y); listBoxControls[i].mouseMove(x, y);
@@ -538,6 +555,7 @@ void MenuStateCustomGame::render(){
int i; int i;
renderer.renderButton(&buttonReturn); renderer.renderButton(&buttonReturn);
renderer.renderButton(&buttonPlayNow); renderer.renderButton(&buttonPlayNow);
renderer.renderButton(&buttonRestoreLastSettings);
for(i=0; i<GameConstants::maxPlayers; ++i){ for(i=0; i<GameConstants::maxPlayers; ++i){
renderer.renderLabel(&labelPlayers[i]); renderer.renderLabel(&labelPlayers[i]);

View File

@@ -25,6 +25,7 @@ class MenuStateCustomGame : public MenuState, public SimpleTaskCallbackInterface
private: private:
GraphicButton buttonReturn; GraphicButton buttonReturn;
GraphicButton buttonPlayNow; GraphicButton buttonPlayNow;
GraphicButton buttonRestoreLastSettings;
GraphicLabel labelControl; GraphicLabel labelControl;
GraphicLabel labelFaction; GraphicLabel labelFaction;
GraphicLabel labelTeam; GraphicLabel labelTeam;

View File

@@ -1,6 +1,6 @@
#include "randomgen.h" #include "randomgen.h"
#include <cassert> #include <cassert>
#include "util.h"
#include "leak_dumper.h" #include "leak_dumper.h"
namespace Shared { namespace Util { namespace Shared { namespace Util {
@@ -15,30 +15,61 @@ const int RandomGen::b= 150889;
RandomGen::RandomGen(){ RandomGen::RandomGen(){
lastNumber= 0; lastNumber= 0;
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] lastNumber = %d\n",__FILE__,__FUNCTION__,__LINE__,lastNumber);
} }
void RandomGen::init(int seed){ void RandomGen::init(int seed){
#ifdef STREFLOP_H
lastNumber = math::RandomInit(seed); // streflop
#else
lastNumber= seed % m; lastNumber= seed % m;
#endif
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] seed = %d, lastNumber = %d\n",__FILE__,__FUNCTION__,__LINE__,seed,lastNumber);
} }
int RandomGen::rand() { int RandomGen::rand() {
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] lastNumber = %d\n",__FILE__,__FUNCTION__,__LINE__,lastNumber);
lastNumber= (a*lastNumber + b) % m; lastNumber= (a*lastNumber + b) % m;
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] lastNumber = %d\n",__FILE__,__FUNCTION__,__LINE__,lastNumber);
return lastNumber; return lastNumber;
} }
int RandomGen::randRange(int min, int max){ int RandomGen::randRange(int min, int max){
assert(min<=max); assert(min<=max);
#ifdef STREFLOP_H
int res = math::Random<true, false, float>(min, max); // streflop
#else
int diff= max-min; int diff= max-min;
int res= min + static_cast<int>(static_cast<float>(diff+1)*RandomGen::rand() / m); int res= min + static_cast<int>(static_cast<float>(diff+1)*RandomGen::rand() / m);
#endif
assert(res>=min && res<=max); assert(res>=min && res<=max);
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] min = %d, max = %d, res = %d\n",__FILE__,__FUNCTION__,__LINE__,min,max,res);
return res; return res;
} }
float RandomGen::randRange(float min, float max){ float RandomGen::randRange(float min, float max){
assert(min<=max); assert(min<=max);
#ifdef STREFLOP_H
float res = math::Random<true, false, float>(min, max); // streflop
#else
float rand01= static_cast<float>(RandomGen::rand())/(m-1); float rand01= static_cast<float>(RandomGen::rand())/(m-1);
float res= min+(max-min)*rand01; float res= min+(max-min)*rand01;
#endif
assert(res>=min && res<=max); assert(res>=min && res<=max);
//SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] min = %f, max = %f, res = %f\n",__FILE__,__FUNCTION__,__LINE__,min,max,res);
return res; return res;
} }