ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/pclient
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/pclient (file contents):
Revision 1.205 by root, Tue May 9 16:22:44 2006 UTC vs.
Revision 1.223 by elmex, Wed May 17 14:55:15 2006 UTC

37use CFClient; 37use CFClient;
38use CFClient::UI; 38use CFClient::UI;
39use CFClient::MapWidget; 39use CFClient::MapWidget;
40 40
41$Event::DIED = sub { 41$Event::DIED = sub {
42 # TODO: display dialog box or so
42 CFClient::error $_[1]; 43 CFClient::error $_[1];
43}; 44};
44 45
45#$SIG{__WARN__} = sub { Carp::cluck $_[0] };#d# 46#$SIG{__WARN__} = sub { Carp::cluck $_[0] };#d#
46 47
59our $NOW; 60our $NOW;
60 61
61our $CFG; 62our $CFG;
62our $CONN; 63our $CONN;
63our $FAST; # fast, low-quality mode, possibly useful for software-rendering 64our $FAST; # fast, low-quality mode, possibly useful for software-rendering
65
66our $WANT_REFRESH;
67our $CAN_REFRESH;
64 68
65our @SDL_MODES; 69our @SDL_MODES;
66our $WIDTH; 70our $WIDTH;
67our $HEIGHT; 71our $HEIGHT;
68our $FULLSCREEN; 72our $FULLSCREEN;
90our $SDL_MIXER; 94our $SDL_MIXER;
91our @SOUNDS; # event => file mapping 95our @SOUNDS; # event => file mapping
92our %AUDIO_CHUNKS; # audio files 96our %AUDIO_CHUNKS; # audio files
93 97
94our $ALT_ENTER_MESSAGE; 98our $ALT_ENTER_MESSAGE;
95our $STATUS_LINE; 99our $STATUSBOX;
96our $DEBUG_STATUS; 100our $DEBUG_STATUS;
97 101
98our $INVWIN; 102our $INVWIN;
99our $INV; 103our $INV;
104our $INVR;
105our $INVR_LBL;
106our $OPENCONT;
100 107
101sub status { 108sub status {
102 $STATUS_LINE->set_text ($_[0]); 109 $STATUSBOX->add ($_[0], pri => -10, group => "status", timeout => 20, fg => [1, 1, 0, 1]);
103 $STATUS_LINE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h} - $STATUS_LINE->{h});
104} 110}
105 111
106sub debug { 112sub debug {
107 $DEBUG_STATUS->set_text ($_[0]); 113 $DEBUG_STATUS->set_text ($_[0]);
108 $DEBUG_STATUS->move ($WIDTH - $DEBUG_STATUS->{w}, 0, $DEBUG_STATUS->{w}, $DEBUG_STATUS->{h}); 114 my ($w, $h) = $DEBUG_STATUS->size_request;
115 $DEBUG_STATUS->move ($WIDTH - $w, 0);
109} 116}
110 117
111sub start_game { 118sub start_game {
112 status "logging in..."; 119 status "logging in...";
113 120
160 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 167 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
161 168
162 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); 169 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode");
163 $table->add (1, 0, my $hbox = new CFClient::UI::HBox); 170 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
164 171
165 $hbox->add (my $mode_slider = new CFClient::UI::Slider expand => 1, req_w => 100, range => [$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1]); 172 $hbox->add (my $mode_slider = new CFClient::UI::Slider expand => 1, req_w => 100, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 1, 1]);
166 $hbox->add (my $mode_label = new CFClient::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999"); 173 $hbox->add (my $mode_label = new CFClient::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999");
167 174
168 $mode_slider->connect (changed => sub { 175 $mode_slider->connect (changed => sub {
169 my ($self, $value) = @_; 176 my ($self, $value) = @_;
170 177
195 } 202 }
196 ); 203 );
197 204
198 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); 205 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale");
199 $table->add (1, $row++, new CFClient::UI::Slider 206 $table->add (1, $row++, new CFClient::UI::Slider
200 range => [$CFG->{map_scale}, 0.25, 2, 0.05], 207 range => [$CFG->{map_scale}, 0.25, 2, 0.05, 0.05],
201 tooltip => "Enlarge or shrink the displayed map", 208 tooltip => "Enlarge or shrink the displayed map",
202 connect_changed => sub { 209 connect_changed => sub {
203 my ($self, $value) = @_; 210 my ($self, $value) = @_;
204 $CFG->{map_scale} = 0.05 * int $value / 0.05; 211 $CFG->{map_scale} = $value;
205 } 212 }
206 ); 213 );
207 214
208 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War"); 215 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War");
209 $table->add (1, $row++, new CFClient::UI::CheckBox 216 $table->add (1, $row++, new CFClient::UI::CheckBox
236 } 243 }
237 ); 244 );
238 245
239 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 246 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize");
240 $table->add (1, $row++, new CFClient::UI::Slider 247 $table->add (1, $row++, new CFClient::UI::Slider
241 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1], 248 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1, 0.1],
242 tooltip => "The font size used by most GUI elements", 249 tooltip => "The font size used by most GUI elements",
243 connect_changed => sub { 250 connect_changed => sub { $CFG->{gui_fontsize} = $_[1] },
244 $CFG->{gui_fontsize} = 0.1 * int $_[1] * 10;
245# $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
246 }
247 ); 251 );
248 252
249 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Server Log Fontsize"); 253 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Server Log Fontsize");
250 $table->add (1, $row++, new CFClient::UI::Slider 254 $table->add (1, $row++, new CFClient::UI::Slider
251 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1], 255 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1, 0.1],
252 tooltip => "The font size used by the server log window only", 256 tooltip => "The font size used by the server log window only",
253 connect_changed => sub { 257 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
254 $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = 0.1 * int $_[1] * 10);
255 }
256 ); 258 );
257 259
258 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); 260 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
259 261
260 $table->add (1, $row++, new CFClient::UI::Slider 262 $table->add (1, $row++, new CFClient::UI::Slider
261 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1], 263 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1, 0.1],
262 tooltip => "The font size used by the statistics window only", 264 tooltip => "The font size used by the statistics window only",
263 connect_changed => sub { 265 connect_changed => sub {
264 $CFG->{stat_fontsize} = 0.1 * int $_[1] * 10; 266 $CFG->{stat_fontsize} = $_[1];
265 &set_stats_window_fontsize; 267 &set_stats_window_fontsize;
266 } 268 }
267 ); 269 );
268 270
269 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size"); 271 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size");
270 $table->add (1, $row++, new CFClient::UI::Slider 272 $table->add (1, $row++, new CFClient::UI::Slider
271 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02], 273 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02],
272 tooltip => "Adjust the size of the stats gauges at the bottom right", 274 tooltip => "Adjust the size of the stats gauges at the bottom right",
273 connect_changed => sub { 275 connect_changed => sub {
274 $CFG->{gauge_size} = $_[1]; 276 $CFG->{gauge_size} = $_[1];
275 my $h = int $HEIGHT * $CFG->{gauge_size}; 277 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
276 $GAUGES->{win}->set_size ($WIDTH, $h);
277 $GAUGES->{win}->move (0, $HEIGHT - $h);
278 } 278 }
279 ); 279 );
280 280
281 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 281 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
282 $table->add (1, $row++, new CFClient::UI::Slider 282 $table->add (1, $row++, new CFClient::UI::Slider
283 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1], 283 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1, 0.1],
284 tooltip => "Adjusts the fontsize of the gauges at the bottom right", 284 tooltip => "Adjusts the fontsize of the gauges at the bottom right",
285 connect_changed => sub { 285 connect_changed => sub {
286 $CFG->{gauge_fontsize} = 0.1 * int $_[1] * 10; 286 $CFG->{gauge_fontsize} = $_[1];
287 &set_gauge_window_fontsize; 287 &set_gauge_window_fontsize;
288 } 288 }
289 ); 289 );
290 290
291 $table->add (1, $row++, new CFClient::UI::Button 291 $table->add (1, $row++, new CFClient::UI::Button
365# local $GAUGES->{win}{parent};#d# 365# local $GAUGES->{win}{parent};#d#
366# use PApp::Util; open D, ">:utf8", "d"; print D PApp::Util::dumpval $GAUGES->{win}; close D; 366# use PApp::Util; open D, ">:utf8", "d"; print D PApp::Util::dumpval $GAUGES->{win}; close D;
367} 367}
368 368
369sub make_gauge_window { 369sub make_gauge_window {
370 my $gh = int ($HEIGHT * $CFG->{gauge_size}); 370 my $gh = int $HEIGHT * $CFG->{gauge_size};
371# my $gw = int ($WIDTH * $CFG->{gauge_w_size});
372 371
373 my $win = new CFClient::UI::Frame ( 372 my $win = new CFClient::UI::Frame (
374 y => $HEIGHT - $gh, x => 0, user_w => $WIDTH, user_h => $gh 373 req_y => -1,
374 user_w => $WIDTH,
375 user_h => $gh,
375 ); 376 );
377
376 $win->add (my $hbox = new CFClient::UI::HBox 378 $win->add (my $hbox = new CFClient::UI::HBox
377 children => [ 379 children => [
378 (new CFClient::UI::HBox expand => 1), 380 (new CFClient::UI::HBox expand => 1),
379 ($FLOORBOX = new CFClient::UI::VBox), 381 (new CFClient::UI::VBox children => [
382 (new CFClient::UI::Empty expand => 1),
383 (new CFClient::UI::Frame bg => [0, 0, 0, 0.4], child => ($FLOORBOX = new CFClient::UI::VBox)),
384 ]),
380 (my $vbox = new CFClient::UI::VBox), 385 (my $vbox = new CFClient::UI::VBox),
381 ], 386 ],
382 ); 387 );
383 388
384 $vbox->add (new CFClient::UI::HBox 389 $vbox->add (new CFClient::UI::HBox
727 ); 732 );
728 733
729 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); 734 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size");
730 $table->add (1, 7, new CFClient::UI::Slider 735 $table->add (1, 7, new CFClient::UI::Slider
731 req_w => 100, 736 req_w => 100,
732 range => [$CFG->{mapsize}, 10, 100 + 1, 1], 737 range => [$CFG->{mapsize}, 10, 100 + 1, 1, 1],
733 tooltip => "This is the size of the portion of the map update the server sends you. " 738 tooltip => "This is the size of the portion of the map update the server sends you. "
734 ."If you set this to a high value you will be able to see further for example.", 739 ."If you set this to a high value you will be able to see further for example.",
735 connect_changed => sub { 740 connect_changed => sub {
736 my ($self, $value) = @_; 741 my ($self, $value) = @_;
737 742
805 810
806 $window 811 $window
807} 812}
808 813
809sub make_inventory_window { 814sub make_inventory_window {
810 my $invwin = new CFClient::UI::FancyFrame user_w => 300, user_h => 300, title => "Inventory"; 815 my $invwin = new CFClient::UI::FancyFrame
816 user_w => $WIDTH * (4/5), user_h => $HEIGHT * (4/5), title => "Inventory";
817
818 $invwin->add (my $hb = new CFClient::UI::HBox);
819
820 $hb->add (my $vb1 = new CFClient::UI::VBox expand => 1);
821 $vb1->add (my $lbl = new CFClient::UI::Label);
822 $lbl->set_text ("Player");
811 $invwin->add ($INV = new CFClient::UI::Inventory expand => 1); 823 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1);
824
825 $hb->add (my $vb2 = new CFClient::UI::VBox expand => 1);
826 $vb2->add ($INVR_LBL = new CFClient::UI::Label);
827 $INVR_LBL->set_text ("Floor");
828 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1);
829
812 $invwin 830 $invwin
813} 831}
814 832
815sub sdl_init { 833sub sdl_init {
816 CFClient::SDL_Init 834 CFClient::SDL_Init
838 856
839 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d# 857 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
840 858
841 ############################################################################# 859 #############################################################################
842 860
843 if ($DEBUG_STATUS) { 861 unless ($DEBUG_STATUS) {
844 # reconfigure all widgets
845 $CFClient::UI::ROOT->reconfigure;
846
847 } else {
848 # create the widgets 862 # create the widgets
849 863
850 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; 864 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1;
851 $DEBUG_STATUS->show; 865 $DEBUG_STATUS->show;
852 866
853 $STATUS_LINE = new CFClient::UI::Label 867 $STATUSBOX = new CFClient::UI::Statusbox;
854 padding => 0, 868 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]);
855 y => $HEIGHT - $FONTSIZE * 1.8;
856 $STATUS_LINE->show;
857 869
858 $ALT_ENTER_MESSAGE = new CFClient::UI::Label 870 (new CFClient::UI::Frame
859 padding => 0, 871 bg => [0, 0, 0, 0.4],
860 fontsize => 0.8, 872 req_y => -1,
861 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode"; 873 child => $STATUSBOX,
862 $ALT_ENTER_MESSAGE->show; 874 )->show;
863 $ALT_ENTER_MESSAGE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h});
864 875
865 CFClient::UI::FancyFrame->new ( 876 CFClient::UI::FancyFrame->new (
866 border_bg => [1, 1, 1, 192/255], 877 border_bg => [1, 1, 1, 192/255],
867 bg => [1, 1, 1, 0], 878 bg => [1, 1, 1, 0],
868 child => ($MAPMAP = new CFClient::MapWidget::MapMap), 879 child => ($MAPMAP = new CFClient::MapWidget::MapMap),
900 status "Configuration Saved"; 911 status "Configuration Saved";
901 }); 912 });
902 913
903 $BUTTONBAR->show; 914 $BUTTONBAR->show;
904 915
916 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
917
918 # delay till geometry is constant
919 $CFClient::UI::ROOT->on_post_alloc (startup => sub {
905 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup 920 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup
921 my $widget = $GAUGES->{win};
922 $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel
923 });
924 force_refresh ();
906 } 925 }
907} 926}
908 927
909sub video_shutdown { 928sub video_shutdown {
910 undef $SDL_ACTIVE; 929 undef $SDL_ACTIVE;
966} 985}
967 986
968my %animate_object; 987my %animate_object;
969my $animate_timer; 988my $animate_timer;
970 989
971my $want_refresh;
972my $can_refresh;
973
974my $fps = 9; 990my $fps = 9;
975 991
976sub force_refresh { 992sub force_refresh {
977 $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; 993 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05;
978 debug sprintf "%3.2f", $fps; 994 debug sprintf "%3.2f", $fps;
979 995
980 $want_refresh = 0;
981 $can_refresh = 0;
982
983 $CFClient::UI::ROOT->draw; 996 $CFClient::UI::ROOT->draw;
984
985 CFClient::SDL_GL_SwapBuffers; 997 CFClient::SDL_GL_SwapBuffers;
986 998
999 $WANT_REFRESH = 0;
1000 $CAN_REFRESH = 0;
987 $LAST_REFRESH = $NOW; 1001 $LAST_REFRESH = $NOW;
988} 1002}
989 1003
990my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub { 1004my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub {
991 $NOW = time; 1005 $NOW = time;
993 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 1007 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
994 for CFClient::SDL_PollEvent; 1008 for CFClient::SDL_PollEvent;
995 1009
996 if (%animate_object) { 1010 if (%animate_object) {
997 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 1011 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
998 $want_refresh++; 1012 $WANT_REFRESH++;
999 } 1013 }
1000 1014
1001 if ($want_refresh) { 1015 if ($WANT_REFRESH) {
1002 force_refresh; 1016 force_refresh;
1003 } else { 1017 } else {
1004 $can_refresh = 1; 1018 $CAN_REFRESH = 1;
1005 } 1019 }
1006}); 1020});
1007
1008sub refresh {
1009 $want_refresh++;
1010}
1011 1021
1012sub animation_start { 1022sub animation_start {
1013 my ($widget) = @_; 1023 my ($widget) = @_;
1014 $animate_object{$widget} = $widget; 1024 $animate_object{$widget} = $widget;
1015} 1025}
1327 [0.55, 0.41, 0.13], 1337 [0.55, 0.41, 0.13],
1328 [0.99, 0.77, 0.26], 1338 [0.99, 0.77, 0.26],
1329 [0.74, 0.65, 0.41], 1339 [0.74, 0.65, 0.41],
1330 ); 1340 );
1331 1341
1342 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
1343
1344 $text = CFClient::UI::Label::escape $text;
1345 $text =~ s/\[b\](.*?)\[\/b\]/<b>\1<\/b>/g;
1346 $text =~ s/\[color=(.*?)\](.*?)\[\/color\]/<span foreground='\1'>\2<\/span>/g;
1347
1332 $LOGVIEW->add_paragraph ($color[$color], $text); 1348 $LOGVIEW->add_paragraph ($color[$color],
1349 join "\n", map "$time $_", split /\n/, $text);
1350
1351 $STATUSBOX->add ($text,
1352 group => $text,
1353 fg => $color[$color],
1354 timeout => 60,
1355 tooltip_font => $::FONT_FIXED,
1356 );
1357}
1358
1359sub conn::drawextinfo {
1360 my ($self, $color, $type, $subtype, $message) = @_;
1361
1362 $self->drawinfo ($color, $message);
1333} 1363}
1334 1364
1335sub conn::spell_add { 1365sub conn::spell_add {
1336 my ($self, $spell) = @_; 1366 my ($self, $spell) = @_;
1337 1367
1346} 1376}
1347 1377
1348sub conn::addme_success { 1378sub conn::addme_success {
1349 my ($self) = @_; 1379 my ($self) = @_;
1350 1380
1381 $MAPWIDGET->clr_commands;
1382
1351 for my $skill (values %{$self->{skill_info}}) { 1383 for my $skill (values %{$self->{skill_info}}) {
1352 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); 1384 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'");
1353 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); 1385 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'");
1354 } 1386 }
1355 1387
1356 $MAPWIDGET->add_command ("pet\\_mode defend", "Tell pets to stay close to you and defend you"); 1388 $MAPWIDGET->add_command ("petmode defend", "Tell pets to stay close to you and defend you");
1357 $MAPWIDGET->add_command ("pet\\_mode arena", "Same as petmode attack, but also attack other players"); 1389 $MAPWIDGET->add_command ("petmode arena", "Same as petmode sad, but also attack other players");
1358 $MAPWIDGET->add_command ("pet\\_mode sad", "Search &amp; Destroy - tell pets to roam about and attack enemies"); 1390 $MAPWIDGET->add_command ("petmode sad", "Search &amp; Destroy - tell pets to roam about and attack enemies");
1359 $MAPWIDGET->add_command ("kill\\_pets", "kill your pets"); 1391 $MAPWIDGET->add_command ("killpets", "Kill your pets");
1392 $MAPWIDGET->add_command ("chat", "chat TEXT\nChat with all other players");
1393 $MAPWIDGET->add_command ("shout", "shout TEXT\nShout loudly, used for emergencies");
1394 $MAPWIDGET->add_command ("tell", "tell USERNAME TEXT\nPrivately tell a specific player");
1395
1396 # TODO: add documentation on these
1397 for (qw(
1398 afk
1399 apply
1400 body
1401 bowmode
1402 brace
1403 build
1404 disarm
1405 dm
1406 dmhide
1407 drop
1408 dropall
1409 examine
1410 get
1411 gsay
1412 help
1413 hiscore
1414 inventory
1415 invoke
1416 killpets
1417 listen
1418 logs
1419 mapinfo
1420 maps
1421 mark
1422 motd
1423 output-count
1424 output-sync
1425 party
1426 peaceful
1427 petmode
1428 pickup
1429 players
1430 prepare
1431 quests
1432 rename
1433 resistances
1434 rotateshoottype
1435 save
1436 say
1437 search
1438 search-items
1439 showpets
1440 skills
1441 sound
1442 take
1443 throw
1444 time
1445 title
1446 usekeys
1447 version
1448 weather
1449 whereabouts
1450 whereami
1451 who
1452 wimpy
1453 )) {
1454 $MAPWIDGET->add_command ($_, "$_: no help available (yet)");
1455 }
1456
1457 #TODO: add " and ' "aliases" etc.
1360} 1458}
1361 1459
1362sub conn::eof { 1460sub conn::eof {
1461 $MAPWIDGET->clr_commands;
1462
1363 stop_game; 1463 stop_game;
1364} 1464}
1365 1465
1366sub update_floorbox { 1466sub update_floorbox {
1367 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub { 1467 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub {
1368 return unless $CONN; 1468 return unless $CONN;
1369 1469
1370 $FLOORBOX->clear; 1470 $FLOORBOX->clear;
1371 $FLOORBOX->add (new CFClient::UI::Empty expand => 1); 1471 $FLOORBOX->add (new CFClient::UI::Empty expand => 1);
1372 1472
1373 # we basically have to use the same sorting as everybody else 1473 my $count = 4;
1374 $FLOORBOX->add ( 1474 for (@{ $CONN->{container}{0} }) {
1475 if (--$count) {
1375 map +(new CFClient::UI::InventoryItem item => $_), 1476 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $_);
1376 @{ $CONN->{container}{0} } 1477 } else {
1478 $FLOORBOX->add (new CFClient::UI::Label text => "More...");
1479 last;
1480 }
1377 ); 1481 }
1378 }); 1482 });
1379 refresh; 1483
1484 $WANT_REFRESH++;
1380} 1485}
1381 1486
1382sub conn::container_add { 1487sub conn::container_add {
1383 my ($self, $tag, $items) = @_; 1488 my ($self, $tag, $items) = @_;
1384 1489
1385 update_floorbox if $tag == 0; 1490 #d# print "container_add: container $tag ($self->{player}{tag})\n";
1386 1491
1492 if ($tag == 0) {
1493 update_floorbox;
1494 $OPENCONT = 0;
1495 $INVR_LBL->set_text ("Floor");
1496 $INVR->set_items ($self->{container}{0});
1497 } elsif ($tag == $self->{player}{tag}) {
1498 $INVR_LBL->set_text ("Player");
1387 $INV->set_items ($self->{container}{$self->{player}{tag}}) 1499 $INV->set_items ($self->{container}{$self->{player}{tag}})
1388 if $tag == $self->{player}{tag}; 1500 } else {
1501 $OPENCONT = $tag;
1502 $INVR_LBL->set_text (CFClient::UI::InventoryItem::_item_to_desc ($self->{item}->{$OPENCONT}));
1503 $INVR->set_items ($self->{container}{$tag});
1504 }
1389 1505
1390 # $self-<{player}{tag} => player inv 1506 # $self-<{player}{tag} => player inv
1391 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}}; 1507 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}};
1392} 1508}
1393 1509
1394sub conn::container_clear { 1510sub conn::container_clear {
1395 my ($self, $tag) = @_; 1511 my ($self, $tag) = @_;
1396 1512
1397 update_floorbox if $tag == 0; 1513 #d# print "container_clear: container $tag ($self->{player}{tag})\n";
1398 1514
1515 if ($tag == 0) {
1516 update_floorbox;
1517 $OPENCONT = 0;
1518 $INVR_LBL->set_text ("Floor");
1519 $INVR->set_items ($self->{container}{0});
1520 } elsif ($tag == $self->{player}{tag}) {
1521 $INVR_LBL->set_text ("Player");
1399 $INV->set_items ($self->{container}{$tag}) 1522 $INV->set_items ($self->{container}{$tag})
1400 if $tag == $self->{player}{tag}; 1523 } else {
1524 $OPENCONT = $tag;
1525 $INVR_LBL->set_text (CFClient::UI::InventoryItem::_item_to_desc ($self->{item}->{$OPENCONT}));
1526 $INVR->set_items ($self->{container}{$tag});
1527 }
1401 1528
1402# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; 1529# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0};
1403} 1530}
1404 1531
1405sub conn::item_delete { 1532sub conn::item_delete {
1406 my ($self, @items) = @_; 1533 my ($self, @items) = @_;
1407 1534
1408 for (@items) { 1535 for (@items) {
1409 update_floorbox if $_->{container} == 0; 1536 #d# print "item_delete: $_->{tag} from $_->{container} ($self->{player}{tag})\n";
1410 1537
1538 if ($_->{container} == 0) {
1539 update_floorbox;
1540 $OPENCONT = 0;
1541 $INVR_LBL->set_text ("Floor");
1542 $INVR->set_items ($self->{container}{0});
1543 } elsif ($_->{container} == $self->{player}{tag}) {
1544 $INVR_LBL->set_text ("Player");
1545 $INV->set_items ($self->{container}{$self->{player}{tag}})
1546 } else {
1547 $OPENCONT = $_->{container};
1548 $INVR_LBL->set_text (CFClient::UI::InventoryItem::_item_to_desc ($self->{item}->{$OPENCONT}));
1411 $INV->set_items ($self->{container}{$_->{container}}) 1549 $INVR->set_items ($self->{container}{$_->{container}});
1412 if $_->{container} == $self->{player}{tag}; 1550 }
1413 } 1551 }
1414} 1552}
1415 1553
1416sub conn::item_update { 1554sub conn::item_update {
1417 my ($self, $item) = @_; 1555 my ($self, $item) = @_;
1418 1556
1419 update_floorbox if $item->{container} == 0; 1557 #d# print "item_update: $item->{tag} in $item->{container} ($self->{player}{tag}) ($OPENCONT)\n";
1420 1558
1559 if ($item->{tag} == $OPENCONT && not ($item->{flags} & Crossfire::Protocol::F_OPEN)) {
1560 $OPENCONT = 0;
1561 $INVR_LBL->set_text ("Floor");
1562 $INVR->set_items ($self->{container}{0});
1563
1564 $item->{widget}->update_item
1565 if $item->{widget};
1566 } else {
1567 if ($item->{container} == 0) {
1568 update_floorbox;
1569 $OPENCONT = 0;
1570 $INVR_LBL->set_text ("Floor");
1571 $INVR->set_items ($self->{container}{0});
1572 } elsif ($item->{container} == $self->{player}{tag}) {
1421 $INV->set_items ($self->{container}{$item->{container}}) 1573 $INV->set_items ($self->{container}{$item->{container}})
1422 if $item->{container} == $self->{player}{tag}; 1574 }
1575 }
1423} 1576}
1424 1577
1425%SDL_CB = ( 1578%SDL_CB = (
1426 CFClient::SDL_QUIT => sub { 1579 CFClient::SDL_QUIT => sub {
1427 Event::unloop -1; 1580 Event::unloop -1;
1428 }, 1581 },
1429 CFClient::SDL_VIDEORESIZE => sub { 1582 CFClient::SDL_VIDEORESIZE => sub {
1430 }, 1583 },
1431 CFClient::SDL_VIDEOEXPOSE => \&refresh, 1584 CFClient::SDL_VIDEOEXPOSE => sub {
1585 $WANT_REFRESH++;
1586 },
1432 CFClient::SDL_ACTIVEEVENT => sub { 1587 CFClient::SDL_ACTIVEEVENT => sub {
1433# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 1588# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
1434 }, 1589 },
1435 CFClient::SDL_KEYDOWN => sub { 1590 CFClient::SDL_KEYDOWN => sub {
1436 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1591 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1477 fow_enable => 1, 1632 fow_enable => 1,
1478 fow_intensity => 0.45, 1633 fow_intensity => 0.45,
1479 fow_smooth => 0, 1634 fow_smooth => 0,
1480 gui_fontsize => 1, 1635 gui_fontsize => 1,
1481 log_fontsize => 1, 1636 log_fontsize => 1,
1482 gauge_fontsize => 1, 1637 gauge_fontsize=> 1,
1483 gauge_size => 0.35, 1638 gauge_size => 0.35,
1484 stat_fontsize => 1, 1639 stat_fontsize => 1,
1485 mapsize => 100, 1640 mapsize => 100,
1486 host => "crossfire.schmorp.de", 1641 host => "crossfire.schmorp.de",
1487 say_command => 'say', 1642 say_command => 'say',
1488 audio_enable => 1, 1643 audio_enable => 1,
1516 DejaVuSansMono-BoldOblique.ttf 1671 DejaVuSansMono-BoldOblique.ttf
1517 ); 1672 );
1518 1673
1519 CFClient::add_font $_ for @fonts; 1674 CFClient::add_font $_ for @fonts;
1520 1675
1676 CFClient::pango_init;
1677
1521 $FONT_PROP = new_from_file CFClient::Font $fonts[0]; 1678 $FONT_PROP = new_from_file CFClient::Font $fonts[0];
1522 $FONT_FIXED = new_from_file CFClient::Font $fonts[1]; 1679 $FONT_FIXED = new_from_file CFClient::Font $fonts[1];
1523 1680
1524 $FONT_PROP->make_default; 1681 $FONT_PROP->make_default;
1525 } 1682 }
1683
1684# compare mono (ft) vs. rgba (cairo)
1685# ft - 1.8s, cairo 3s, even in alpha-only mode
1686# for my $rgba (0..1) {
1687# my $t1 = Time::HiRes::time;
1688# for (1..1000) {
1689# my $layout = CFClient::Layout->new ($rgba);
1690# $layout->set_text ("hallo" x 100);
1691# $layout->render;
1692# }
1693# my $t2 = Time::HiRes::time;
1694# warn $t2-$t1;
1695# }
1526 1696
1527 video_init; 1697 video_init;
1528 audio_init; 1698 audio_init;
1529} 1699}
1530 1700

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines