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.191 by elmex, Fri Apr 28 05:17:24 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;
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 = new conn 127 $CONN = eval {
128 new conn
122 host => $host, 129 host => $host,
123 port => $port || 13327, 130 port => $port || 13327,
124 user => $CFG->{user}, 131 user => $CFG->{user},
125 pass => $CFG->{password}, 132 pass => $CFG->{password},
126 mapw => $mapsize, 133 mapw => $mapsize,
127 maph => $mapsize, 134 maph => $mapsize,
135 ;
128 ; 136 };
129 137
138 if ($CONN) {
139 $LOGIN_BUTTON->set_text ("Logout");
140
130 status "login successful"; 141 status "login successful";
131 142
132 CFClient::lowdelay fileno $CONN->{fh}; 143 CFClient::lowdelay fileno $CONN->{fh};
144 } else {
145 status "unable to connect";
146 stop_game();
147 }
133} 148}
134 149
135sub 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;
136 undef $CONN; 159 undef $MAP;
137} 160}
138 161
139sub client_setup { 162sub client_setup {
140 my $dialog = new CFClient::UI::FancyFrame 163 my $dialog = new CFClient::UI::FancyFrame
141 title => "Client Setup", 164 title => "Client Setup",
143 $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]);
144 167
145 $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");
146 $table->add (1, 0, my $hbox = new CFClient::UI::HBox); 169 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
147 170
148 $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]);
149 $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");
150 173
151 $mode_slider->connect (changed => sub { 174 $mode_slider->connect (changed => sub {
152 my ($self, $value) = @_; 175 my ($self, $value) = @_;
153 176
178 } 201 }
179 ); 202 );
180 203
181 $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");
182 $table->add (1, $row++, new CFClient::UI::Slider 205 $table->add (1, $row++, new CFClient::UI::Slider
183 range => [$CFG->{map_scale}, 0.25, 2, 0.05], 206 range => [$CFG->{map_scale}, 0.25, 2, 0.05, 0.05],
184 tooltip => "Enlarge or shrink the displayed map", 207 tooltip => "Enlarge or shrink the displayed map",
185 connect_changed => sub { 208 connect_changed => sub {
186 my ($self, $value) = @_; 209 my ($self, $value) = @_;
187 $CFG->{map_scale} = 0.05 * int $value / 0.05; 210 $CFG->{map_scale} = $value;
188 } 211 }
189 ); 212 );
190 213
191 $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");
192 $table->add (1, $row++, new CFClient::UI::CheckBox 215 $table->add (1, $row++, new CFClient::UI::CheckBox
219 } 242 }
220 ); 243 );
221 244
222 $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");
223 $table->add (1, $row++, new CFClient::UI::Slider 246 $table->add (1, $row++, new CFClient::UI::Slider
224 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1], 247 range => [$CFG->{gui_fontsize}, 0.5, 2, 0.1, 0.1],
225 tooltip => "The font size used by most GUI elements", 248 tooltip => "The font size used by most GUI elements",
226 connect_changed => sub { 249 connect_changed => sub { $CFG->{gui_fontsize} = $_[1] },
227 $CFG->{gui_fontsize} = 0.1 * int $_[1] * 10;
228# $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
229 }
230 ); 250 );
231 251
232 $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");
233 $table->add (1, $row++, new CFClient::UI::Slider 253 $table->add (1, $row++, new CFClient::UI::Slider
234 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1], 254 range => [$CFG->{log_fontsize}, 0.5, 2, 0.1, 0.1],
235 tooltip => "The font size used by the server log window only", 255 tooltip => "The font size used by the server log window only",
236 connect_changed => sub { 256 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
237 $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = 0.1 * int $_[1] * 10);
238 }
239 ); 257 );
240 258
241 $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");
242 260
243 $table->add (1, $row++, new CFClient::UI::Slider 261 $table->add (1, $row++, new CFClient::UI::Slider
244 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1], 262 range => [$CFG->{stat_fontsize}, 0.5, 2, 0.1, 0.1],
245 tooltip => "The font size used by the statistics window only", 263 tooltip => "The font size used by the statistics window only",
246 connect_changed => sub { 264 connect_changed => sub {
247 $CFG->{stat_fontsize} = 0.1 * int $_[1] * 10; 265 $CFG->{stat_fontsize} = $_[1];
248 &set_stats_window_fontsize; 266 &set_stats_window_fontsize;
249 } 267 }
250 ); 268 );
251 269
252 $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");
253 $table->add (1, $row++, new CFClient::UI::Slider 271 $table->add (1, $row++, new CFClient::UI::Slider
254 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02], 272 range => [$CFG->{gauge_size}, 0.2, 0.8, 0.02],
255 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",
256 connect_changed => sub { 274 connect_changed => sub {
257 $CFG->{gauge_size} = $_[1]; 275 $CFG->{gauge_size} = $_[1];
258 my $h = int $HEIGHT * $CFG->{gauge_size}; 276 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
259 $GAUGES->{win}->set_size ($WIDTH, $h);
260 $GAUGES->{win}->move (0, $HEIGHT - $h);
261 } 277 }
262 ); 278 );
263 279
264 $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");
265 $table->add (1, $row++, new CFClient::UI::Slider 281 $table->add (1, $row++, new CFClient::UI::Slider
266 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1], 282 range => [$CFG->{gauge_fontsize}, 0.5, 2.0, 0.1, 0.1],
267 tooltip => "Adjusts the fontsize of the gauges at the bottom right", 283 tooltip => "Adjusts the fontsize of the gauges at the bottom right",
268 connect_changed => sub { 284 connect_changed => sub {
269 $CFG->{gauge_fontsize} = 0.1 * int $_[1] * 10; 285 $CFG->{gauge_fontsize} = $_[1];
270 &set_gauge_window_fontsize; 286 &set_gauge_window_fontsize;
271 } 287 }
272 ); 288 );
273 289
274 $table->add (1, $row++, new CFClient::UI::Button 290 $table->add (1, $row++, new CFClient::UI::Button
348# local $GAUGES->{win}{parent};#d# 364# local $GAUGES->{win}{parent};#d#
349# 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;
350} 366}
351 367
352sub make_gauge_window { 368sub make_gauge_window {
353 my $gh = int ($HEIGHT * $CFG->{gauge_size}); 369 my $gh = int $HEIGHT * $CFG->{gauge_size};
354# my $gw = int ($WIDTH * $CFG->{gauge_w_size});
355 370
356 my $win = new CFClient::UI::Frame ( 371 my $win = new CFClient::UI::Frame (
357 y => $HEIGHT - $gh, x => 0, user_w => $WIDTH, user_h => $gh 372 req_y => -1,
373 user_w => $WIDTH,
374 user_h => $gh,
358 ); 375 );
376
359 $win->add (my $hbox = new CFClient::UI::HBox 377 $win->add (my $hbox = new CFClient::UI::HBox
360 children => [ 378 children => [
361 (new CFClient::UI::HBox expand => 1), 379 (new CFClient::UI::HBox expand => 1),
362 ($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 ]),
363 (my $vbox = new CFClient::UI::VBox), 384 (my $vbox = new CFClient::UI::VBox),
364 ], 385 ],
365 ); 386 );
366 387
367 $vbox->add (new CFClient::UI::HBox 388 $vbox->add (new CFClient::UI::HBox
565 586
566} 587}
567 588
568sub metaserver_dialog { 589sub metaserver_dialog {
569 my $dialog = new CFClient::UI::FancyFrame 590 my $dialog = new CFClient::UI::FancyFrame
570 title => "Metaserver", 591 title => "Server List",
571 child => (my $vbox = new CFClient::UI::VBox); 592 child => (my $vbox = new CFClient::UI::VBox);
572 593
573 $vbox->add ($dialog->{table} = new CFClient::UI::Table); 594 $vbox->add ($dialog->{table} = new CFClient::UI::Table);
574 595
575 $dialog 596 $dialog
677 698
678 $METASERVER = metaserver_dialog; 699 $METASERVER = metaserver_dialog;
679 700
680 $vbox->add (new CFClient::UI::Flopper 701 $vbox->add (new CFClient::UI::Flopper
681 expand => 1, 702 expand => 1,
682 text => "Metaserver", 703 text => "Server List",
683 other => $METASERVER, 704 other => $METASERVER,
684 tooltip => "Show a list of avaible crossfire servers", 705 tooltip => "Show a list of available crossfire servers",
685 connect_open => sub { 706 connect_open => sub {
686 update_metaserver $HOST; 707 update_metaserver $HOST;
687 } 708 }
688 ); 709 );
689 } 710 }
710 ); 731 );
711 732
712 $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");
713 $table->add (1, 7, new CFClient::UI::Slider 734 $table->add (1, 7, new CFClient::UI::Slider
714 req_w => 100, 735 req_w => 100,
715 range => [$CFG->{mapsize}, 10, 100 + 1, 1], 736 range => [$CFG->{mapsize}, 10, 100 + 1, 1, 1],
716 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. "
717 ."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.",
718 connect_changed => sub { 739 connect_changed => sub {
719 my ($self, $value) = @_; 740 my ($self, $value) = @_;
720 741
721 $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 742 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
722 }, 743 },
723 ); 744 );
724 745
725 $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
726 start_game; 752 : start_game;
753 },
727 }); 754 );
728 755
729 $dialog 756 $dialog
730} 757}
731 758
732sub message_window { 759sub message_window {
782 809
783 $window 810 $window
784} 811}
785 812
786sub make_inventory_window { 813sub make_inventory_window {
787 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
788 $invwin->add (my $hb = new CFClient::UI::HBox); 817 $invwin->add (my $hb = new CFClient::UI::HBox);
789 $hb->add ($INV = new CFClient::UI::Inventory expand => 1); 818 $hb->add ($INV = new CFClient::UI::Inventory expand => 1);
790 $hb->add (my $rng = new CFClient::UI::Slider vertical => 1); 819 $hb->add ($INVR = new CFClient::UI::Inventory expand => 1);
791 $INV->set_range ($rng); 820
792 $invwin 821 $invwin
793} 822}
794 823
795sub sdl_init { 824sub sdl_init {
796 CFClient::SDL_Init 825 CFClient::SDL_Init
798} 827}
799 828
800sub video_init { 829sub video_init {
801 sdl_init; 830 sdl_init;
802 831
832 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} >= @SDL_MODES;
833
803 ($WIDTH, $HEIGHT) = @{ $SDL_MODES[$CFG->{sdl_mode}] }; 834 ($WIDTH, $HEIGHT) = @{ $SDL_MODES[$CFG->{sdl_mode}] };
804 $FULLSCREEN = $CFG->{fullscreen}; 835 $FULLSCREEN = $CFG->{fullscreen};
805 $FAST = $CFG->{fast}; 836 $FAST = $CFG->{fast};
806 837
807 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN 838 CFClient::SDL_SetVideoMode $WIDTH, $HEIGHT, $FULLSCREEN
808 or die "SDL_SetVideoMode failed!\n"; 839 or die "SDL_SetVideoMode failed!\n";
809 840
810 $SDL_ACTIVE = 1; 841 $SDL_ACTIVE = 1;
811
812 $LAST_REFRESH = time - 0.01; 842 $LAST_REFRESH = time - 0.01;
813 843
814 CFClient::gl_init; 844 CFClient::gl_init;
815 845
816 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; 846 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
817 847
848 $CFClient::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
849
818 ############################################################################# 850 #############################################################################
819 851
852 unless ($DEBUG_STATUS) {
853 # create the widgets
854
820 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100; 855 $DEBUG_STATUS = new CFClient::UI::Label padding => 0, z => 100, req_x => -1;
821 $DEBUG_STATUS->show; 856 $DEBUG_STATUS->show;
822 857
823 $STATUS_LINE = new CFClient::UI::Label 858 $STATUSBOX = new CFClient::UI::Statusbox;
824 padding => 0, 859 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]);
825 y => $HEIGHT - $FONTSIZE * 1.8;
826 $STATUS_LINE->show;
827 860
828 $ALT_ENTER_MESSAGE = new CFClient::UI::Label 861 (new CFClient::UI::Frame
829 padding => 0, 862 bg => [0, 0, 0, 0.4],
830 fontsize => 0.8, 863 req_y => -1,
831 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode"; 864 child => $STATUSBOX,
832 $ALT_ENTER_MESSAGE->show; 865 )->show;
833 $ALT_ENTER_MESSAGE->move (0, $HEIGHT - $ALT_ENTER_MESSAGE->{h});
834 866
835 CFClient::UI::FancyFrame->new ( 867 CFClient::UI::FancyFrame->new (
836 border_bg => [1, 1, 1, 192/255], 868 border_bg => [1, 1, 1, 192/255],
837 bg => [1, 1, 1, 0], 869 bg => [1, 1, 1, 0],
838 child => ($MAPMAP = new CFClient::MapWidget::MapMap), 870 child => ($MAPMAP = new CFClient::MapWidget::MapMap),
839 )->show; 871 )->show;
840 872
841 $MAPWIDGET = new CFClient::MapWidget; 873 $MAPWIDGET = new CFClient::MapWidget;
842 $MAPWIDGET->connect (activate_console => sub { 874 $MAPWIDGET->connect (activate_console => sub {
843 my ($mapwidget, $preset) = @_; 875 my ($mapwidget, $preset) = @_;
844 876
845 if ($CONSOLE) { 877 if ($CONSOLE) {
846 $CONSOLE->{input}->{auto_activated} = 1; 878 $CONSOLE->{input}->{auto_activated} = 1;
847 $CONSOLE->{input}->focus_in; 879 $CONSOLE->{input}->focus_in;
848 880
849 if ($preset && $CONSOLE->{input}->get_text eq '') { 881 if ($preset && $CONSOLE->{input}->get_text eq '') {
850 $CONSOLE->{input}->set_text ($preset); 882 $CONSOLE->{input}->set_text ($preset);
883 }
851 } 884 }
852 } 885 });
853 });
854 $MAPWIDGET->show; 886 $MAPWIDGET->show;
855 $MAPWIDGET->focus_in; 887 $MAPWIDGET->focus_in;
856 888
857 $BUTTONBAR = new CFClient::UI::HBox; 889 $BUTTONBAR = new CFClient::UI::HBox;
858 890
859 $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);
860 $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);
861 $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);
862 894
863 $CFClient::UI::ROOT->add (make_gauge_window); # 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
896
864 $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);
865 $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);
866 899
867 $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 {
868 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc"; 901 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc";
869 status "Configuration Saved"; 902 status "Configuration Saved";
870 }); 903 });
871 904
872 $BUTTONBAR->show; 905 $BUTTONBAR->show;
873 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 {
874 $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 }
875} 917}
876 918
877sub video_shutdown { 919sub video_shutdown {
878 $CFClient::UI::ROOT->{children} = [];
879 undef $CFClient::UI::GRAB;
880 undef $CFClient::UI::HOVER;
881 undef $SDL_ACTIVE; 920 undef $SDL_ACTIVE;
882} 921}
883 922
884my @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#
885my $bgmusic;#TODO#hack#d# 924my $bgmusic;#TODO#hack#d#
925
926sub audio_channel_finished {
927 my ($channel) = @_;
928
929 warn "channel $channel finished\n";#d#
930}
886 931
887sub audio_music_finished { 932sub audio_music_finished {
888 return unless $CFG->{bgm_enable}; 933 return unless $CFG->{bgm_enable};
889 934
890 # TODO: hack, do play loop and mood music 935 # TODO: hack, do play loop and mood music
894 push @bgmusic, shift @bgmusic; 939 push @bgmusic, shift @bgmusic;
895} 940}
896 941
897sub audio_init { 942sub audio_init {
898 if ($CFG->{audio_enable}) { 943 if ($CFG->{audio_enable}) {
899 if (open my $fh, "<:utf8", CFClient::find_rcfile "sounds/config") { 944 if (open my $fh, "<", CFClient::find_rcfile "sounds/config") {
900 $SDL_MIXER = !CFClient::Mix_OpenAudio; 945 $SDL_MIXER = !CFClient::Mix_OpenAudio;
901 CFClient::Mix_AllocateChannels 8; 946 CFClient::Mix_AllocateChannels 8;
902 CFClient::MixMusic::volume $CFG->{bgm_volume} * 128; 947 CFClient::MixMusic::volume $CFG->{bgm_volume} * 128;
903 948
904 audio_music_finished; 949 audio_music_finished;
931} 976}
932 977
933my %animate_object; 978my %animate_object;
934my $animate_timer; 979my $animate_timer;
935 980
936my $want_refresh;
937my $can_refresh;
938
939my $fps = 9; 981my $fps = 9;
940 982
941sub force_refresh { 983sub force_refresh {
942 $fps = $fps * 0.95 + 1 / ($NOW - $LAST_REFRESH) * 0.05; 984 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05;
943 debug sprintf "%3.2f", $fps; 985 debug sprintf "%3.2f", $fps;
944 986
945 $want_refresh = 0;
946 $can_refresh = 0;
947
948 $CFClient::UI::ROOT->draw; 987 $CFClient::UI::ROOT->draw;
949
950 CFClient::SDL_GL_SwapBuffers; 988 CFClient::SDL_GL_SwapBuffers;
951 989
990 $WANT_REFRESH = 0;
991 $CAN_REFRESH = 0;
952 $LAST_REFRESH = $NOW; 992 $LAST_REFRESH = $NOW;
953} 993}
954 994
955my $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 {
956 $NOW = time; 996 $NOW = time;
958 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 998 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
959 for CFClient::SDL_PollEvent; 999 for CFClient::SDL_PollEvent;
960 1000
961 if (%animate_object) { 1001 if (%animate_object) {
962 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 1002 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
963 $want_refresh++; 1003 $WANT_REFRESH++;
964 } 1004 }
965 1005
966 if ($want_refresh) { 1006 if ($WANT_REFRESH) {
967 force_refresh; 1007 force_refresh;
968 } else { 1008 } else {
969 $can_refresh = 1; 1009 $CAN_REFRESH = 1;
970 } 1010 }
971}); 1011});
972
973sub refresh {
974 $want_refresh++;
975}
976 1012
977sub animation_start { 1013sub animation_start {
978 my ($widget) = @_; 1014 my ($widget) = @_;
979 $animate_object{$widget} = $widget; 1015 $animate_object{$widget} = $widget;
980} 1016}
1292 [0.55, 0.41, 0.13], 1328 [0.55, 0.41, 0.13],
1293 [0.99, 0.77, 0.26], 1329 [0.99, 0.77, 0.26],
1294 [0.74, 0.65, 0.41], 1330 [0.74, 0.65, 0.41],
1295 ); 1331 );
1296 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
1297 $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);
1298} 1354}
1299 1355
1300sub conn::spell_add { 1356sub conn::spell_add {
1301 my ($self, $spell) = @_; 1357 my ($self, $spell) = @_;
1302 1358
1311} 1367}
1312 1368
1313sub conn::addme_success { 1369sub conn::addme_success {
1314 my ($self) = @_; 1370 my ($self) = @_;
1315 1371
1372 $MAPWIDGET->clr_commands;
1373
1316 for my $skill (values %{$self->{skill_info}}) { 1374 for my $skill (values %{$self->{skill_info}}) {
1317 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'"); 1375 $MAPWIDGET->add_command ("ready_skill $skill", "Ready the skill '$skill'");
1318 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'"); 1376 $MAPWIDGET->add_command ("use_skill $skill", "Immediately use the skill '$skill'");
1319 } 1377 }
1378
1379 $MAPWIDGET->add_command ("petmode defend", "Tell pets to stay close to you and defend you");
1380 $MAPWIDGET->add_command ("petmode arena", "Same as petmode sad, but also attack other players");
1381 $MAPWIDGET->add_command ("petmode sad", "Search &amp; Destroy - tell pets to roam about and attack enemies");
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.
1449}
1450
1451sub conn::eof {
1452 $MAPWIDGET->clr_commands;
1453
1454 stop_game;
1320} 1455}
1321 1456
1322sub update_floorbox { 1457sub update_floorbox {
1323 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub { 1458 $CFClient::UI::ROOT->on_refresh ($FLOORBOX => sub {
1459 return unless $CONN;
1460
1324 $FLOORBOX->clear; 1461 $FLOORBOX->clear;
1325 $FLOORBOX->add (new CFClient::UI::Empty expand => 1); 1462 $FLOORBOX->add (new CFClient::UI::Empty expand => 1);
1326 1463
1327 my @items = values %{ $CONN->{container}{0} }; 1464 my $count = 4;
1328 1465 for (@{ $CONN->{container}{0} }) {
1329 # we basically have to use the same sorting as everybody else 1466 if (--$count) {
1330 @items = sort { $a->{type} <=> $b->{type} } @items; 1467 $FLOORBOX->add (new CFClient::UI::InventoryItem item => $_);
1331 1468 } else {
1332 for my $item (reverse @items) { 1469 $FLOORBOX->add (new CFClient::UI::Label text => "More...");
1333 my $desc = $item->{nrof} < 2
1334 ? $item->{name}
1335 : "$item->{nrof} $item->{name_pl}";
1336 # todo: animation widget, face widget, weight(?) etc.
1337 $FLOORBOX->add (my $hbox = new CFClient::UI::HBox
1338 tooltip => (CFClient::UI::Label->escape ($desc)
1339 . "\n<small>leftclick - pick up\nmiddle click - apply\nrightclick - menu</small>"),
1340 can_hover => 1,
1341 can_events => 1,
1342 connect_button_down => sub {
1343 my ($self, $ev, $x, $y) = @_;
1344
1345 # todo: maybe put examine on 1? but should just be a tooltip :(
1346 if ($ev->{button} == 1) {
1347 $CONN->send ("move $CONN->{player}{tag} $item->{tag} 0");
1348 } elsif ($ev->{button} == 2) {
1349 $CONN->send ("apply $item->{tag}");
1350 } elsif ($ev->{button} == 3) {
1351 CFClient::UI::Menu->new (
1352 items => [
1353 ["examine", sub { $CONN->send ("examine $item->{tag}") }],
1354 [
1355 $item->{flags} & Crossfire::Protocol::F_LOCKED ? "lock" : "unlock",
1356 sub { $CONN->send ("lock $item->{tag}") },
1357 ],
1358 ["mark", sub { $CONN->send ("mark $item->{tag}") }],
1359 ["apply", sub { $CONN->send ("apply $item->{tag}") }],
1360 ],
1361 )->popup ($ev);
1362 }
1363
1364 1
1365 }, 1470 last;
1366 );
1367
1368 $hbox->add (new CFClient::UI::Face
1369 can_events => 0,
1370 face => $item->{face},
1371 anim => $item->{anim},
1372 animspeed => $item->{animspeed},
1373 );
1374 1471 }
1375 $hbox->add (new CFClient::UI::Label
1376 can_events => 0,
1377 text => $desc,
1378 );
1379 } 1472 }
1380 }); 1473 });
1381 refresh; 1474
1475 $WANT_REFRESH++;
1382} 1476}
1383 1477
1384sub conn::container_add { 1478sub conn::container_add {
1385 my ($self, $id, $items) = @_; 1479 my ($self, $tag, $items) = @_;
1386 1480
1387 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});
1388 if ($self->{player}{tag} == $id) { 1487 } elsif ($tag == $self->{player}{tag}) {
1389 $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});
1390 } 1492 }
1493
1391 # $self-<{player}{tag} => player inv 1494 # $self-<{player}{tag} => player inv
1392 #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}};
1393} 1496}
1394 1497
1395sub conn::container_clear { 1498sub conn::container_clear {
1396 my ($self, $id) = @_; 1499 my ($self, $tag) = @_;
1397 1500
1398 update_floorbox if $id == 0; 1501 #d# print "container_clear: container $tag ($self->{player}{tag})\n";
1399 if ($self->{player}{tag} == $id) { 1502
1503 if ($tag == 0) {
1504 update_floorbox;
1505 $OPENCONT = 0;
1400 $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});
1401 } 1512 }
1402 1513
1403# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0}; 1514# use PApp::Util; warn PApp::Util::dumpval $self->{container}{0};
1404} 1515}
1405 1516
1406sub conn::item_delete { 1517sub conn::item_delete {
1407 my ($self, @items) = @_; 1518 my ($self, @items) = @_;
1408 1519
1409 for (@items) { 1520 for (@items) {
1410 update_floorbox if $_->{container} == 0; 1521 #d# print "item_delete: $_->{tag} from $_->{container} ($self->{player}{tag})\n";
1411 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};
1412 $INV->set_items ($self->{container}{$_->{container}}); 1531 $INVR->set_items ($self->{container}{$_->{container}});
1413 } 1532 }
1414 } 1533 }
1415} 1534}
1416 1535
1417sub conn::item_update { 1536sub conn::item_update {
1418 my ($self, $item) = @_; 1537 my ($self, $item) = @_;
1419 1538
1420 update_floorbox if $item->{container} == 0; 1539 #d# print "item_update: $item->{tag} in $item->{container} ($self->{player}{tag}) ($OPENCONT)\n";
1421 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}) {
1422 $INV->set_items ($self->{container}{$item->{container}}); 1550 $INV->set_items ($self->{container}{$item->{container}})
1551 }
1423 } 1552 }
1424} 1553}
1425 1554
1426%SDL_CB = ( 1555%SDL_CB = (
1427 CFClient::SDL_QUIT => sub { 1556 CFClient::SDL_QUIT => sub {
1428 Event::unloop -1; 1557 Event::unloop -1;
1429 }, 1558 },
1430 CFClient::SDL_VIDEORESIZE => sub { 1559 CFClient::SDL_VIDEORESIZE => sub {
1431 }, 1560 },
1432 CFClient::SDL_VIDEOEXPOSE => \&refresh, 1561 CFClient::SDL_VIDEOEXPOSE => sub {
1562 $WANT_REFRESH++;
1563 },
1433 CFClient::SDL_ACTIVEEVENT => sub { 1564 CFClient::SDL_ACTIVEEVENT => sub {
1434# 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#
1435 }, 1566 },
1436 CFClient::SDL_KEYDOWN => sub { 1567 CFClient::SDL_KEYDOWN => sub {
1437 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1568 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1441 video_init; 1572 video_init;
1442 } else { 1573 } else {
1443 CFClient::UI::feed_sdl_key_down_event ($_[0]); 1574 CFClient::UI::feed_sdl_key_down_event ($_[0]);
1444 } 1575 }
1445 }, 1576 },
1446 CFClient::SDL_KEYUP => \&CFClient::UI::feed_sdl_key_up_event, 1577 CFClient::SDL_KEYUP => \&CFClient::UI::feed_sdl_key_up_event,
1447 CFClient::SDL_MOUSEMOTION => \&CFClient::UI::feed_sdl_motion_event, 1578 CFClient::SDL_MOUSEMOTION => \&CFClient::UI::feed_sdl_motion_event,
1448 CFClient::SDL_MOUSEBUTTONDOWN => \&CFClient::UI::feed_sdl_button_down_event, 1579 CFClient::SDL_MOUSEBUTTONDOWN => \&CFClient::UI::feed_sdl_button_down_event,
1449 CFClient::SDL_MOUSEBUTTONUP => \&CFClient::UI::feed_sdl_button_up_event, 1580 CFClient::SDL_MOUSEBUTTONUP => \&CFClient::UI::feed_sdl_button_up_event,
1450 CFClient::SDL_USEREVENT => \&audio_music_finished, 1581 CFClient::SDL_USEREVENT => sub {
1582 if ($_[0]{code} == 1) {
1583 audio_channel_finished $_[0]{data1};
1584 } elsif ($_[0]{code} == 0) {
1585 audio_music_finished;
1586 }
1587 },
1451); 1588);
1452 1589
1453############################################################################# 1590#############################################################################
1454 1591
1455$SIG{INT} = $SIG{TERM} = sub { exit }; 1592$SIG{INT} = $SIG{TERM} = sub { exit };
1456 1593
1457$TILECACHE = CFClient::db_table "tilecache";
1458$FACEMAP = CFClient::db_table "facemap";
1459
1460CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1461
1462my %DEF_CFG = (
1463 sdl_mode => 0,
1464 width => 640,
1465 height => 480,
1466 fullscreen => 0,
1467 fast => 0,
1468 map_scale => 0.5,
1469 fow_enable => 1,
1470 fow_intensity => 0.45,
1471 fow_smooth => 0,
1472 gui_fontsize => 1,
1473 log_fontsize => 1,
1474 gauge_fontsize => 1,
1475 gauge_size => 0.35,
1476 stat_fontsize => 1,
1477 mapsize => 100,
1478 host => "crossfire.schmorp.de",
1479 say_command => 'say',
1480 audio_enable => 1,
1481 bgm_enable => 1,
1482 bgm_volume => 0.25,
1483);
1484
1485while (my ($k, $v) = each %DEF_CFG) {
1486 $CFG->{$k} = $v unless exists $CFG->{$k};
1487}
1488
1489sdl_init;
1490
1491@SDL_MODES = reverse
1492 grep $_->[0] >= 640 && $_->[1] >= 480,
1493 CFClient::SDL_ListModes;
1494
1495@SDL_MODES or CFClient::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
1496
1497$CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
1498
1499{ 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 {
1500 my @fonts = map CFClient::find_rcfile "fonts/$_", qw( 1640 my @fonts = map CFClient::find_rcfile "fonts/$_", qw(
1501 DejaVuSans.ttf 1641 DejaVuSans.ttf
1502 DejaVuSansMono.ttf 1642 DejaVuSansMono.ttf
1503 DejaVuSans-Bold.ttf 1643 DejaVuSans-Bold.ttf
1504 DejaVuSansMono-Bold.ttf 1644 DejaVuSansMono-Bold.ttf
1505 DejaVuSans-Oblique.ttf 1645 DejaVuSans-Oblique.ttf
1506 DejaVuSansMono-Oblique.ttf 1646 DejaVuSansMono-Oblique.ttf
1507 DejaVuSans-BoldOblique.ttf 1647 DejaVuSans-BoldOblique.ttf
1508 DejaVuSansMono-BoldOblique.ttf 1648 DejaVuSansMono-BoldOblique.ttf
1509 ); 1649 );
1510 1650
1511 CFClient::add_font $_ for @fonts; 1651 CFClient::add_font $_ for @fonts;
1512 1652
1653 CFClient::pango_init;
1654
1513 $FONT_PROP = new_from_file CFClient::Font $fonts[0]; 1655 $FONT_PROP = new_from_file CFClient::Font $fonts[0];
1514 $FONT_FIXED = new_from_file CFClient::Font $fonts[1]; 1656 $FONT_FIXED = new_from_file CFClient::Font $fonts[1];
1515 1657
1516 $FONT_PROP->make_default; 1658 $FONT_PROP->make_default;
1517} 1659 }
1518 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
1519video_init; 1674 video_init;
1520audio_init; 1675 audio_init;
1676}
1521 1677
1522Event::loop; 1678Event::loop;
1523 1679
1524END { CFClient::SDL_Quit } 1680END { CFClient::SDL_Quit }
1525 1681

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines