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

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.15 by root, Sat May 27 19:49:07 2006 UTC vs.
Revision 1.29 by root, Mon May 29 21:54:16 2006 UTC

81our $LOGVIEW; 81our $LOGVIEW;
82our $CONSOLE; 82our $CONSOLE;
83our $METASERVER; 83our $METASERVER;
84our $LOGIN_BUTTON; 84our $LOGIN_BUTTON;
85our $QUIT_DIALOG; 85our $QUIT_DIALOG;
86our $SERVER_SETUP;
86 87
87our $FLOORBOX; 88our $FLOORBOX;
88our $GAUGES; 89our $GAUGES;
89our $STATWIDS; 90our $STATWIDS;
90 91
97 98
98our $ALT_ENTER_MESSAGE; 99our $ALT_ENTER_MESSAGE;
99our $STATUSBOX; 100our $STATUSBOX;
100our $DEBUG_STATUS; 101our $DEBUG_STATUS;
101 102
103our $INV_WINDOW;
102our $INV; 104our $INV;
103our $INVR; 105our $INVR;
104our $INVR_LBL; 106our $INV_RIGHT_HB;
107
108our $BIND_WINDOW;
105 109
106sub status { 110sub status {
107 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 111 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
108} 112}
109 113
113 $DEBUG_STATUS->move ($WIDTH - $w, 0); 117 $DEBUG_STATUS->move ($WIDTH - $w, 0);
114} 118}
115 119
116sub start_game { 120sub start_game {
117 status "logging in..."; 121 status "logging in...";
122
123 $LOGIN_BUTTON->set_text ("Logout");
124 $SERVER_SETUP->hide;
118 125
119 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 126 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
120 127
121 my ($host, $port) = split /:/, $CFG->{host}; 128 my ($host, $port) = split /:/, $CFG->{host};
122 129
151 }; 158 };
152 159
153 if ($CONN) { 160 if ($CONN) {
154 CFClient::lowdelay fileno $CONN->{fh}; 161 CFClient::lowdelay fileno $CONN->{fh};
155 162
156 $LOGIN_BUTTON->set_text ("Logout");
157 status "login successful"; 163 status "login successful";
158
159 $BUTTONBAR->{children}[1]->emit ("activate")
160 if $BUTTONBAR->{children}[1]->{state};
161
162 } else { 164 } else {
163 status "unable to connect"; 165 status "unable to connect";
164 stop_game(); 166 stop_game();
165 } 167 }
166} 168}
167 169
168sub stop_game { 170sub stop_game {
171 $LOGIN_BUTTON->set_text ("Login");
172 $SERVER_SETUP->show;
173 $INV_WINDOW->hide;
174 $LOGVIEW->hide;
175
169 return unless $CONN; 176 return unless $CONN;
170 177
171 status "connection closed"; 178 status "connection closed";
172 $LOGIN_BUTTON->set_text ("Login"); 179
173 $CONN->destroy; 180 $CONN->destroy;
174 $CONN = 0; # false, does not autovivify 181 $CONN = 0; # false, does not autovivify
175
176 $BUTTONBAR->{children}[1]->emit ("activate")
177 unless $BUTTONBAR->{children}[1]->{state};
178} 182}
179 183
180sub client_setup { 184sub client_setup {
181 my $dialog = new CFClient::UI::FancyFrame 185 my $dialog = new CFClient::UI::FancyFrame
186 req_x => 1,
187 req_y => $HEIGHT * (1/8),
188 name => "client_setup",
182 title => "Client Setup", 189 title => "Client Setup",
183 child => (my $vbox = new CFClient::UI::VBox); 190 child => (my $vbox = new CFClient::UI::VBox);
184 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 191 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
185 192
186 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); 193 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode");
201 208
202 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen"); 209 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen");
203 $table->add (1, $row++, new CFClient::UI::CheckBox 210 $table->add (1, $row++, new CFClient::UI::CheckBox
204 state => $CFG->{fullscreen}, 211 state => $CFG->{fullscreen},
205 tooltip => "Bring the client into fullscreen mode.", 212 tooltip => "Bring the client into fullscreen mode.",
206 connect_changed => sub { 213 on_changed => sub {
207 my ($self, $value) = @_; 214 my ($self, $value) = @_;
208 $CFG->{fullscreen} = $value; 215 $CFG->{fullscreen} = $value;
209 } 216 }
210 ); 217 );
211 218
212 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 219 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly");
213 $table->add (1, $row++, new CFClient::UI::CheckBox 220 $table->add (1, $row++, new CFClient::UI::CheckBox
214 state => $CFG->{fast}, 221 state => $CFG->{fast},
215 tooltip => "Lower the visual quality considerably to speed up rendering.", 222 tooltip => "Lower the visual quality considerably to speed up rendering.",
216 connect_changed => sub { 223 on_changed => sub {
217 my ($self, $value) = @_; 224 my ($self, $value) = @_;
218 $CFG->{fast} = $value; 225 $CFG->{fast} = $value;
219 } 226 }
220 ); 227 );
221 228
222 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); 229 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale");
223 $table->add (1, $row++, new CFClient::UI::Slider 230 $table->add (1, $row++, new CFClient::UI::Slider
224 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 231 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
225 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 232 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
226 connect_changed => sub { 233 on_changed => sub {
227 my ($self, $value) = @_; 234 my ($self, $value) = @_;
228 $CFG->{map_scale} = 2 ** $value; 235 $CFG->{map_scale} = 2 ** $value;
229 } 236 }
230 ); 237 );
231 238
232 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War"); 239 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War");
233 $table->add (1, $row++, new CFClient::UI::CheckBox 240 $table->add (1, $row++, new CFClient::UI::CheckBox
234 state => $CFG->{fow_enable}, 241 state => $CFG->{fow_enable},
235 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 242 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
236 connect_changed => sub { 243 on_changed => sub {
237 my ($self, $value) = @_; 244 my ($self, $value) = @_;
238 $CFG->{fow_enable} = $value; 245 $CFG->{fow_enable} = $value;
239 } 246 }
240 ); 247 );
241 248
242 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity"); 249 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity");
243 $table->add (1, $row++, new CFClient::UI::Slider 250 $table->add (1, $row++, new CFClient::UI::Slider
244 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 251 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
245 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", 252 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.",
246 connect_changed => sub { 253 on_changed => sub {
247 my ($self, $value) = @_; 254 my ($self, $value) = @_;
248 $CFG->{fow_intensity} = $value; 255 $CFG->{fow_intensity} = $value;
249 } 256 }
250 ); 257 );
251 258
252 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth"); 259 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth");
253 $table->add (1, $row++, new CFClient::UI::CheckBox 260 $table->add (1, $row++, new CFClient::UI::CheckBox
254 state => $CFG->{fow_smooth}, 261 state => $CFG->{fow_smooth},
255 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.", 262 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.",
256 connect_changed => sub { 263 on_changed => sub {
257 my ($self, $value) = @_; 264 my ($self, $value) = @_;
258 $CFG->{fow_smooth} = $value; 265 $CFG->{fow_smooth} = $value;
259 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2; 266 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2;
260 } 267 }
261 ); 268 );
262 269
263 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 270 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize");
264 $table->add (1, $row++, new CFClient::UI::Slider 271 $table->add (1, $row++, new CFClient::UI::Slider
265 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 272 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
266 tooltip => "The base font size used by most GUI elements that do not have their own setting.", 273 tooltip => "The base font size used by most GUI elements that do not have their own setting.",
267 connect_changed => sub { $CFG->{gui_fontsize} = $_[1] }, 274 on_changed => sub { $CFG->{gui_fontsize} = $_[1] },
268 ); 275 );
269 276
270 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 277 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize");
271 $table->add (1, $row++, new CFClient::UI::Slider 278 $table->add (1, $row++, new CFClient::UI::Slider
272 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 279 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
273 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.", 280 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.",
274 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) }, 281 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
275 ); 282 );
276 283
277 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); 284 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
278 285
279 $table->add (1, $row++, new CFClient::UI::Slider 286 $table->add (1, $row++, new CFClient::UI::Slider
280 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1], 287 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1],
281 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.", 288 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.",
282 connect_changed => sub { 289 on_changed => sub {
283 $CFG->{stat_fontsize} = $_[1]; 290 $CFG->{stat_fontsize} = $_[1];
284 &set_stats_window_fontsize; 291 &set_stats_window_fontsize;
285 } 292 }
286 ); 293 );
287 294
288 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 295 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
289 $table->add (1, $row++, new CFClient::UI::Slider 296 $table->add (1, $row++, new CFClient::UI::Slider
290 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 297 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
291 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", 298 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
292 connect_changed => sub { 299 on_changed => sub {
293 $CFG->{gauge_fontsize} = $_[1]; 300 $CFG->{gauge_fontsize} = $_[1];
294 &set_gauge_window_fontsize; 301 &set_gauge_window_fontsize;
295 } 302 }
296 ); 303 );
297 304
298 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size"); 305 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size");
299 $table->add (1, $row++, new CFClient::UI::Slider 306 $table->add (1, $row++, new CFClient::UI::Slider
300 range => [$CFG->{gauge_size}, 0.2, 0.8], 307 range => [$CFG->{gauge_size}, 0.2, 0.8],
301 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", 308 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.",
302 connect_changed => sub { 309 on_changed => sub {
303 $CFG->{gauge_size} = $_[1]; 310 $CFG->{gauge_size} = $_[1];
304 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 311 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
305 } 312 }
306 ); 313 );
307 314
308 $table->add (1, $row++, new CFClient::UI::Button 315 $table->add (1, $row++, new CFClient::UI::Button
309 expand => 1, align => 0, text => "Apply", 316 expand => 1, align => 0, text => "Apply",
310 tooltip => "Apply the video settings", 317 tooltip => "Apply the video settings",
311 connect_activate => sub { 318 on_activate => sub {
312 video_shutdown (); 319 video_shutdown ();
313 video_init (); 320 video_init ();
314 } 321 }
315 ); 322 );
316 323
317 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable"); 324 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable");
318 $table->add (1, $row++, new CFClient::UI::CheckBox 325 $table->add (1, $row++, new CFClient::UI::CheckBox
319 state => $CFG->{audio_enable}, 326 state => $CFG->{audio_enable},
320 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", 327 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.",
321 connect_changed => sub { 328 on_changed => sub {
322 $CFG->{audio_enable} = $_[1]; 329 $CFG->{audio_enable} = $_[1];
323 } 330 }
324 ); 331 );
325# $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Effects Volume"); 332# $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Effects Volume");
326# $table->add (1, 8, new CFClient::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], connect_changed => sub { 333# $table->add (1, 8, new CFClient::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
327# $CFG->{effects_volume} = $_[1]; 334# $CFG->{effects_volume} = $_[1];
328# }); 335# });
329 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Background Music"); 336 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Background Music");
330 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox); 337 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox);
331 $hbox->add (new CFClient::UI::CheckBox 338 $hbox->add (new CFClient::UI::CheckBox
332 expand => 1, state => $CFG->{bgm_enable}, 339 expand => 1, state => $CFG->{bgm_enable},
333 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 340 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
334 connect_changed => sub { 341 on_changed => sub {
335 $CFG->{bgm_enable} = $_[1]; 342 $CFG->{bgm_enable} = $_[1];
336 } 343 }
337 ); 344 );
338 $hbox->add (new CFClient::UI::Slider 345 $hbox->add (new CFClient::UI::Slider
339 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 346 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
340 tooltip => "The volume of the background music. Changes are instant.", 347 tooltip => "The volume of the background music. Changes are instant.",
341 connect_changed => sub { 348 on_changed => sub {
342 $CFG->{bgm_volume} = $_[1]; 349 $CFG->{bgm_volume} = $_[1];
343 CFClient::MixMusic::volume $_[1] * 128; 350 CFClient::MixMusic::volume $_[1] * 128;
344 } 351 }
345 ); 352 );
346 353
347 $table->add (1, $row++, new CFClient::UI::Button 354 $table->add (1, $row++, new CFClient::UI::Button
348 expand => 1, align => 0, text => "Apply", 355 expand => 1, align => 0, text => "Apply",
349 tooltip => "Apply the audio settings", 356 tooltip => "Apply the audio settings",
350 connect_activate => sub { 357 on_activate => sub {
351 audio_shutdown (); 358 audio_shutdown ();
352 audio_init (); 359 audio_init ();
353 } 360 }
354 ); 361 );
355 362
357 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry 364 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry
358 text => $CFG->{say_command}, 365 text => $CFG->{say_command},
359 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. " 366 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. "
360 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 367 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
361 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 368 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
362 connect_changed => sub { 369 on_changed => sub {
363 my ($self, $value) = @_; 370 my ($self, $value) = @_;
364 $CFG->{say_command} = $value; 371 $CFG->{say_command} = $value;
365 } 372 }
366 ); 373 );
367 374
382 389
383sub make_gauge_window { 390sub make_gauge_window {
384 my $gh = int $HEIGHT * $CFG->{gauge_size}; 391 my $gh = int $HEIGHT * $CFG->{gauge_size};
385 392
386 my $win = new CFClient::UI::Frame ( 393 my $win = new CFClient::UI::Frame (
394 req_x => 0,
387 req_y => -1, 395 req_y => -1,
388 user_w => $WIDTH, 396 def_w => $WIDTH,
389 user_h => $gh, 397 def_h => $gh,
390 ); 398 );
391 399
392 $win->add (my $hbox = new CFClient::UI::HBox 400 $win->add (my $hbox = new CFClient::UI::HBox
393 children => [ 401 children => [
394 (new CFClient::UI::HBox expand => 1), 402 (new CFClient::UI::HBox expand => 1),
430 &set_gauge_window_fontsize; 438 &set_gauge_window_fontsize;
431 439
432 $win 440 $win
433} 441}
434 442
443
435sub make_stats_window { 444sub make_stats_window {
436 my $tgw = new CFClient::UI::FancyFrame title => "Stats"; 445 my $tgw = new CFClient::UI::FancyFrame
446 req_y => $HEIGHT * (2/8),
447 req_x => -1,
448 title => "Stats",
449 name => "stats_window";
437 450
438 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox); 451 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox);
439 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 452 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
440 can_hover => 1, can_events => 1, 453 can_hover => 1, can_events => 1,
441 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 454 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
688 $m = [$users, $host, $uptime, $version, $desc]; 701 $m = [$users, $host, $uptime, $version, $desc];
689 702
690 $y++; 703 $y++;
691 704
692 $table->add (0, $y, new CFClient::UI::VBox children => [ 705 $table->add (0, $y, new CFClient::UI::VBox children => [
693 (new CFClient::UI::Button text => "Use", connect_activate => sub { 706 (new CFClient::UI::Button text => "Use", on_activate => sub {
694 $HOST->set_text ($CFG->{host} = $host); 707 $HOST->set_text ($CFG->{host} = $host);
695 }), 708 }),
696 (new CFClient::UI::Empty expand => 1), 709 (new CFClient::UI::Empty expand => 1),
697 ]); 710 ]);
698 711
703 } 716 }
704 }); 717 });
705} 718}
706 719
707sub server_setup { 720sub server_setup {
708 my $dialog = new CFClient::UI::FancyFrame 721 my $dialog = $SERVER_SETUP = new CFClient::UI::FancyFrame
722 x => $WIDTH * (1/3),
723 y => $HEIGHT * (1/8),
724 name => "server_setup",
709 title => "Server Setup", 725 title => "Server Setup",
710 child => (my $vbox = new CFClient::UI::VBox); 726 child => (my $vbox = new CFClient::UI::VBox),
727 on_visibility_change => sub {
728 my ($self, $visible) = @_;
729 $self->center if $visible;
730 },
711 731 ;
732
712 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 733 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
713 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port"); 734 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port");
714 735
715 { 736 {
716 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 737 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
718 $vbox->add ( 739 $vbox->add (
719 my $HOST = new CFClient::UI::Entry 740 my $HOST = new CFClient::UI::Entry
720 expand => 1, 741 expand => 1,
721 text => $CFG->{host}, 742 text => $CFG->{host},
722 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", 743 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to",
723 connect_changed => sub { 744 on_changed => sub {
724 my ($self, $value) = @_; 745 my ($self, $value) = @_;
725 $CFG->{host} = $value; 746 $CFG->{host} = $value;
726 } 747 }
727 ); 748 );
728 749
731 $vbox->add (new CFClient::UI::Flopper 752 $vbox->add (new CFClient::UI::Flopper
732 expand => 1, 753 expand => 1,
733 text => "Server List", 754 text => "Server List",
734 other => $METASERVER, 755 other => $METASERVER,
735 tooltip => "Show a list of available crossfire servers", 756 tooltip => "Show a list of available crossfire servers",
736 connect_open => sub { 757 on_open => sub {
737 update_metaserver $HOST; 758 update_metaserver $HOST;
738 } 759 }
739 ); 760 );
740 } 761 }
741 762
742 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); 763 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username");
743 $table->add (1, 4, new CFClient::UI::Entry 764 $table->add (1, 4, new CFClient::UI::Entry
744 text => $CFG->{user}, 765 text => $CFG->{user},
745 tooltip => "The name of your character on the server", 766 tooltip => "The name of your character on the server",
746 connect_changed => sub { 767 on_changed => sub {
747 my ($self, $value) = @_; 768 my ($self, $value) = @_;
748 $CFG->{user} = $value; 769 $CFG->{user} = $value;
749 } 770 }
750 ); 771 );
751 772
752 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); 773 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password");
753 $table->add (1, 5, new CFClient::UI::Entry 774 $table->add (1, 5, new CFClient::UI::Entry
754 text => $CFG->{password}, 775 text => $CFG->{password},
755 hidden => 1, 776 hidden => 1,
756 tooltip => "The password for your character", 777 tooltip => "The password for your character",
757 connect_changed => sub { 778 on_changed => sub {
758 my ($self, $value) = @_; 779 my ($self, $value) = @_;
759 $CFG->{password} = $value; 780 $CFG->{password} = $value;
760 } 781 }
761 ); 782 );
762 783
766 range => [$CFG->{mapsize}, 10, 100, 0, 1], 787 range => [$CFG->{mapsize}, 10, 100, 0, 1],
767 tooltip => "This is the size of the portion of the map update the server sends you. " 788 tooltip => "This is the size of the portion of the map update the server sends you. "
768 . "If you set this to a high value you will be able to see further, " 789 . "If you set this to a high value you will be able to see further, "
769 . "but you also increase bandwidth requirements and latency. " 790 . "but you also increase bandwidth requirements and latency. "
770 . "This option is only used once at log-in.", 791 . "This option is only used once at log-in.",
771 connect_changed => sub { 792 on_changed => sub {
772 my ($self, $value) = @_; 793 my ($self, $value) = @_;
773 794
774 $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 795 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
775 }, 796 },
776 ); 797 );
783 . "This might increase or create lag, but increases the chances " 804 . "This might increase or create lag, but increases the chances "
784 . "of faces being ready for display when you encounter them. " 805 . "of faces being ready for display when you encounter them. "
785 . "It also uses up server bandwidth on every connect, " 806 . "It also uses up server bandwidth on every connect, "
786 . "so only set it if you really need to prefetch images. " 807 . "so only set it if you really need to prefetch images. "
787 . "This option can be set and unset any time.", 808 . "This option can be set and unset any time.",
788 connect_changed => sub { $CFG->{face_prefetch} = $_[1] }, 809 on_changed => sub { $CFG->{face_prefetch} = $_[1] },
789 ); 810 );
790 811
791 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count"); 812 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count");
792 $table->add (1, 9, new CFClient::UI::Entry 813 $table->add (1, 9, new CFClient::UI::Entry
793 text => $CFG->{output_count}, 814 text => $CFG->{output_count},
794 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 815 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
795 connect_changed => sub { $CFG->{output_count} = $_[1] }, 816 on_changed => sub { $CFG->{output_count} = $_[1] },
796 ); 817 );
797 818
798 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync"); 819 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync");
799 $table->add (1, 10, new CFClient::UI::Entry 820 $table->add (1, 10, new CFClient::UI::Entry
800 text => $CFG->{output_sync}, 821 text => $CFG->{output_sync},
801 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 822 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
802 connect_changed => sub { $CFG->{output_sync} = $_[1] }, 823 on_changed => sub { $CFG->{output_sync} = $_[1] },
803 ); 824 );
804 825
805 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 826 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
806 expand => 1, 827 expand => 1,
807 align => 0, 828 align => 0,
808 text => "Login", 829 text => "Login",
809 connect_activate => sub { 830 on_activate => sub {
810 $CONN ? stop_game 831 $CONN ? stop_game
811 : start_game; 832 : start_game;
812 }, 833 },
813 ); 834 );
814 835
815 $dialog 836 $dialog
816} 837}
817 838
818sub message_window { 839sub message_window {
819 my $window = new CFClient::UI::FancyFrame 840 my $window = new CFClient::UI::FancyFrame
841 name => "message_window",
820 title => "Messages", 842 title => "Messages",
821 border_bg => [1, 1, 1, 1], 843 border_bg => [1, 1, 1, 1],
822 bg => [0, 0, 0, 0.75], 844 bg => [0, 0, 0, 0.75],
845 req_x => -1,
846 req_y => 0,
823 user_w => int $::WIDTH / 3, 847 def_w => int $::WIDTH / 3,
824 user_h => int $::HEIGHT / 5, 848 def_h => int $::HEIGHT / 5,
825 child => (my $vbox = new CFClient::UI::VBox); 849 child => (my $vbox = new CFClient::UI::VBox);
826 850
827 $vbox->add ($LOGVIEW); 851 $vbox->add ($LOGVIEW);
828 852
829 $vbox->add (my $input = new CFClient::UI::Entry 853 $vbox->add (my $input = new CFClient::UI::Entry
830 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> " 854 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> "
831 . "from the client setup will be prepended (e.g. <b>shout</b>, <b>chat</b>...). " 855 . "from the client setup will be prepended (e.g. <b>shout</b>, <b>chat</b>...). "
832 . "If you prepend a slash (/), you will submit a command instead (similar to IRC). " 856 . "If you prepend a slash (/), you will submit a command instead (similar to IRC). "
833 . "A better way to submit commands (and the occasional chat command) is often the map command completer.", 857 . "A better way to submit commands (and the occasional chat command) is often the map command completer.",
834 connect_focus_in => sub { 858 on_focus_in => sub {
835 my ($input, $prev_focus) = @_; 859 my ($input, $prev_focus) = @_;
836 860
837 delete $input->{refocus_map}; 861 delete $input->{refocus_map};
838 862
839 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 863 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
840 $input->{refocus_map} = 1; 864 $input->{refocus_map} = 1;
841 } 865 }
842 delete $input->{auto_activated}; 866 delete $input->{auto_activated};
843 }, 867 },
844 connect_activate => sub { 868 on_activate => sub {
845 my ($input, $text) = @_; 869 my ($input, $text) = @_;
846 $input->set_text (''); 870 $input->set_text ('');
847 871
872 if ($text =~ /^\/bind\s+(.*)$/) {
873 CFClient::Recorder::open_binding_dialog ([$1]);
848 if ($text =~ /^\/(.*)/) { 874 } elsif ($text =~ /^\/(.*)/) {
849 $::CONN->user_send ($1); 875 $::CONN->user_send ($1);
850 } else { 876 } else {
851 my $say_cmd = $::CFG->{say_command} || 'say'; 877 my $say_cmd = $::CFG->{say_command} || 'say';
852 $::CONN->user_send ("$say_cmd $text"); 878 $::CONN->user_send ("$say_cmd $text");
853 } 879 }
854 if ($input->{refocus_map}) { 880 if ($input->{refocus_map}) {
855 delete $input->{refocus_map}; 881 delete $input->{refocus_map};
856 $MAPWIDGET->focus_in 882 $MAPWIDGET->focus_in
857 } 883 }
858 }, 884 },
859 connect_escape => sub { 885 on_escape => sub {
860 $MAPWIDGET->focus_in 886 $MAPWIDGET->focus_in
861 }, 887 },
862 ); 888 );
863 889
864 $CONSOLE = { 890 $CONSOLE = {
869 $window 895 $window
870} 896}
871 897
872sub open_quit_dialog { 898sub open_quit_dialog {
873 unless ($QUIT_DIALOG) { 899 unless ($QUIT_DIALOG) {
874
875 $QUIT_DIALOG = new CFClient::UI::FancyFrame title => "Really Quit?"; 900 $QUIT_DIALOG = new CFClient::UI::FancyFrame title => "Really Quit?";
876 901
877 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); 902 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1);
878 903
879 $vb->add (new CFClient::UI::Label 904 $vb->add (new CFClient::UI::Label
883 ); 908 );
884 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 909 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
885 $hb->add (new CFClient::UI::Button 910 $hb->add (new CFClient::UI::Button
886 text => "Ok", 911 text => "Ok",
887 expand => 1, 912 expand => 1,
888 connect_activate => sub { $QUIT_DIALOG->hide }, 913 on_activate => sub { $QUIT_DIALOG->hide },
889 ); 914 );
890 $hb->add (new CFClient::UI::Button 915 $hb->add (new CFClient::UI::Button
891 text => "Quit anyway", 916 text => "Quit anyway",
892 expand => 1, 917 expand => 1,
893 connect_activate => sub { exit }, 918 on_activate => sub { exit },
894 ); 919 );
920 }
895 921
922 $QUIT_DIALOG->show;
896 $QUIT_DIALOG->show_centered; 923 $QUIT_DIALOG->center;
897 } else {
898 $QUIT_DIALOG->show_centered;
899 }
900} 924}
901 925
902sub make_inventory_window { 926sub make_inventory_window {
903 my $invwin = new CFClient::UI::FancyFrame 927 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
904 user_w => $WIDTH * (7/8), user_h => $HEIGHT * (7/8), title => "Inventory"; 928 def_w => $WIDTH * 7/8,
905 929 def_h => $HEIGHT * 7/8,
906 $invwin->add (my $hb = new CFClient::UI::HBox expand => 1); 930 title => "Inventory",
907 931 name => "inventory_window",
908 $hb->add (my $vb1 = new CFClient::UI::VBox expand => 1); 932 on_visibility_change => sub {
909 $vb1->add (my $lbl = new CFClient::UI::Label align => 0); 933 my ($self, $visible) = @_;
910 $lbl->set_text ("Player"); 934 $self->center if $visible;
911 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1);
912
913 $hb->add (my $vb2 = new CFClient::UI::VBox expand => 1);
914 $vb2->add (my $hb2 = new CFClient::UI::HBox);
915 $hb2->add (new CFClient::UI::Button
916 text => "Close",
917 tooltip => "Close the currently open container (if one is open)",
918 connect_activate => sub {
919 $CONN->send ("apply $CONN->{open_container}")
920 if $CONN->{open_container} != 0;
921 }, 935 },
922 ); 936 ;
923 $hb2->add ($INVR_LBL = new CFClient::UI::Label align => 0);
924 937
925 $INVR_LBL->set_text ("Floor"); 938 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
939
940 $hb->add (my $vb1 = new CFClient::UI::VBox);
941 $vb1->add (new CFClient::UI::Label align => 0, text => "Player");
942 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1);
943
944 $hb->add (my $vb2 = new CFClient::UI::VBox);
945
946 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox);
947
926 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1); 948 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1);
927 949
950 # XXX: Call after $INVR = ... because set_opencont sets the items
951 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
952
928 $invwin 953 $invwin
954}
955
956sub make_binding_window {
957 my $binding_list = new CFClient::UI::VBox;
958
959 my $refresh = sub {
960 $binding_list->clear ();
961
962 for my $mod (keys %{$::CFG->{bindings}}) {
963 for my $sym (keys %{$::CFG->{bindings}->{$mod}}) {
964 my $cmds = $::CFG->{bindings}->{$mod}->{$sym};
965 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
966
967 my $lbl = join "; ", @$cmds;
968 my $nam = CFClient::Recorder::keycombo_to_name ($mod, $sym);
969 $binding_list->add (my $hb = new CFClient::UI::HBox);
970 $hb->add (new CFClient::UI::Button
971 text => "delete",
972 on_activate => sub {
973 $binding_list->remove ($hb);
974 delete $::CFG->{bindings}->{$mod}->{$sym};
975 });
976 $hb->add (new CFClient::UI::Label text => "($nam)");
977 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
978 }
979 }
980 };
981
982 $BIND_WINDOW = new CFClient::UI::FancyFrame
983 title => "Bindings",
984 def_w => int $WIDTH * 7/8,
985 def_h => int $HEIGHT * 7/8,
986 on_visibility_change => sub {
987 my ($self, $visible) = @_;
988 if ($visible) {
989 $self->center;
990 $refresh->()
991 }
992 };
993
994 $BIND_WINDOW->add ($binding_list);
995 $refresh->();
996 $BIND_WINDOW
929} 997}
930 998
931sub make_help_window { 999sub make_help_window {
932 my $win = new CFClient::UI::FancyFrame 1000 my $win = new CFClient::UI::FancyFrame
933 user_w => $WIDTH * (7/8), user_h => $HEIGHT * (7/8), title => "Documentation"; 1001 def_w => int $WIDTH * 7/8,
1002 def_h => int $HEIGHT * 7/8,
1003 title => "Documentation";
934 1004
935 $win->add (my $vbox = new CFClient::UI::VBox); 1005 $win->add (my $vbox = new CFClient::UI::VBox);
936 1006
937 $vbox->add (my $buttons = new CFClient::UI::HBox); 1007 $vbox->add (my $buttons = new CFClient::UI::HBox);
938 $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8); 1008 $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8);
945 ) { 1015 ) {
946 my ($pod, $label) = @$_; 1016 my ($pod, $label) = @$_;
947 1017
948 $buttons->add (new CFClient::UI::Button 1018 $buttons->add (new CFClient::UI::Button
949 text => $label, 1019 text => $label,
950 connect_activate => sub { 1020 on_activate => sub {
951 my $parser = new Pod::POM; 1021 my $parser = new Pod::POM;
952 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod"); 1022 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod");
953 1023
954 $viewer->clear; 1024 $viewer->clear;
955 1025
1063 tooltip => "Toggles the inventory window, where you can manage your loot (or treaures :)."); 1133 tooltip => "Toggles the inventory window, where you can manage your loot (or treaures :).");
1064 1134
1065 $BUTTONBAR->add (new CFClient::UI::Button 1135 $BUTTONBAR->add (new CFClient::UI::Button
1066 text => "Save Config", 1136 text => "Save Config",
1067 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1137 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1068 connect_activate => sub { 1138 on_activate => sub {
1139 $::CFG->{layout} = CFClient::UI::get_layout;
1069 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc"; 1140 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc";
1070 status "Configuration Saved"; 1141 status "Configuration Saved";
1071 }, 1142 },
1072 ); 1143 );
1073 1144
1074 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, 1145 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window,
1075 tooltip => "View Documentation"); 1146 tooltip => "View Documentation");
1076 1147
1148 $BUTTONBAR->add (new CFClient::UI::Flopper
1149 text => "Bindings",
1150 other => make_binding_window,
1151 tooltip => "Lets you delete bindings you have made with the recorder"
1152 );
1153 $BUTTONBAR->add (new CFClient::UI::Flopper text => "[Rec]", other => CFClient::Recorder::make_window,
1154 tooltip => "This feature lets you record a series of actions (eg. walking a path or ready a skill) and bind them to keys");
1155
1077 $BUTTONBAR->add (new CFClient::UI::Button 1156 $BUTTONBAR->add (new CFClient::UI::Button
1078 text => "Quit", 1157 text => "Quit",
1079 tooltip => "Terminates the program", 1158 tooltip => "Terminates the program",
1080 connect_activate => sub { 1159 on_activate => sub {
1081 if ($CONN) { 1160 if ($CONN) {
1082 open_quit_dialog; 1161 open_quit_dialog;
1083 } else { 1162 } else {
1084 exit; 1163 exit;
1085 } 1164 }
1088 1167
1089 $BUTTONBAR->show; 1168 $BUTTONBAR->show;
1090 1169
1091 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1170 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1092 1171
1093 # delay till geometry is constant 1172 $SERVER_SETUP->show;
1094 $CFClient::UI::ROOT->on_post_alloc (startup => sub {
1095 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup
1096 my $widget = $GAUGES->{win};
1097 $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel
1098 });
1099 force_refresh ();
1100 } 1173 }
1101} 1174}
1102 1175
1103sub video_shutdown { 1176sub video_shutdown {
1104 undef $SDL_ACTIVE; 1177 undef $SDL_ACTIVE;
1314############################################################################# 1387#############################################################################
1315 1388
1316$SIG{INT} = $SIG{TERM} = sub { exit }; 1389$SIG{INT} = $SIG{TERM} = sub { exit };
1317 1390
1318{ 1391{
1319 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] }; 1392 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] if defined $^S && !$^S };
1320 1393
1321 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc"; 1394 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1395 CFClient::UI::set_layout ($::CFG->{layout});
1322 1396
1323 my %DEF_CFG = ( 1397 my %DEF_CFG = (
1324 sdl_mode => 0, 1398 sdl_mode => 0,
1325 width => 640, 1399 width => 640,
1326 height => 480, 1400 height => 480,
1403 1477
1404END { CFClient::SDL_Quit } 1478END { CFClient::SDL_Quit }
1405 1479
1406=head1 NAME 1480=head1 NAME
1407 1481
1408pclient - A Crossfire+ and Crossfire game client 1482cfplus - A Crossfire+ and Crossfire game client
1409 1483
1410=head1 SYNOPSIS 1484=head1 SYNOPSIS
1411 1485
1412Just run it - no commandline arguments are supported. 1486Just run it - no commandline arguments are supported.
1413 1487
1414=head1 USAGE 1488=head1 USAGE
1415 1489
1416Pclient utilises OpenGL for all UI elements and the game. It is supposed to be used 1490cfplus utilises OpenGL for all UI elements and the game. It is supposed to be used
1417fullscreen and interactively. 1491fullscreen and interactively.
1418 1492
1419=head1 AUTHOR 1493=head1 AUTHOR
1420 1494
1421Marc Lehmann <crossfire@schmorp.de>, Robin Redeker <elmex@ta-sa.org> 1495Marc Lehmann <crossfire@schmorp.de>, Robin Redeker <elmex@ta-sa.org>

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines