--- deliantra/Deliantra-Client/bin/pclient 2006/05/14 22:24:17 1.214 +++ deliantra/Deliantra-Client/bin/pclient 2006/05/17 01:03:10 1.221 @@ -101,13 +101,11 @@ our $INVWIN; our $INV; +our $INVR; +our $OPENCONT; sub status { - $STATUSBOX->add ($_[0], pri => -10, group => "status", timeout => 20, color => [1, 1, 0, 1]); - $CFClient::UI::ROOT->on_post_alloc (status_line_positioner => sub { - my $widget = $STATUSBOX->{parent}; - $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel - }); + $STATUSBOX->add ($_[0], pri => -10, group => "status", timeout => 20, fg => [1, 1, 0, 1]); } sub debug { @@ -170,7 +168,7 @@ $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); $table->add (1, 0, my $hbox = new CFClient::UI::HBox); - $hbox->add (my $mode_slider = new CFClient::UI::Slider expand => 1, req_w => 100, range => [$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1]); + $hbox->add (my $mode_slider = new CFClient::UI::Slider expand => 1, req_w => 100, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 1, 1]); $hbox->add (my $mode_label = new CFClient::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999"); $mode_slider->connect (changed => sub { @@ -205,11 +203,11 @@ $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); $table->add (1, $row++, new CFClient::UI::Slider - range => [$CFG->{map_scale}, 0.25, 2, 0.05], + range => [$CFG->{map_scale}, 0.25, 2, 0.05, 0.05], tooltip => "Enlarge or shrink the displayed map", connect_changed => sub { my ($self, $value) = @_; - $CFG->{map_scale} = 0.05 * int $value / 0.05; + $CFG->{map_scale} = $value; } ); @@ -246,30 +244,25 @@ $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); $table->add (1, $row++, new CFClient::UI::Slider - range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1], + range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1, 0.1], tooltip => "The font size used by most GUI elements", - connect_changed => sub { - $CFG->{gui_fontsize} = 0.1 * int $_[1] * 10; -# $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; - } + connect_changed => sub { $CFG->{gui_fontsize} = $_[1] }, ); $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Server Log Fontsize"); $table->add (1, $row++, new CFClient::UI::Slider - range => [$CFG->{log_fontsize}, 0.5, 2, 0.1], + range => [$CFG->{log_fontsize}, 0.5, 2, 0.1, 0.1], tooltip => "The font size used by the server log window only", - connect_changed => sub { - $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = 0.1 * int $_[1] * 10); - } + connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) }, ); $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); $table->add (1, $row++, new CFClient::UI::Slider - range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1], + range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1, 0.1], tooltip => "The font size used by the statistics window only", connect_changed => sub { - $CFG->{stat_fontsize} = 0.1 * int $_[1] * 10; + $CFG->{stat_fontsize} = $_[1]; &set_stats_window_fontsize; } ); @@ -280,18 +273,16 @@ tooltip => "Adjust the size of the stats gauges at the bottom right", connect_changed => sub { $CFG->{gauge_size} = $_[1]; - my $h = int $HEIGHT * $CFG->{gauge_size}; - $GAUGES->{win}->set_size ($WIDTH, $h); - $GAUGES->{win}->move (0, $HEIGHT - $h); + $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); } ); $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); $table->add (1, $row++, new CFClient::UI::Slider - range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1], + range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1, 0.1], tooltip => "Adjusts the fontsize of the gauges at the bottom right", connect_changed => sub { - $CFG->{gauge_fontsize} = 0.1 * int $_[1] * 10; + $CFG->{gauge_fontsize} = $_[1]; &set_gauge_window_fontsize; } ); @@ -375,12 +366,14 @@ } sub make_gauge_window { - my $gh = int ($HEIGHT * $CFG->{gauge_size}); -# my $gw = int ($WIDTH * $CFG->{gauge_w_size}); + my $gh = int $HEIGHT * $CFG->{gauge_size}; my $win = new CFClient::UI::Frame ( - y => $HEIGHT - $gh, x => 0, user_w => $WIDTH, user_h => $gh + req_y => -1, + user_w => $WIDTH, + user_h => $gh, ); + $win->add (my $hbox = new CFClient::UI::HBox children => [ (new CFClient::UI::HBox expand => 1), @@ -740,7 +733,7 @@ $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); $table->add (1, 7, new CFClient::UI::Slider req_w => 100, - range => [$CFG->{mapsize}, 10, 100 + 1, 1], + range => [$CFG->{mapsize}, 10, 100 + 1, 1, 1], tooltip => "This is the size of the portion of the map update the server sends you. " ."If you set this to a high value you will be able to see further for example.", connect_changed => sub { @@ -818,8 +811,13 @@ } sub make_inventory_window { - my $invwin = new CFClient::UI::FancyFrame user_w => 300, user_h => 300, title => "Inventory"; - $invwin->add ($INV = new CFClient::UI::Inventory expand => 1); + my $invwin = new CFClient::UI::FancyFrame + user_w => $WIDTH * (4/5), user_h => $HEIGHT * (4/5), title => "Inventory"; + + $invwin->add (my $hb = new CFClient::UI::HBox); + $hb->add ($INV = new CFClient::UI::Inventory expand => 1); + $hb->add ($INVR = new CFClient::UI::Inventory expand => 1); + $invwin } @@ -854,15 +852,16 @@ unless ($DEBUG_STATUS) { # create the widgets - $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; + $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1; $DEBUG_STATUS->show; $STATUSBOX = new CFClient::UI::Statusbox; - $STATUSBOX->add ("Use Alt-Enter to toggle fullscreen mode", pri => -100, size => 0.8, color => [1, 1, 1, 0.8]); + $STATUSBOX->add ("Use Alt-Enter to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]); (new CFClient::UI::Frame - bg => [0, 0, 0, 0.4], - child => $STATUSBOX, + bg => [0, 0, 0, 0.4], + req_y => -1, + child => $STATUSBOX, )->show; CFClient::UI::FancyFrame->new ( @@ -905,9 +904,13 @@ $BUTTONBAR->show; + $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); + # delay till geometry is constant $CFClient::UI::ROOT->on_post_alloc (startup => sub { $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup + my $widget = $GAUGES->{win}; + $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel }); force_refresh (); } @@ -978,7 +981,7 @@ my $fps = 9; sub force_refresh { - $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; + $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05; debug sprintf "%3.2f", $fps; $CFClient::UI::ROOT->draw; @@ -1329,7 +1332,7 @@ my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; - $text =~ s/&/&/g; $text =~ s/\1<\/b>/g; $text =~ s/\[color=(.*?)\](.*?)\[\/color\]/\2<\/span>/g; @@ -1338,7 +1341,7 @@ $STATUSBOX->add ($text, group => $text, - color => $color[$color], + fg => $color[$color], timeout => 60, tooltip_font => $::FONT_FIXED, ); @@ -1366,18 +1369,88 @@ sub conn::addme_success { my ($self) = @_; + $MAPWIDGET->clr_commands; + for my $skill (values %{$self->{skill_info}}) { $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); } - $MAPWIDGET->add_command ("pet\\_mode defend", "Tell pets to stay close to you and defend you"); - $MAPWIDGET->add_command ("pet\\_mode arena", "Same as petmode attack, but also attack other players"); - $MAPWIDGET->add_command ("pet\\_mode sad", "Search & Destroy - tell pets to roam about and attack enemies"); - $MAPWIDGET->add_command ("kill\\_pets", "kill your pets"); + $MAPWIDGET->add_command ("petmode defend", "Tell pets to stay close to you and defend you"); + $MAPWIDGET->add_command ("petmode arena", "Same as petmode sad, but also attack other players"); + $MAPWIDGET->add_command ("petmode sad", "Search & Destroy - tell pets to roam about and attack enemies"); + $MAPWIDGET->add_command ("killpets", "Kill your pets"); + $MAPWIDGET->add_command ("chat", "chat TEXT\nChat with all other players"); + $MAPWIDGET->add_command ("shout", "shout TEXT\nShout loudly, used for emergencies"); + $MAPWIDGET->add_command ("tell", "tell USERNAME TEXT\nPrivately tell a specific player"); + + # TODO: add documentation on these + for (qw( + afk + apply + body + bowmode + brace + build + disarm + dm + dmhide + drop + dropall + examine + get + gsay + help + hiscore + inventory + invoke + killpets + listen + logs + mapinfo + maps + mark + motd + output-count + output-sync + party + peaceful + petmode + pickup + players + prepare + quests + rename + resistances + rotateshoottype + save + say + search + search-items + showpets + skills + sound + take + throw + time + title + usekeys + version + weather + whereabouts + whereami + who + wimpy + )) { + $MAPWIDGET->add_command ($_, "$_: no help available (yet)"); + } + + #TODO: add " and ' "aliases" etc. } sub conn::eof { + $MAPWIDGET->clr_commands; + stop_game; } @@ -1405,10 +1478,16 @@ sub conn::container_add { my ($self, $tag, $items) = @_; - update_floorbox if $tag == 0; - - $INV->set_items ($self->{container}{$self->{player}{tag}}) - if $tag == $self->{player}{tag}; + if ($tag == 0) { + update_floorbox; + $INVR->set_items ($self->{container}{0}); + $OPENCONT = 0; + } elsif ($tag == $self->{player}{tag}) { + $INV->set_items ($self->{container}{$self->{player}{tag}}) + } else { + $OPENCONT = $tag; + $INVR->set_items ($self->{container}{$tag}); + } # $self-<{player}{tag} => player inv #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}}; @@ -1417,10 +1496,16 @@ sub conn::container_clear { my ($self, $tag) = @_; - update_floorbox if $tag == 0; - - $INV->set_items ($self->{container}{$tag}) - if $tag == $self->{player}{tag}; + if ($tag == 0) { + update_floorbox; + $INVR->set_items ($self->{container}{0}); + $OPENCONT = 0; + } elsif ($tag == $self->{player}{tag}) { + $INV->set_items ($self->{container}{$tag}) + } else { + $INVR->set_items ($self->{container}{$tag}); + $OPENCONT = $tag; + } # use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; } @@ -1429,20 +1514,26 @@ my ($self, @items) = @_; for (@items) { - update_floorbox if $_->{container} == 0; - - $INV->set_items ($self->{container}{$_->{container}}) - if $_->{container} == $self->{player}{tag}; + if ($_->{container} == 0) { + update_floorbox; + $INVR->set_items ($self->{container}{0}); + } elsif ($_->{container} == $self->{player}{tag}) { + $INV->set_items ($self->{container}{$self->{player}{tag}}) + } else { + $INVR->set_items ($self->{container}{0}); + } } } sub conn::item_update { my ($self, $item) = @_; - update_floorbox if $item->{container} == 0; - - $INV->set_items ($self->{container}{$item->{container}}) - if $item->{container} == $self->{player}{tag}; + if ($item->{container} == 0) { + update_floorbox; + $INVR->set_items ($self->{container}{0}); + } elsif ($item->{container} == $self->{player}{tag}) { + $INV->set_items ($self->{container}{$item->{container}}) + } } %SDL_CB = ( @@ -1551,6 +1642,19 @@ $FONT_PROP->make_default; } +# compare mono (ft) vs. rgba (cairo) +# ft - 1.8s, cairo 3s, even in alpha-only mode +# for my $rgba (0..1) { +# my $t1 = Time::HiRes::time; +# for (1..1000) { +# my $layout = CFClient::Layout->new ($rgba); +# $layout->set_text ("hallo" x 100); +# $layout->render; +# } +# my $t2 = Time::HiRes::time; +# warn $t2-$t1; +# } + video_init; audio_init; }