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

Comparing deliantra/Deliantra-Client/bin/deliantra (file contents):
Revision 1.89 by root, Mon Jan 12 03:11:05 2009 UTC vs.
Revision 1.104 by root, Sat Mar 20 01:38:59 2010 UTC

56 56
57 if ($^O eq "MSWin32") { 57 if ($^O eq "MSWin32") {
58 # pango is relocatable on win32 58 # pango is relocatable on win32
59 } else { 59 } else {
60 # OS X 60 # OS X
61 $ENV{FONTCONFIG_FILE} = "$root/fonts.conf"; # no effect??!?!
62 $ENV{FONTCONFIG_DIR} = $root; # no effect??!?!
63 $ENV{PANGO_RC_FILE} = "$root/pango.rc"; 61 $ENV{PANGO_RC_FILE} = "$root/pango.rc";
64 $ENV{DYLD_LIBRARY_PATH} = $root; 62 $ENV{DYLD_LIBRARY_PATH} = $root;
65 chdir $root; # for pango modules, maybe other things 63 chdir $root; # for pango modules, maybe other things
66 } 64 }
67 65
68 unshift @INC, $root; 66 unshift @INC, $root;
69 } 67 }
70} 68}
71 69
72# prepend private library directory 70# prepend private library directory and prepare env
73BEGIN { 71BEGIN {
74 for (grep !ref, @INC) { 72 for (grep !ref, @INC) {
75 my $path = "$_/Deliantra/Client/private"; 73 my $path = "$_/Deliantra/Client/private";
76 if (-d $path) { 74 if (-d $path) {
77 unshift @INC, $path; 75 unshift @INC, $path;
135 crash "CRASH/EV::DIED: $@" => 0; 133 crash "CRASH/EV::DIED: $@" => 0;
136 DC::fatal Carp::longmess $@; 134 DC::fatal Carp::longmess $@;
137}; 135};
138 136
139my $MAX_FPS = 60; 137my $MAX_FPS = 60;
138
139our $DEFAULT_SERVER = "gameserver.deliantra.net";
140 140
141our $META_SERVER = "http://metaserver.schmorp.de/current.json"; 141our $META_SERVER = "http://metaserver.schmorp.de/current.json";
142 142
143our $LAST_REFRESH; 143our $LAST_REFRESH;
144our $NOW; 144our $NOW;
205our $FLOORBOX; 205our $FLOORBOX;
206our $GAUGES; 206our $GAUGES;
207our $STATWIDS; 207our $STATWIDS;
208 208
209our $SDL_ACTIVE; 209our $SDL_ACTIVE;
210our %SDL_CB; 210our @SDL_CB;
211 211
212our $ALT_ENTER_MESSAGE; 212our $ALT_ENTER_MESSAGE;
213our $STATUSBOX; 213our $STATUSBOX;
214our $MODBOX; 214our $MODBOX;
215our $DEBUG_STATUS; 215our $DEBUG_STATUS;
541 sub audio_tab_update; 541 sub audio_tab_update;
542 audio_tab_update; 542 audio_tab_update;
543} 543}
544 544
545sub audio_shutdown { 545sub audio_shutdown {
546 if ($SDL_MIXER) {
547 DC::MixMusic::halt;
548 DC::Mix_AllocateChannels 0;
549 }
550
546 undef $MUSIC_PLAYER; 551 undef $MUSIC_PLAYER;
547 undef $MUSIC_PLAYING_META; 552 undef $MUSIC_PLAYING_META;
548 undef $MUSIC_PLAYING_DATA; 553 undef $MUSIC_PLAYING_DATA;
549 554
550 $MUSIC_WANT = []; 555 $MUSIC_WANT = [];
818 823
819 on_connect => sub { 824 on_connect => sub {
820 if ($_[0]) { 825 if ($_[0]) {
821 DC::lowdelay fileno $CONN->{fh}; 826 DC::lowdelay fileno $CONN->{fh};
822 827
823 status "login successful"; 828 status "successfully connected to the server";
824 } else { 829 } else {
825 undef $CONN; 830 undef $CONN;
826 status "unable to connect: $!"; 831 status "unable to connect: $!";
827 stop_game(); 832 stop_game();
828 } 833 }
830 ; 835 ;
831} 836}
832 837
833sub start_game { 838sub start_game {
834 status "logging in..."; 839 status "logging in...";
840
841 my $server = $PROFILE->{host} || $DEFAULT_SERVER;
842 my ($host, $port) = AnyEvent::Socket::parse_hostport $server, "deliantra=13327"
843 or return status "$server: unable to parse server address, try an empty field.";
835 844
836 $LOGIN_BUTTON->set_text ("Logout"); 845 $LOGIN_BUTTON->set_text ("Logout");
837 $SETUP_DIALOG->hide; 846 $SETUP_DIALOG->hide;
838
839 my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327";
840 847
841 $MAP = new DC::Map; 848 $MAP = new DC::Map;
842 849
843 # hack to make SURE we find the IP address all right 850 # hack to make SURE we find the IP address all right
844 # can be removed once AnyEvent::DNS is proven stable. 851 # can be removed once AnyEvent::DNS is proven stable.
845 if ($host eq "gameserver.deliantra.net") { 852 if ($host eq "gameserver.deliantra.net") {
846 AnyEvent::DNS::a "dnstest.deliantra.net", sub { 853 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
847 if ($_[0] ne "80.101.114.108") { # Perl 854 if ($_[0] ne "80.101.114.108") { # Perl
855 status "dns failure, trying differently";
856 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" };
857 unless (defined $host) {
848 status "dns failure, using hardcoded address"; 858 status "dns failure, using hardcoded address";
849 $host = "129.13.162.95"; 859 $host = "129.13.162.95";
860 }
850 } 861 }
851 862
852 dc_connect $host, $port; 863 dc_connect $host, $port;
853 }; 864 };
854 } else { 865 } else {
1023 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, " 1034 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, "
1024 . "then disable this option. Changes take effect immdiately.", 1035 . "then disable this option. Changes take effect immdiately.",
1025 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 } 1036 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 }
1026 ); 1037 );
1027 1038
1039 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Smooth Transitions");
1040 $table->add_at (1, $row++, new DC::UI::CheckBox
1041 state => $CFG->{smooth_transitions},
1042 tooltip => "<b>Smooth Transitions</b> tries to blend the fog of war and lighting smoothly between updates. "
1043 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, "
1044 . "then disable this option. Requires Smooth Movement and OpenGL Multitexturing. Changes take effect immdiately.",
1045 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_transitions} = $value; 0 }
1046 );
1047
1048
1028 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale"); 1049 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale");
1029 $table->add_at (1, $row++, new DC::UI::Slider 1050 $table->add_at (1, $row++, new DC::UI::Slider
1030 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 1051 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
1031 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 1052 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
1032 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } 1053 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
1044 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War"); 1065 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War");
1045 $table->add_at (1, $row++, new DC::UI::CheckBox 1066 $table->add_at (1, $row++, new DC::UI::CheckBox
1046 state => $CFG->{fow_enable}, 1067 state => $CFG->{fow_enable},
1047 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 1068 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
1048 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } 1069 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
1070 );
1071
1072 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Pattern");
1073 $table->add_at (1, $row++, new DC::UI::ImageButton
1074 tex => $DC::MapWidget::TEX_HIDDEN[$CFG->{fow_texture}],
1075 bg => [0.3, 0.3, 0.2],
1076 force_w => 64,
1077 force_h => 64,
1078 tooltip => "<b>Fog of War Pattern.</b> The pattern that is overlaid over areas hidden from view. Click to cycle through various alternatives. Changes are instant.",
1079 on_activate => sub {
1080 my ($self) = @_;
1081 $CFG->{fow_texture} = ($CFG->{fow_texture} + 1) % @DC::MapWidget::TEX_HIDDEN;
1082 $self->set_texture ($DC::MapWidget::TEX_HIDDEN[$CFG->{fow_texture}]);
1083 $MAPWIDGET->update;
1084 }
1049 ); 1085 );
1050 1086
1051 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity"); 1087 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity");
1052 $table->add_at (1, $row++, new DC::UI::Slider 1088 $table->add_at (1, $row++, new DC::UI::Slider
1053 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 1089 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
1105 1141
1106 my $text = !$freq 1142 my $text = !$freq
1107 ? "audio is off" 1143 ? "audio is off"
1108 : "audio is enabled\n" 1144 : "audio is enabled\n"
1109 . "frequency (Hz): $freq\n" 1145 . "frequency (Hz): $freq\n"
1110 . "channels: $chans"; 1146 . "channels: $chans\n"
1147 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n"
1148 . "music decoders available: " . (join ", ", DC::MixMusic::decoders);
1111 1149
1112 $AUDIO_INFO->set_text ($text); 1150 $AUDIO_INFO->set_text ($text);
1113} 1151}
1114 1152
1115sub audio_setup { 1153sub audio_setup {
1635 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), 1673 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1636 ); 1674 );
1637 1675
1638 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username"); 1676 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username");
1639 $table->add_at (1, 4, new DC::UI::Entry 1677 $table->add_at (1, 4, new DC::UI::Entry
1640 text => $CFG->{profile}{default}{user}, 1678 text => $PROFILE->{user},
1641 tooltip => "The name of your character on the server. The name is case-sensitive!", 1679 tooltip => "The name of your character on the server. The name is case-sensitive!",
1642 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1680 on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 }
1643 ); 1681 );
1644 1682
1645 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password"); 1683 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password");
1646 $table->add_at (1, 5, new DC::UI::Entry 1684 $table->add_at (1, 5, new DC::UI::Entry
1647 text => $CFG->{profile}{default}{password}, 1685 text => $PROFILE->{password},
1648 hidden => 1, 1686 hidden => 1,
1649 tooltip => "The password for your character.", 1687 tooltip => "The password for your character.",
1650 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1688 on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 }
1651 ); 1689 );
1652 1690
1653 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button 1691 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1654 expand => 1, 1692 expand => 1,
1655 text => "Login / Register", 1693 text => "Login / Register",
1691 $table->add_at (1, $row, my $vbox = new DC::UI::VBox); 1729 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1692 1730
1693 $vbox->add ( 1731 $vbox->add (
1694 $HOST_ENTRY = new DC::UI::Entry 1732 $HOST_ENTRY = new DC::UI::Entry
1695 expand => 1, 1733 expand => 1,
1696 text => $CFG->{profile}{default}{host}, 1734 text => $PROFILE->{host},
1697 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)", 1735 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)",
1698 on_changed => sub { 1736 on_changed => sub {
1699 my ($self, $value) = @_; 1737 my ($self, $value) = @_;
1700 $CFG->{profile}{default}{host} = $value; 1738 $PROFILE->{host} = $value;
1701 1 1739 1
1702 } 1740 }
1703 ); 1741 );
1704 1742
1705 if (0) { #d# disabled 1743 if (0) { #d# disabled
2258 ); 2296 );
2259 2297
2260 $MENUBAR->add ($GAUGES->{exp} = new DC::UI::ExperienceProgress 2298 $MENUBAR->add ($GAUGES->{exp} = new DC::UI::ExperienceProgress
2261 padding_x => 6, 2299 padding_x => 6,
2262 padding_y => 3, 2300 padding_y => 3,
2263 tooltip => "This progress bar shows your progress towards the next character level.", 2301 tooltip => "This progress bar shows your overall experience and your progress towards the next character level.",
2264 template => " Exp: 888,888,888,888 (lvl 188) ", 2302 template => " Exp: 888,888,888,888 (lvl 188) ",
2265 ); 2303 );
2266 2304
2267 $MENUBAR->add ($PICKUP_ENABLE = new DC::UI::CheckBox # checkbox bad, button better? 2305 $MENUBAR->add ($PICKUP_ENABLE = new DC::UI::CheckBox # checkbox bad, button better?
2268 tooltip => "Automatic Pickup Enable - when this checkbox is enabled, then your character " 2306 tooltip => "Automatic Pickup Enable - when this checkbox is enabled, then your character "
2481 2519
2482 DC::UI::Toplevel->new ( 2520 DC::UI::Toplevel->new (
2483 title => "Minimap", 2521 title => "Minimap",
2484 name => "mapmap", 2522 name => "mapmap",
2485 x => 0, 2523 x => 0,
2486 y => $FONTSIZE + 8, 2524 y => $::FONTSIZE + 8,#d# hack to move messages window below the menubar
2487 border_bg => [1, 1, 1, 192/255], 2525 border_bg => [1, 1, 1, 192/255],
2488 bg => [1, 1, 1, 0], 2526 bg => [1, 1, 1, 0],
2489 child => ($MAPMAP = new DC::MapWidget::MapMap 2527 child => ($MAPMAP = new DC::MapWidget::MapMap
2490 tooltip => "<b>Minimap</b>. This will display an overview of the surrounding areas.", 2528 tooltip => "<b>Minimap</b>. This will display an overview of the surrounding areas.",
2491 ), 2529 ),
2520 $METASERVER = metaserver_dialog; 2558 $METASERVER = metaserver_dialog;
2521 # the name is changed to not conflict with the older name as users could have hidden it 2559 # the name is changed to not conflict with the older name as users could have hidden it
2522 $MESSAGE_WINDOW = new DC::UI::Dockbar 2560 $MESSAGE_WINDOW = new DC::UI::Dockbar
2523 name => "message_window2", 2561 name => "message_window2",
2524 title => 'Messages', 2562 title => 'Messages',
2563 y => $::FONTSIZE + 8,#d# hack to move messages window below the menubar
2525 force_w => $::WIDTH * 0.6, 2564 force_w => $::WIDTH * 0.6,
2526 force_h => $::HEIGHT * 0.25, 2565 force_h => $::HEIGHT * 0.25,
2527 ; 2566 ;
2528 2567
2529 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW; 2568 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW;
2560 2599
2561 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]); 2600 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]);
2562 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode}); 2601 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode});
2563 2602
2564 $CAVEAT_LABEL->set_text ("None :)"); 2603 $CAVEAT_LABEL->set_text ("None :)");
2604 $CAVEAT_LABEL->set_text ("Apple/NVIDIA Texture bug (slow)")
2605 if $DC::OpenGL::APPLE_NVIDIA_BUG;
2565 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)") 2606 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)")
2566 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL; 2607 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL;
2567 2608
2568 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2609 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2569} 2610}
2597my $want_refresh = EV::prepare_ns \&force_refresh; 2638my $want_refresh = EV::prepare_ns \&force_refresh;
2598 2639
2599my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub { 2640my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub {
2600 $NOW = EV::now; 2641 $NOW = EV::now;
2601 2642
2602 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2643 ($SDL_CB[$_->{type}] || sub { warn "unhandled event $_->{type}" })->($_)
2603 for DC::poll_events; 2644 for DC::poll_events;
2604 2645
2605 if (%animate_object) { 2646 if (%animate_object) {
2606 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 2647 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
2607 $WANT_REFRESH = 1; 2648 $WANT_REFRESH = 1;
2619sub animation_stop { 2660sub animation_stop {
2620 my ($widget) = @_; 2661 my ($widget) = @_;
2621 delete $animate_object{$widget}; 2662 delete $animate_object{$widget};
2622} 2663}
2623 2664
2624%SDL_CB = (
2625 DC::SDL_QUIT => sub { 2665$SDL_CB[DC::SDL_QUIT] = sub {
2626 crash "SDL_QUIT"; 2666 crash "SDL_QUIT";
2627 EV::unloop EV::UNLOOP_ALL; 2667 EV::unloop EV::UNLOOP_ALL;
2628 }, 2668};
2629 DC::SDL_VIDEORESIZE => sub { 2669$SDL_CB[DC::SDL_VIDEORESIZE] = sub { };
2630 },
2631 DC::SDL_VIDEOEXPOSE => sub { 2670$SDL_CB[DC::SDL_VIDEOEXPOSE] = sub {
2632 DC::UI::full_refresh; 2671 DC::UI::full_refresh;
2633 }, 2672};
2634 DC::SDL_ACTIVEEVENT => sub { 2673$SDL_CB[DC::SDL_ACTIVEEVENT] = sub {
2635# not useful, as APPACTIVE includes only iconified state, not unmapped 2674# not useful, as APPACTIVE includes only iconified state, not unmapped
2636# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, DC::SDL_GetAppState;#d# 2675# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, DC::SDL_GetAppState;#d#
2637# printf "a %x\n", DC::SDL_GetAppState & DC::SDL_APPACTIVE;#d# 2676# printf "a %x\n", DC::SDL_GetAppState & DC::SDL_APPACTIVE;#d#
2638# printf "A\n" if $_[0]{state} & DC::SDL_APPACTIVE; 2677# printf "A\n" if $_[0]{state} & DC::SDL_APPACTIVE;
2639# printf "K\n" if $_[0]{state} & DC::SDL_APPINPUTFOCUS; 2678# printf "K\n" if $_[0]{state} & DC::SDL_APPINPUTFOCUS;
2640# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS; 2679# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS;
2641 }, 2680};
2642 DC::SDL_KEYDOWN => sub { 2681$SDL_CB[DC::SDL_KEYDOWN] = sub {
2643 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) { 2682 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) {
2644 # alt-enter 2683 # alt-enter
2645 video_shutdown; 2684 video_shutdown;
2646 $FULLSCREEN_ENABLE->toggle; 2685 $FULLSCREEN_ENABLE->toggle;
2647 video_init; 2686 video_init;
2648 } else { 2687 } else {
2649 &DC::UI::feed_sdl_key_down_event; 2688 &DC::UI::feed_sdl_key_down_event;
2650 } 2689 }
2651 update_modbox; 2690 update_modbox;
2652 }, 2691};
2653 DC::SDL_KEYUP => sub { 2692$SDL_CB[DC::SDL_KEYUP] = sub {
2654 &DC::UI::feed_sdl_key_up_event; 2693 &DC::UI::feed_sdl_key_up_event;
2655 update_modbox; 2694 update_modbox;
2656 }, 2695};
2657 DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event, 2696$SDL_CB[DC::SDL_MOUSEMOTION] = \&DC::UI::feed_sdl_motion_event,
2658 DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event, 2697$SDL_CB[DC::SDL_MOUSEBUTTONDOWN] = \&DC::UI::feed_sdl_button_down_event,
2659 DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event, 2698$SDL_CB[DC::SDL_MOUSEBUTTONUP] = \&DC::UI::feed_sdl_button_up_event,
2660 DC::SDL_USEREVENT => sub { 2699$SDL_CB[DC::SDL_USEREVENT] = sub {
2661 if ($_[0]{code} == 1) { 2700 if ($_[0]{code} == 1) {
2662 audio_channel_finished $_[0]{data1}; 2701 audio_channel_finished $_[0]{data1};
2663 } elsif ($_[0]{code} == 0) { 2702 } elsif ($_[0]{code} == 0) {
2664 audio_music_finished; 2703 audio_music_finished;
2665 }
2666 }, 2704 }
2667); 2705};
2668 2706
2669############################################################################# 2707#############################################################################
2670 2708
2671$SIG{INT} = $SIG{TERM} = sub { 2709$SIG{INT} = $SIG{TERM} = sub {
2672 EV::unloop; 2710 EV::unloop;
2705 fullscreen => 1, 2743 fullscreen => 1,
2706 fast => 0, 2744 fast => 0,
2707 force_opengl11 => undef, 2745 force_opengl11 => undef,
2708 disable_alpha => 0, 2746 disable_alpha => 0,
2709 smooth_movement => 1, 2747 smooth_movement => 1,
2748 smooth_transitions => 1,
2710 texture_compression => 1, 2749 texture_compression => 1,
2711 map_scale => 1, 2750 map_scale => 1,
2712 fow_enable => 1, 2751 fow_enable => 1,
2713 fow_intensity => 0, 2752 fow_intensity => 0,
2753 fow_texture => 0,
2714 map_smoothing => 1, 2754 map_smoothing => 1,
2715 gui_fontsize => 1, 2755 gui_fontsize => 1,
2716 log_fontsize => 0.7, 2756 log_fontsize => 0.7,
2717 gauge_fontsize => 1, 2757 gauge_fontsize => 1,
2718 gauge_size => 0.35, 2758 gauge_size => 0.35,
2733 default => "profile", # default profile 2773 default => "profile", # default profile
2734 show_tips => 1, 2774 show_tips => 1,
2735 logview_max_par => 1000, 2775 logview_max_par => 1000,
2736 shift_fire_stop => 0, 2776 shift_fire_stop => 0,
2737 uitheme => "wood", 2777 uitheme => "wood",
2738 ); 2778 map_shift_x => -24, # arbitrary
2779 map_shift_y => +24, # arbitrary
2739 2780 );
2781
2740 while (my ($k, $v) = each %DEF_CFG) { 2782 while (my ($k, $v) = each %DEF_CFG) {
2741 $CFG->{$k} = $v unless exists $CFG->{$k}; 2783 $CFG->{$k} = $v unless exists $CFG->{$k};
2742 } 2784 }
2743 2785
2744 $CFG->{profile}{default}{host} ||= "gameserver.deliantra.net"; 2786 my @args = @ARGV;
2787
2788 my $profile = 'default';
2789
2790 for (my $i = 0; $i < @args; $i++) {
2791 if ($args[$i] =~ /^--?profile$/) {
2792 $profile = $args[$i + 1];
2793 splice @args, $i, 2, ();
2794 $i = 0;
2795 } elsif ($args[$i] =~ /^--?h/) {
2796 print STDERR "Usage: $0 [--profile name] [host [user [password]]]\n";
2797 exit 0;
2798 }
2799 }
2800
2801 $CFG->{profile}{$profile} ||= {};
2745 $PROFILE = $CFG->{profile}{default}; 2802 $PROFILE = $CFG->{profile}{$profile};
2803 $PROFILE->{host} ||= "gameserver.deliantra.net";
2804
2805 $PROFILE->{host} = $args[0] if @args > 0;
2806 $PROFILE->{user} = $args[1] if @args > 1;
2807 $PROFILE->{password} = $args[2] if @args > 2;
2746 2808
2747 # convert old bindings (only default profile matters) 2809 # convert old bindings (only default profile matters)
2748 if (my $bindings = delete $PROFILE->{bindings}) { 2810 if (my $bindings = delete $PROFILE->{bindings}) {
2749 while (my ($mod, $syms) = each %$bindings) { 2811 while (my ($mod, $syms) = each %$bindings) {
2750 while (my ($sym, $cmds) = each %$syms) { 2812 while (my ($sym, $cmds) = each %$syms) {
2756 } 2818 }
2757 } 2819 }
2758 2820
2759 sdl_init; 2821 sdl_init;
2760 2822
2823 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf";
2824 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts";
2825
2761 { 2826 {
2762 my @fonts = map DC::find_rcfile "fonts/$_", qw( 2827 my @fonts = map DC::find_rcfile "fonts/$_", qw(
2763 DejaVuSans.ttf 2828 DejaVuSans.ttf
2764 DejaVuSansMono.ttf 2829 DejaVuSansMono.ttf
2765 DejaVuSans-Bold.ttf 2830 DejaVuSans-Bold.ttf
2766 DejaVuSansMono-Bold.ttf 2831 DejaVuSansMono-Bold.ttf
2767 DejaVuSans-Oblique.ttf 2832 DejaVuSans-Oblique.ttf
2768 DejaVuSansMono-Oblique.ttf 2833 DejaVuSansMono-Oblique.ttf
2769 DejaVuSans-BoldOblique.ttf 2834 DejaVuSans-BoldOblique.ttf
2770 DejaVuSansMono-BoldOblique.ttf 2835 DejaVuSansMono-BoldOblique.ttf
2836 mona.ttf
2771 ); 2837 );
2772 2838
2773 DC::add_font $_ for @fonts; 2839 DC::add_font $_ for @fonts;
2774 2840
2775 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2841 $FONT_PROP = new_from_file DC::Font $fonts[0];
2776 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2842 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2777 2843
2778 $FONT_PROP->make_default; 2844 $FONT_PROP->make_default;
2779 2845
2823 2889
2824deliantra - A Deliantra MORPG game client 2890deliantra - A Deliantra MORPG game client
2825 2891
2826=head1 SYNOPSIS 2892=head1 SYNOPSIS
2827 2893
2828Just run it - no commandline arguments are supported. 2894 deliantra [--profile name] [host [user [password]]]
2895 deliantra --help
2829 2896
2830=head1 USAGE 2897=head1 USAGE
2831 2898
2832deliantra utilises OpenGL for all UI elements and the game. It is supposed to 2899The deliantra client utilises OpenGL for all UI elements and the game. It
2833be used in fullscreen mode and interactively. 2900is supposed to be used in fullscreen mode and interactively.
2834 2901
2835=head1 DEBUGGING 2902=head1 DEBUGGING
2836
2837 2903
2838CFPLUS_DEBUG - environment variable 2904CFPLUS_DEBUG - environment variable
2839 2905
2840 1 draw borders around widgets 2906 1 draw borders around widgets
2841 2 add low-level widget info to tooltips 2907 2 add low-level widget info to tooltips

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines