diff --git a/JGE/include/JNetwork.h b/JGE/include/JNetwork.h index 71ed10334..0412bb9be 100644 --- a/JGE/include/JNetwork.h +++ b/JGE/include/JNetwork.h @@ -17,6 +17,8 @@ typedef void(*processCmd)(void*, stringstream&, stringstream&); class JNetwork { private: +private: + boost::thread *mpWorkerThread; struct CommandStruc{ void* object; string command; @@ -31,13 +33,10 @@ private: stringstream received; stringstream toSend; static map sCommandMap; - static JNetwork* mInstance; public: JNetwork(); ~JNetwork(); - static JNetwork* GetInstance(); - static void Destroy(); void Update(); int connect(string serverIP = ""); @@ -49,9 +48,6 @@ public: #endif bool sendCommand(const string& command, const string& payload = "", const string& suffix = "Request"); static void registerCommand(string command, void* object, processCmd processRequest, processCmd processResponse); - -private: - boost::thread *mpWorkerThread; }; #endif diff --git a/JGE/include/JSocket.h b/JGE/include/JSocket.h index eeb52e493..ecc81eed9 100644 --- a/JGE/include/JSocket.h +++ b/JGE/include/JSocket.h @@ -32,6 +32,8 @@ public: void Disconnect(); private: + // socket state + SOCKET_STATE state; // socket creation when server accepts a connection JSocket(int fd); // convert the socket into non-blocking state @@ -42,8 +44,6 @@ private: #elif LINUX int mfd; #endif - // socket state - SOCKET_STATE state; }; #endif diff --git a/JGE/src/JNetwork.cpp b/JGE/src/JNetwork.cpp index 9d10fe8e9..4d0cc72dc 100644 --- a/JGE/src/JNetwork.cpp +++ b/JGE/src/JNetwork.cpp @@ -34,7 +34,6 @@ #include "../include/JSocket.h" map JNetwork::sCommandMap; -JNetwork* JNetwork::mInstance = NULL; bool JNetwork::isConnected(){ if (connected_to_ap !=1 || !socket) return false; @@ -63,21 +62,6 @@ JNetwork::~JNetwork() delete socket; } -JNetwork* JNetwork::GetInstance() -{ - if (mInstance == NULL) mInstance = new JNetwork(); - return mInstance; -} - -void JNetwork::Destroy() -{ - if (mInstance) - { - delete mInstance; - mInstance = NULL; - } -} - bool JNetwork::sendCommand(const string& xString, const string& payload, const string& suffix) { string aString; diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 7a91bfb50..d49e67bed 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -40,6 +40,7 @@ class GameObserver{ list loadingList; list::iterator loadingite; RandomGenerator randomGenerator; + unsigned int mSeed; WResourceManager* mResourceManager; JGE* mJGE; DeckManager* mDeckManager; @@ -143,7 +144,7 @@ class GameObserver{ logAction(players[playerId], s); }; void logAction(MTGCardInstance* card, MTGGameZone* zone, size_t index, int result); - bool load(const string& s, bool undo = false + bool load(const string& s, bool undo = false, bool swapPlayers = false #ifdef TESTSUITE , TestSuiteGame* testgame = 0 #endif diff --git a/projects/mtg/include/GameStateDuel.h b/projects/mtg/include/GameStateDuel.h index ded0d5ea9..d98a16c1f 100644 --- a/projects/mtg/include/GameStateDuel.h +++ b/projects/mtg/include/GameStateDuel.h @@ -31,7 +31,6 @@ private: Credits * credits; int mGamePhase; - Player * mCurrentPlayer; GameObserver * game; DeckMenu * deckmenu; DeckMenu * opponentMenu; diff --git a/projects/mtg/include/Rules.h b/projects/mtg/include/Rules.h index 5b2069bc9..b38dc6e54 100644 --- a/projects/mtg/include/Rules.h +++ b/projects/mtg/include/Rules.h @@ -73,7 +73,7 @@ public: void initPlayers(GameObserver *observer); bool canChooseDeck(); //True if the players get to select their decks, false if the decks are automatically generated by the mode void addExtraRules(GameObserver *observer); - void initGame(GameObserver* observer); + void initGame(GameObserver* observer, bool currentPlayerSet = false); //second part of the initialization, needs to happen after the first update call void postUpdateInit(GameObserver* observer); void cleanup(); diff --git a/projects/mtg/include/utils.h b/projects/mtg/include/utils.h index 88ff7c3e1..3347202e3 100644 --- a/projects/mtg/include/utils.h +++ b/projects/mtg/include/utils.h @@ -73,11 +73,12 @@ protected: list usedRandomValues; bool log; public: - RandomGenerator(bool doLog = false) : log(doLog) {}; + RandomGenerator(unsigned int seed = -1, bool doLog = false) : log(doLog) { if(seed != -1) srand(seed);}; void loadRandValues(string s); ostream& saveUsedRandValues(ostream& out) const; ostream& saveLoadedRandValues(ostream& out); int random(); + void setSeed(unsigned int seed) { srand(seed); }; template void random_shuffle(Iter first, Iter last) { ptrdiff_t i, n; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 0118a592a..df94687ca 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -79,7 +79,7 @@ GameObserver::~GameObserver() } GameObserver::GameObserver(WResourceManager *output, JGE* input) - : randomGenerator(true), mResourceManager(output), mJGE(input) + : mSeed((unsigned int)time(0)), randomGenerator(mSeed, true), mResourceManager(output), mJGE(input) { ExtraRules = new MTGCardInstance[2](); @@ -1491,6 +1491,9 @@ ostream& operator<<(ostream& out, const GameObserver& g) } else { + out << "seed:"; + out << g.mSeed; + out << endl; out << "rvalues:"; out << g.randomGenerator.saveUsedRandValues(out); out << endl; @@ -1531,13 +1534,14 @@ bool GameObserver::parseLine(const string& s) return false; } -bool GameObserver::load(const string& ss, bool undo +bool GameObserver::load(const string& ss, bool undo, bool swapPlayers #ifdef TESTSUITE , TestSuiteGame* testgame #endif ) { - int state = -1; + bool currentPlayerSet = false; + int state = -1; string s; stringstream stream(ss); @@ -1555,7 +1559,8 @@ bool GameObserver::load(const string& ss, bool undo std::transform(s.begin(), s.end(), s.begin(), ::tolower); if (s.find("seed ") == 0) { -// seed = atoi(s.substr(5).c_str()); + mSeed = atoi(s.substr(5).c_str()); + randomGenerator.setSeed(mSeed); continue; } if (s.find("rvalues:") == 0) @@ -1576,7 +1581,7 @@ bool GameObserver::load(const string& ss, bool undo } else { - parseLine(s); + currentPlayerSet = parseLine(s); } break; case 1: @@ -1624,7 +1629,14 @@ bool GameObserver::load(const string& ss, bool undo case 3: if (s.compare("[end]") == 0) { - turn = 0; + if(swapPlayers) { + std::swap(players[0], players[1]); + currentPlayerId = (currentPlayerId + 1) % players.size(); + currentPlayer = players[currentPlayerId]; + currentActionPlayer = currentPlayer; + } + + turn = 0; mLayers = NEW DuelLayers(); mLayers->init(this); currentPlayer = players[currentPlayerId]; @@ -1634,7 +1646,7 @@ bool GameObserver::load(const string& ss, bool undo // take a snapshot before processing the actions resetStartupGame(); - mRules->initGame(this); + mRules->initGame(this, currentPlayerSet); phaseRing->goToPhase(0, currentPlayer, false); phaseRing->goToPhase(mCurrentGamePhase, currentPlayer); @@ -1904,17 +1916,6 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b loadPlayer(playerId, NEW HumanPlayer(this, deckFile, deckFileSmall, premadeDeck)); } } -#ifdef NETWORK_SUPPORT - else if(playerType == PLAYER_TYPE_REMOTE) - { - //Player 0 is the human player - ProxyPlayer* mProxy; - mProxy = NEW ProxyPlayer(players[0], JNetwork::GetInstance()); - - //Player 1 is the remote player - loadPlayer(playerId, NEW RemotePlayer(this, JNetwork::GetInstance())); - } -#endif //NETWORK_SUPPORT else { //AI Player, chooses deck AIPlayerFactory playerCreator; @@ -2014,9 +2015,8 @@ void NetworkGameObserver::synchronize() void NetworkGameObserver::synchronize(void*pxThis, stringstream& in, stringstream& out) { NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - pThis->load(in.str()); // now, we need to swap players as player1 for host is player 2 for guest - std::swap(pThis->players[0], pThis->players[1]); + pThis->load(in.str(), false, true); } void NetworkGameObserver::sendAction(void*pxThis, stringstream& in, stringstream& out) diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 31b41cf7e..c5b2ade4e 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -843,7 +843,7 @@ void GameStateMenu::ButtonPressed(int controllerId, int controlId) { if(!mParent->mpNetwork) { - mParent->mpNetwork = JNetwork::GetInstance(); + mParent->mpNetwork = new JNetwork(); } mParent->mpNetwork->connect(); subMenuController->Close(); @@ -854,7 +854,7 @@ void GameStateMenu::ButtonPressed(int controllerId, int controlId) { if(!mParent->mpNetwork) { - mParent->mpNetwork = JNetwork::GetInstance(); + mParent->mpNetwork = new JNetwork(); } // FIXME needs to be able to specify the server ip mParent->mpNetwork->connect("127.0.0.1"); @@ -882,8 +882,7 @@ void GameStateMenu::ButtonPressed(int controllerId, int controlId) subMenuController->Close(); } #ifdef NETWORK_SUPPORT - JNetwork::Destroy(); - mParent->mpNetwork=0; + SAFE_DELETE(mParent->mpNetwork); #endif //NETWORK_SUPPORT currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_SUBMENU_CLOSING; break; diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index b22317060..42bc96299 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -360,7 +360,7 @@ void Rules::initPlayers(GameObserver *g) } } -void Rules::initGame(GameObserver *g) +void Rules::initGame(GameObserver *g, bool currentPlayerSet) { DebugTrace("RULES Init Game\n"); @@ -372,9 +372,12 @@ void Rules::initGame(GameObserver *g) if(OptionWhosFirst::WHO_O == options[Options::FIRSTPLAYER].number) initState.player = 1; } - g->currentPlayer = g->players[initState.player]; - g->currentActionPlayer = g->currentPlayer; - g->currentPlayerId = initState.player; + if(!currentPlayerSet) + { + g->currentPlayerId = initState.player; + } + g->currentPlayer = g->players[g->currentPlayerId]; + g->currentActionPlayer = g->currentPlayer; g->phaseRing->goToPhase(0, g->currentPlayer, false); g->phaseRing->goToPhase(initState.phase, g->currentPlayer); g->setCurrentGamePhase(initState.phase);