… | |
… | |
115 | our $INV; |
115 | our $INV; |
116 | our $INVR; |
116 | our $INVR; |
117 | our $INV_RIGHT_HB; |
117 | our $INV_RIGHT_HB; |
118 | |
118 | |
119 | our $BIND_EDITOR; |
119 | our $BIND_EDITOR; |
|
|
120 | our $BIND_UPD_CB; |
120 | |
121 | |
121 | our $PICKUP_CFG; |
122 | our $PICKUP_CFG; |
122 | |
123 | |
123 | sub status { |
124 | sub status { |
124 | $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); |
125 | $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); |
… | |
… | |
324 | $LOGIN_BUTTON->set_text ("Logout"); |
325 | $LOGIN_BUTTON->set_text ("Logout"); |
325 | $SETUP_DIALOG->hide; |
326 | $SETUP_DIALOG->hide; |
326 | |
327 | |
327 | my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; |
328 | my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; |
328 | |
329 | |
329 | my ($host, $port) = split /:/, $CFG->{host}; |
330 | my ($host, $port) = split /:/, $CFG->{profile}{default}{host}; |
330 | |
331 | |
331 | $MAP = new CFClient::Map $mapsize, $mapsize; |
332 | $MAP = new CFClient::Map $mapsize, $mapsize; |
332 | |
333 | |
333 | $CONN = eval { |
334 | $CONN = eval { |
334 | new CFClient::Protocol |
335 | new CFClient::Protocol |
335 | host => $host, |
336 | host => $host, |
336 | port => $port || 13327, |
337 | port => $port || 13327, |
337 | user => $CFG->{user}, |
338 | user => $CFG->{profile}{default}{user}, |
338 | pass => $CFG->{password}, |
339 | pass => $CFG->{profile}{default}{password}, |
339 | mapw => $mapsize, |
340 | mapw => $mapsize, |
340 | maph => $mapsize, |
341 | maph => $mapsize, |
341 | |
342 | |
342 | map_widget => $MAPWIDGET, |
343 | map_widget => $MAPWIDGET, |
343 | logview => $LOGVIEW, |
344 | logview => $LOGVIEW, |
… | |
… | |
381 | status "connection closed"; |
382 | status "connection closed"; |
382 | |
383 | |
383 | destroy_query_dialog $CONN; |
384 | destroy_query_dialog $CONN; |
384 | $CONN->destroy; |
385 | $CONN->destroy; |
385 | $CONN = 0; # false, does not autovivify |
386 | $CONN = 0; # false, does not autovivify |
|
|
387 | |
|
|
388 | undef $MAP; |
386 | } |
389 | } |
387 | |
390 | |
388 | sub graphics_setup { |
391 | sub graphics_setup { |
389 | my $vbox = new CFClient::UI::VBox; |
392 | my $vbox = new CFClient::UI::VBox; |
390 | |
393 | |
… | |
… | |
912 | $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [ |
915 | $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [ |
913 | (new CFClient::UI::Button |
916 | (new CFClient::UI::Button |
914 | text => "Use", |
917 | text => "Use", |
915 | tooltip => "Put this server into the <b>Host:Port</b> field", |
918 | tooltip => "Put this server into the <b>Host:Port</b> field", |
916 | on_activate => sub { |
919 | on_activate => sub { |
917 | $HOST_ENTRY->set_text ($CFG->{host} = $host); |
920 | $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host); |
918 | $METASERVER->hide; |
921 | $METASERVER->hide; |
919 | 0 |
922 | 0 |
920 | }, |
923 | }, |
921 | ), |
924 | ), |
922 | (new CFClient::UI::Empty expand => 1), |
925 | (new CFClient::UI::Empty expand => 1), |
… | |
… | |
968 | $table->add (1, 2, my $vbox = new CFClient::UI::VBox); |
971 | $table->add (1, 2, my $vbox = new CFClient::UI::VBox); |
969 | |
972 | |
970 | $vbox->add ( |
973 | $vbox->add ( |
971 | $HOST_ENTRY = new CFClient::UI::Entry |
974 | $HOST_ENTRY = new CFClient::UI::Entry |
972 | expand => 1, |
975 | expand => 1, |
973 | text => $CFG->{host}, |
976 | text => $CFG->{profile}{default}{host}, |
974 | tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", |
977 | tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", |
975 | on_changed => sub { |
978 | on_changed => sub { |
976 | my ($self, $value) = @_; |
979 | my ($self, $value) = @_; |
977 | $CFG->{host} = $value; |
980 | $CFG->{profile}{default}{host} = $value; |
978 | 0 |
981 | 0 |
979 | } |
982 | } |
980 | ); |
983 | ); |
981 | |
984 | |
982 | $METASERVER = metaserver_dialog; |
985 | $METASERVER = metaserver_dialog; |
… | |
… | |
991 | ); |
994 | ); |
992 | } |
995 | } |
993 | |
996 | |
994 | $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); |
997 | $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); |
995 | $table->add (1, 4, new CFClient::UI::Entry |
998 | $table->add (1, 4, new CFClient::UI::Entry |
996 | text => $CFG->{user}, |
999 | text => $CFG->{profile}{default}{user}, |
997 | tooltip => "The name of your character on the server", |
1000 | tooltip => "The name of your character on the server", |
998 | on_changed => sub { my ($self, $value) = @_; $CFG->{user} = $value; 0 } |
1001 | on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value } |
999 | ); |
1002 | ); |
1000 | |
1003 | |
1001 | $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); |
1004 | $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); |
1002 | $table->add (1, 5, new CFClient::UI::Entry |
1005 | $table->add (1, 5, new CFClient::UI::Entry |
1003 | text => $CFG->{password}, |
1006 | text => $CFG->{profile}{default}{password}, |
1004 | hidden => 1, |
1007 | hidden => 1, |
1005 | tooltip => "The password for your character", |
1008 | tooltip => "The password for your character", |
1006 | on_changed => sub { my ($self, $value) = @_; $CFG->{password} = $value; 0 } |
1009 | on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value } |
1007 | ); |
1010 | ); |
1008 | |
1011 | |
1009 | $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); |
1012 | $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); |
1010 | $table->add (1, 7, new CFClient::UI::Slider |
1013 | $table->add (1, 7, new CFClient::UI::Slider |
1011 | force_w => 100, |
1014 | force_w => 100, |
… | |
… | |
1299 | |
1302 | |
1300 | sub spell_setup { |
1303 | sub spell_setup { |
1301 | new CFClient::UI::SpellList |
1304 | new CFClient::UI::SpellList |
1302 | } |
1305 | } |
1303 | |
1306 | |
|
|
1307 | sub update_bindings { |
|
|
1308 | $BIND_UPD_CB->() if $BIND_UPD_CB; |
|
|
1309 | } |
|
|
1310 | |
1304 | sub keyboard_setup { |
1311 | sub keyboard_setup { |
1305 | my $binding_list = new CFClient::UI::VBox; |
1312 | my $binding_list = new CFClient::UI::VBox; |
1306 | |
1313 | |
1307 | my $refresh; |
1314 | my $refresh; |
1308 | $refresh = sub { |
1315 | $refresh = $BIND_UPD_CB = sub { |
1309 | $binding_list->clear (); |
1316 | $binding_list->clear (); |
1310 | |
1317 | |
1311 | for my $mod (keys %{$::CFG->{bindings}}) { |
1318 | for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { |
1312 | for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { |
1319 | for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { |
1313 | my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; |
1320 | my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; |
1314 | next unless ref $cmds eq 'ARRAY' and @$cmds > 0; |
1321 | next unless ref $cmds eq 'ARRAY' and @$cmds > 0; |
1315 | |
1322 | |
1316 | my $lbl = join "; ", @$cmds; |
1323 | my $lbl = join "; ", @$cmds; |
1317 | my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); |
1324 | my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); |
1318 | $binding_list->add (my $hb = new CFClient::UI::HBox); |
1325 | $binding_list->add (my $hb = new CFClient::UI::HBox); |
1319 | $hb->add (new CFClient::UI::Button |
1326 | $hb->add (new CFClient::UI::Button |
1320 | text => "delete", |
1327 | text => "delete", |
1321 | tooltip => "Deletes the binding", |
1328 | tooltip => "Deletes the binding", |
1322 | on_activate => sub { |
1329 | on_activate => sub { |
1323 | $binding_list->remove ($hb); |
1330 | $binding_list->remove ($hb); |
1324 | delete $::CFG->{bindings}->{$mod}->{$sym}; |
1331 | delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; |
1325 | 0 |
1332 | 0 |
1326 | }); |
1333 | }); |
1327 | |
1334 | |
1328 | $hb->add (new CFClient::UI::Button |
1335 | $hb->add (new CFClient::UI::Button |
1329 | text => "edit", |
1336 | text => "edit", |
1330 | tooltip => "Edits the binding", |
1337 | tooltip => "Edits the binding", |
1331 | on_activate => sub { |
1338 | on_activate => sub { |
1332 | $::BIND_EDITOR->set_binding ( |
1339 | $::BIND_EDITOR->set_binding ( |
1333 | $mod, $sym, $::CFG->{bindings}->{$mod}->{$sym}, |
1340 | $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, |
1334 | sub { |
1341 | sub { |
1335 | my ($nmod, $nsym, $ncmds) = @_; |
1342 | my ($nmod, $nsym, $ncmds) = @_; |
1336 | delete $::CFG->{bindings}->{$mod}->{$sym}; |
1343 | $::BIND_EDITOR->cfg_unbind ($mod, $sym); |
1337 | $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; |
1344 | $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds); |
1338 | $refresh->(); |
1345 | $refresh->(); |
1339 | $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); |
1346 | $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); |
1340 | $SETUP_DIALOG->show; |
1347 | $SETUP_DIALOG->show; |
1341 | }, |
1348 | }, |
1342 | sub { |
1349 | sub { |
… | |
… | |
1376 | tooltip => "This button opens the binding editor with an empty binding.", |
1383 | tooltip => "This button opens the binding editor with an empty binding.", |
1377 | on_activate => sub { |
1384 | on_activate => sub { |
1378 | $::BIND_EDITOR->set_binding (undef, undef, [], |
1385 | $::BIND_EDITOR->set_binding (undef, undef, [], |
1379 | sub { |
1386 | sub { |
1380 | my ($mod, $sym, $cmds) = @_; |
1387 | my ($mod, $sym, $cmds) = @_; |
1381 | $::CFG->{bindings}->{$mod}->{$sym} = $cmds; |
1388 | $::BIND_EDITOR->cfg_bind ($mod, $sym, $cmds); |
1382 | $refresh->(); |
1389 | $refresh->(); |
1383 | $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); |
1390 | $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); |
1384 | $SETUP_DIALOG->show; |
1391 | $SETUP_DIALOG->show; |
1385 | }, |
1392 | }, |
1386 | sub { |
1393 | sub { |
… | |
… | |
1575 | $SETUP_NOTEBOOK->add (Graphics => graphics_setup, |
1582 | $SETUP_NOTEBOOK->add (Graphics => graphics_setup, |
1576 | "Configure the video mode, performance, fonts and other graphical aspects of the game."); |
1583 | "Configure the video mode, performance, fonts and other graphical aspects of the game."); |
1577 | $SETUP_NOTEBOOK->add (Audio => audio_setup, |
1584 | $SETUP_NOTEBOOK->add (Audio => audio_setup, |
1578 | "Configure the use of audio, sound effects and background music."); |
1585 | "Configure the use of audio, sound effects and background music."); |
1579 | $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, |
1586 | $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, |
1580 | "Lets you define, edit and delete bindings." |
1587 | "Lets you define, edit and delete key bindings." |
1581 | . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor " |
1588 | . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor " |
1582 | . "with nothing set and the recording started. After doing the actions you " |
1589 | . "with nothing set and the recording started. After doing the actions you " |
1583 | . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " |
1590 | . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " |
1584 | . "After pressing the combo the binding will be saved automatically and the " |
1591 | . "After pressing the combo the binding will be saved automatically and the " |
1585 | . "binding editor closes"); |
1592 | . "binding editor closes"); |
1586 | $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, |
1593 | $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, |
1587 | "Displays all spells you have and lets you edit keyboard shortcuts for them."); |
1594 | "Displays all spells you have and lets you edit keyboard shortcuts for them."); |
1588 | $SETUP_NOTEBOOK->add (Debug => debug_setup, |
1595 | $SETUP_NOTEBOOK->add (Debug => debug_setup, |
1589 | "Some debuggign options. Do not ask."); |
1596 | "Some debuggin' options. Do not ask."); |
1590 | |
1597 | |
1591 | $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top |
1598 | $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top |
1592 | |
1599 | |
1593 | $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, |
1600 | $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, |
1594 | tooltip => "Toggles a dialog where you can configure all aspects of this client."); |
1601 | tooltip => "Toggles a dialog where you can configure all aspects of this client."); |
… | |
… | |
1864 | |
1871 | |
1865 | CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; |
1872 | CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; |
1866 | CFClient::UI::set_layout ($::CFG->{layout}); |
1873 | CFClient::UI::set_layout ($::CFG->{layout}); |
1867 | |
1874 | |
1868 | my %DEF_CFG = ( |
1875 | my %DEF_CFG = ( |
1869 | sdl_mode => 0, |
1876 | sdl_mode => 0, |
1870 | width => 640, |
1877 | width => 640, |
1871 | height => 480, |
1878 | height => 480, |
1872 | fullscreen => 0, |
1879 | fullscreen => 0, |
1873 | fast => 0, |
1880 | fast => 0, |
1874 | map_scale => 1, |
1881 | map_scale => 1, |
1875 | fow_enable => 1, |
1882 | fow_enable => 1, |
1876 | fow_intensity => 0.45, |
1883 | fow_intensity => 0.45, |
1877 | fow_smooth => 0, |
1884 | fow_smooth => 0, |
1878 | gui_fontsize => 1, |
1885 | gui_fontsize => 1, |
1879 | log_fontsize => 0.7, |
1886 | log_fontsize => 0.7, |
1880 | gauge_fontsize=> 1, |
1887 | gauge_fontsize => 1, |
1881 | gauge_size => 0.35, |
1888 | gauge_size => 0.35, |
1882 | stat_fontsize => 0.7, |
1889 | stat_fontsize => 0.7, |
1883 | mapsize => 100, |
1890 | mapsize => 100, |
1884 | host => "crossfire.schmorp.de", |
|
|
1885 | say_command => 'say', |
1891 | say_command => 'say', |
1886 | audio_enable => 1, |
1892 | audio_enable => 1, |
1887 | bgm_enable => 1, |
1893 | bgm_enable => 1, |
1888 | bgm_volume => 0.25, |
1894 | bgm_volume => 0.25, |
1889 | face_prefetch => 0, |
1895 | face_prefetch => 0, |
1890 | output_sync => 1, |
1896 | output_sync => 1, |
1891 | output_count => 1, |
1897 | output_count => 1, |
1892 | pickup => 0, |
1898 | pickup => 0, |
|
|
1899 | default => "profile", # default profile |
|
|
1900 | ); |
1893 | ); |
1901 | |
1894 | |
|
|
1895 | while (my ($k, $v) = each %DEF_CFG) { |
1902 | while (my ($k, $v) = each %DEF_CFG) { |
1896 | $CFG->{$k} = $v unless exists $CFG->{$k}; |
1903 | $CFG->{$k} = $v unless exists $CFG->{$k}; |
1897 | } |
1904 | } |
|
|
1905 | |
|
|
1906 | $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de"; |
1898 | |
1907 | |
1899 | sdl_init; |
1908 | sdl_init; |
1900 | |
1909 | |
1901 | @SDL_MODES = reverse |
1910 | @SDL_MODES = reverse |
1902 | grep $_->[0] >= 640 && $_->[1] >= 480, |
1911 | grep $_->[0] >= 640 && $_->[1] >= 480, |