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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines