--- deliantra/Deliantra-Client/DC/Main.pm 2012/11/04 02:13:53 1.22 +++ deliantra/Deliantra-Client/DC/Main.pm 2012/11/16 12:03:26 1.23 @@ -27,6 +27,7 @@ use List::Util qw(max min); use Deliantra; +use Deliantra::Util; use Deliantra::Protocol::Constants; use AnyEvent::Util (); @@ -130,6 +131,7 @@ our $BUTTONBAR; # the menu buttons our $METASERVER; our $LOGIN_BUTTON; +our $LOGIN_ERROR; our $QUIT_DIALOG; our $HOST_ENTRY; our $FULLSCREEN_ENABLE; @@ -255,6 +257,40 @@ $MODBOX->set_markup ("$markup"); } +sub errorbox { + my ($msg) = @_; + + status $msg; + + my $dialog = new DC::UI::Toplevel + x => "center", + y => "center", + z => 200, + title => "Error", + child => my $vbox = new DC::UI::VBox, + has_close_button => 1, + on_delete => sub { + $_[0]->destroy; + }, + ; + + add $vbox new DC::UI::Label + align => 0.5, + ellipsise => 0, + text => $msg; + + add $vbox new DC::UI::Button + expand => 1, + text => "OK", + on_activate => sub { + $dialog->destroy; + 0 + } + ; + + $dialog->show; +} + ############################################################################# #TODO: maybe move into own audio module... @@ -930,15 +966,16 @@ } sub dc_connect { - my ($host, $port) = @_; + my ($host, $port, $create) = @_; my $mapw = List::Util::min 48, List::Util::max 11, int 1.5 + $WIDTH * $CFG->{mapsize} * 0.01 / 32; my $maph = List::Util::min 48, List::Util::max 11, int 1.5 + $HEIGHT * $CFG->{mapsize} * 0.01 / 32; - $CONN = + $CONN = new DC::Protocol host => $host, port => $port, + create_login => $create, user => $PROFILE->{user}, pass => $PROFILE->{password}, mapw => $mapw, @@ -970,14 +1007,24 @@ status "successfully connected to the server"; } else { undef $CONN; - status "unable to connect: $!"; + $LOGIN_ERROR->{fg} = [1, 0, 0]; + $LOGIN_ERROR->set_text ("Unable to connect to server: $!"); stop_game(); } }, + + on_addme => sub { + my ($ok, $msg) = @_; + + $LOGIN_ERROR->{fg} = $ok ? [0, 1, 0] : [1, 0, 0]; + $LOGIN_ERROR->set_text ($msg); + }, ; } -sub start_game { +sub start_game($) { + my ($create) = @_; + status "logging in..."; my $server = $PROFILE->{host} || $DEFAULT_SERVER; @@ -1002,10 +1049,10 @@ } } - dc_connect $host, $port; + dc_connect $host, $port, $create; }; } else { - dc_connect $host, $port; + dc_connect $host, $port, $create; } } @@ -1848,41 +1895,81 @@ child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), ); - $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username"); - $table->add_at (1, 4, new DC::UI::Entry + my $nullpw = "\x00" x 16; + + $table->add_at (0, 0, new DC::UI::Label align => 1, text => "Username"); + $table->add_at (1, 0, new DC::UI::Entry text => $PROFILE->{user}, tooltip => "The name of your character on the server. The name is case-sensitive!", on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 } ); - $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password"); - $table->add_at (1, 5, new DC::UI::Entry - text => $PROFILE->{password}, + $table->add_at (0, 1, new DC::UI::Label align => 1, text => "Password"); + $table->add_at (1, 1, my $pw1 = new DC::UI::Entry + text => $PROFILE->{password} ? $nullpw : "", hidden => 1, tooltip => "The password for your character.", - on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 } + on_focus_in => sub { + my ($self) = @_; + $self->set_text ("") + if $self->{text} eq $nullpw; + 0 + }, + on_changed => sub { + my ($self, $value) = @_; + $PROFILE->{password} = Deliantra::Util::hash_pw $value + if length $value && $value ne $nullpw; + 1 + }, ); - $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button + $table->add_at (1, 2, $LOGIN_BUTTON = new DC::UI::Button expand => 1, - text => "Login / Register", - tooltip => "This button will either login to the account configured above or register a new account.", + text => "Login to Existing Account", + tooltip => "This button will login to the account given by the Username and Password fields above.", on_activate => sub { $CONN ? stop_game - : start_game; + : start_game 0; 1 }, ); + $table->add_at (0, 3, new DC::UI::Label align => 1, text => "Password"); + $table->add_at (1, 3, my $pw2 = new DC::UI::Entry + hidden => 1, + tooltip => "The new password for your character", + ); + + $table->add_at (1, 4, new DC::UI::Button + expand => 1, + text => "Create New Account", + tooltip => "This button will try to create a new account - you need to fill out the Username and the two Password fields above, using the same password for both Password fields.", + on_activate => sub { + if ($pw1->{text} ne $pw2->{text}) { + $LOGIN_ERROR->{fg} = [1, 0, 0]; + $LOGIN_ERROR->set_text ("The passwords do not match - try to enter them again."); + } else { + $CONN or start_game 1; + } + 1 + }, + ); + + $vbox->add (new DC::UI::FancyFrame + label => "Server Message", + tooltip => "The last message, or error, form the server.", + child => ($LOGIN_ERROR = new DC::UI::Label valign => 0, ellipsise => 0), + ); + $vbox->add (new DC::UI::FancyFrame label => "How to Play", - min_h => 240, + min_h => 240,#d# should not be necessary - widget bug child => (new DC::UI::Label valign => 0, ellipsise => 0, markup => "First select a suitable video resolution in the Graphics tab, above.\n\n" - . "Then register a new account (or use an existing one if you have one). " - . "To register an account, choose a username that hasn't been taken yet (just guess) and " - . "try to log-in. Follow the instructions in the Log tab in the message window.", + . "Then create a new account (or use an existing one if you have one).\n\n" + . "To create an account, choose a username that hasn't been taken yet (just guess) and " + . "fill out the top two Password fields using the same password, then press Create New Account.", ), );