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.11 by root, Fri May 26 18:56:14 2006 UTC vs.
Revision 1.27 by elmex, Mon May 29 20:22:33 2006 UTC

29use Time::HiRes 'time'; 29use Time::HiRes 'time';
30use Pod::POM; 30use Pod::POM;
31use Event; 31use Event;
32 32
33use Crossfire; 33use Crossfire;
34use Crossfire::Protocol::Base; 34use Crossfire::Protocol::Constants;
35 35
36use Compress::LZF; 36use Compress::LZF;
37 37
38use CFClient; 38use CFClient;
39use CFClient::OpenGL (); 39use CFClient::OpenGL ();
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
102our $INVWIN; 103our $INV_WINDOW;
103our $INV; 104our $INV;
104our $INVR; 105our $INVR;
105our $INVR_LBL; 106our $INV_RIGHT_HB;
107
108our $BIND_WINDOW;
106 109
107sub status { 110sub status {
108 $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]);
109} 112}
110 113
114 $DEBUG_STATUS->move ($WIDTH - $w, 0); 117 $DEBUG_STATUS->move ($WIDTH - $w, 0);
115} 118}
116 119
117sub start_game { 120sub start_game {
118 status "logging in..."; 121 status "logging in...";
122
123 $LOGIN_BUTTON->set_text ("Logout");
124 $SERVER_SETUP->hide;
119 125
120 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;
121 127
122 my ($host, $port) = split /:/, $CFG->{host}; 128 my ($host, $port) = split /:/, $CFG->{host};
123 129
152 }; 158 };
153 159
154 if ($CONN) { 160 if ($CONN) {
155 CFClient::lowdelay fileno $CONN->{fh}; 161 CFClient::lowdelay fileno $CONN->{fh};
156 162
157 $LOGIN_BUTTON->set_text ("Logout");
158 status "login successful"; 163 status "login successful";
159
160 $BUTTONBAR->{children}[1]->emit ("activate")
161 if $BUTTONBAR->{children}[1]->{state};
162
163 } else { 164 } else {
164 status "unable to connect"; 165 status "unable to connect";
165 stop_game(); 166 stop_game();
166 } 167 }
167} 168}
168 169
169sub stop_game { 170sub stop_game {
171 $LOGIN_BUTTON->set_text ("Login");
172 $SERVER_SETUP->show;
173 $INV_WINDOW->hide;
174 $LOGVIEW->hide;
175
170 return unless $CONN; 176 return unless $CONN;
171 177
172 status "connection closed"; 178 status "connection closed";
173 $LOGIN_BUTTON->set_text ("Login"); 179
174 $CONN->destroy; 180 $CONN->destroy;
175 $CONN = 0; # false, does not autovivify 181 $CONN = 0; # false, does not autovivify
176
177 $BUTTONBAR->{children}[1]->emit ("activate")
178 unless $BUTTONBAR->{children}[1]->{state};
179} 182}
180 183
181sub client_setup { 184sub client_setup {
182 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",
183 title => "Client Setup", 189 title => "Client Setup",
184 child => (my $vbox = new CFClient::UI::VBox); 190 child => (my $vbox = new CFClient::UI::VBox);
185 $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]);
186 192
187 $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");
202 208
203 $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");
204 $table->add (1, $row++, new CFClient::UI::CheckBox 210 $table->add (1, $row++, new CFClient::UI::CheckBox
205 state => $CFG->{fullscreen}, 211 state => $CFG->{fullscreen},
206 tooltip => "Bring the client into fullscreen mode.", 212 tooltip => "Bring the client into fullscreen mode.",
207 connect_changed => sub { 213 on_changed => sub {
208 my ($self, $value) = @_; 214 my ($self, $value) = @_;
209 $CFG->{fullscreen} = $value; 215 $CFG->{fullscreen} = $value;
210 } 216 }
211 ); 217 );
212 218
213 $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");
214 $table->add (1, $row++, new CFClient::UI::CheckBox 220 $table->add (1, $row++, new CFClient::UI::CheckBox
215 state => $CFG->{fast}, 221 state => $CFG->{fast},
216 tooltip => "Lower the visual quality considerably to speed up rendering.", 222 tooltip => "Lower the visual quality considerably to speed up rendering.",
217 connect_changed => sub { 223 on_changed => sub {
218 my ($self, $value) = @_; 224 my ($self, $value) = @_;
219 $CFG->{fast} = $value; 225 $CFG->{fast} = $value;
220 } 226 }
221 ); 227 );
222 228
223 $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");
224 $table->add (1, $row++, new CFClient::UI::Slider 230 $table->add (1, $row++, new CFClient::UI::Slider
225 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 231 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
226 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 232 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
227 connect_changed => sub { 233 on_changed => sub {
228 my ($self, $value) = @_; 234 my ($self, $value) = @_;
229 $CFG->{map_scale} = 2 ** $value; 235 $CFG->{map_scale} = 2 ** $value;
230 } 236 }
231 ); 237 );
232 238
233 $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");
234 $table->add (1, $row++, new CFClient::UI::CheckBox 240 $table->add (1, $row++, new CFClient::UI::CheckBox
235 state => $CFG->{fow_enable}, 241 state => $CFG->{fow_enable},
236 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.",
237 connect_changed => sub { 243 on_changed => sub {
238 my ($self, $value) = @_; 244 my ($self, $value) = @_;
239 $CFG->{fow_enable} = $value; 245 $CFG->{fow_enable} = $value;
240 } 246 }
241 ); 247 );
242 248
243 $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");
244 $table->add (1, $row++, new CFClient::UI::Slider 250 $table->add (1, $row++, new CFClient::UI::Slider
245 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 251 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
246 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.",
247 connect_changed => sub { 253 on_changed => sub {
248 my ($self, $value) = @_; 254 my ($self, $value) = @_;
249 $CFG->{fow_intensity} = $value; 255 $CFG->{fow_intensity} = $value;
250 } 256 }
251 ); 257 );
252 258
253 $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");
254 $table->add (1, $row++, new CFClient::UI::CheckBox 260 $table->add (1, $row++, new CFClient::UI::CheckBox
255 state => $CFG->{fow_smooth}, 261 state => $CFG->{fow_smooth},
256 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.",
257 connect_changed => sub { 263 on_changed => sub {
258 my ($self, $value) = @_; 264 my ($self, $value) = @_;
259 $CFG->{fow_smooth} = $value; 265 $CFG->{fow_smooth} = $value;
260 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::GL_VERSION < 1.2; 266 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2;
261 } 267 }
262 ); 268 );
263 269
264 $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");
265 $table->add (1, $row++, new CFClient::UI::Slider 271 $table->add (1, $row++, new CFClient::UI::Slider
266 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 272 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
267 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.",
268 connect_changed => sub { $CFG->{gui_fontsize} = $_[1] }, 274 on_changed => sub { $CFG->{gui_fontsize} = $_[1] },
269 ); 275 );
270 276
271 $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");
272 $table->add (1, $row++, new CFClient::UI::Slider 278 $table->add (1, $row++, new CFClient::UI::Slider
273 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 279 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
274 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.",
275 connect_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) }, 281 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) },
276 ); 282 );
277 283
278 $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");
279 285
280 $table->add (1, $row++, new CFClient::UI::Slider 286 $table->add (1, $row++, new CFClient::UI::Slider
281 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1], 287 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1],
282 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.",
283 connect_changed => sub { 289 on_changed => sub {
284 $CFG->{stat_fontsize} = $_[1]; 290 $CFG->{stat_fontsize} = $_[1];
285 &set_stats_window_fontsize; 291 &set_stats_window_fontsize;
286 } 292 }
287 ); 293 );
288 294
289 $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");
290 $table->add (1, $row++, new CFClient::UI::Slider 296 $table->add (1, $row++, new CFClient::UI::Slider
291 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 297 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
292 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.",
293 connect_changed => sub { 299 on_changed => sub {
294 $CFG->{gauge_fontsize} = $_[1]; 300 $CFG->{gauge_fontsize} = $_[1];
295 &set_gauge_window_fontsize; 301 &set_gauge_window_fontsize;
296 } 302 }
297 ); 303 );
298 304
299 $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");
300 $table->add (1, $row++, new CFClient::UI::Slider 306 $table->add (1, $row++, new CFClient::UI::Slider
301 range => [$CFG->{gauge_size}, 0.2, 0.8], 307 range => [$CFG->{gauge_size}, 0.2, 0.8],
302 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.",
303 connect_changed => sub { 309 on_changed => sub {
304 $CFG->{gauge_size} = $_[1]; 310 $CFG->{gauge_size} = $_[1];
305 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 311 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
306 } 312 }
307 ); 313 );
308 314
309 $table->add (1, $row++, new CFClient::UI::Button 315 $table->add (1, $row++, new CFClient::UI::Button
310 expand => 1, align => 0, text => "Apply", 316 expand => 1, align => 0, text => "Apply",
311 tooltip => "Apply the video settings", 317 tooltip => "Apply the video settings",
312 connect_activate => sub { 318 on_activate => sub {
313 video_shutdown (); 319 video_shutdown ();
314 video_init (); 320 video_init ();
315 } 321 }
316 ); 322 );
317 323
318 $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");
319 $table->add (1, $row++, new CFClient::UI::CheckBox 325 $table->add (1, $row++, new CFClient::UI::CheckBox
320 state => $CFG->{audio_enable}, 326 state => $CFG->{audio_enable},
321 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.",
322 connect_changed => sub { 328 on_changed => sub {
323 $CFG->{audio_enable} = $_[1]; 329 $CFG->{audio_enable} = $_[1];
324 } 330 }
325 ); 331 );
326# $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");
327# $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 {
328# $CFG->{effects_volume} = $_[1]; 334# $CFG->{effects_volume} = $_[1];
329# }); 335# });
330 $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");
331 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox); 337 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox);
332 $hbox->add (new CFClient::UI::CheckBox 338 $hbox->add (new CFClient::UI::CheckBox
333 expand => 1, state => $CFG->{bgm_enable}, 339 expand => 1, state => $CFG->{bgm_enable},
334 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.",
335 connect_changed => sub { 341 on_changed => sub {
336 $CFG->{bgm_enable} = $_[1]; 342 $CFG->{bgm_enable} = $_[1];
337 } 343 }
338 ); 344 );
339 $hbox->add (new CFClient::UI::Slider 345 $hbox->add (new CFClient::UI::Slider
340 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 346 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
341 tooltip => "The volume of the background music. Changes are instant.", 347 tooltip => "The volume of the background music. Changes are instant.",
342 connect_changed => sub { 348 on_changed => sub {
343 $CFG->{bgm_volume} = $_[1]; 349 $CFG->{bgm_volume} = $_[1];
344 CFClient::MixMusic::volume $_[1] * 128; 350 CFClient::MixMusic::volume $_[1] * 128;
345 } 351 }
346 ); 352 );
347 353
348 $table->add (1, $row++, new CFClient::UI::Button 354 $table->add (1, $row++, new CFClient::UI::Button
349 expand => 1, align => 0, text => "Apply", 355 expand => 1, align => 0, text => "Apply",
350 tooltip => "Apply the audio settings", 356 tooltip => "Apply the audio settings",
351 connect_activate => sub { 357 on_activate => sub {
352 audio_shutdown (); 358 audio_shutdown ();
353 audio_init (); 359 audio_init ();
354 } 360 }
355 ); 361 );
356 362
358 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry 364 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry
359 text => $CFG->{say_command}, 365 text => $CFG->{say_command},
360 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. "
361 . "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. "
362 . "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.",
363 connect_changed => sub { 369 on_changed => sub {
364 my ($self, $value) = @_; 370 my ($self, $value) = @_;
365 $CFG->{say_command} = $value; 371 $CFG->{say_command} = $value;
366 } 372 }
367 ); 373 );
368 374
383 389
384sub make_gauge_window { 390sub make_gauge_window {
385 my $gh = int $HEIGHT * $CFG->{gauge_size}; 391 my $gh = int $HEIGHT * $CFG->{gauge_size};
386 392
387 my $win = new CFClient::UI::Frame ( 393 my $win = new CFClient::UI::Frame (
394 req_x => 0,
388 req_y => -1, 395 req_y => -1,
389 user_w => $WIDTH, 396 def_w => $WIDTH,
390 user_h => $gh, 397 def_h => $gh,
391 ); 398 );
392 399
393 $win->add (my $hbox = new CFClient::UI::HBox 400 $win->add (my $hbox = new CFClient::UI::HBox
394 children => [ 401 children => [
395 (new CFClient::UI::HBox expand => 1), 402 (new CFClient::UI::HBox expand => 1),
431 &set_gauge_window_fontsize; 438 &set_gauge_window_fontsize;
432 439
433 $win 440 $win
434} 441}
435 442
443
436sub make_stats_window { 444sub make_stats_window {
437 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";
438 450
439 $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);
440 $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,
441 can_hover => 1, can_events => 1, 453 can_hover => 1, can_events => 1,
442 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.");
445 tooltip => "The map you are currently on (if supported by the server)."); 457 tooltip => "The map you are currently on (if supported by the server).");
446 458
447 $vb->add (my $hb0 = new CFClient::UI::HBox); 459 $vb->add (my $hb0 = new CFClient::UI::HBox);
448 $hb0->add ($STATWIDS->{weight} = new CFClient::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1, 460 $hb0->add ($STATWIDS->{weight} = new CFClient::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1,
449 can_hover => 1, can_events => 1, 461 can_hover => 1, can_events => 1,
450 tooltip => "This is the amount the Player weights."); 462 tooltip => "The weight of the player including all inventory items.");
451 $hb0->add ($STATWIDS->{m_weight} = new CFClient::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1, 463 $hb0->add ($STATWIDS->{m_weight} = new CFClient::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1,
452 can_hover => 1, can_events => 1, 464 can_hover => 1, can_events => 1,
453 tooltip => "The weight limit, you can't carry more than this."); 465 tooltip => "The weight limit: you cannot carry more than this.");
454 466
455 467
456 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 468 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
457 $hb->add (my $tbl = new CFClient::UI::Table expand => 1); 469 $hb->add (my $tbl = new CFClient::UI::Table expand => 1);
458 470
548} 560}
549 561
550sub update_stats_window { 562sub update_stats_window {
551 my ($stats) = @_; 563 my ($stats) = @_;
552 564
553 # i love text protocols!!! 565 # I love text protocols...
554 my $hp = $stats->{Crossfire::Protocol::Base::CS_STAT_HP} * 1; 566
567 my $hp = $stats->{+CS_STAT_HP} * 1;
555 my $hp_m = $stats->{Crossfire::Protocol::Base::CS_STAT_MAXHP} * 1; 568 my $hp_m = $stats->{+CS_STAT_MAXHP} * 1;
556 my $sp = $stats->{Crossfire::Protocol::Base::CS_STAT_SP} * 1; 569 my $sp = $stats->{+CS_STAT_SP} * 1;
557 my $sp_m = $stats->{Crossfire::Protocol::Base::CS_STAT_MAXSP} * 1; 570 my $sp_m = $stats->{+CS_STAT_MAXSP} * 1;
558 my $fo = $stats->{Crossfire::Protocol::Base::CS_STAT_FOOD} * 1; 571 my $fo = $stats->{+CS_STAT_FOOD} * 1;
559 my $fo_m = 999; 572 my $fo_m = 999;
560 my $gr = $stats->{Crossfire::Protocol::Base::CS_STAT_GRACE} * 1; 573 my $gr = $stats->{+CS_STAT_GRACE} * 1;
561 my $gr_m = $stats->{Crossfire::Protocol::Base::CS_STAT_MAXGRACE} * 1; 574 my $gr_m = $stats->{+CS_STAT_MAXGRACE} * 1;
562 575
563 $GAUGES->{hp} ->set_value ($hp, $hp_m); 576 $GAUGES->{hp} ->set_value ($hp, $hp_m);
564 $GAUGES->{mana} ->set_value ($sp, $sp_m); 577 $GAUGES->{mana} ->set_value ($sp, $sp_m);
565 $GAUGES->{food} ->set_value ($fo, $fo_m); 578 $GAUGES->{food} ->set_value ($fo, $fo_m);
566 $GAUGES->{grace} ->set_value ($gr, $gr_m); 579 $GAUGES->{grace} ->set_value ($gr, $gr_m);
567 $GAUGES->{exp} ->set_text ("Exp: " . (formsep $stats->{Crossfire::Protocol::Base::CS_STAT_EXP64}) 580 $GAUGES->{exp} ->set_text ("Exp: " . (formsep $stats->{+CS_STAT_EXP64})
568 . " (lvl " . ($stats->{Crossfire::Protocol::Base::CS_STAT_LEVEL} * 1) . ")"); 581 . " (lvl " . ($stats->{+CS_STAT_LEVEL} * 1) . ")");
569 my $rng = $stats->{Crossfire::Protocol::Base::CS_STAT_RANGE}; 582 my $rng = $stats->{+CS_STAT_RANGE};
570 $rng =~ s/^Range: //; # thank you so much dear server 583 $rng =~ s/^Range: //; # thank you so much dear server
571 $GAUGES->{range} ->set_text ("Rng: " . $rng); 584 $GAUGES->{range} ->set_text ("Rng: " . $rng);
572 my $title = $stats->{Crossfire::Protocol::Base::CS_STAT_TITLE}; 585 my $title = $stats->{+CS_STAT_TITLE};
573 $title =~ s/^Player: //; 586 $title =~ s/^Player: //;
574 $STATWIDS->{title} ->set_text ("Title: " . $title); 587 $STATWIDS->{title} ->set_text ("Title: " . $title);
575 588
576 $STATWIDS->{st_str} ->set_text (sprintf "%d", $stats->{5}); 589 $STATWIDS->{st_str} ->set_text (sprintf "%d" , $stats->{+CS_STAT_STR});
577 $STATWIDS->{st_dex} ->set_text (sprintf "%d", $stats->{8}); 590 $STATWIDS->{st_dex} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DEX});
578 $STATWIDS->{st_con} ->set_text (sprintf "%d", $stats->{9}); 591 $STATWIDS->{st_con} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CON});
579 $STATWIDS->{st_int} ->set_text (sprintf "%d", $stats->{6}); 592 $STATWIDS->{st_int} ->set_text (sprintf "%d" , $stats->{+CS_STAT_INT});
580 $STATWIDS->{st_wis} ->set_text (sprintf "%d", $stats->{7}); 593 $STATWIDS->{st_wis} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WIS});
581 $STATWIDS->{st_pow} ->set_text (sprintf "%d", $stats->{22}); 594 $STATWIDS->{st_pow} ->set_text (sprintf "%d" , $stats->{+CS_STAT_POW});
582 $STATWIDS->{st_cha} ->set_text (sprintf "%d", $stats->{10}); 595 $STATWIDS->{st_cha} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CHA});
583 $STATWIDS->{st_wc} ->set_text (sprintf "%d", $stats->{13}); 596 $STATWIDS->{st_wc} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WC});
584 $STATWIDS->{st_ac} ->set_text (sprintf "%d", $stats->{14}); 597 $STATWIDS->{st_ac} ->set_text (sprintf "%d" , $stats->{+CS_STAT_AC});
585 $STATWIDS->{st_dam} ->set_text (sprintf "%d", $stats->{15}); 598 $STATWIDS->{st_dam} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DAM});
586 $STATWIDS->{st_arm} ->set_text (sprintf "%d", $stats->{16}); 599 $STATWIDS->{st_arm} ->set_text (sprintf "%d" , $stats->{+CS_STAT_ARMOUR});
587 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{Crossfire::Protocol::Base::CS_STAT_SPEED}); 600 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED});
588 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{Crossfire::Protocol::Base::CS_STAT_WEAP_SP}); 601 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP});
589 602
590 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{Crossfire::Protocol::Base::CS_STAT_WEIGHT_LIM} / 1000); 603 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000);
591 604
605 # TODO: replace by CS_STAT_RES_xxx constants
592 my %tbl = ( 606 my %tbl = (
593 phys => 100, 607 phys => 100,
594 magic => 101, 608 magic => 101,
595 fire => 102, 609 fire => 102,
596 elec => 103, 610 elec => 103,
605 tund => 112, 619 tund => 112,
606 fear => 113, 620 fear => 113,
607 depl => 113, 621 depl => 113,
608 deat => 115, 622 deat => 115,
609 holyw => 116, 623 holyw => 116,
610 blind => 117 624 blind => 117,
611 ); 625 );
612 626
613 for (keys %tbl) {
614 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}); 627 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
615 } 628 for keys %tbl;
616
617} 629}
618 630
619sub metaserver_dialog { 631sub metaserver_dialog {
620 my $dialog = new CFClient::UI::FancyFrame 632 my $dialog = new CFClient::UI::FancyFrame
621 title => "Server List", 633 title => "Server List",
689 $m = [$users, $host, $uptime, $version, $desc]; 701 $m = [$users, $host, $uptime, $version, $desc];
690 702
691 $y++; 703 $y++;
692 704
693 $table->add (0, $y, new CFClient::UI::VBox children => [ 705 $table->add (0, $y, new CFClient::UI::VBox children => [
694 (new CFClient::UI::Button text => "Use", connect_activate => sub { 706 (new CFClient::UI::Button text => "Use", on_activate => sub {
695 $HOST->set_text ($CFG->{host} = $host); 707 $HOST->set_text ($CFG->{host} = $host);
696 }), 708 }),
697 (new CFClient::UI::Empty expand => 1), 709 (new CFClient::UI::Empty expand => 1),
698 ]); 710 ]);
699 711
704 } 716 }
705 }); 717 });
706} 718}
707 719
708sub server_setup { 720sub server_setup {
709 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",
710 title => "Server Setup", 725 title => "Server Setup",
711 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 },
712 731 ;
732
713 $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]);
714 $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");
715 735
716 { 736 {
717 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 737 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
719 $vbox->add ( 739 $vbox->add (
720 my $HOST = new CFClient::UI::Entry 740 my $HOST = new CFClient::UI::Entry
721 expand => 1, 741 expand => 1,
722 text => $CFG->{host}, 742 text => $CFG->{host},
723 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",
724 connect_changed => sub { 744 on_changed => sub {
725 my ($self, $value) = @_; 745 my ($self, $value) = @_;
726 $CFG->{host} = $value; 746 $CFG->{host} = $value;
727 } 747 }
728 ); 748 );
729 749
732 $vbox->add (new CFClient::UI::Flopper 752 $vbox->add (new CFClient::UI::Flopper
733 expand => 1, 753 expand => 1,
734 text => "Server List", 754 text => "Server List",
735 other => $METASERVER, 755 other => $METASERVER,
736 tooltip => "Show a list of available crossfire servers", 756 tooltip => "Show a list of available crossfire servers",
737 connect_open => sub { 757 on_open => sub {
738 update_metaserver $HOST; 758 update_metaserver $HOST;
739 } 759 }
740 ); 760 );
741 } 761 }
742 762
743 $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");
744 $table->add (1, 4, new CFClient::UI::Entry 764 $table->add (1, 4, new CFClient::UI::Entry
745 text => $CFG->{user}, 765 text => $CFG->{user},
746 tooltip => "The name of your character on the server", 766 tooltip => "The name of your character on the server",
747 connect_changed => sub { 767 on_changed => sub {
748 my ($self, $value) = @_; 768 my ($self, $value) = @_;
749 $CFG->{user} = $value; 769 $CFG->{user} = $value;
750 } 770 }
751 ); 771 );
752 772
753 $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");
754 $table->add (1, 5, new CFClient::UI::Entry 774 $table->add (1, 5, new CFClient::UI::Entry
755 text => $CFG->{password}, 775 text => $CFG->{password},
756 hidden => 1, 776 hidden => 1,
757 tooltip => "The password for your character", 777 tooltip => "The password for your character",
758 connect_changed => sub { 778 on_changed => sub {
759 my ($self, $value) = @_; 779 my ($self, $value) = @_;
760 $CFG->{password} = $value; 780 $CFG->{password} = $value;
761 } 781 }
762 ); 782 );
763 783
767 range => [$CFG->{mapsize}, 10, 100, 0, 1], 787 range => [$CFG->{mapsize}, 10, 100, 0, 1],
768 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. "
769 . "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, "
770 . "but you also increase bandwidth requirements and latency. " 790 . "but you also increase bandwidth requirements and latency. "
771 . "This option is only used once at log-in.", 791 . "This option is only used once at log-in.",
772 connect_changed => sub { 792 on_changed => sub {
773 my ($self, $value) = @_; 793 my ($self, $value) = @_;
774 794
775 $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 795 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
776 }, 796 },
777 ); 797 );
784 . "This might increase or create lag, but increases the chances " 804 . "This might increase or create lag, but increases the chances "
785 . "of faces being ready for display when you encounter them. " 805 . "of faces being ready for display when you encounter them. "
786 . "It also uses up server bandwidth on every connect, " 806 . "It also uses up server bandwidth on every connect, "
787 . "so only set it if you really need to prefetch images. " 807 . "so only set it if you really need to prefetch images. "
788 . "This option can be set and unset any time.", 808 . "This option can be set and unset any time.",
789 connect_changed => sub { $CFG->{face_prefetch} = $_[1] }, 809 on_changed => sub { $CFG->{face_prefetch} = $_[1] },
790 ); 810 );
791 811
792 $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");
793 $table->add (1, 9, new CFClient::UI::Entry 813 $table->add (1, 9, new CFClient::UI::Entry
794 text => $CFG->{output_count}, 814 text => $CFG->{output_count},
795 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.",
796 connect_changed => sub { $CFG->{output_count} = $_[1] }, 816 on_changed => sub { $CFG->{output_count} = $_[1] },
797 ); 817 );
798 818
799 $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");
800 $table->add (1, 10, new CFClient::UI::Entry 820 $table->add (1, 10, new CFClient::UI::Entry
801 text => $CFG->{output_sync}, 821 text => $CFG->{output_sync},
802 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.",
803 connect_changed => sub { $CFG->{output_sync} = $_[1] }, 823 on_changed => sub { $CFG->{output_sync} = $_[1] },
804 ); 824 );
805 825
806 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 826 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
807 expand => 1, 827 expand => 1,
808 align => 0, 828 align => 0,
809 text => "Login", 829 text => "Login",
810 connect_activate => sub { 830 on_activate => sub {
811 $CONN ? stop_game 831 $CONN ? stop_game
812 : start_game; 832 : start_game;
813 }, 833 },
814 ); 834 );
815 835
816 $dialog 836 $dialog
817} 837}
818 838
819sub message_window { 839sub message_window {
820 my $window = new CFClient::UI::FancyFrame 840 my $window = new CFClient::UI::FancyFrame
841 name => "message_window",
821 title => "Messages", 842 title => "Messages",
822 border_bg => [1, 1, 1, 1], 843 border_bg => [1, 1, 1, 1],
823 bg => [0, 0, 0, 0.75], 844 bg => [0, 0, 0, 0.75],
845 req_x => -1,
846 req_y => 0,
824 user_w => int $::WIDTH / 3, 847 def_w => int $::WIDTH / 3,
825 user_h => int $::HEIGHT / 5, 848 def_h => int $::HEIGHT / 5,
826 child => (my $vbox = new CFClient::UI::VBox); 849 child => (my $vbox = new CFClient::UI::VBox);
827 850
828 $vbox->add ($LOGVIEW); 851 $vbox->add ($LOGVIEW);
829 852
830 $vbox->add (my $input = new CFClient::UI::Entry 853 $vbox->add (my $input = new CFClient::UI::Entry
831 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> "
832 . "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>...). "
833 . "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). "
834 . "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.",
835 connect_focus_in => sub { 858 on_focus_in => sub {
836 my ($input, $prev_focus) = @_; 859 my ($input, $prev_focus) = @_;
837 860
838 delete $input->{refocus_map}; 861 delete $input->{refocus_map};
839 862
840 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 863 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
841 $input->{refocus_map} = 1; 864 $input->{refocus_map} = 1;
842 } 865 }
843 delete $input->{auto_activated}; 866 delete $input->{auto_activated};
844 }, 867 },
845 connect_activate => sub { 868 on_activate => sub {
846 my ($input, $text) = @_; 869 my ($input, $text) = @_;
847 $input->set_text (''); 870 $input->set_text ('');
848 871
872 if ($text =~ /^\/bind\s+(.*)$/) {
873 CFClient::Recorder::open_binding_dialog ([$1]);
849 if ($text =~ /^\/(.*)/) { 874 } elsif ($text =~ /^\/(.*)/) {
850 $::CONN->user_send ($1); 875 $::CONN->user_send ($1);
851 } else { 876 } else {
852 my $say_cmd = $::CFG->{say_command} || 'say'; 877 my $say_cmd = $::CFG->{say_command} || 'say';
853 $::CONN->user_send ("$say_cmd $text"); 878 $::CONN->user_send ("$say_cmd $text");
854 } 879 }
855 if ($input->{refocus_map}) { 880 if ($input->{refocus_map}) {
856 delete $input->{refocus_map}; 881 delete $input->{refocus_map};
857 $MAPWIDGET->focus_in 882 $MAPWIDGET->focus_in
858 } 883 }
859 }, 884 },
860 connect_escape => sub { 885 on_escape => sub {
861 $MAPWIDGET->focus_in 886 $MAPWIDGET->focus_in
862 }, 887 },
863 ); 888 );
864 889
865 $CONSOLE = { 890 $CONSOLE = {
870 $window 895 $window
871} 896}
872 897
873sub open_quit_dialog { 898sub open_quit_dialog {
874 unless ($QUIT_DIALOG) { 899 unless ($QUIT_DIALOG) {
875
876 $QUIT_DIALOG = new CFClient::UI::FancyFrame title => "Really Quit?"; 900 $QUIT_DIALOG = new CFClient::UI::FancyFrame title => "Really Quit?";
877 901
878 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); 902 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1);
879 903
880 $vb->add (new CFClient::UI::Label 904 $vb->add (new CFClient::UI::Label
884 ); 908 );
885 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 909 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
886 $hb->add (new CFClient::UI::Button 910 $hb->add (new CFClient::UI::Button
887 text => "Ok", 911 text => "Ok",
888 expand => 1, 912 expand => 1,
889 connect_activate => sub { $QUIT_DIALOG->hide }, 913 on_activate => sub { $QUIT_DIALOG->hide },
890 ); 914 );
891 $hb->add (new CFClient::UI::Button 915 $hb->add (new CFClient::UI::Button
892 text => "Quit anyway", 916 text => "Quit anyway",
893 expand => 1, 917 expand => 1,
894 connect_activate => sub { exit }, 918 on_activate => sub { exit },
895 ); 919 );
920 }
896 921
922 $QUIT_DIALOG->show;
897 $QUIT_DIALOG->show_centered; 923 $QUIT_DIALOG->center;
898 } else {
899 $QUIT_DIALOG->show_centered;
900 }
901} 924}
902 925
903sub make_inventory_window { 926sub make_inventory_window {
904 my $invwin = new CFClient::UI::FancyFrame 927 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
905 user_w => $WIDTH * (7/8), user_h => $HEIGHT * (7/8), title => "Inventory"; 928 def_w => $WIDTH * 7/8,
929 def_h => $HEIGHT * 7/8,
930 title => "Inventory",
931 name => "inventory_window",
932 on_visibility_change => sub {
933 my ($self, $visible) = @_;
934 $self->center if $visible;
935 },
936 ;
906 937
907 $invwin->add (my $hb = new CFClient::UI::HBox expand => 1); 938 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
908 939
909 $hb->add (my $vb1 = new CFClient::UI::VBox expand => 1); 940 $hb->add (my $vb1 = new CFClient::UI::VBox);
910 $vb1->add (my $lbl = new CFClient::UI::Label xalign => 0.5); 941 $vb1->add (new CFClient::UI::Label align => 0, text => "Player");
911 $lbl->set_text ("Player");
912 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1); 942 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1);
913 943
914 $hb->add (my $vb2 = new CFClient::UI::VBox expand => 1); 944 $hb->add (my $vb2 = new CFClient::UI::VBox);
945
915 $vb2->add ($INVR_LBL = new CFClient::UI::Label xalign => 0.5); 946 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox);
916 $INVR_LBL->set_text ("Floor"); 947
917 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1); 948 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1);
918 949
950 # XXX: Call after $INVR = ... because set_opencont sets the items
951 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
952
919 $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
920} 997}
921 998
922sub make_help_window { 999sub make_help_window {
923 my $win = new CFClient::UI::FancyFrame 1000 my $win = new CFClient::UI::FancyFrame
924 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";
925 1004
926 $win->add (my $vbox = new CFClient::UI::VBox); 1005 $win->add (my $vbox = new CFClient::UI::VBox);
927 1006
928 $vbox->add (my $buttons = new CFClient::UI::HBox); 1007 $vbox->add (my $buttons = new CFClient::UI::HBox);
929 $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);
936 ) { 1015 ) {
937 my ($pod, $label) = @$_; 1016 my ($pod, $label) = @$_;
938 1017
939 $buttons->add (new CFClient::UI::Button 1018 $buttons->add (new CFClient::UI::Button
940 text => $label, 1019 text => $label,
941 connect_activate => sub { 1020 on_activate => sub {
942 my $parser = new Pod::POM; 1021 my $parser = new Pod::POM;
943 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod"); 1022 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod");
944 1023
945 $viewer->clear; 1024 $viewer->clear;
946 1025
1054 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 :).");
1055 1134
1056 $BUTTONBAR->add (new CFClient::UI::Button 1135 $BUTTONBAR->add (new CFClient::UI::Button
1057 text => "Save Config", 1136 text => "Save Config",
1058 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.",
1059 connect_activate => sub { 1138 on_activate => sub {
1139 $::CFG->{layout} = CFClient::UI::get_layout;
1060 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc"; 1140 CFClient::write_cfg "$Crossfire::VARDIR/pclientrc";
1061 status "Configuration Saved"; 1141 status "Configuration Saved";
1062 }, 1142 },
1063 ); 1143 );
1064 1144
1065 $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,
1066 tooltip => "View Documentation"); 1146 tooltip => "View Documentation");
1067 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
1068 $BUTTONBAR->add (new CFClient::UI::Button 1156 $BUTTONBAR->add (new CFClient::UI::Button
1069 text => "Quit", 1157 text => "Quit",
1070 tooltip => "Terminates the program", 1158 tooltip => "Terminates the program",
1071 connect_activate => sub { 1159 on_activate => sub {
1072 if ($CONN) { 1160 if ($CONN) {
1073 open_quit_dialog; 1161 open_quit_dialog;
1074 } else { 1162 } else {
1075 exit; 1163 exit;
1076 } 1164 }
1079 1167
1080 $BUTTONBAR->show; 1168 $BUTTONBAR->show;
1081 1169
1082 $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]);
1083 1171
1084 # delay till geometry is constant 1172 $SERVER_SETUP->show;
1085 $CFClient::UI::ROOT->on_post_alloc (startup => sub {
1086 $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup
1087 my $widget = $GAUGES->{win};
1088 $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel
1089 });
1090 force_refresh ();
1091 } 1173 }
1092} 1174}
1093 1175
1094sub video_shutdown { 1176sub video_shutdown {
1095 undef $SDL_ACTIVE; 1177 undef $SDL_ACTIVE;
1308 1390
1309{ 1391{
1310 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] }; 1392 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] };
1311 1393
1312 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc"; 1394 CFClient::read_cfg "$Crossfire::VARDIR/pclientrc";
1395 CFClient::UI::set_layout ($::CFG->{layout});
1313 1396
1314 my %DEF_CFG = ( 1397 my %DEF_CFG = (
1315 sdl_mode => 0, 1398 sdl_mode => 0,
1316 width => 640, 1399 width => 640,
1317 height => 480, 1400 height => 480,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines