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.203 by root, Mon May 8 20:55:49 2006 UTC vs.
Revision 1.221 by root, Wed May 17 01:03:10 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 $OPENCONT;
100 106
101sub status { 107sub status {
102 $STATUS_LINE->set_text ($_[0]); 108 $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} 109}
105 110
106sub debug { 111sub debug {
107 $DEBUG_STATUS->set_text ($_[0]); 112 $DEBUG_STATUS->set_text ($_[0]);
108 $DEBUG_STATUS->move ($WIDTH - $DEBUG_STATUS->{w}, 0, $DEBUG_STATUS->{w}, $DEBUG_STATUS->{h}); 113 my ($w, $h) = $DEBUG_STATUS->size_request;
114 $DEBUG_STATUS->move ($WIDTH - $w, 0);
109} 115}
110 116
111sub start_game { 117sub start_game {
112 status "logging in..."; 118 status "logging in...";
113 119
160 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 166 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
161 167
162 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); 168 $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); 169 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
164 170
165 $hbox->add (my $mode_slider = new CFClient::UI::Slider expand => 1, req_w => 100, range => [$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1]); 171 $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"); 172 $hbox->add (my $mode_label = new CFClient::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999");
167 173
168 $mode_slider->connect (changed => sub { 174 $mode_slider->connect (changed => sub {
169 my ($self, $value) = @_; 175 my ($self, $value) = @_;
170 176
195 } 201 }
196 ); 202 );
197 203
198 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); 204 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale");
199 $table->add (1, $row++, new CFClient::UI::Slider 205 $table->add (1, $row++, new CFClient::UI::Slider
200 range => [$CFG->{map_scale}, 0.25, 2, 0.05], 206 range => [$CFG->{map_scale}, 0.25, 2, 0.05, 0.05],
201 tooltip => "Enlarge or shrink the displayed map", 207 tooltip => "Enlarge or shrink the displayed map",
202 connect_changed => sub { 208 connect_changed => sub {
203 my ($self, $value) = @_; 209 my ($self, $value) = @_;
204 $CFG->{map_scale} = 0.05 * int $value / 0.05; 210 $CFG->{map_scale} = $value;
205 } 211 }
206 ); 212 );
207 213
208 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War"); 214 $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 215 $table->add (1, $row++, new CFClient::UI::CheckBox
236 } 242 }
237 ); 243 );
238 244
239 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 245 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize");
240 $table->add (1, $row++, new CFClient::UI::Slider 246 $table->add (1, $row++, new CFClient::UI::Slider
241 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1], 247 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1, 0.1],
242 tooltip => "The font size used by most GUI elements", 248 tooltip => "The font size used by most GUI elements",
243 connect_changed => sub { 249 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 ); 250 );
248 251
249 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Server Log Fontsize"); 252 $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 253 $table->add (1, $row++, new CFClient::UI::Slider
251 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1], 254 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1, 0.1],
252 tooltip => "The font size used by the server log window only", 255 tooltip => "The font size used by the server log window only",
253 connect_changed => sub { 256 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
254 $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = 0.1 * int $_[1] * 10);
255 }
256 ); 257 );
257 258
258 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); 259 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
259 260
260 $table->add (1, $row++, new CFClient::UI::Slider 261 $table->add (1, $row++, new CFClient::UI::Slider
261 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1], 262 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1, 0.1],
262 tooltip => "The font size used by the statistics window only", 263 tooltip => "The font size used by the statistics window only",
263 connect_changed => sub { 264 connect_changed => sub {
264 $CFG->{stat_fontsize} = 0.1 * int $_[1] * 10; 265 $CFG->{stat_fontsize} = $_[1];
265 &set_stats_window_fontsize; 266 &set_stats_window_fontsize;
266 } 267 }
267 ); 268 );
268 269
269 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size"); 270 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size");
270 $table->add (1, $row++, new CFClient::UI::Slider 271 $table->add (1, $row++, new CFClient::UI::Slider
271 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02], 272 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02],
272 tooltip => "Adjust the size of the stats gauges at the bottom right", 273 tooltip => "Adjust the size of the stats gauges at the bottom right",
273 connect_changed => sub { 274 connect_changed => sub {
274 $CFG->{gauge_size} = $_[1]; 275 $CFG->{gauge_size} = $_[1];
275 my $h = int $HEIGHT * $CFG->{gauge_size}; 276 $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 } 277 }
279 ); 278 );
280 279
281 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 280 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
282 $table->add (1, $row++, new CFClient::UI::Slider 281 $table->add (1, $row++, new CFClient::UI::Slider
283 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1], 282 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1, 0.1],
284 tooltip => "Adjusts the fontsize of the gauges at the bottom right", 283 tooltip => "Adjusts the fontsize of the gauges at the bottom right",
285 connect_changed => sub { 284 connect_changed => sub {
286 $CFG->{gauge_fontsize} = 0.1 * int $_[1] * 10; 285 $CFG->{gauge_fontsize} = $_[1];
287 &set_gauge_window_fontsize; 286 &set_gauge_window_fontsize;
288 } 287 }
289 ); 288 );
290 289
291 $table->add (1, $row++, new CFClient::UI::Button 290 $table->add (1, $row++, new CFClient::UI::Button
365# local $GAUGES->{win}{parent};#d# 364# local $GAUGES->{win}{parent};#d#
366# use PApp::Util; open D, ">:utf8", "d"; print D PApp::Util::dumpval $GAUGES->{win}; close D; 365# use PApp::Util; open D, ">:utf8", "d"; print D PApp::Util::dumpval $GAUGES->{win}; close D;
367} 366}
368 367
369sub make_gauge_window { 368sub make_gauge_window {
370 my $gh = int ($HEIGHT * $CFG->{gauge_size}); 369 my $gh = int $HEIGHT * $CFG->{gauge_size};
371# my $gw = int ($WIDTH * $CFG->{gauge_w_size});
372 370
373 my $win = new CFClient::UI::Frame ( 371 my $win = new CFClient::UI::Frame (
374 y => $HEIGHT - $gh, x => 0, user_w => $WIDTH, user_h => $gh 372 req_y => -1,
373 user_w => $WIDTH,
374 user_h => $gh,
375 ); 375 );
376
376 $win->add (my $hbox = new CFClient::UI::HBox 377 $win->add (my $hbox = new CFClient::UI::HBox
377 children => [ 378 children => [
378 (new CFClient::UI::HBox expand => 1), 379 (new CFClient::UI::HBox expand => 1),
379 ($FLOORBOX = new CFClient::UI::VBox), 380 (new CFClient::UI::VBox children => [
381 (new CFClient::UI::Empty expand => 1),
382 (new CFClient::UI::Frame bg => [0, 0, 0, 0.4], child => ($FLOORBOX = new CFClient::UI::VBox)),
383 ]),
380 (my $vbox = new CFClient::UI::VBox), 384 (my $vbox = new CFClient::UI::VBox),
381 ], 385 ],
382 ); 386 );
383 387
384 $vbox->add (new CFClient::UI::HBox 388 $vbox->add (new CFClient::UI::HBox
727 ); 731 );
728 732
729 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); 733 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size");
730 $table->add (1, 7, new CFClient::UI::Slider 734 $table->add (1, 7, new CFClient::UI::Slider
731 req_w => 100, 735 req_w => 100,
732 range => [$CFG->{mapsize}, 10, 100 + 1, 1], 736 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. " 737 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.", 738 ."If you set this to a high value you will be able to see further for example.",
735 connect_changed => sub { 739 connect_changed => sub {
736 my ($self, $value) = @_; 740 my ($self, $value) = @_;
737 741
805 809
806 $window 810 $window
807} 811}
808 812
809sub make_inventory_window { 813sub make_inventory_window {
810 my $invwin = new CFClient::UI::FancyFrame user_w => 300, user_h => 300, title => "Inventory"; 814 my $invwin = new CFClient::UI::FancyFrame
815 user_w => $WIDTH * (4/5), user_h => $HEIGHT * (4/5), title => "Inventory";
816
817 $invwin->add (my $hb = new CFClient::UI::HBox);
811 $invwin->add ($INV = new CFClient::UI::Inventory expand => 1); 818 $hb->add ($INV = new CFClient::UI::Inventory expand => 1);
819 $hb->add ($INVR = new CFClient::UI::Inventory expand => 1);
820
812 $invwin 821 $invwin
813} 822}
814 823
815sub sdl_init { 824sub sdl_init {
816 CFClient::SDL_Init 825 CFClient::SDL_Init
838 847
839 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d# 848 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
840 849
841 ############################################################################# 850 #############################################################################
842 851
843 if ($DEBUG_STATUS) { 852 unless ($DEBUG_STATUS) {
844 # reconfigure all widgets
845 $CFClient::UI::ROOT->reconfigure;
846
847 } else {
848 # create the widgets 853 # create the widgets
849 854
850 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; 855 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1;
851 $DEBUG_STATUS->show; 856 $DEBUG_STATUS->show;
852 857
853 $STATUS_LINE = new CFClient::UI::Label 858 $STATUSBOX = new CFClient::UI::Statusbox;
854 padding => 0, 859 $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 860
858 $ALT_ENTER_MESSAGE = new CFClient::UI::Label 861 (new CFClient::UI::Frame
859 padding => 0, 862 bg => [0, 0, 0, 0.4],
860 fontsize => 0.8, 863 req_y => -1,
861 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode"; 864 child => $STATUSBOX,
862 $ALT_ENTER_MESSAGE->show; 865 )->show;
863 $ALT_ENTER_MESSAGE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h});
864 866
865 CFClient::UI::FancyFrame->new ( 867 CFClient::UI::FancyFrame->new (
866 border_bg => [1, 1, 1, 192/255], 868 border_bg => [1, 1, 1, 192/255],
867 bg => [1, 1, 1, 0], 869 bg => [1, 1, 1, 0],
868 child => ($MAPMAP = new CFClient::MapWidget::MapMap), 870 child => ($MAPMAP = new CFClient::MapWidget::MapMap),
900 status "Configuration Saved"; 902 status "Configuration Saved";
901 }); 903 });
902 904
903 $BUTTONBAR->show; 905 $BUTTONBAR->show;
904 906
907 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
908
909 # delay till geometry is constant
910 $CFClient::UI::ROOT->on_post_alloc (startup => sub {
905 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup 911 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup
912 my $widget = $GAUGES->{win};
913 $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel
914 });
915 force_refresh ();
906 } 916 }
907} 917}
908 918
909sub video_shutdown { 919sub video_shutdown {
910 undef $SDL_ACTIVE; 920 undef $SDL_ACTIVE;
966} 976}
967 977
968my %animate_object; 978my %animate_object;
969my $animate_timer; 979my $animate_timer;
970 980
971my $want_refresh;
972my $can_refresh;
973
974my $fps = 9; 981my $fps = 9;
975 982
976sub force_refresh { 983sub force_refresh {
977 $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; 984 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05;
978 debug sprintf "%3.2f", $fps; 985 debug sprintf "%3.2f", $fps;
979 986
980 $want_refresh = 0;
981 $can_refresh = 0;
982
983 $CFClient::UI::ROOT->draw; 987 $CFClient::UI::ROOT->draw;
984
985 CFClient::SDL_GL_SwapBuffers; 988 CFClient::SDL_GL_SwapBuffers;
986 989
990 $WANT_REFRESH = 0;
991 $CAN_REFRESH = 0;
987 $LAST_REFRESH = $NOW; 992 $LAST_REFRESH = $NOW;
988} 993}
989 994
990my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub { 995my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub {
991 $NOW = time; 996 $NOW = time;
993 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 998 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
994 for CFClient::SDL_PollEvent; 999 for CFClient::SDL_PollEvent;
995 1000
996 if (%animate_object) { 1001 if (%animate_object) {
997 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 1002 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
998 $want_refresh++; 1003 $WANT_REFRESH++;
999 } 1004 }
1000 1005
1001 if ($want_refresh) { 1006 if ($WANT_REFRESH) {
1002 force_refresh; 1007 force_refresh;
1003 } else { 1008 } else {
1004 $can_refresh = 1; 1009 $CAN_REFRESH = 1;
1005 } 1010 }
1006}); 1011});
1007
1008sub refresh {
1009 $want_refresh++;
1010}
1011 1012
1012sub animation_start { 1013sub animation_start {
1013 my ($widget) = @_; 1014 my ($widget) = @_;
1014 $animate_object{$widget} = $widget; 1015 $animate_object{$widget} = $widget;
1015} 1016}
1327 [0.55, 0.41, 0.13], 1328 [0.55, 0.41, 0.13],
1328 [0.99, 0.77, 0.26], 1329 [0.99, 0.77, 0.26],
1329 [0.74, 0.65, 0.41], 1330 [0.74, 0.65, 0.41],
1330 ); 1331 );
1331 1332
1333 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
1334
1335 $text = CFClient::UI::Label::escape $text;
1336 $text =~ s/\[b\](.*?)\[\/b\]/<b>\1<\/b>/g;
1337 $text =~ s/\[color=(.*?)\](.*?)\[\/color\]/<span foreground='\1'>\2<\/span>/g;
1338
1332 $LOGVIEW->add_paragraph ($color[$color], $text); 1339 $LOGVIEW->add_paragraph ($color[$color],
1340 join "\n", map "$time $_", split /\n/, $text);
1341
1342 $STATUSBOX->add ($text,
1343 group => $text,
1344 fg => $color[$color],
1345 timeout => 60,
1346 tooltip_font => $::FONT_FIXED,
1347 );
1348}
1349
1350sub conn::drawextinfo {
1351 my ($self, $color, $type, $subtype, $message) = @_;
1352
1353 $self->drawinfo ($color, $message);
1333} 1354}
1334 1355
1335sub conn::spell_add { 1356sub conn::spell_add {
1336 my ($self, $spell) = @_; 1357 my ($self, $spell) = @_;
1337 1358
1346} 1367}
1347 1368
1348sub conn::addme_success { 1369sub conn::addme_success {
1349 my ($self) = @_; 1370 my ($self) = @_;
1350 1371
1372 $MAPWIDGET->clr_commands;
1373
1351 for my $skill (values %{$self->{skill_info}}) { 1374 for my $skill (values %{$self->{skill_info}}) {
1352 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); 1375 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'");
1353 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); 1376 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'");
1354 } 1377 }
1355 1378
1356 $MAPWIDGET->add_command ("pet\\_mode defend", "Tell pets to stay close to you and defend you"); 1379 $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"); 1380 $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"); 1381 $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"); 1382 $MAPWIDGET->add_command ("killpets", "Kill your pets");
1383 $MAPWIDGET->add_command ("chat", "chat TEXT\nChat with all other players");
1384 $MAPWIDGET->add_command ("shout", "shout TEXT\nShout loudly, used for emergencies");
1385 $MAPWIDGET->add_command ("tell", "tell USERNAME TEXT\nPrivately tell a specific player");
1386
1387 # TODO: add documentation on these
1388 for (qw(
1389 afk
1390 apply
1391 body
1392 bowmode
1393 brace
1394 build
1395 disarm
1396 dm
1397 dmhide
1398 drop
1399 dropall
1400 examine
1401 get
1402 gsay
1403 help
1404 hiscore
1405 inventory
1406 invoke
1407 killpets
1408 listen
1409 logs
1410 mapinfo
1411 maps
1412 mark
1413 motd
1414 output-count
1415 output-sync
1416 party
1417 peaceful
1418 petmode
1419 pickup
1420 players
1421 prepare
1422 quests
1423 rename
1424 resistances
1425 rotateshoottype
1426 save
1427 say
1428 search
1429 search-items
1430 showpets
1431 skills
1432 sound
1433 take
1434 throw
1435 time
1436 title
1437 usekeys
1438 version
1439 weather
1440 whereabouts
1441 whereami
1442 who
1443 wimpy
1444 )) {
1445 $MAPWIDGET->add_command ($_, "$_: no help available (yet)");
1446 }
1447
1448 #TODO: add " and ' "aliases" etc.
1360} 1449}
1361 1450
1362sub conn::eof { 1451sub conn::eof {
1452 $MAPWIDGET->clr_commands;
1453
1363 stop_game; 1454 stop_game;
1364} 1455}
1365 1456
1366sub update_floorbox { 1457sub update_floorbox {
1367 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub { 1458 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub {
1368 return unless $CONN; 1459 return unless $CONN;
1369 1460
1370 $FLOORBOX->clear; 1461 $FLOORBOX->clear;
1371 $FLOORBOX->add (new CFClient::UI::Empty expand => 1); 1462 $FLOORBOX->add (new CFClient::UI::Empty expand => 1);
1372 1463
1373 # we basically have to use the same sorting as everybody else 1464 my $count = 4;
1374 for my $item (@{ $CONN->{container}{0} }) { 1465 for (@{ $CONN->{container}{0} }) {
1466 if (--$count) {
1375 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $item); 1467 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $_);
1468 } else {
1469 $FLOORBOX->add (new CFClient::UI::Label text => "More...");
1470 last;
1471 }
1376 } 1472 }
1377 }); 1473 });
1378 refresh; 1474
1475 $WANT_REFRESH++;
1379} 1476}
1380 1477
1381sub conn::container_add { 1478sub conn::container_add {
1382 my ($self, $tag, $items) = @_; 1479 my ($self, $tag, $items) = @_;
1383 1480
1384 update_floorbox if $tag == 0; 1481 if ($tag == 0) {
1385 1482 update_floorbox;
1483 $INVR->set_items ($self->{container}{0});
1484 $OPENCONT = 0;
1485 } elsif ($tag == $self->{player}{tag}) {
1386 $INV->set_items ($self->{container}{$self->{player}{tag}}) 1486 $INV->set_items ($self->{container}{$self->{player}{tag}})
1387 if $tag == $self->{player}{tag}; 1487 } else {
1488 $OPENCONT = $tag;
1489 $INVR->set_items ($self->{container}{$tag});
1490 }
1388 1491
1389 # $self-<{player}{tag} => player inv 1492 # $self-<{player}{tag} => player inv
1390 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}}; 1493 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}};
1391} 1494}
1392 1495
1393sub conn::container_clear { 1496sub conn::container_clear {
1394 my ($self, $tag) = @_; 1497 my ($self, $tag) = @_;
1395 1498
1396 update_floorbox if $tag == 0; 1499 if ($tag == 0) {
1397 1500 update_floorbox;
1501 $INVR->set_items ($self->{container}{0});
1502 $OPENCONT = 0;
1503 } elsif ($tag == $self->{player}{tag}) {
1398 $INV->set_items ($self->{container}{$tag}) 1504 $INV->set_items ($self->{container}{$tag})
1399 if $tag == $self->{player}{tag}; 1505 } else {
1506 $INVR->set_items ($self->{container}{$tag});
1507 $OPENCONT = $tag;
1508 }
1400 1509
1401# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; 1510# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0};
1402} 1511}
1403 1512
1404sub conn::item_delete { 1513sub conn::item_delete {
1405 my ($self, @items) = @_; 1514 my ($self, @items) = @_;
1406 1515
1407 for (@items) { 1516 for (@items) {
1408 update_floorbox if $_->{container} == 0; 1517 if ($_->{container} == 0) {
1409 1518 update_floorbox;
1410 $INV->set_items ($self->{container}{$_->{container}}) 1519 $INVR->set_items ($self->{container}{0});
1411 if $_->{container} == $self->{player}{tag}; 1520 } elsif ($_->{container} == $self->{player}{tag}) {
1521 $INV->set_items ($self->{container}{$self->{player}{tag}})
1522 } else {
1523 $INVR->set_items ($self->{container}{0});
1524 }
1412 } 1525 }
1413} 1526}
1414 1527
1415sub conn::item_update { 1528sub conn::item_update {
1416 my ($self, $item) = @_; 1529 my ($self, $item) = @_;
1417 1530
1418 update_floorbox if $item->{container} == 0; 1531 if ($item->{container} == 0) {
1419 1532 update_floorbox;
1533 $INVR->set_items ($self->{container}{0});
1534 } elsif ($item->{container} == $self->{player}{tag}) {
1420 $INV->set_items ($self->{container}{$item->{container}}) 1535 $INV->set_items ($self->{container}{$item->{container}})
1421 if $item->{container}; == $self->{player}{tag}; 1536 }
1422} 1537}
1423 1538
1424%SDL_CB = ( 1539%SDL_CB = (
1425 CFClient::SDL_QUIT => sub { 1540 CFClient::SDL_QUIT => sub {
1426 Event::unloop -1; 1541 Event::unloop -1;
1427 }, 1542 },
1428 CFClient::SDL_VIDEORESIZE => sub { 1543 CFClient::SDL_VIDEORESIZE => sub {
1429 }, 1544 },
1430 CFClient::SDL_VIDEOEXPOSE => \&refresh, 1545 CFClient::SDL_VIDEOEXPOSE => sub {
1546 $WANT_REFRESH++;
1547 },
1431 CFClient::SDL_ACTIVEEVENT => sub { 1548 CFClient::SDL_ACTIVEEVENT => sub {
1432# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 1549# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
1433 }, 1550 },
1434 CFClient::SDL_KEYDOWN => sub { 1551 CFClient::SDL_KEYDOWN => sub {
1435 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1552 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1456 1573
1457############################################################################# 1574#############################################################################
1458 1575
1459$SIG{INT} = $SIG{TERM} = sub { exit }; 1576$SIG{INT} = $SIG{TERM} = sub { exit };
1460 1577
1461CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1462
1463$TILECACHE = CFClient::db_table "tilecache";
1464$FACEMAP = CFClient::db_table "facemap";
1465
1466my %DEF_CFG = (
1467 sdl_mode => 0,
1468 width => 640,
1469 height => 480,
1470 fullscreen => 0,
1471 fast => 0,
1472 map_scale => 0.5,
1473 fow_enable => 1,
1474 fow_intensity => 0.45,
1475 fow_smooth => 0,
1476 gui_fontsize => 1,
1477 log_fontsize => 1,
1478 gauge_fontsize => 1,
1479 gauge_size => 0.35,
1480 stat_fontsize => 1,
1481 mapsize => 100,
1482 host => "crossfire.schmorp.de",
1483 say_command => 'say',
1484 audio_enable => 1,
1485 bgm_enable => 1,
1486 bgm_volume => 0.25,
1487);
1488
1489while (my ($k, $v) = each %DEF_CFG) {
1490 $CFG->{$k} = $v unless exists $CFG->{$k};
1491}
1492
1493sdl_init;
1494
1495@SDL_MODES = reverse
1496 grep $_->[0] >= 640 && $_->[1] >= 480,
1497 CFClient::SDL_ListModes;
1498
1499@SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1500
1501$CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1502
1503{ 1578{
1579 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] };
1580
1581 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1582
1583 $TILECACHE = CFClient::db_table "tilecache";
1584 $FACEMAP = CFClient::db_table "facemap";
1585
1586 my %DEF_CFG = (
1587 sdl_mode => 0,
1588 width => 640,
1589 height => 480,
1590 fullscreen => 0,
1591 fast => 0,
1592 map_scale => 0.5,
1593 fow_enable => 1,
1594 fow_intensity => 0.45,
1595 fow_smooth => 0,
1596 gui_fontsize => 1,
1597 log_fontsize => 1,
1598 gauge_fontsize=> 1,
1599 gauge_size => 0.35,
1600 stat_fontsize => 1,
1601 mapsize => 100,
1602 host => "crossfire.schmorp.de",
1603 say_command => 'say',
1604 audio_enable => 1,
1605 bgm_enable => 1,
1606 bgm_volume => 0.25,
1607 );
1608
1609 while (my ($k, $v) = each %DEF_CFG) {
1610 $CFG->{$k} = $v unless exists $CFG->{$k};
1611 }
1612
1613 sdl_init;
1614
1615 @SDL_MODES = reverse
1616 grep $_->[0] >= 640 && $_->[1] >= 480,
1617 CFClient::SDL_ListModes;
1618
1619 @SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1620
1621 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1622
1623 {
1504 my @fonts = map CFClient::find_rcfile "fonts/$_", qw( 1624 my @fonts = map CFClient::find_rcfile "fonts/$_", qw(
1505 DejaVuSans.ttf 1625 DejaVuSans.ttf
1506 DejaVuSansMono.ttf 1626 DejaVuSansMono.ttf
1507 DejaVuSans-Bold.ttf 1627 DejaVuSans-Bold.ttf
1508 DejaVuSansMono-Bold.ttf 1628 DejaVuSansMono-Bold.ttf
1509 DejaVuSans-Oblique.ttf 1629 DejaVuSans-Oblique.ttf
1510 DejaVuSansMono-Oblique.ttf 1630 DejaVuSansMono-Oblique.ttf
1511 DejaVuSans-BoldOblique.ttf 1631 DejaVuSans-BoldOblique.ttf
1512 DejaVuSansMono-BoldOblique.ttf 1632 DejaVuSansMono-BoldOblique.ttf
1513 ); 1633 );
1514 1634
1515 CFClient::add_font $_ for @fonts; 1635 CFClient::add_font $_ for @fonts;
1516 1636
1637 CFClient::pango_init;
1638
1517 $FONT_PROP = new_from_file CFClient::Font $fonts[0]; 1639 $FONT_PROP = new_from_file CFClient::Font $fonts[0];
1518 $FONT_FIXED = new_from_file CFClient::Font $fonts[1]; 1640 $FONT_FIXED = new_from_file CFClient::Font $fonts[1];
1519 1641
1520 $FONT_PROP->make_default; 1642 $FONT_PROP->make_default;
1521} 1643 }
1522 1644
1645# compare mono (ft) vs. rgba (cairo)
1646# ft - 1.8s, cairo 3s, even in alpha-only mode
1647# for my $rgba (0..1) {
1648# my $t1 = Time::HiRes::time;
1649# for (1..1000) {
1650# my $layout = CFClient::Layout->new ($rgba);
1651# $layout->set_text ("hallo" x 100);
1652# $layout->render;
1653# }
1654# my $t2 = Time::HiRes::time;
1655# warn $t2-$t1;
1656# }
1657
1523video_init; 1658 video_init;
1524audio_init; 1659 audio_init;
1660}
1525 1661
1526Event::loop; 1662Event::loop;
1527 1663
1528END { CFClient::SDL_Quit } 1664END { CFClient::SDL_Quit }
1529 1665

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines