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.198 by root, Fri May 5 19:10:16 2006 UTC vs.
Revision 1.220 by root, Wed May 17 00:28:46 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;
76our $MAPWIDGET; 80our $MAPWIDGET;
77our $BUTTONBAR; 81our $BUTTONBAR;
78our $LOGVIEW; 82our $LOGVIEW;
79our $CONSOLE; 83our $CONSOLE;
80our $METASERVER; 84our $METASERVER;
85our $LOGIN_BUTTON;
81 86
82our $FLOORBOX; 87our $FLOORBOX;
83our $GAUGES; 88our $GAUGES;
84our $STATWIDS; 89our $STATWIDS;
85 90
89our $SDL_MIXER; 94our $SDL_MIXER;
90our @SOUNDS; # event => file mapping 95our @SOUNDS; # event => file mapping
91our %AUDIO_CHUNKS; # audio files 96our %AUDIO_CHUNKS; # audio files
92 97
93our $ALT_ENTER_MESSAGE; 98our $ALT_ENTER_MESSAGE;
94our $STATUS_LINE; 99our $STATUSBOX;
95our $DEBUG_STATUS; 100our $DEBUG_STATUS;
96 101
97our $INVWIN; 102our $INVWIN;
98our $INV; 103our $INV;
104our $INVR;
105our $OPENCONT;
99 106
100sub status { 107sub status {
101 $STATUS_LINE->set_text ($_[0]); 108 $STATUSBOX->add ($_[0], pri => -10, group => "status", timeout => 20, fg => [1, 1, 0, 1]);
102 $STATUS_LINE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h} - $STATUS_LINE->{h});
103} 109}
104 110
105sub debug { 111sub debug {
106 $DEBUG_STATUS->set_text ($_[0]); 112 $DEBUG_STATUS->set_text ($_[0]);
107 $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);
108} 115}
109 116
110sub start_game { 117sub start_game {
111 status "logging in..."; 118 status "logging in...";
112 119
113 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 120 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
114 121
115 $MAPCACHE = CFClient::db_table "mapcache_$CFG->{host}"; 122 $MAPCACHE = CFClient::db_table "mapcache_$CFG->{host}";
116
117 $MAP = new CFClient::Map $mapsize, $mapsize; 123 $MAP = new CFClient::Map $mapsize, $mapsize;
118 124
119 my ($host, $port) = split /:/, $CFG->{host}; 125 my ($host, $port) = split /:/, $CFG->{host};
120 126
121 $CONN = eval { 127 $CONN = eval {
128 maph => $mapsize, 134 maph => $mapsize,
129 ; 135 ;
130 }; 136 };
131 137
132 if ($CONN) { 138 if ($CONN) {
139 $LOGIN_BUTTON->set_text ("Logout");
140
133 status "login successful"; 141 status "login successful";
134 142
135 CFClient::lowdelay fileno $CONN->{fh}; 143 CFClient::lowdelay fileno $CONN->{fh};
136 } else { 144 } else {
137 status "unable to connect"; 145 status "unable to connect";
146 stop_game();
138 } 147 }
139} 148}
140 149
141sub stop_game { 150sub stop_game {
151 return unless $CONN;
152
153 status "connection closed";
154 $LOGIN_BUTTON->set_text ("Login");
155 $CONN->destroy;
156 $CONN = 0; # false, does not autovivify
157
158 undef $MAPCACHE;
142 undef $CONN; 159 undef $MAP;
143} 160}
144 161
145sub client_setup { 162sub client_setup {
146 my $dialog = new CFClient::UI::FancyFrame 163 my $dialog = new CFClient::UI::FancyFrame
147 title => "Client Setup", 164 title => "Client Setup",
149 $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]);
150 167
151 $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");
152 $table->add (1, 0, my $hbox = new CFClient::UI::HBox); 169 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
153 170
154 $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]);
155 $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");
156 173
157 $mode_slider->connect (changed => sub { 174 $mode_slider->connect (changed => sub {
158 my ($self, $value) = @_; 175 my ($self, $value) = @_;
159 176
184 } 201 }
185 ); 202 );
186 203
187 $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");
188 $table->add (1, $row++, new CFClient::UI::Slider 205 $table->add (1, $row++, new CFClient::UI::Slider
189 range => [$CFG->{map_scale}, 0.25, 2, 0.05], 206 range => [$CFG->{map_scale}, 0.25, 2, 0.05, 0.05],
190 tooltip => "Enlarge or shrink the displayed map", 207 tooltip => "Enlarge or shrink the displayed map",
191 connect_changed => sub { 208 connect_changed => sub {
192 my ($self, $value) = @_; 209 my ($self, $value) = @_;
193 $CFG->{map_scale} = 0.05 * int $value / 0.05; 210 $CFG->{map_scale} = $value;
194 } 211 }
195 ); 212 );
196 213
197 $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");
198 $table->add (1, $row++, new CFClient::UI::CheckBox 215 $table->add (1, $row++, new CFClient::UI::CheckBox
225 } 242 }
226 ); 243 );
227 244
228 $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");
229 $table->add (1, $row++, new CFClient::UI::Slider 246 $table->add (1, $row++, new CFClient::UI::Slider
230 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1], 247 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1, 0.1],
231 tooltip => "The font size used by most GUI elements", 248 tooltip => "The font size used by most GUI elements",
232 connect_changed => sub { 249 connect_changed => sub { $CFG->{gui_fontsize} = $_[1] },
233 $CFG->{gui_fontsize} = 0.1 * int $_[1] * 10;
234# $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
235 }
236 ); 250 );
237 251
238 $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");
239 $table->add (1, $row++, new CFClient::UI::Slider 253 $table->add (1, $row++, new CFClient::UI::Slider
240 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1], 254 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1, 0.1],
241 tooltip => "The font size used by the server log window only", 255 tooltip => "The font size used by the server log window only",
242 connect_changed => sub { 256 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
243 $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = 0.1 * int $_[1] * 10);
244 }
245 ); 257 );
246 258
247 $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");
248 260
249 $table->add (1, $row++, new CFClient::UI::Slider 261 $table->add (1, $row++, new CFClient::UI::Slider
250 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1], 262 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1, 0.1],
251 tooltip => "The font size used by the statistics window only", 263 tooltip => "The font size used by the statistics window only",
252 connect_changed => sub { 264 connect_changed => sub {
253 $CFG->{stat_fontsize} = 0.1 * int $_[1] * 10; 265 $CFG->{stat_fontsize} = $_[1];
254 &set_stats_window_fontsize; 266 &set_stats_window_fontsize;
255 } 267 }
256 ); 268 );
257 269
258 $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");
259 $table->add (1, $row++, new CFClient::UI::Slider 271 $table->add (1, $row++, new CFClient::UI::Slider
260 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02], 272 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02],
261 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",
262 connect_changed => sub { 274 connect_changed => sub {
263 $CFG->{gauge_size} = $_[1]; 275 $CFG->{gauge_size} = $_[1];
264 my $h = int $HEIGHT * $CFG->{gauge_size}; 276 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
265 $GAUGES->{win}->set_size ($WIDTH, $h);
266 $GAUGES->{win}->move (0, $HEIGHT - $h);
267 } 277 }
268 ); 278 );
269 279
270 $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");
271 $table->add (1, $row++, new CFClient::UI::Slider 281 $table->add (1, $row++, new CFClient::UI::Slider
272 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1], 282 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1, 0.1],
273 tooltip => "Adjusts the fontsize of the gauges at the bottom right", 283 tooltip => "Adjusts the fontsize of the gauges at the bottom right",
274 connect_changed => sub { 284 connect_changed => sub {
275 $CFG->{gauge_fontsize} = 0.1 * int $_[1] * 10; 285 $CFG->{gauge_fontsize} = $_[1];
276 &set_gauge_window_fontsize; 286 &set_gauge_window_fontsize;
277 } 287 }
278 ); 288 );
279 289
280 $table->add (1, $row++, new CFClient::UI::Button 290 $table->add (1, $row++, new CFClient::UI::Button
354# local $GAUGES->{win}{parent};#d# 364# local $GAUGES->{win}{parent};#d#
355# 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;
356} 366}
357 367
358sub make_gauge_window { 368sub make_gauge_window {
359 my $gh = int ($HEIGHT * $CFG->{gauge_size}); 369 my $gh = int $HEIGHT * $CFG->{gauge_size};
360# my $gw = int ($WIDTH * $CFG->{gauge_w_size});
361 370
362 my $win = new CFClient::UI::Frame ( 371 my $win = new CFClient::UI::Frame (
363 y => $HEIGHT - $gh, x => 0, user_w => $WIDTH, user_h => $gh 372 req_y => -1,
373 user_w => $WIDTH,
374 user_h => $gh,
364 ); 375 );
376
365 $win->add (my $hbox = new CFClient::UI::HBox 377 $win->add (my $hbox = new CFClient::UI::HBox
366 children => [ 378 children => [
367 (new CFClient::UI::HBox expand => 1), 379 (new CFClient::UI::HBox expand => 1),
368 ($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 ]),
369 (my $vbox = new CFClient::UI::VBox), 384 (my $vbox = new CFClient::UI::VBox),
370 ], 385 ],
371 ); 386 );
372 387
373 $vbox->add (new CFClient::UI::HBox 388 $vbox->add (new CFClient::UI::HBox
571 586
572} 587}
573 588
574sub metaserver_dialog { 589sub metaserver_dialog {
575 my $dialog = new CFClient::UI::FancyFrame 590 my $dialog = new CFClient::UI::FancyFrame
576 title => "Metaserver", 591 title => "Server List",
577 child => (my $vbox = new CFClient::UI::VBox); 592 child => (my $vbox = new CFClient::UI::VBox);
578 593
579 $vbox->add ($dialog->{table} = new CFClient::UI::Table); 594 $vbox->add ($dialog->{table} = new CFClient::UI::Table);
580 595
581 $dialog 596 $dialog
683 698
684 $METASERVER = metaserver_dialog; 699 $METASERVER = metaserver_dialog;
685 700
686 $vbox->add (new CFClient::UI::Flopper 701 $vbox->add (new CFClient::UI::Flopper
687 expand => 1, 702 expand => 1,
688 text => "Metaserver", 703 text => "Server List",
689 other => $METASERVER, 704 other => $METASERVER,
690 tooltip => "Show a list of avaible crossfire servers", 705 tooltip => "Show a list of available crossfire servers",
691 connect_open => sub { 706 connect_open => sub {
692 update_metaserver $HOST; 707 update_metaserver $HOST;
693 } 708 }
694 ); 709 );
695 } 710 }
716 ); 731 );
717 732
718 $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");
719 $table->add (1, 7, new CFClient::UI::Slider 734 $table->add (1, 7, new CFClient::UI::Slider
720 req_w => 100, 735 req_w => 100,
721 range => [$CFG->{mapsize}, 10, 100 + 1, 1], 736 range => [$CFG->{mapsize}, 10, 100 + 1, 1, 1],
722 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. "
723 ."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.",
724 connect_changed => sub { 739 connect_changed => sub {
725 my ($self, $value) = @_; 740 my ($self, $value) = @_;
726 741
727 $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 742 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
728 }, 743 },
729 ); 744 );
730 745
731 $table->add (1, 8, new CFClient::UI::Button expand => 1, align => 0, text => "Login", connect_activate => sub { 746 $table->add (1, 8, $LOGIN_BUTTON = new CFClient::UI::Button
747 expand => 1,
748 align => 0,
749 text => "Login",
750 connect_activate => sub {
751 $CONN ? stop_game
732 start_game; 752 : start_game;
753 },
733 }); 754 );
734 755
735 $dialog 756 $dialog
736} 757}
737 758
738sub message_window { 759sub message_window {
788 809
789 $window 810 $window
790} 811}
791 812
792sub make_inventory_window { 813sub make_inventory_window {
793 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);
794 $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
795 $invwin 821 $invwin
796} 822}
797 823
798sub sdl_init { 824sub sdl_init {
799 CFClient::SDL_Init 825 CFClient::SDL_Init
811 837
812 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN 838 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN
813 or die "SDL_SetVideoMode failed!\n"; 839 or die "SDL_SetVideoMode failed!\n";
814 840
815 $SDL_ACTIVE = 1; 841 $SDL_ACTIVE = 1;
816
817 $LAST_REFRESH = time - 0.01; 842 $LAST_REFRESH = time - 0.01;
818 843
819 CFClient::gl_init; 844 CFClient::gl_init;
820 845
821 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; 846 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
822 847
848 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
849
823 ############################################################################# 850 #############################################################################
824 851
852 unless ($DEBUG_STATUS) {
853 # create the widgets
854
825 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; 855 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1;
826 $DEBUG_STATUS->show; 856 $DEBUG_STATUS->show;
827 857
828 $STATUS_LINE = new CFClient::UI::Label 858 $STATUSBOX = new CFClient::UI::Statusbox;
829 padding => 0, 859 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]);
830 y => $HEIGHT - $FONTSIZE * 1.8;
831 $STATUS_LINE->show;
832 860
833 $ALT_ENTER_MESSAGE = new CFClient::UI::Label 861 (new CFClient::UI::Frame
834 padding => 0, 862 bg => [0, 0, 0, 0.4],
835 fontsize => 0.8, 863 req_y => -1,
836 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode"; 864 child => $STATUSBOX,
837 $ALT_ENTER_MESSAGE->show; 865 )->show;
838 $ALT_ENTER_MESSAGE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h});
839 866
840 CFClient::UI::FancyFrame->new ( 867 CFClient::UI::FancyFrame->new (
841 border_bg => [1, 1, 1, 192/255], 868 border_bg => [1, 1, 1, 192/255],
842 bg => [1, 1, 1, 0], 869 bg => [1, 1, 1, 0],
843 child => ($MAPMAP = new CFClient::MapWidget::MapMap), 870 child => ($MAPMAP = new CFClient::MapWidget::MapMap),
844 )->show; 871 )->show;
845 872
846 $MAPWIDGET = new CFClient::MapWidget; 873 $MAPWIDGET = new CFClient::MapWidget;
847 $MAPWIDGET->connect (activate_console => sub { 874 $MAPWIDGET->connect (activate_console => sub {
848 my ($mapwidget, $preset) = @_; 875 my ($mapwidget, $preset) = @_;
849 876
850 if ($CONSOLE) { 877 if ($CONSOLE) {
851 $CONSOLE->{input}->{auto_activated} = 1; 878 $CONSOLE->{input}->{auto_activated} = 1;
852 $CONSOLE->{input}->focus_in; 879 $CONSOLE->{input}->focus_in;
853 880
854 if ($preset && $CONSOLE->{input}->get_text eq '') { 881 if ($preset && $CONSOLE->{input}->get_text eq '') {
855 $CONSOLE->{input}->set_text ($preset); 882 $CONSOLE->{input}->set_text ($preset);
883 }
856 } 884 }
857 } 885 });
858 });
859 $MAPWIDGET->show; 886 $MAPWIDGET->show;
860 $MAPWIDGET->focus_in; 887 $MAPWIDGET->focus_in;
861 888
862 $BUTTONBAR = new CFClient::UI::HBox; 889 $BUTTONBAR = new CFClient::UI::HBox;
863 890
864 $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);
865 $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);
866 $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);
867 894
868 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
869 896
870 $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);
871 $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);
872 899
873 $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 {
874 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc"; 901 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc";
875 status "Configuration Saved"; 902 status "Configuration Saved";
876 }); 903 });
877 904
878 $BUTTONBAR->show; 905 $BUTTONBAR->show;
879 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 {
880 $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 }
881} 917}
882 918
883sub video_shutdown { 919sub video_shutdown {
884 $CFClient::UI::ROOT->{children} = [];
885 undef $CFClient::UI::GRAB;
886 undef $CFClient::UI::HOVER;
887 undef $SDL_ACTIVE; 920 undef $SDL_ACTIVE;
888} 921}
889 922
890my @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#
891my $bgmusic;#TODO#hack#d# 924my $bgmusic;#TODO#hack#d#
943} 976}
944 977
945my %animate_object; 978my %animate_object;
946my $animate_timer; 979my $animate_timer;
947 980
948my $want_refresh;
949my $can_refresh;
950
951my $fps = 9; 981my $fps = 9;
952 982
953sub force_refresh { 983sub force_refresh {
954 $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; 984 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05;
955 debug sprintf "%3.2f", $fps; 985 debug sprintf "%3.2f", $fps;
956 986
957 $want_refresh = 0;
958 $can_refresh = 0;
959
960 $CFClient::UI::ROOT->draw; 987 $CFClient::UI::ROOT->draw;
961
962 CFClient::SDL_GL_SwapBuffers; 988 CFClient::SDL_GL_SwapBuffers;
963 989
990 $WANT_REFRESH = 0;
991 $CAN_REFRESH = 0;
964 $LAST_REFRESH = $NOW; 992 $LAST_REFRESH = $NOW;
965} 993}
966 994
967my $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 {
968 $NOW = time; 996 $NOW = time;
970 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 998 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
971 for CFClient::SDL_PollEvent; 999 for CFClient::SDL_PollEvent;
972 1000
973 if (%animate_object) { 1001 if (%animate_object) {
974 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 1002 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
975 $want_refresh++; 1003 $WANT_REFRESH++;
976 } 1004 }
977 1005
978 if ($want_refresh) { 1006 if ($WANT_REFRESH) {
979 force_refresh; 1007 force_refresh;
980 } else { 1008 } else {
981 $can_refresh = 1; 1009 $CAN_REFRESH = 1;
982 } 1010 }
983}); 1011});
984
985sub refresh {
986 $want_refresh++;
987}
988 1012
989sub animation_start { 1013sub animation_start {
990 my ($widget) = @_; 1014 my ($widget) = @_;
991 $animate_object{$widget} = $widget; 1015 $animate_object{$widget} = $widget;
992} 1016}
1304 [0.55, 0.41, 0.13], 1328 [0.55, 0.41, 0.13],
1305 [0.99, 0.77, 0.26], 1329 [0.99, 0.77, 0.26],
1306 [0.74, 0.65, 0.41], 1330 [0.74, 0.65, 0.41],
1307 ); 1331 );
1308 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
1309 $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);
1310} 1354}
1311 1355
1312sub conn::spell_add { 1356sub conn::spell_add {
1313 my ($self, $spell) = @_; 1357 my ($self, $spell) = @_;
1314 1358
1323} 1367}
1324 1368
1325sub conn::addme_success { 1369sub conn::addme_success {
1326 my ($self) = @_; 1370 my ($self) = @_;
1327 1371
1372 $MAPWIDGET->clr_commands;
1373
1328 for my $skill (values %{$self->{skill_info}}) { 1374 for my $skill (values %{$self->{skill_info}}) {
1329 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); 1375 $MAPWIDGET->add_command ("ready_\\skill $skill", "Ready the skill '$skill'");
1330 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); 1376 $MAPWIDGET->add_command ("use_\\skill $skill", "Immediately use the skill '$skill'");
1331 } 1377 }
1378
1379 $MAPWIDGET->add_command ("pet\\mode defend", "Tell pets to stay close to you and defend you");
1380 $MAPWIDGET->add_command ("pet\\mode arena", "Same as petmode sad, but also attack other players");
1381 $MAPWIDGET->add_command ("pet\\mode sad", "Search &amp; Destroy - tell pets to roam about and attack enemies");
1382 $MAPWIDGET->add_command ("kill\\pets", "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 applymode
1392 body
1393 bowmode
1394 brace
1395 build
1396 disarm
1397 dm
1398 dmhide
1399 drop
1400 dropall
1401 examine
1402 get
1403 gsay
1404 help
1405 hiscore
1406 inventory
1407 invoke
1408 killpets
1409 listen
1410 logs
1411 mapinfo
1412 maps
1413 mark
1414 motd
1415 output-count
1416 output-sync
1417 party
1418 peaceful
1419 petmode
1420 pickup
1421 players
1422 prepare
1423 quests
1424 rename
1425 resistances
1426 rotateshoottype
1427 save
1428 say
1429 search
1430 search-items
1431 showpets
1432 skills
1433 sound
1434 take
1435 throw
1436 time
1437 title
1438 usekeys
1439 version
1440 weather
1441 whereabouts
1442 whereami
1443 who
1444 wimpy
1445 )) {
1446 $MAPWIDGET->add_command ($_, "$_: no help available (yet)");
1447 }
1448
1449 #TODO: add " and ' "aliases" etc.
1450}
1451
1452sub conn::eof {
1453 $MAPWIDGET->clr_commands;
1454
1455 stop_game;
1332} 1456}
1333 1457
1334sub update_floorbox { 1458sub update_floorbox {
1335 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub { 1459 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub {
1460 return unless $CONN;
1461
1336 $FLOORBOX->clear; 1462 $FLOORBOX->clear;
1337 $FLOORBOX->add (new CFClient::UI::Empty expand => 1); 1463 $FLOORBOX->add (new CFClient::UI::Empty expand => 1);
1338 1464
1339 # we basically have to use the same sorting as everybody else 1465 my $count = 4;
1340 for my $item (@{ $CONN->{container}{0} }) { 1466 for (@{ $CONN->{container}{0} }) {
1467 if (--$count) {
1341 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $item); 1468 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $_);
1469 } else {
1470 $FLOORBOX->add (new CFClient::UI::Label text => "More...");
1471 last;
1472 }
1342 } 1473 }
1343 }); 1474 });
1344 refresh; 1475
1476 $WANT_REFRESH++;
1345} 1477}
1346 1478
1347sub conn::container_add { 1479sub conn::container_add {
1348 my ($self, $id, $items) = @_; 1480 my ($self, $tag, $items) = @_;
1349 1481
1350 update_floorbox if $id == 0; 1482 if ($tag == 0) {
1483 update_floorbox;
1484 $INVR->set_items ($self->{container}{0});
1485 $OPENCONT = 0;
1351 if ($self->{player}{tag} == $id) { 1486 } elsif ($tag == $self->{player}{tag}) {
1352 $INV->set_items ($self->{container}{$self->{player}{tag}}); 1487 $INV->set_items ($self->{container}{$self->{player}{tag}})
1488 } else {
1489 $OPENCONT = $tag;
1490 $INVR->set_items ($self->{container}{$tag});
1353 } 1491 }
1492
1354 # $self-<{player}{tag} => player inv 1493 # $self-<{player}{tag} => player inv
1355 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}}; 1494 #use PApp::Util; warn PApp::Util::dumpval $self->{container}{$self->{player}{tag}};
1356} 1495}
1357 1496
1358sub conn::container_clear { 1497sub conn::container_clear {
1359 my ($self, $id) = @_; 1498 my ($self, $tag) = @_;
1360 1499
1361 update_floorbox if $id == 0; 1500 if ($tag == 0) {
1362 if ($self->{player}{tag} == $id) { 1501 update_floorbox;
1363 $INV->set_items ($self->{container}{$id}); 1502 $INVR->set_items ($self->{container}{0});
1503 $OPENCONT = 0;
1504 } elsif ($tag == $self->{player}{tag}) {
1505 $INV->set_items ($self->{container}{$tag})
1506 } else {
1507 $INVR->set_items ($self->{container}{$tag});
1508 $OPENCONT = $tag;
1364 } 1509 }
1365 1510
1366# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; 1511# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0};
1367} 1512}
1368 1513
1369sub conn::item_delete { 1514sub conn::item_delete {
1370 my ($self, @items) = @_; 1515 my ($self, @items) = @_;
1371 1516
1372 for (@items) { 1517 for (@items) {
1373 update_floorbox if $_->{container} == 0; 1518 if ($_->{container} == 0) {
1374 if ($self->{player}{tag} == $_->{container}) { 1519 update_floorbox;
1375 $INV->set_items ($self->{container}{$_->{container}}); 1520 $INVR->set_items ($self->{container}{0});
1521 } elsif ($_->{container} == $self->{player}{tag}) {
1522 $INV->set_items ($self->{container}{$self->{player}{tag}})
1523 } else {
1524 $INVR->set_items ($self->{container}{0});
1376 } 1525 }
1377 } 1526 }
1378} 1527}
1379 1528
1380sub conn::item_update { 1529sub conn::item_update {
1381 my ($self, $item) = @_; 1530 my ($self, $item) = @_;
1382 1531
1383 update_floorbox if $item->{container} == 0; 1532 if ($item->{container} == 0) {
1384 if ($self->{player}{tag} == $item->{container}) { 1533 update_floorbox;
1534 $INVR->set_items ($self->{container}{0});
1535 } elsif ($item->{container} == $self->{player}{tag}) {
1385 $INV->set_items ($self->{container}{$item->{container}}); 1536 $INV->set_items ($self->{container}{$item->{container}})
1386 } 1537 }
1387} 1538}
1388 1539
1389%SDL_CB = ( 1540%SDL_CB = (
1390 CFClient::SDL_QUIT => sub { 1541 CFClient::SDL_QUIT => sub {
1391 Event::unloop -1; 1542 Event::unloop -1;
1392 }, 1543 },
1393 CFClient::SDL_VIDEORESIZE => sub { 1544 CFClient::SDL_VIDEORESIZE => sub {
1394 }, 1545 },
1395 CFClient::SDL_VIDEOEXPOSE => \&refresh, 1546 CFClient::SDL_VIDEOEXPOSE => sub {
1547 $WANT_REFRESH++;
1548 },
1396 CFClient::SDL_ACTIVEEVENT => sub { 1549 CFClient::SDL_ACTIVEEVENT => sub {
1397# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 1550# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
1398 }, 1551 },
1399 CFClient::SDL_KEYDOWN => sub { 1552 CFClient::SDL_KEYDOWN => sub {
1400 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1553 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1421 1574
1422############################################################################# 1575#############################################################################
1423 1576
1424$SIG{INT} = $SIG{TERM} = sub { exit }; 1577$SIG{INT} = $SIG{TERM} = sub { exit };
1425 1578
1426CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1427
1428$TILECACHE = CFClient::db_table "tilecache";
1429$FACEMAP = CFClient::db_table "facemap";
1430
1431my %DEF_CFG = (
1432 sdl_mode => 0,
1433 width => 640,
1434 height => 480,
1435 fullscreen => 0,
1436 fast => 0,
1437 map_scale => 0.5,
1438 fow_enable => 1,
1439 fow_intensity => 0.45,
1440 fow_smooth => 0,
1441 gui_fontsize => 1,
1442 log_fontsize => 1,
1443 gauge_fontsize => 1,
1444 gauge_size => 0.35,
1445 stat_fontsize => 1,
1446 mapsize => 100,
1447 host => "crossfire.schmorp.de",
1448 say_command => 'say',
1449 audio_enable => 1,
1450 bgm_enable => 1,
1451 bgm_volume => 0.25,
1452);
1453
1454while (my ($k, $v) = each %DEF_CFG) {
1455 $CFG->{$k} = $v unless exists $CFG->{$k};
1456}
1457
1458sdl_init;
1459
1460@SDL_MODES = reverse
1461 grep $_->[0] >= 640 && $_->[1] >= 480,
1462 CFClient::SDL_ListModes;
1463
1464@SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1465
1466$CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1467
1468{ 1579{
1580 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] };
1581
1582 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1583
1584 $TILECACHE = CFClient::db_table "tilecache";
1585 $FACEMAP = CFClient::db_table "facemap";
1586
1587 my %DEF_CFG = (
1588 sdl_mode => 0,
1589 width => 640,
1590 height => 480,
1591 fullscreen => 0,
1592 fast => 0,
1593 map_scale => 0.5,
1594 fow_enable => 1,
1595 fow_intensity => 0.45,
1596 fow_smooth => 0,
1597 gui_fontsize => 1,
1598 log_fontsize => 1,
1599 gauge_fontsize=> 1,
1600 gauge_size => 0.35,
1601 stat_fontsize => 1,
1602 mapsize => 100,
1603 host => "crossfire.schmorp.de",
1604 say_command => 'say',
1605 audio_enable => 1,
1606 bgm_enable => 1,
1607 bgm_volume => 0.25,
1608 );
1609
1610 while (my ($k, $v) = each %DEF_CFG) {
1611 $CFG->{$k} = $v unless exists $CFG->{$k};
1612 }
1613
1614 sdl_init;
1615
1616 @SDL_MODES = reverse
1617 grep $_->[0] >= 640 && $_->[1] >= 480,
1618 CFClient::SDL_ListModes;
1619
1620 @SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1621
1622 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1623
1624 {
1469 my @fonts = map CFClient::find_rcfile "fonts/$_", qw( 1625 my @fonts = map CFClient::find_rcfile "fonts/$_", qw(
1470 DejaVuSans.ttf 1626 DejaVuSans.ttf
1471 DejaVuSansMono.ttf 1627 DejaVuSansMono.ttf
1472 DejaVuSans-Bold.ttf 1628 DejaVuSans-Bold.ttf
1473 DejaVuSansMono-Bold.ttf 1629 DejaVuSansMono-Bold.ttf
1474 DejaVuSans-Oblique.ttf 1630 DejaVuSans-Oblique.ttf
1475 DejaVuSansMono-Oblique.ttf 1631 DejaVuSansMono-Oblique.ttf
1476 DejaVuSans-BoldOblique.ttf 1632 DejaVuSans-BoldOblique.ttf
1477 DejaVuSansMono-BoldOblique.ttf 1633 DejaVuSansMono-BoldOblique.ttf
1478 ); 1634 );
1479 1635
1480 CFClient::add_font $_ for @fonts; 1636 CFClient::add_font $_ for @fonts;
1481 1637
1638 CFClient::pango_init;
1639
1482 $FONT_PROP = new_from_file CFClient::Font $fonts[0]; 1640 $FONT_PROP = new_from_file CFClient::Font $fonts[0];
1483 $FONT_FIXED = new_from_file CFClient::Font $fonts[1]; 1641 $FONT_FIXED = new_from_file CFClient::Font $fonts[1];
1484 1642
1485 $FONT_PROP->make_default; 1643 $FONT_PROP->make_default;
1486} 1644 }
1487 1645
1646# compare mono (ft) vs. rgba (cairo)
1647# ft - 1.8s, cairo 3s, even in alpha-only mode
1648# for my $rgba (0..1) {
1649# my $t1 = Time::HiRes::time;
1650# for (1..1000) {
1651# my $layout = CFClient::Layout->new ($rgba);
1652# $layout->set_text ("hallo" x 100);
1653# $layout->render;
1654# }
1655# my $t2 = Time::HiRes::time;
1656# warn $t2-$t1;
1657# }
1658
1488video_init; 1659 video_init;
1489audio_init; 1660 audio_init;
1661}
1490 1662
1491Event::loop; 1663Event::loop;
1492 1664
1493END { CFClient::SDL_Quit } 1665END { CFClient::SDL_Quit }
1494 1666

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines