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.200 by root, Mon May 8 17:23:08 2006 UTC vs.
Revision 1.222 by elmex, Wed May 17 10:33:03 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
828 837
829 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN 838 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN
830 or die "SDL_SetVideoMode failed!\n"; 839 or die "SDL_SetVideoMode failed!\n";
831 840
832 $SDL_ACTIVE = 1; 841 $SDL_ACTIVE = 1;
833
834 $LAST_REFRESH = time - 0.01; 842 $LAST_REFRESH = time - 0.01;
835 843
836 CFClient::gl_init; 844 CFClient::gl_init;
837 845
838 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; 846 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
839 847
848 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
849
840 ############################################################################# 850 #############################################################################
841 851
852 unless ($DEBUG_STATUS) {
853 # create the widgets
854
842 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; 855 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1;
843 $DEBUG_STATUS->show; 856 $DEBUG_STATUS->show;
844 857
845 $STATUS_LINE = new CFClient::UI::Label 858 $STATUSBOX = new CFClient::UI::Statusbox;
846 padding => 0, 859 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]);
847 y => $HEIGHT - $FONTSIZE * 1.8;
848 $STATUS_LINE->show;
849 860
850 $ALT_ENTER_MESSAGE = new CFClient::UI::Label 861 (new CFClient::UI::Frame
851 padding => 0, 862 bg => [0, 0, 0, 0.4],
852 fontsize => 0.8, 863 req_y => -1,
853 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode"; 864 child => $STATUSBOX,
854 $ALT_ENTER_MESSAGE->show; 865 )->show;
855 $ALT_ENTER_MESSAGE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h});
856 866
857 CFClient::UI::FancyFrame->new ( 867 CFClient::UI::FancyFrame->new (
858 border_bg => [1, 1, 1, 192/255], 868 border_bg => [1, 1, 1, 192/255],
859 bg => [1, 1, 1, 0], 869 bg => [1, 1, 1, 0],
860 child => ($MAPMAP = new CFClient::MapWidget::MapMap), 870 child => ($MAPMAP = new CFClient::MapWidget::MapMap),
861 )->show; 871 )->show;
862 872
863 $MAPWIDGET = new CFClient::MapWidget; 873 $MAPWIDGET = new CFClient::MapWidget;
864 $MAPWIDGET->connect (activate_console => sub { 874 $MAPWIDGET->connect (activate_console => sub {
865 my ($mapwidget, $preset) = @_; 875 my ($mapwidget, $preset) = @_;
866 876
867 if ($CONSOLE) { 877 if ($CONSOLE) {
868 $CONSOLE->{input}->{auto_activated} = 1; 878 $CONSOLE->{input}->{auto_activated} = 1;
869 $CONSOLE->{input}->focus_in; 879 $CONSOLE->{input}->focus_in;
870 880
871 if ($preset && $CONSOLE->{input}->get_text eq '') { 881 if ($preset && $CONSOLE->{input}->get_text eq '') {
872 $CONSOLE->{input}->set_text ($preset); 882 $CONSOLE->{input}->set_text ($preset);
883 }
873 } 884 }
874 } 885 });
875 });
876 $MAPWIDGET->show; 886 $MAPWIDGET->show;
877 $MAPWIDGET->focus_in; 887 $MAPWIDGET->focus_in;
878 888
879 $BUTTONBAR = new CFClient::UI::HBox; 889 $BUTTONBAR = new CFClient::UI::HBox;
880 890
881 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Client Setup", other => client_setup); 891 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Client Setup", other => client_setup);
882 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Server Setup", other => server_setup); 892 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Server Setup", other => server_setup);
883 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window); 893 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window);
884 894
885 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D 895 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D
886 896
887 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window); 897 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window);
888 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window); 898 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window);
889 899
890 $BUTTONBAR->add (new CFClient::UI::Button text => "Save Config", connect_activate => sub { 900 $BUTTONBAR->add (new CFClient::UI::Button text => "Save Config", connect_activate => sub {
891 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc"; 901 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc";
892 status "Configuration Saved"; 902 status "Configuration Saved";
893 }); 903 });
894 904
895 $BUTTONBAR->show; 905 $BUTTONBAR->show;
896 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 {
897 $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 ();
916 }
898} 917}
899 918
900sub video_shutdown { 919sub video_shutdown {
901 $CFClient::UI::ROOT->{children} = [];
902 undef $CFClient::UI::GRAB;
903 undef $CFClient::UI::HOVER;
904 undef $SDL_ACTIVE; 920 undef $SDL_ACTIVE;
905} 921}
906 922
907my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d# 923my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d#
908my $bgmusic;#TODO#hack#d# 924my $bgmusic;#TODO#hack#d#
960} 976}
961 977
962my %animate_object; 978my %animate_object;
963my $animate_timer; 979my $animate_timer;
964 980
965my $want_refresh;
966my $can_refresh;
967
968my $fps = 9; 981my $fps = 9;
969 982
970sub force_refresh { 983sub force_refresh {
971 $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; 984 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05;
972 debug sprintf "%3.2f", $fps; 985 debug sprintf "%3.2f", $fps;
973 986
974 $want_refresh = 0;
975 $can_refresh = 0;
976
977 $CFClient::UI::ROOT->draw; 987 $CFClient::UI::ROOT->draw;
978
979 CFClient::SDL_GL_SwapBuffers; 988 CFClient::SDL_GL_SwapBuffers;
980 989
990 $WANT_REFRESH = 0;
991 $CAN_REFRESH = 0;
981 $LAST_REFRESH = $NOW; 992 $LAST_REFRESH = $NOW;
982} 993}
983 994
984my $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 {
985 $NOW = time; 996 $NOW = time;
987 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 998 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
988 for CFClient::SDL_PollEvent; 999 for CFClient::SDL_PollEvent;
989 1000
990 if (%animate_object) { 1001 if (%animate_object) {
991 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 1002 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
992 $want_refresh++; 1003 $WANT_REFRESH++;
993 } 1004 }
994 1005
995 if ($want_refresh) { 1006 if ($WANT_REFRESH) {
996 force_refresh; 1007 force_refresh;
997 } else { 1008 } else {
998 $can_refresh = 1; 1009 $CAN_REFRESH = 1;
999 } 1010 }
1000}); 1011});
1001
1002sub refresh {
1003 $want_refresh++;
1004}
1005 1012
1006sub animation_start { 1013sub animation_start {
1007 my ($widget) = @_; 1014 my ($widget) = @_;
1008 $animate_object{$widget} = $widget; 1015 $animate_object{$widget} = $widget;
1009} 1016}
1195 } 1202 }
1196 1203
1197gotid: 1204gotid:
1198 $face->{id} = $id; 1205 $face->{id} = $id;
1199 $MAP->set_face ($facenum => $id); 1206 $MAP->set_face ($facenum => $id);
1207 $self->{faceid}[$facenum] = $id;#d#
1200 $TILECACHE->get ($id) 1208 $TILECACHE->get ($id)
1201} 1209}
1202 1210
1203sub conn::face_update { 1211sub conn::face_update {
1204 my ($self, $facenum, $face) = @_; 1212 my ($self, $facenum, $face) = @_;
1320 [0.55, 0.41, 0.13], 1328 [0.55, 0.41, 0.13],
1321 [0.99, 0.77, 0.26], 1329 [0.99, 0.77, 0.26],
1322 [0.74, 0.65, 0.41], 1330 [0.74, 0.65, 0.41],
1323 ); 1331 );
1324 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
1325 $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);
1326} 1354}
1327 1355
1328sub conn::spell_add { 1356sub conn::spell_add {
1329 my ($self, $spell) = @_; 1357 my ($self, $spell) = @_;
1330 1358
1339} 1367}
1340 1368
1341sub conn::addme_success { 1369sub conn::addme_success {
1342 my ($self) = @_; 1370 my ($self) = @_;
1343 1371
1372 $MAPWIDGET->clr_commands;
1373
1344 for my $skill (values %{$self->{skill_info}}) { 1374 for my $skill (values %{$self->{skill_info}}) {
1345 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); 1375 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'");
1346 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); 1376 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'");
1347 } 1377 }
1348 1378
1349 $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");
1350 $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");
1351 $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");
1352 $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.
1353} 1449}
1354 1450
1355sub conn::eof { 1451sub conn::eof {
1452 $MAPWIDGET->clr_commands;
1453
1356 stop_game; 1454 stop_game;
1357} 1455}
1358 1456
1359sub update_floorbox { 1457sub update_floorbox {
1360 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub { 1458 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub {
1361 return unless $CONN; 1459 return unless $CONN;
1362 1460
1363 $FLOORBOX->clear; 1461 $FLOORBOX->clear;
1364 $FLOORBOX->add (new CFClient::UI::Empty expand => 1); 1462 $FLOORBOX->add (new CFClient::UI::Empty expand => 1);
1365 1463
1366 # we basically have to use the same sorting as everybody else 1464 my $count = 4;
1367 for my $item (@{ $CONN->{container}{0} }) { 1465 for (@{ $CONN->{container}{0} }) {
1466 if (--$count) {
1368 $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 }
1369 } 1472 }
1370 }); 1473 });
1371 refresh; 1474
1475 $WANT_REFRESH++;
1372} 1476}
1373 1477
1374sub conn::container_add { 1478sub conn::container_add {
1375 my ($self, $id, $items) = @_; 1479 my ($self, $tag, $items) = @_;
1376 1480
1377 update_floorbox if $id == 0; 1481 #d# print "container_add: container $tag ($self->{player}{tag})\n";
1482
1483 if ($tag == 0) {
1484 update_floorbox;
1485 $OPENCONT = 0;
1486 $INVR->set_items ($self->{container}{0});
1378 if ($self->{player}{tag} == $id) { 1487 } elsif ($tag == $self->{player}{tag}) {
1379 $INV->set_items ($self->{container}{$self->{player}{tag}}); 1488 $INV->set_items ($self->{container}{$self->{player}{tag}})
1489 } else {
1490 $OPENCONT = $tag;
1491 $INVR->set_items ($self->{container}{$tag});
1380 } 1492 }
1493
1381 # $self-<{player}{tag} => player inv 1494 # $self-<{player}{tag} => player inv
1382 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}}; 1495 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}};
1383} 1496}
1384 1497
1385sub conn::container_clear { 1498sub conn::container_clear {
1386 my ($self, $id) = @_; 1499 my ($self, $tag) = @_;
1387 1500
1388 update_floorbox if $id == 0; 1501 #d# print "container_clear: container $tag ($self->{player}{tag})\n";
1389 if ($self->{player}{tag} == $id) { 1502
1503 if ($tag == 0) {
1504 update_floorbox;
1505 $OPENCONT = 0;
1390 $INV->set_items ($self->{container}{$id}); 1506 $INVR->set_items ($self->{container}{0});
1507 } elsif ($tag == $self->{player}{tag}) {
1508 $INV->set_items ($self->{container}{$tag})
1509 } else {
1510 $OPENCONT = $tag;
1511 $INVR->set_items ($self->{container}{$tag});
1391 } 1512 }
1392 1513
1393# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; 1514# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0};
1394} 1515}
1395 1516
1396sub conn::item_delete { 1517sub conn::item_delete {
1397 my ($self, @items) = @_; 1518 my ($self, @items) = @_;
1398 1519
1399 for (@items) { 1520 for (@items) {
1400 update_floorbox if $_->{container} == 0; 1521 #d# print "item_delete: $_->{tag} from $_->{container} ($self->{player}{tag})\n";
1401 if ($self->{player}{tag} == $_->{container}) { 1522
1523 if ($_->{container} == 0) {
1524 update_floorbox;
1525 $OPENCONT = 0;
1526 $INVR->set_items ($self->{container}{0});
1527 } elsif ($_->{container} == $self->{player}{tag}) {
1528 $INV->set_items ($self->{container}{$self->{player}{tag}})
1529 } else {
1530 $OPENCONT = $_->{container};
1402 $INV->set_items ($self->{container}{$_->{container}}); 1531 $INVR->set_items ($self->{container}{$_->{container}});
1403 } 1532 }
1404 } 1533 }
1405} 1534}
1406 1535
1407sub conn::item_update { 1536sub conn::item_update {
1408 my ($self, $item) = @_; 1537 my ($self, $item) = @_;
1409 1538
1410 update_floorbox if $item->{container} == 0; 1539 #d# print "item_update: $item->{tag} in $item->{container} ($self->{player}{tag}) ($OPENCONT)\n";
1411 if ($self->{player}{tag} == $item->{container}) { 1540
1541 if ($item->{tag} == $OPENCONT && not ($item->{flags} & Crossfire::Protocol::F_OPEN)) {
1542 $OPENCONT = 0;
1543 $INVR->set_items ($self->{container}{0});
1544 } else {
1545 if ($item->{container} == 0) {
1546 update_floorbox;
1547 $OPENCONT = 0;
1548 $INVR->set_items ($self->{container}{0});
1549 } elsif ($item->{container} == $self->{player}{tag}) {
1412 $INV->set_items ($self->{container}{$item->{container}}); 1550 $INV->set_items ($self->{container}{$item->{container}})
1551 }
1413 } 1552 }
1414} 1553}
1415 1554
1416%SDL_CB = ( 1555%SDL_CB = (
1417 CFClient::SDL_QUIT => sub { 1556 CFClient::SDL_QUIT => sub {
1418 Event::unloop -1; 1557 Event::unloop -1;
1419 }, 1558 },
1420 CFClient::SDL_VIDEORESIZE => sub { 1559 CFClient::SDL_VIDEORESIZE => sub {
1421 }, 1560 },
1422 CFClient::SDL_VIDEOEXPOSE => \&refresh, 1561 CFClient::SDL_VIDEOEXPOSE => sub {
1562 $WANT_REFRESH++;
1563 },
1423 CFClient::SDL_ACTIVEEVENT => sub { 1564 CFClient::SDL_ACTIVEEVENT => sub {
1424# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 1565# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
1425 }, 1566 },
1426 CFClient::SDL_KEYDOWN => sub { 1567 CFClient::SDL_KEYDOWN => sub {
1427 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1568 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1448 1589
1449############################################################################# 1590#############################################################################
1450 1591
1451$SIG{INT} = $SIG{TERM} = sub { exit }; 1592$SIG{INT} = $SIG{TERM} = sub { exit };
1452 1593
1453CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1454
1455$TILECACHE = CFClient::db_table "tilecache";
1456$FACEMAP = CFClient::db_table "facemap";
1457
1458my %DEF_CFG = (
1459 sdl_mode => 0,
1460 width => 640,
1461 height => 480,
1462 fullscreen => 0,
1463 fast => 0,
1464 map_scale => 0.5,
1465 fow_enable => 1,
1466 fow_intensity => 0.45,
1467 fow_smooth => 0,
1468 gui_fontsize => 1,
1469 log_fontsize => 1,
1470 gauge_fontsize => 1,
1471 gauge_size => 0.35,
1472 stat_fontsize => 1,
1473 mapsize => 100,
1474 host => "crossfire.schmorp.de",
1475 say_command => 'say',
1476 audio_enable => 1,
1477 bgm_enable => 1,
1478 bgm_volume => 0.25,
1479);
1480
1481while (my ($k, $v) = each %DEF_CFG) {
1482 $CFG->{$k} = $v unless exists $CFG->{$k};
1483}
1484
1485sdl_init;
1486
1487@SDL_MODES = reverse
1488 grep $_->[0] >= 640 && $_->[1] >= 480,
1489 CFClient::SDL_ListModes;
1490
1491@SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1492
1493$CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1494
1495{ 1594{
1595 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] };
1596
1597 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1598
1599 $TILECACHE = CFClient::db_table "tilecache";
1600 $FACEMAP = CFClient::db_table "facemap";
1601
1602 my %DEF_CFG = (
1603 sdl_mode => 0,
1604 width => 640,
1605 height => 480,
1606 fullscreen => 0,
1607 fast => 0,
1608 map_scale => 0.5,
1609 fow_enable => 1,
1610 fow_intensity => 0.45,
1611 fow_smooth => 0,
1612 gui_fontsize => 1,
1613 log_fontsize => 1,
1614 gauge_fontsize=> 1,
1615 gauge_size => 0.35,
1616 stat_fontsize => 1,
1617 mapsize => 100,
1618 host => "crossfire.schmorp.de",
1619 say_command => 'say',
1620 audio_enable => 1,
1621 bgm_enable => 1,
1622 bgm_volume => 0.25,
1623 );
1624
1625 while (my ($k, $v) = each %DEF_CFG) {
1626 $CFG->{$k} = $v unless exists $CFG->{$k};
1627 }
1628
1629 sdl_init;
1630
1631 @SDL_MODES = reverse
1632 grep $_->[0] >= 640 && $_->[1] >= 480,
1633 CFClient::SDL_ListModes;
1634
1635 @SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1636
1637 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1638
1639 {
1496 my @fonts = map CFClient::find_rcfile "fonts/$_", qw( 1640 my @fonts = map CFClient::find_rcfile "fonts/$_", qw(
1497 DejaVuSans.ttf 1641 DejaVuSans.ttf
1498 DejaVuSansMono.ttf 1642 DejaVuSansMono.ttf
1499 DejaVuSans-Bold.ttf 1643 DejaVuSans-Bold.ttf
1500 DejaVuSansMono-Bold.ttf 1644 DejaVuSansMono-Bold.ttf
1501 DejaVuSans-Oblique.ttf 1645 DejaVuSans-Oblique.ttf
1502 DejaVuSansMono-Oblique.ttf 1646 DejaVuSansMono-Oblique.ttf
1503 DejaVuSans-BoldOblique.ttf 1647 DejaVuSans-BoldOblique.ttf
1504 DejaVuSansMono-BoldOblique.ttf 1648 DejaVuSansMono-BoldOblique.ttf
1505 ); 1649 );
1506 1650
1507 CFClient::add_font $_ for @fonts; 1651 CFClient::add_font $_ for @fonts;
1508 1652
1653 CFClient::pango_init;
1654
1509 $FONT_PROP = new_from_file CFClient::Font $fonts[0]; 1655 $FONT_PROP = new_from_file CFClient::Font $fonts[0];
1510 $FONT_FIXED = new_from_file CFClient::Font $fonts[1]; 1656 $FONT_FIXED = new_from_file CFClient::Font $fonts[1];
1511 1657
1512 $FONT_PROP->make_default; 1658 $FONT_PROP->make_default;
1513} 1659 }
1514 1660
1661# compare mono (ft) vs. rgba (cairo)
1662# ft - 1.8s, cairo 3s, even in alpha-only mode
1663# for my $rgba (0..1) {
1664# my $t1 = Time::HiRes::time;
1665# for (1..1000) {
1666# my $layout = CFClient::Layout->new ($rgba);
1667# $layout->set_text ("hallo" x 100);
1668# $layout->render;
1669# }
1670# my $t2 = Time::HiRes::time;
1671# warn $t2-$t1;
1672# }
1673
1515video_init; 1674 video_init;
1516audio_init; 1675 audio_init;
1676}
1517 1677
1518Event::loop; 1678Event::loop;
1519 1679
1520END { CFClient::SDL_Quit } 1680END { CFClient::SDL_Quit }
1521 1681

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines