void ReqLogin::OnSuccess() { // Check for session ID or login failure TheVe1ReqManager::Instance()->SetLoggedIn(false); // Format of XML: // <session/> <- Child(1) PXml p = m_xml.getChildNode(1); if (SafeStrCmp(p.getName(), "session")) { #ifdef XML_DEBUG std::cout << "found session element\n"; #endif std::string sessionId = p.getText(); std::string playername; int objId = -1; // object ID for local player // Get player name and object ID for local player p = m_xml.getChildNode(2); if (SafeStrCmp(p.getName(), "playername")) { playername = p.getText(); std::cout << "**Got player name! \"" << playername << "\"\n"; } else { // Got session ID but no player name, WTF ? std::cout << "Got session ID but no player name, WTF??\n"; } p = m_xml.getChildNode(3); if (SafeStrCmp(p.getName(), "objid")) { objId = ToInt(p.getText()); std::cout << "**Got local player object ID: " << objId << "\n"; } else { // Got session ID but we don't know the object ID for the local player. WTF ? std::cout << "Got session ID but we don't know the object ID for the local player. WTF?\n"; } p = m_xml.getChildNode(4); if (SafeStrCmp(p.getName(), "loc")) { int loc = ToInt(p.getText()); // TODO Use ResetLocalPlayer() to set start pos/loc ????? TheGSStartGame::Instance()->SetStartLoc(loc); std::cout << "Got start location: " << loc << "\n"; } else { // Reset here to well known start location. ResetLocalPlayer(); std::cout << "No start location.\n"; } std::cout << "Got session ID! " << sessionId << "\n"; TheVe1ReqManager::Instance()->SetSessionId(sessionId); TheVe1ReqManager::Instance()->SetLoggedIn(true); // Check if we are set up std::string playerInfoFilename = playername + ".txt"; // TODO Sanitise the filename ThePlayerInfoManager::Instance()->SetCurrentPlayer(playerInfoFilename); ThePlayerInfoManager::Instance()->Save(); PlayerInfo* pi = ThePlayerInfoManager::Instance()->GetPI(); pi->PISetInt(PI_KEY("player obj id"), objId); pi->PISetString(PI_KEY("playername"), playername); pi->PISetString(PI_KEY("email"), m_email); pi->Save(); // Set options for this player TheGSOptions::Instance()->LoadSettingsFromPI(pi); // TODO Do we need to set this via ObjectUpdater too, so it gets sent to all clients ? // Set ID of this player object as the local player ID SetLocalPlayerId(objId); Assert(pi); // Play happy logged in sound TheSoundManager::Instance()->PlayWav("Sound/button112.wav"); if (GetGameMode() == AMJU_MODE_EDIT) { TheGame::Instance()->SetCurrentState(TheGSStartGame::Instance()); } else { // Handle research info: session, mode, etc. ChooseMode(); } } else { std::cout << "Didn't get sesssion ID from server :-(\n"; TheGSLoginWaiting::Instance()->SetErrorString("Didn't get session ID from server"); } }