1
0
forked from 0ad/0ad

New lobby connect/registration page. Not perfect but fixes most of the outstanding issues. Refs #2312

This was SVN commit r15069.
This commit is contained in:
JoshuaJB 2014-04-30 00:46:57 +00:00
parent 15e9ffa21b
commit dfacf5358c
7 changed files with 220 additions and 103 deletions

View File

@ -141,15 +141,15 @@
<!-- title frame -->
<image texture = "global/modern/titlebar-middle.png"
real_texture_placement = "0 0 128 32"
size = "50%-72 0%-18 50%+72 15"
size = "50%-108 0%-18 50%+108 15"
/>
<image texture = "global/modern/titlebar-left.png"
real_texture_placement = "0 0 32 32"
size = "50%-98 0%-18 50%-66 15"
size = "50%-134 0%-18 50%-102 15"
/>
<image texture = "global/modern/titlebar-left.png"
real_texture_placement = "32 32 0 0"
size = "50%+66 0%-18 50%+98 15"
size = "50%+102 0%-18 50%+134 15"
/>
</sprite>
@ -433,35 +433,35 @@
/>
</sprite>
<sprite name="ModernTickOn">
<image texture="global/modern/tick-on.png"
<image texture="global/modern/tick-on.png"
real_texture_placement="0 0 27 27"
size="0 0 22 22"
/>
</sprite>
<sprite name="ModernTickOff">
<image texture="global/modern/tick-off.png"
<image texture="global/modern/tick-off.png"
real_texture_placement="0 0 27 27"
size="0 0 22 22"
/>
</sprite>
<sprite name="ModernTickDisabled">
<image texture="global/modern/tick-disabled.png"
<image texture="global/modern/tick-disabled.png"
real_texture_placement="0 0 27 27"
size="0 0 22 22"
/>
</sprite>
<sprite name="ModernGear">
<image texture="global/modern/gear.png"
<image texture="global/modern/gear.png"
texture_size="0 0 24 24"
/>
</sprite>
<sprite name="ModernGearHover">
<image texture="global/modern/gear-hover.png"
<image texture="global/modern/gear-hover.png"
texture_size="0 0 24 24"
/>
</sprite>
<sprite name="ModernGearPressed">
<image texture="global/modern/gear-press.png"
<image texture="global/modern/gear-press.png"
texture_size="0 0 24 24"
/>
</sprite>

View File

@ -1,10 +1,15 @@
var g_LobbyIsConnecting = false;
var g_EncrytedPassword = "";
var g_PasswordInputIsHidden = false;
var g_TermsOfServiceRead = false;
var g_TermsOfUseRead = false;
var g_hasSystemMessage = false;
function init()
{
g_EncrytedPassword = Engine.ConfigDB_GetValue("user", "lobby.password");
if (Engine.ConfigDB_GetValue("user", "lobby.login") && g_EncrytedPassword)
switchPage("connect");
}
function lobbyStop()
@ -18,7 +23,7 @@ function lobbyStop()
Engine.StopXmppClient();
}
function lobbyStart()
function lobbyStartConnect()
{
if (g_LobbyIsConnecting)
return;
@ -44,27 +49,16 @@ function lobbyStart()
function lobbyStartRegister()
{
if (g_LobbyIsConnecting != false)
if (g_LobbyIsConnecting)
return;
if (Engine.HasXmppClient())
Engine.StopXmppClient();
var account = Engine.GetGUIObjectByName("connectUsername").caption;
var password = Engine.GetGUIObjectByName("connectPassword").caption;
var passwordAgain = Engine.GetGUIObjectByName("registerPasswordAgain").caption;
var account = Engine.GetGUIObjectByName("registerUsername").caption;
var password = Engine.GetGUIObjectByName("registerPassword").caption;
var feedback = Engine.GetGUIObjectByName("feedback");
// Check the passwords match.
if (password != passwordAgain)
{
feedback.caption = translate("Passwords do not match");
Engine.GetGUIObjectByName("connectPassword").caption = "";
Engine.GetGUIObjectByName("registerPasswordAgain").caption = "";
switchRegister();
return;
}
feedback.caption = translate("Registering...");
g_EncrytedPassword = Engine.EncryptPassword(password, account);
Engine.StartRegisterXmppClient(account, g_EncrytedPassword);
@ -72,64 +66,94 @@ function lobbyStartRegister()
Engine.ConnectXmppClient();
}
function switchRegister()
function onTick()
{
if (Engine.GetGUIObjectByName("pageRegister").hidden)
var pageRegisterHidden = Engine.GetGUIObjectByName("pageRegister").hidden;
if (pageRegisterHidden)
{
lobbyStop();
Engine.GetGUIObjectByName("pageRegister").hidden = false;
Engine.GetGUIObjectByName("pageConnect").hidden = true;
Engine.GetGUIObjectByName("connect").enabled = false;
var username = Engine.GetGUIObjectByName("connectUsername").caption;
var password = Engine.GetGUIObjectByName("connectPassword").caption;
}
else
{
Engine.GetGUIObjectByName("pageRegister").hidden = true;
Engine.GetGUIObjectByName("pageConnect").hidden = false;
Engine.GetGUIObjectByName("connect").enabled = true;
var username = Engine.GetGUIObjectByName("registerUsername").caption;
var password = Engine.GetGUIObjectByName("registerPassword").caption;
}
}
function onTick()
{
//
var username = Engine.GetGUIObjectByName("connectUsername").caption;
var password = Engine.GetGUIObjectByName("connectPassword").caption;
var passwordAgain = Engine.GetGUIObjectByName("registerPasswordAgain").caption;
var agreeTerms = Engine.GetGUIObjectByName("registerAgreeTerms");
var feedback = Engine.GetGUIObjectByName("feedback");
var pageRegisterHidden = Engine.GetGUIObjectByName("pageRegister").hidden;
var connectButton = Engine.GetGUIObjectByName("connect");
var registerButton = Engine.GetGUIObjectByName("register");
var sanitizedName = sanitizePlayerName(username, true, true)
// If there aren't a username and password entered, we can't start registration or connection.
if (!username || !password)
var continueButton = Engine.GetGUIObjectByName("continue");
var sanitizedName = sanitizePlayerName(username, true, true);
// Do not change feedback while connecting.
if (g_LobbyIsConnecting) {}
// Do not show feedback on the welcome screen.
else if (!Engine.GetGUIObjectByName("pageWelcome").hidden)
{
connectButton.enabled = false;
registerButton.enabled = false;
if (!username && !password)
feedback.caption = translate("Please enter existing login or desired registration credentials.");
feedback.caption = "";
}
// Check they are using a valid account name.
// Check that they entered a username.
else if (!username)
{
continueButton.enabled = false;
feedback.caption = translate("Please enter your username");
}
// Check that they are using a valid username.
else if (username != sanitizedName)
{
feedback.caption = translate("Usernames can't contain [, ], unicode, whitespace, or commas.");
connectButton.enabled = false;
registerButton.enabled = false;
continueButton.enabled = false;
feedback.caption = translate("Usernames can't contain [, ], unicode, whitespace, or commas");
}
// Allow them to connect/begin registation if there aren't any problems.
// Check that they entered a password.
else if (!password)
{
continueButton.enabled = false;
feedback.caption = translate("Please enter your password");
}
// Allow them to connect if tests pass up to this point.
else if (pageRegisterHidden)
{
// TODO Do this without comparing the caption
if (feedback.caption == translate("Usernames can't contain [, ], unicode, whitespace, or commas.") ||
feedback.caption == translate("Please enter existing login or desired registration credentials."))
if (!g_hasSystemMessage)
feedback.caption = "";
connectButton.enabled = true;
registerButton.enabled = true;
continueButton.enabled = true;
}
// Check that they entered their password again.
else if (!passwordAgain)
{
continueButton.enabled = false;
feedback.caption = translate("Please enter your password again");
}
// Check that the passwords match.
else if (passwordAgain != password)
{
continueButton.enabled = false;
feedback.caption = translate("Passwords do not match");
}
// Check that they read the Terms of Service.
else if (!g_TermsOfServiceRead)
{
continueButton.enabled = false;
feedback.caption = translate("Please read the Terms of Service");
}
// Check that they read the Terms of Use.
else if (!g_TermsOfUseRead)
{
continueButton.enabled = false;
feedback.caption = translate("Please read the Terms of Use");
}
// Check that they agree to the terms of service and use.
else if (!agreeTerms.checked)
{
continueButton.enabled = false;
feedback.caption = translate("Please agree to the Terms of Service and Terms of Use");
}
// Allow them to register.
else
{
if (!g_hasSystemMessage)
feedback.caption = "";
continueButton.enabled = true;
}
// If the password hasn't been entered again, we can't complete registation.
if (!pageRegisterHidden && !passwordAgain)
registerButton.enabled = false;
else if (!pageRegisterHidden)
registerButton.enabled = true;
if (!g_LobbyIsConnecting)
// The Xmpp Client has not been created
@ -171,13 +195,62 @@ function onTick()
feedback.caption = toTitleCase(message.text);
Engine.StopXmppClient();
g_LobbyIsConnecting = false;
switchRegister();
Engine.GetGUIObjectByName("connectUsername").caption = username;
Engine.GetGUIObjectByName("connectPassword").caption = password;
switchPage("connect");
}
else if(message.type == "system" && (message.level == "error" || message.text == "disconnected"))
{
g_hasSystemMessage = true;
feedback.caption = toTitleCase(message.text);
Engine.StopXmppClient();
g_LobbyIsConnecting = false;
}
}
}
function switchPage(page)
{
// First hide everything.
if (!Engine.GetGUIObjectByName("pageWelcome").hidden)
{
Engine.GetGUIObjectByName("pageWelcome").hidden = true;
}
else if (!Engine.GetGUIObjectByName("pageRegister").hidden)
{
Engine.GetGUIObjectByName("pageRegister").hidden = true;
Engine.GetGUIObjectByName("continue").hidden = true;
var dialog = Engine.GetGUIObjectByName("dialog");
var newSize = dialog.size;
newSize.bottom -= 150;
dialog.size = newSize;
}
else if (!Engine.GetGUIObjectByName("pageConnect").hidden)
{
Engine.GetGUIObjectByName("pageConnect").hidden = true;
Engine.GetGUIObjectByName("continue").hidden = true;
}
// Then show appropriate page.
switch(page)
{
case "welcome":
Engine.GetGUIObjectByName("pageWelcome").hidden = false;
break;
case "register":
var dialog = Engine.GetGUIObjectByName("dialog");
var newSize = dialog.size;
newSize.bottom += 150;
dialog.size = newSize;
Engine.GetGUIObjectByName("pageRegister").hidden = false;
Engine.GetGUIObjectByName("continue").caption = translate("Register");
Engine.GetGUIObjectByName("continue").hidden = false;
break;
case "connect":
Engine.GetGUIObjectByName("pageConnect").hidden = false;
Engine.GetGUIObjectByName("continue").caption = translate("Connect");
Engine.GetGUIObjectByName("continue").hidden = false;
break;
}
}

View File

@ -24,7 +24,17 @@
<translatableAttribute id="caption">Multiplayer Lobby</translatableAttribute>
</object>
<object name="pageConnect" size="0 32 100% 100%">
<object name="pageWelcome" size="0 32 100% 100%">
<object type="button" size="50 12 100%-50 68" style="ModernButtonRed">
<translatableAttribute id="caption">Create a new account</translatableAttribute>
<action on="Press">switchPage("register");</action>
</object>
<object type="button" size="50 80 100%-50 136" style="ModernButtonRed">
<translatableAttribute id="caption">Login to an existing account</translatableAttribute>
<action on="Press">switchPage("connect");</action>
</object>
</object>
<object name="pageConnect" size="0 32 100% 100%" hidden="true">
<object type="text" size="0 0 400 30" style="ModernLabelText" text_align="center">
<translatableAttribute id="caption">Connect to the game lobby</translatableAttribute>
</object>
@ -45,51 +55,75 @@
this.caption = Engine.ConfigDB_GetValue("user", "lobby.password").substring(0, 10);
</action>
<action on="Press">
lobbyStart();
lobbyStartConnect();
</action>
</object>
</object>
<object name="pageRegister" size="0 32 100% 100%" hidden="true">
<object type="text" style="ModernLabelText" size="0 0 400 30" text_align="center">
<translatableAttribute id="caption">Registration</translatableAttribute>
</object>
<object type="text" size="50 40 170 70" style="ModernLabelText" text_align="right">
<object name="registerUsernameLabel" type="text" size="50 40 130 70" style="ModernLabelText" text_align="right">
<translatableAttribute id="caption">Login:</translatableAttribute>
</object>
<object name="registerUsername" type="input" size="140 40 100%-50 64" style="ModernInput"/>
<object name="registerPasswordLabel" type="text" size="50 80 130 110" style="ModernLabelText" text_align="right">
<translatableAttribute id="caption">Password:</translatableAttribute>
</object>
<object name="registerPassword" type="input" size="140 80 100%-50 104" style="ModernInput" mask="true" mask_char="*"/>
<object name="registerPasswordAgainLabel" type="text" size="50 120 130 150" style="ModernLabelText" text_align="right">
<translatableAttribute id="caption">Password again:</translatableAttribute>
</object>
<object name="registerPasswordAgain" type="input" size="180 40 100%-50 64" style="ModernInput" mask="true" mask_char="*">
<object name="registerPasswordAgain" type="input" size="140 120 100%-50 144" style="ModernInput" mask="true" mask_char="*"/>
<object type="button" size="50 160 100%-50 188" style="ModernButtonRed">
<translatableAttribute id="caption">Terms of Service</translatableAttribute>
<action on="Press">
lobbyStartRegister()
g_TermsOfServiceRead = true;
Engine.PushGuiPage("page_manual.xml", {"page":"lobby/Terms_of_Service", "title":"Terms of Service"})
</action>
</object>
<object type="button" size="50 200 100%-50 228" style="ModernButtonRed">
<translatableAttribute id="caption">Terms of Use</translatableAttribute>
<action on="Press">
g_TermsOfUseRead = true;
Engine.PushGuiPage("page_manual.xml", {"page":"lobby/Terms_of_Use", "title":"Terms of Use"})
</action>
</object>
<object name="registerAgreeTermsLabel" type="text" size="50 240 285 270" style="ModernLabelText">
<translatableAttribute id="caption">I have read and agree to the Terms of Service and Terms of Use:</translatableAttribute>
</object>
<object name="registerAgreeTerms" type="checkbox" size="295 245 100%-50 270" style="ModernTickBox" enabled="false">
<action on="Tick"><![CDATA[this.enabled = g_TermsOfServiceRead && g_TermsOfUseRead;]]></action>
</object>
</object>
<object name="feedback" type="text" size="50 150 100%-50 190" style="ModernLabelText" textcolor="red" text_align="center"/>
<object type="button" size="18 100%-45 126 100%-17" style="ModernButtonRed">
<object name="feedback" type="text" size="50 100%-90 100%-50 100%-50" style="ModernLabelText" textcolor="red" text_align="center"/>
<object name="cancel" type="button" size="18 100%-45 50%-5 100%-17" style="ModernButtonRed">
<translatableAttribute id="caption">Cancel</translatableAttribute>
<action on="Press">
if (Engine.GetGUIObjectByName("pageRegister").hidden)
if (Engine.GetGUIObjectByName("pageWelcome").hidden)
switchPage("welcome");
else
{
lobbyStop();
Engine.PopGuiPage();
}
else
switchRegister();
</action>
</object>
<object name="register" type="button" size="136 100%-45 244 100%-17" style="ModernButtonRed">
<translatableAttribute id="caption">Register</translatableAttribute>
<action on="Press">
if (Engine.GetGUIObjectByName("pageRegister").hidden)
{
switchRegister();
}
else
lobbyStartRegister()
</action>
</object>
<object name="connect" type="button" size="254 100%-45 100%-18 100%-17" style="ModernButtonRed">
<object name="continue" type="button" size="50%+5 100%-45 100%-18 100%-17" style="ModernButtonRed" enabled="false" hidden="true">
<translatableAttribute id="caption">Connect</translatableAttribute>
<action on="Press">
lobbyStart();
if (!Engine.GetGUIObjectByName("pageConnect").hidden)
lobbyStartConnect();
else if (!Engine.GetGUIObjectByName("pageRegister").hidden)
lobbyStartRegister();
</action>
</object>

View File

@ -2,9 +2,22 @@ var hasCallback = false;
function init(data)
{
Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile("gui/manual/" + data.page + ".txt"));
Engine.GetGUIObjectByName("mainText").caption = Engine.TranslateLines(Engine.ReadFile("gui/" + data.page + ".txt"));
if (data.callback)
hasCallback = true;
if (data.title)
Engine.GetGUIObjectByName("title").caption = data.title;
if (data.url)
{
var urlButton = Engine.GetGUIObjectByName("url");
var callback = function(url)
{
return function()
openURL(url);
}(data.url)
urlButton.onPress = callback;
urlButton.hidden = false;
}
}
function closeManual()

View File

@ -8,19 +8,16 @@
<object type="image" z="0" style="TranslucentPanel"/>
<object type="image" style="ModernDialog" size="50%-466 50%-316 50%+466 50%+316">
<object type="text" style="TitleText" size="50%-128 0%-16 50%+128 16">
<translatableAttribute id="caption">Manual</translatableAttribute>
<object name="title" type="text" style="TitleText" size="50%-128 0%-16 50%+128 16">
<translatableAttribute id="caption">Information</translatableAttribute>
</object>
<object type="image" sprite="ModernFade" size="20 20 100%-20 100%-58">
<object name="mainText" type="text" style="textPanel"/>
</object>
<object type="button" style="StoneButton" size="100%-308 100%-52 100%-168 100%-24">
<translatableAttribute id="caption">Online Manual</translatableAttribute>
<action on="Press"><![CDATA[
openURL("http://trac.wildfiregames.com/wiki/0adManual");
]]></action>
<object name="url" type="button" style="StoneButton" size="100%-308 100%-52 100%-168 100%-24" hidden="true">
<translatableAttribute id="caption">View Online</translatableAttribute>
</object>
<object type="button" style="StoneButton" tooltip_style="snToolTip" size="100%-164 100%-52 100%-24 100%-24">
<translatableAttribute id="caption">Close</translatableAttribute>

View File

@ -106,7 +106,7 @@
</object>
<object type="button" style="StoneButton" size="100%-146 100%-36 100%-8 100%-8">
<translatableAttribute id="caption">Technical details</translatableAttribute>
<action on="Press">Engine.PushGuiPage("page_manual.xml", { "page": "userreport" });</action>
<action on="Press">Engine.PushGuiPage("page_manual.xml", {"page":"manual/userreport", "title":translate("Technical Details")});</action>
</object>
</object>
@ -137,7 +137,7 @@
</object>
<object type="button" style="StoneButton" size="100%-146 100%-36 100%-8 100%-8">
<translatableAttribute id="caption">Technical details</translatableAttribute>
<action on="Press">Engine.PushGuiPage("page_manual.xml", { "page": "userreport" });</action>
<action on="Press">Engine.PushGuiPage("page_manual.xml", {"page":"manual/userreport", "title":translate("Technical Details")});</action>
</object>
</object>
@ -398,7 +398,7 @@
<action on="Press">
closeMenu();
<![CDATA[
Engine.PushGuiPage("page_manual.xml", { "page": "intro" });
Engine.PushGuiPage("page_manual.xml", { "page":"manual/intro", "title":translate("Manual"), "url":"http://trac.wildfiregames.com/wiki/0adManual"});
]]>
</action>
</object>
@ -561,7 +561,7 @@
>
<!-- COMPANY LOGO -->
<object name="companyLogo"
<object name="companyLogo"
type="image"
sprite="companyLogo"
ghost="true"
@ -570,7 +570,7 @@
<!-- COMPANY NAME -->
<object type="text"
style="MediumTitleText"
style="MediumTitleText"
ghost="true"
size="50%-128 32 50%+128 48"
>

View File

@ -660,7 +660,7 @@ function openManual()
closeMenu();
closeOpenDialogs();
pauseGame();
Engine.PushGuiPage("page_manual.xml", {"page": "intro", "callback": "resumeGame"});
Engine.PushGuiPage("page_manual.xml", {"page": "intro", "title":translate("Manual"), "url":"http://trac.wildfiregames.com/wiki/0adManual", "callback": "resumeGame"});
}
function toggleDeveloperOverlay()