Fixed start with no players (including aborting the create user screen),

added 'lastWasOnline' flag to enable saving of a login token even
when the account is used offline in between.
This commit is contained in:
hiker 2014-05-17 11:43:05 +10:00
parent cf297c67b4
commit 1946df97be
9 changed files with 79 additions and 37 deletions

View File

@ -255,8 +255,8 @@ void PlayerManager::save()
players_file << L"<?xml version=\"1.0\"?>\n";
players_file << L"<players version=\"1\" >\n";
if(m_current_player && UserConfigParams::m_remember_user)
{
if(m_current_player && UserConfigParams::m_remember_user)
{
players_file << L" <current player=\""
<< m_current_player->getName() << L"\"/>\n";
}

View File

@ -47,6 +47,7 @@ PlayerProfile::PlayerProfile(const core::stringw& name, bool is_guest)
m_saved_token = "";
m_saved_user_id = 0;
m_last_online_name = "";
m_last_was_online = false;
initRemainingData();
} // PlayerProfile
@ -71,6 +72,7 @@ PlayerProfile::PlayerProfile(const XMLNode* node)
m_saved_token = "";
m_saved_user_id = 0;
m_last_online_name = "";
m_last_was_online = false;
m_story_mode_status = NULL;
m_achievements_status = NULL;
@ -82,6 +84,7 @@ PlayerProfile::PlayerProfile(const XMLNode* node)
node->get("saved-user", &m_saved_user_id );
node->get("saved-token", &m_saved_token );
node->get("last-online-name", &m_last_online_name);
node->get("last-was-online", &m_last_was_online );
#ifdef DEBUG
m_magic_number = 0xABCD1234;
@ -138,7 +141,8 @@ void PlayerProfile::save(UTFWriter &out)
out << L" saved-user=\"" << m_saved_user_id
<< L"\" saved-token=\"" << m_saved_token << L"\"\n";
out << L" last-online-name=\"" << m_last_online_name<< L"\">\n";
out << L" last-online-name=\"" << m_last_online_name
<< L"\" last-was-online=\"" << m_last_was_online<< L"\">\n";
{
if(m_story_mode_status)
m_story_mode_status->save(out);

View File

@ -95,6 +95,9 @@ private:
/** The online user name used last (empty if not used online). */
core::stringw m_last_online_name;
/** True if the last time this player was used as online. */
bool m_last_was_online;
/** The complete challenge state. */
StoryModeStatus *m_story_mode_status;
@ -256,6 +259,13 @@ public:
return m_saved_token;
} // getSavedToken
// ------------------------------------------------------------------------
/** Returns if the last time this player was used it was used online or
* offline. */
bool wasOnlineLastTime() const { return m_last_was_online; }
// ------------------------------------------------------------------------
/** Sets if this player was logged in last time it was used. */
void setWasOnlineLastTime(bool b) { m_last_was_online = b; }
// ------------------------------------------------------------------------
}; // class PlayerProfile
#endif

View File

@ -189,6 +189,7 @@
#include "replay/replay_play.hpp"
#include "replay/replay_recorder.hpp"
#include "states_screens/main_menu_screen.hpp"
#include "states_screens/register_screen.hpp"
#include "states_screens/state_manager.hpp"
#include "states_screens/user_screen.hpp"
#include "states_screens/dialogs/message_dialog.hpp"
@ -1293,7 +1294,14 @@ int main(int argc, char *argv[] )
if(PlayerManager::getCurrentPlayer())
StateManager::get()->pushScreen(MainMenuScreen::getInstance());
else
{
StateManager::get()->pushScreen(UserScreen::getInstance());
// If there is no player, push the RegisterScreen on top of
// the login screen. This way on first start players are
// forced to create a player.
if(PlayerManager::get()->getNumPlayers()==0)
StateManager::get()->pushScreen(RegisterScreen::getInstance());
}
#ifdef ENABLE_WIIUSE
// Show a dialog to allow connection of wiimotes. */
if(WiimoteManager::isEnabled())

View File

@ -94,7 +94,7 @@ namespace Online
void OnlinePlayerProfile::requestSavedSession()
{
SignInRequest * request = NULL;
if (m_online_state == OS_SIGNED_OUT && hasSavedSession() )
if (m_online_state == OS_SIGNED_OUT && hasSavedSession())
{
request = new SignInRequest(true);
request->setServerURL("client-user.php");

View File

@ -97,7 +97,7 @@ void RegisterScreen::makeEntryFieldsVisible(bool online)
getWidget<LabelWidget >("label_email")->setVisible(online);
getWidget<TextBoxWidget>("email_confirm")->setVisible(online);
getWidget<LabelWidget >("label_email_confirm")->setVisible(online);
} // makeEntryFieldvisible
} // makeEntryFieldsVisible
// -----------------------------------------------------------------------------
/** If necessary creates the local user.
@ -268,7 +268,12 @@ void RegisterScreen::eventCallback(Widget* widget, const std::string& name,
doRegister();
}
else if(button=="cancel")
StateManager::get()->escapePressed();
{
// We poop this menu, onEscapePress will handle the special case
// of e.g. a fresh start of stk that is aborted.
StateManager::get()->popMenu();
onEscapePressed();
}
}
else if (name == "back")
{
@ -278,3 +283,18 @@ void RegisterScreen::eventCallback(Widget* widget, const std::string& name,
} // eventCallback
// -----------------------------------------------------------------------------
bool RegisterScreen::onEscapePressed()
{
if (PlayerManager::get()->getNumPlayers() == 0)
{
// Must be first time start, and player cancelled player creation
// so quit stk. At this stage there are two menus on the stack:
// 1) The UserScreen, 2) RegisterStreen
// Popping them both will trigger STK to close.
StateManager::get()->popMenu();
return true;
}
StateManager::get()->escapePressed();
return true;
} // onEscapePressed

View File

@ -56,6 +56,7 @@ public:
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void loadedFromFile() OVERRIDE {};
virtual void onUpdate(float dt) OVERRIDE;
virtual bool onEscapePressed() OVERRIDE;
void acceptTerms();
/** \brief implement callback from parent class GUIEngine::Screen */

View File

@ -103,11 +103,13 @@ void BaseUserScreen::init()
{
m_players->setSelection(current_player_index, PLAYER_ID_GAME_MASTER,
/*focus*/ true);
const stringw &online_name = PlayerManager::getCurrentPlayer()
->getLastOnlineName();
m_online_cb->setState(online_name.size()>0);
PlayerProfile *player = PlayerManager::getCurrentPlayer();
const stringw &online_name = player->getLastOnlineName();
m_username_tb->setText(online_name);
makeEntryFieldsVisible(online_name.size()>0);
// Select 'online
m_online_cb->setState(player->wasOnlineLastTime() ||
player->isLoggedIn() );
makeEntryFieldsVisible();
}
else // no current player found
{
@ -154,16 +156,17 @@ void BaseUserScreen::selectUser(int index)
// Last game was not online, so make the offline settings the default
// (i.e. unckeck online checkbox, and make entry fields invisible).
if (profile->getLastOnlineName() == "")
if (!profile->wasOnlineLastTime() || profile->getLastOnlineName() == "")
{
m_online_cb->setState(false);
makeEntryFieldsVisible(false);
makeEntryFieldsVisible();
return;
}
// Now last use was with online --> Display the saved data
m_online_cb->setState(true);
makeEntryFieldsVisible(true);
makeEntryFieldsVisible();
m_username_tb->setText(profile->getLastOnlineName());
// And make the password invisible if the session is saved (i.e
@ -181,26 +184,19 @@ void BaseUserScreen::selectUser(int index)
* \param online Online state, which dicates if the entry fields are
* visible (true) or not.
*/
void BaseUserScreen::makeEntryFieldsVisible(bool online)
void BaseUserScreen::makeEntryFieldsVisible()
{
#ifdef GUEST_ACCOUNTS_ENABLED
getWidget<LabelWidget>("label_guest")->setVisible(online);
getWidget<CheckBoxWidget>("guest")->setVisible(online);
#endif
bool online = m_online_cb->getState();
getWidget<LabelWidget>("label_username")->setVisible(online);
m_username_tb->setVisible(online);
getWidget<LabelWidget>("label_password")->setVisible(online);
m_password_tb->setVisible(online);
} // makeEntryFieldsVisible
// ----------------------------------------------------------------------------
/** Make sure that a current player is defined when escape is pressed.
*/
bool BaseUserScreen::onEscapePressed()
{
return Screen::onEscapePressed();
} // onEscapePressed
// ----------------------------------------------------------------------------
/** Called when the user selects anything on the screen.
*/
@ -237,7 +233,7 @@ void BaseUserScreen::eventCallback(Widget* widget,
sfx_manager->quickSound( "anvil" );
m_online_cb->setState(false);
}
makeEntryFieldsVisible(m_online_cb->getState());
makeEntryFieldsVisible();
}
else if (name == "options")
{
@ -253,10 +249,8 @@ void BaseUserScreen::eventCallback(Widget* widget,
}
else if (button == "cancel")
{
PlayerProfile *cp = PlayerManager::getCurrentPlayer();
if(cp && cp->isLoggedIn())
cp->requestSignOut();
StateManager::get()->popMenu();
onEscapePressed();
}
else if (button == "rename")
{
@ -296,27 +290,30 @@ void BaseUserScreen::login()
// problem will activate the widget again.
m_options_widget->setDeactivated();
PlayerProfile *profile = getSelectedPlayer();
PlayerManager::get()->setCurrentPlayer(profile);
assert(profile);
PlayerProfile *player = getSelectedPlayer();
PlayerManager::get()->setCurrentPlayer(player);
assert(player);
// If no online login requested, go straight to the main menu screen.
if(!m_online_cb->getState())
{
if(profile->isLoggedIn())
if(player->isLoggedIn())
{
// The player is logged in, but online is now disabled,
// so log the player out. There is no error handling of
// a failed logout request
profile->requestSignOut();
player->requestSignOut();
}
player->setWasOnlineLastTime(false);
closeScreen();
return;
}
// Player wants to be online, and is already online - nothing to do
if(profile->isLoggedIn())
if(player->isLoggedIn())
{
player->setWasOnlineLastTime(true);
closeScreen();
return;
}
@ -325,10 +322,10 @@ void BaseUserScreen::login()
// This implies that this screen will wait till the server responds, so
// that error messages ('invalid password') can be shown, and the user
// can decide what to do about them.
if (profile->hasSavedSession())
if (player->hasSavedSession())
{
// Online login with saved token
profile->requestSavedSession();
player->requestSavedSession();
}
else
{
@ -340,7 +337,7 @@ void BaseUserScreen::login()
m_options_widget->setActivated();
return;
}
profile->requestSignIn(m_username_tb->getText(),
player->requestSignIn(m_username_tb->getText(),
m_password_tb->getText());
} // !hasSavedSession
@ -362,6 +359,8 @@ void BaseUserScreen::onUpdate(float dt)
*/
void BaseUserScreen::loginSuccessful()
{
PlayerProfile *player = getSelectedPlayer();
player->setWasOnlineLastTime(true);
m_options_widget->setActivated();
// Clean any error message still shown
m_info_widget->setText("", true);
@ -448,6 +447,7 @@ void BaseUserScreen::unloaded()
*/
void BaseUserScreen::onDialogClose()
{
return;
// To allow players to exit the game without creating a player, we count
// how often this function was called. The first time is after the
// internet allowed dialog, the 2nd time

View File

@ -70,7 +70,7 @@ private:
GUIEngine::DynamicRibbonWidget* m_players;
void selectUser(int index);
void makeEntryFieldsVisible(bool online);
void makeEntryFieldsVisible();
void login();
void closeScreen();
void deletePlayer();
@ -95,7 +95,6 @@ public:
/** \brief implement optional callback from parent class GUIEngine::Screen */
virtual void unloaded();
virtual bool onEscapePressed();
void loginSuccessful();
void loginError(const irr::core::stringw &error_message);