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.94 by root, Sun Mar 29 22:28:13 2009 UTC vs.
Revision 1.107 by root, Thu Apr 8 03:51:26 2010 UTC

32 Win32::GUI::SplashScreen::Done (1); 32 Win32::GUI::SplashScreen::Done (1);
33 }; 33 };
34 } 34 }
35} 35}
36 36
37use strict; 37use common::sense;
38use utf8;
39 38
40use Carp 'verbose'; 39use Carp 'verbose';
41 40
42# do things only needed for single-binary version (par) 41# do things only needed for single-binary version (par)
43BEGIN { 42BEGIN {
133 crash "CRASH/EV::DIED: $@" => 0; 132 crash "CRASH/EV::DIED: $@" => 0;
134 DC::fatal Carp::longmess $@; 133 DC::fatal Carp::longmess $@;
135}; 134};
136 135
137my $MAX_FPS = 60; 136my $MAX_FPS = 60;
137
138our $DEFAULT_SERVER = "gameserver.deliantra.net";
138 139
139our $META_SERVER = "http://metaserver.schmorp.de/current.json"; 140our $META_SERVER = "http://metaserver.schmorp.de/current.json";
140 141
141our $LAST_REFRESH; 142our $LAST_REFRESH;
142our $NOW; 143our $NOW;
539 sub audio_tab_update; 540 sub audio_tab_update;
540 audio_tab_update; 541 audio_tab_update;
541} 542}
542 543
543sub audio_shutdown { 544sub audio_shutdown {
545 if ($SDL_MIXER) {
546 DC::MixMusic::halt;
547 DC::Mix_AllocateChannels 0;
548 }
549
544 undef $MUSIC_PLAYER; 550 undef $MUSIC_PLAYER;
545 undef $MUSIC_PLAYING_META; 551 undef $MUSIC_PLAYING_META;
546 undef $MUSIC_PLAYING_DATA; 552 undef $MUSIC_PLAYING_DATA;
547 553
548 $MUSIC_WANT = []; 554 $MUSIC_WANT = [];
800 user => $PROFILE->{user}, 806 user => $PROFILE->{user},
801 pass => $PROFILE->{password}, 807 pass => $PROFILE->{password},
802 mapw => $mapw, 808 mapw => $mapw,
803 maph => $maph, 809 maph => $maph,
804 810
811 client => "deliantra",
805 client => "$DC::VERSION $] $^O", 812 clientversion => $DC::VERSION,
806 813
807 map_widget => $MAPWIDGET, 814 map_widget => $MAPWIDGET,
808 statusbox => $STATUSBOX, 815 statusbox => $STATUSBOX,
809 map => $MAP, 816 map => $MAP,
810 mapmap => $MAPMAP, 817 mapmap => $MAPMAP,
828 ; 835 ;
829} 836}
830 837
831sub start_game { 838sub start_game {
832 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.";
833 844
834 $LOGIN_BUTTON->set_text ("Logout"); 845 $LOGIN_BUTTON->set_text ("Logout");
835 $SETUP_DIALOG->hide; 846 $SETUP_DIALOG->hide;
836
837 my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327";
838 847
839 $MAP = new DC::Map; 848 $MAP = new DC::Map;
840 849
841 # hack to make SURE we find the IP address all right 850 # hack to make SURE we find the IP address all right
842 # can be removed once AnyEvent::DNS is proven stable. 851 # can be removed once AnyEvent::DNS is proven stable.
843 if ($host eq "gameserver.deliantra.net") { 852 if ($host eq "gameserver.deliantra.net") {
844 AnyEvent::DNS::a "dnstest.deliantra.net", sub { 853 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
845 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) {
846 status "dns failure, using hardcoded address"; 858 status "dns failure, using hardcoded address";
847 $host = "129.13.162.95"; 859 $host = "129.13.162.95";
860 }
848 } 861 }
849 862
850 dc_connect $host, $port; 863 dc_connect $host, $port;
851 }; 864 };
852 } else { 865 } else {
1021 . "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, "
1022 . "then disable this option. Changes take effect immdiately.", 1035 . "then disable this option. Changes take effect immdiately.",
1023 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 } 1036 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 }
1024 ); 1037 );
1025 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
1026 $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");
1027 $table->add_at (1, $row++, new DC::UI::Slider 1050 $table->add_at (1, $row++, new DC::UI::Slider
1028 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 1051 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
1029 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 1052 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
1030 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 }
1042 $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");
1043 $table->add_at (1, $row++, new DC::UI::CheckBox 1066 $table->add_at (1, $row++, new DC::UI::CheckBox
1044 state => $CFG->{fow_enable}, 1067 state => $CFG->{fow_enable},
1045 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.",
1046 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 }
1047 ); 1085 );
1048 1086
1049 $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");
1050 $table->add_at (1, $row++, new DC::UI::Slider 1088 $table->add_at (1, $row++, new DC::UI::Slider
1051 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 1089 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
1103 1141
1104 my $text = !$freq 1142 my $text = !$freq
1105 ? "audio is off" 1143 ? "audio is off"
1106 : "audio is enabled\n" 1144 : "audio is enabled\n"
1107 . "frequency (Hz): $freq\n" 1145 . "frequency (Hz): $freq\n"
1108 . "channels: $chans"; 1146 . "channels: $chans\n"
1147 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n"
1148 . "music decoders available: " . (join ", ", DC::MixMusic::decoders);
1109 1149
1110 $AUDIO_INFO->set_text ($text); 1150 $AUDIO_INFO->set_text ($text);
1111} 1151}
1112 1152
1113sub audio_setup { 1153sub audio_setup {
1633 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]),
1634 ); 1674 );
1635 1675
1636 $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");
1637 $table->add_at (1, 4, new DC::UI::Entry 1677 $table->add_at (1, 4, new DC::UI::Entry
1638 text => $CFG->{profile}{default}{user}, 1678 text => $PROFILE->{user},
1639 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!",
1640 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1680 on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 }
1641 ); 1681 );
1642 1682
1643 $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");
1644 $table->add_at (1, 5, new DC::UI::Entry 1684 $table->add_at (1, 5, new DC::UI::Entry
1645 text => $CFG->{profile}{default}{password}, 1685 text => $PROFILE->{password},
1646 hidden => 1, 1686 hidden => 1,
1647 tooltip => "The password for your character.", 1687 tooltip => "The password for your character.",
1648 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1688 on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 }
1649 ); 1689 );
1650 1690
1651 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button 1691 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1652 expand => 1, 1692 expand => 1,
1653 text => "Login / Register", 1693 text => "Login / Register",
1689 $table->add_at (1, $row, my $vbox = new DC::UI::VBox); 1729 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1690 1730
1691 $vbox->add ( 1731 $vbox->add (
1692 $HOST_ENTRY = new DC::UI::Entry 1732 $HOST_ENTRY = new DC::UI::Entry
1693 expand => 1, 1733 expand => 1,
1694 text => $CFG->{profile}{default}{host}, 1734 text => $PROFILE->{host},
1695 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>)",
1696 on_changed => sub { 1736 on_changed => sub {
1697 my ($self, $value) = @_; 1737 my ($self, $value) = @_;
1698 $CFG->{profile}{default}{host} = $value; 1738 $PROFILE->{host} = $value;
1699 1 1739 1
1700 } 1740 }
1701 ); 1741 );
1702 1742
1703 if (0) { #d# disabled 1743 if (0) { #d# disabled
1902 $r 1942 $r
1903} 1943}
1904 1944
1905my %SORT_ORDER = ( 1945my %SORT_ORDER = (
1906 type => sub { 1946 type => sub {
1947 use sort 'stable';
1907 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_ 1948 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1908 }, 1949 },
1909 mtime => sub { 1950 mtime => sub {
1951 use sort 'stable';
1910 my $NOW = time; 1952 my $NOW = time;
1911 sort { 1953 sort {
1912 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6; 1954 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1913 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6; 1955 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1914 1956
1915 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 1957 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1916 or $btime <=> $atime 1958 or $btime <=> $atime
1917 or $a->{type} <=> $b->{type} 1959 or $a->{type} <=> $b->{type}
1918 } @_ 1960 } @_
1919 }, 1961 },
1920 weight => sub { sort { 1962 weight => sub {
1963 use sort 'stable';
1964 sort {
1921 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 1965 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1922 or $a->{type} <=> $b->{type} 1966 or $a->{type} <=> $b->{type}
1923 } @_ }, 1967 } @_
1968 },
1924); 1969);
1925 1970
1926sub inventory_widget { 1971sub inventory_widget {
1927 my $hb = new DC::UI::HBox homogeneous => 1; 1972 my $hb = new DC::UI::HBox homogeneous => 1;
1928 1973
2559 2604
2560 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]); 2605 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]);
2561 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode}); 2606 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode});
2562 2607
2563 $CAVEAT_LABEL->set_text ("None :)"); 2608 $CAVEAT_LABEL->set_text ("None :)");
2609 $CAVEAT_LABEL->set_text ("Apple/NVIDIA Texture bug (slow)")
2610 if $DC::OpenGL::APPLE_NVIDIA_BUG;
2564 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)") 2611 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)")
2565 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL; 2612 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL;
2566 2613
2567 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2614 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2568} 2615}
2701 fullscreen => 1, 2748 fullscreen => 1,
2702 fast => 0, 2749 fast => 0,
2703 force_opengl11 => undef, 2750 force_opengl11 => undef,
2704 disable_alpha => 0, 2751 disable_alpha => 0,
2705 smooth_movement => 1, 2752 smooth_movement => 1,
2753 smooth_transitions => 1,
2706 texture_compression => 1, 2754 texture_compression => 1,
2707 map_scale => 1, 2755 map_scale => 1,
2708 fow_enable => 1, 2756 fow_enable => 1,
2709 fow_intensity => 0, 2757 fow_intensity => 0,
2758 fow_texture => 0,
2710 map_smoothing => 1, 2759 map_smoothing => 1,
2711 gui_fontsize => 1, 2760 gui_fontsize => 1,
2712 log_fontsize => 0.7, 2761 log_fontsize => 0.7,
2713 gauge_fontsize => 1, 2762 gauge_fontsize => 1,
2714 gauge_size => 0.35, 2763 gauge_size => 0.35,
2732 shift_fire_stop => 0, 2781 shift_fire_stop => 0,
2733 uitheme => "wood", 2782 uitheme => "wood",
2734 map_shift_x => -24, # arbitrary 2783 map_shift_x => -24, # arbitrary
2735 map_shift_y => +24, # arbitrary 2784 map_shift_y => +24, # arbitrary
2736 ); 2785 );
2737 2786
2738 while (my ($k, $v) = each %DEF_CFG) { 2787 while (my ($k, $v) = each %DEF_CFG) {
2739 $CFG->{$k} = $v unless exists $CFG->{$k}; 2788 $CFG->{$k} = $v unless exists $CFG->{$k};
2740 } 2789 }
2741 2790
2742 $CFG->{profile}{default}{host} ||= "gameserver.deliantra.net"; 2791 my @args = @ARGV;
2792
2793 my $profile = 'default';
2794
2795 for (my $i = 0; $i < @args; $i++) {
2796 if ($args[$i] =~ /^--?profile$/) {
2797 $profile = $args[$i + 1];
2798 splice @args, $i, 2, ();
2799 $i = 0;
2800 } elsif ($args[$i] =~ /^--?h/) {
2801 print STDERR "Usage: $0 [--profile name] [host [user [password]]]\n";
2802 exit 0;
2803 }
2804 }
2805
2806 $CFG->{profile}{$profile} ||= {};
2743 $PROFILE = $CFG->{profile}{default}; 2807 $PROFILE = $CFG->{profile}{$profile};
2808 $PROFILE->{host} ||= "gameserver.deliantra.net";
2809
2810 $PROFILE->{host} = $args[0] if @args > 0;
2811 $PROFILE->{user} = $args[1] if @args > 1;
2812 $PROFILE->{password} = $args[2] if @args > 2;
2744 2813
2745 # convert old bindings (only default profile matters) 2814 # convert old bindings (only default profile matters)
2746 if (my $bindings = delete $PROFILE->{bindings}) { 2815 if (my $bindings = delete $PROFILE->{bindings}) {
2747 while (my ($mod, $syms) = each %$bindings) { 2816 while (my ($mod, $syms) = each %$bindings) {
2748 while (my ($sym, $cmds) = each %$syms) { 2817 while (my ($sym, $cmds) = each %$syms) {
2771 DejaVuSansMono-BoldOblique.ttf 2840 DejaVuSansMono-BoldOblique.ttf
2772 mona.ttf 2841 mona.ttf
2773 ); 2842 );
2774 2843
2775 DC::add_font $_ for @fonts; 2844 DC::add_font $_ for @fonts;
2776 2845
2777 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2846 $FONT_PROP = new_from_file DC::Font $fonts[0];
2778 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2847 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2779 2848
2780 $FONT_PROP->make_default; 2849 $FONT_PROP->make_default;
2781 2850
2825 2894
2826deliantra - A Deliantra MORPG game client 2895deliantra - A Deliantra MORPG game client
2827 2896
2828=head1 SYNOPSIS 2897=head1 SYNOPSIS
2829 2898
2830Just run it - no commandline arguments are supported. 2899 deliantra [--profile name] [host [user [password]]]
2900 deliantra --help
2831 2901
2832=head1 USAGE 2902=head1 USAGE
2833 2903
2834deliantra utilises OpenGL for all UI elements and the game. It is supposed to 2904The deliantra client utilises OpenGL for all UI elements and the game. It
2835be used in fullscreen mode and interactively. 2905is supposed to be used in fullscreen mode and interactively.
2836 2906
2837=head1 DEBUGGING 2907=head1 DEBUGGING
2838
2839 2908
2840CFPLUS_DEBUG - environment variable 2909CFPLUS_DEBUG - environment variable
2841 2910
2842 1 draw borders around widgets 2911 1 draw borders around widgets
2843 2 add low-level widget info to tooltips 2912 2 add low-level widget info to tooltips

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines