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.85 by root, Sun Jan 11 03:19:47 2009 UTC vs.
Revision 1.105 by root, Sat Apr 3 02:58:25 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.", 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 ["Enable autopickup" => PICKUP_NEWMODE, \$PICKUP_ENABLE],
1815 ["Inhibit autopickup" => PICKUP_INHIBIT], 1851# ["Inhibit autopickup" => PICKUP_INHIBIT],
1816 ["Stop before pickup" => PICKUP_STOP], 1852 ["Stop before pickup" => PICKUP_STOP],
1817 ["Debug autopickup" => PICKUP_DEBUG], 1853 ["Debug autopickup" => PICKUP_DEBUG],
1818 ], 1854 ],
1819 ["Weapons", 0, 6, 1855 ["Weapons", 0, 6,
1820 ["All weapons" => PICKUP_ALLWEAPON], 1856 ["All weapons" => PICKUP_ALLWEAPON],
1868 $::CFG->{pickup} |= $mask; 1904 $::CFG->{pickup} |= $mask;
1869 } else { 1905 } else {
1870 $::CFG->{pickup} &= ~$mask; 1906 $::CFG->{pickup} &= ~$mask;
1871 } 1907 }
1872 1908
1873 $::CONN->send_command ("pickup $::CFG->{pickup}") 1909 $::CONN->send_pickup ($::CFG->{pickup})
1874 if defined $::CONN; 1910 if defined $::CONN;
1875 1911
1876 0 1912 0
1877 }); 1913 });
1878 1914
1895 }); 1931 });
1896 1932
1897 $table->add_at (3, 18, new DC::UI::Button 1933 $table->add_at (3, 18, new DC::UI::Button
1898 text => "set", 1934 text => "set",
1899 on_activate => sub { 1935 on_activate => sub {
1900 $::CONN->send_command ("pickup $::CFG->{pickup}") 1936 $::CONN->send_pickup ($::CFG->{pickup})
1901 if defined $::CONN; 1937 if defined $::CONN;
1902 0 1938 0
1903 }); 1939 });
1904 1940
1905 $r 1941 $r
2068 2104
2069sub keyboard_setup { 2105sub keyboard_setup {
2070 DC::Macro::keyboard_setup 2106 DC::Macro::keyboard_setup
2071} 2107}
2072 2108
2073sub help_window { 2109sub make_help_window {
2074 my $win = new DC::UI::Toplevel 2110 my $win = new DC::UI::Toplevel
2075 x => 'center', 2111 x => 'center',
2076 y => 'center', 2112 y => 'center',
2077 z => 4, 2113 z => 4,
2078 name => 'doc_browser', 2114 name => 'doc_browser',
2167 2203
2168 $load_node->((DC::Pod::find @path)[0]); 2204 $load_node->((DC::Pod::find @path)[0]);
2169 $win->show; 2205 $win->show;
2170 }; 2206 };
2171 2207
2172 $win 2208 $HELP_WINDOW = $win;
2173} 2209}
2174 2210
2175sub open_quit_dialog { 2211sub open_quit_dialog {
2176 unless ($QUIT_DIALOG) { 2212 unless ($QUIT_DIALOG) {
2177 $QUIT_DIALOG = new DC::UI::Toplevel 2213 $QUIT_DIALOG = new DC::UI::Toplevel
2210 2246
2211 $QUIT_DIALOG->show; 2247 $QUIT_DIALOG->show;
2212 $QUIT_DIALOG->grab_focus; 2248 $QUIT_DIALOG->grab_focus;
2213} 2249}
2214 2250
2215sub make_menuframe { 2251sub make_menubar {
2216 $MENUFRAME = new DC::UI::Toplevel 2252 $MENUFRAME = new DC::UI::Toplevel
2217 border => 0, 2253 border => 0,
2218 force_x => 0, 2254 force_x => 0,
2219 force_y => 0, 2255 force_y => 0,
2220 force_w => $::WIDTH, 2256 force_w => $::WIDTH,
2230# tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 2266# tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
2231 2267
2232 make_playerbook; 2268 make_playerbook;
2233 2269
2234 $MENUPOPUP = DC::UI::Menu->new (items => [ 2270 $MENUPOPUP = DC::UI::Menu->new (items => [
2235 ["Setup…" , sub { $SETUP_DIALOG->toggle_visibility}], 2271 ["Setup…\tF9" , sub { $SETUP_DIALOG->toggle_visibility }],
2236 ["Playerbook…\tTab", sub { $PL_WINDOW ->toggle_visibility}], 2272 ["Playerbook…\tTab" , sub { $PL_WINDOW ->toggle_visibility }],
2273 ["…Statistics\tF2" , sub { toggle_player_page ($::STATS_PAGE) }],
2274 ["…Skills\tF3" , sub { toggle_player_page ($::SKILL_PAGE) }],
2275 ["…Spells\tF4" , sub { toggle_player_page ($::SPELL_PAGE) }],
2276 ["…Inventory\tF5" , sub { toggle_player_page ($::INVENTORY_PAGE) }],
2237 ["Help Browser…" , sub { $HELP_WINDOW ->toggle_visibility}], 2277 ["Help Browser…\tF1" , sub { $HELP_WINDOW ->toggle_visibility }],
2238 ["Quit…" , sub { 2278 ["Quit…" , sub {
2239 if ($CONN) { 2279 if ($CONN) {
2240 open_quit_dialog; 2280 open_quit_dialog;
2241 } else { 2281 } else {
2242 EV::unloop EV::UNLOOP_ALL; 2282 EV::unloop EV::UNLOOP_ALL;
2243 } 2283 }
2244 }], 2284 }],
2245 ]); 2285 ]);
2246 2286
2247 $BUTTONBAR->add (new DC::UI::Button text => "Menu…", 2287 $BUTTONBAR->add (new DC::UI::Button text => "Menu…",
2248 tooltip => "Shows the main menu", 2288 tooltip => "Shows the main menu",
2249 on_button_down => sub { $MENUPOPUP->popup ($_[1]) }, 2289 on_button_down => sub {
2290 my ($self, $ev) = @_;
2291 local $ev->{x} = 0;
2292 local $ev->{y} = 0;
2293 $MENUPOPUP->popup ($ev);
2294 },
2250 ); 2295 );
2251 2296
2252 $MENUBAR->add ($GAUGES->{prg} = new DC::UI::ExperienceProgress 2297 $MENUBAR->add ($GAUGES->{exp} = new DC::UI::ExperienceProgress
2253 c_rescale => 1,
2254 padding_x => 6, 2298 padding_x => 6,
2255 padding_y => 3, 2299 padding_y => 3,
2256 force_w => $::WIDTH * 0.1,
2257 tooltip => "This progress bar shows your progress towards the next character level.", 2300 tooltip => "This progress bar shows your overall experience and your progress towards the next character level.",
2301 template => " Exp: 888,888,888,888 (lvl 188) ",
2258 ); 2302 );
2259 $MENUBAR->add ($GAUGES->{exp} = new DC::UI::Label 2303
2260 align => 1, can_hover => 1, can_events => 1, 2304 $MENUBAR->add ($PICKUP_ENABLE = new DC::UI::CheckBox # checkbox bad, button better?
2261 text => "Total Experience", 2305 tooltip => "Automatic Pickup Enable - when this checkbox is enabled, then your character "
2262 tooltip => "#stat_exp", 2306 . "will automatically pick up items as defined by your item pickup settings "
2263 fontsize => 0.8, 2307 . "in the playerbook. Often (e.g. in apartments) you want to temporarily "
2308 . "disable autopickup by disabling this checkbox.",
2309 state => $CFG->{pickup} & PICKUP_INHIBIT ? 0 : 1,
2310 on_changed => sub {
2311 my ($self, $value) = @_;
2312 $CFG->{pickup} &= ~PICKUP_INHIBIT;
2313 $CFG->{pickup} |= PICKUP_INHIBIT unless $_[1];
2314 $CONN->send_pickup ($CFG->{pickup})
2315 if $CONN;
2316 },
2264 ); 2317 );
2318
2265 $MENUBAR->add ($GAUGES->{sklprg} = new DC::UI::ExperienceProgress 2319 $MENUBAR->add ($GAUGES->{skillexp} = new DC::UI::ExperienceProgress
2266 c_rescale => 1, 2320 c_rescale => 1,
2267 padding_x => 6, 2321 padding_x => 6,
2268 padding_y => 3, 2322 padding_y => 3,
2269 force_w => $::WIDTH * 0.2, 2323 force_w => $::WIDTH * 0.2,
2270 tooltip => "This progress bar shows the currently used skill and your progress towards the next skill level of that skill.", 2324 tooltip => "This progress bar shows the currently used skill and your progress towards the next skill level of that skill.",
2325 template => "two handed weapons 99%",
2271 ); 2326 );
2327
2272 $MENUBAR->add ($GAUGES->{range} = new DC::UI::Label 2328 $MENUBAR->add ($GAUGES->{range} = new DC::UI::Label
2273 expand => 1, 2329 expand => 1,
2274 align => 1, can_hover => 1, can_events => 1, 2330 align => 1, can_hover => 1, can_events => 1,
2275 text => "Range and Combat Slots", 2331 text => "Range and Combat Slots",
2276 tooltip => "#stat_ranged", 2332 tooltip => "#stat_ranged",
2462 2518
2463 DC::UI::Toplevel->new ( 2519 DC::UI::Toplevel->new (
2464 title => "Minimap", 2520 title => "Minimap",
2465 name => "mapmap", 2521 name => "mapmap",
2466 x => 0, 2522 x => 0,
2467 y => $FONTSIZE + 8, 2523 y => $::FONTSIZE + 8,#d# hack to move messages window below the menubar
2468 border_bg => [1, 1, 1, 192/255], 2524 border_bg => [1, 1, 1, 192/255],
2469 bg => [1, 1, 1, 0], 2525 bg => [1, 1, 1, 0],
2470 child => ($MAPMAP = new DC::MapWidget::MapMap 2526 child => ($MAPMAP = new DC::MapWidget::MapMap
2471 tooltip => "<b>Minimap</b>. This will display an overview of the surrounding areas.", 2527 tooltip => "<b>Minimap</b>. This will display an overview of the surrounding areas.",
2472 ), 2528 ),
2501 $METASERVER = metaserver_dialog; 2557 $METASERVER = metaserver_dialog;
2502 # the name is changed to not conflict with the older name as users could have hidden it 2558 # the name is changed to not conflict with the older name as users could have hidden it
2503 $MESSAGE_WINDOW = new DC::UI::Dockbar 2559 $MESSAGE_WINDOW = new DC::UI::Dockbar
2504 name => "message_window2", 2560 name => "message_window2",
2505 title => 'Messages', 2561 title => 'Messages',
2562 y => $::FONTSIZE + 8,#d# hack to move messages window below the menubar
2506 force_w => $::WIDTH * 0.6, 2563 force_w => $::WIDTH * 0.6,
2507 force_h => $::HEIGHT * 0.25, 2564 force_h => $::HEIGHT * 0.25,
2508 ; 2565 ;
2509 2566
2510 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW; 2567 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW;
2530 . "After pressing the combo the binding will be saved automatically and the " 2587 . "After pressing the combo the binding will be saved automatically and the "
2531 . "binding editor closes"); 2588 . "binding editor closes");
2532 $SETUP_NOTEBOOK->add_tab (Debug => debug_setup, 2589 $SETUP_NOTEBOOK->add_tab (Debug => debug_setup,
2533 "Some debuggin' options. Do not ask."); 2590 "Some debuggin' options. Do not ask.");
2534 2591
2592 make_help_window;
2535 make_menuframe; 2593 make_menubar;
2536 2594
2537 $SETUP_DIALOG->show; 2595 $SETUP_DIALOG->show;
2538 $MESSAGE_WINDOW->show; 2596 $MESSAGE_WINDOW->show;
2539 } 2597 }
2540 2598
2541 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]); 2599 $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]);
2542 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode}); 2600 $MODE_SLIDER->emit (changed => $CFG->{sdl_mode});
2543 2601
2544 $CAVEAT_LABEL->set_text ("None :)"); 2602 $CAVEAT_LABEL->set_text ("None :)");
2603 $CAVEAT_LABEL->set_text ("Apple/NVIDIA Texture bug (slow)")
2604 if $DC::OpenGL::APPLE_NVIDIA_BUG;
2545 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)") 2605 $CAVEAT_LABEL->set_text ("Software Rendering (very slow)")
2546 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL; 2606 unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL;
2547 2607
2548 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2608 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2549} 2609}
2577my $want_refresh = EV::prepare_ns \&force_refresh; 2637my $want_refresh = EV::prepare_ns \&force_refresh;
2578 2638
2579my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub { 2639my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub {
2580 $NOW = EV::now; 2640 $NOW = EV::now;
2581 2641
2582 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2642 ($SDL_CB[$_->{type}] || sub { warn "unhandled event $_->{type}" })->($_)
2583 for DC::poll_events; 2643 for DC::poll_events;
2584 2644
2585 if (%animate_object) { 2645 if (%animate_object) {
2586 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 2646 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
2587 $WANT_REFRESH = 1; 2647 $WANT_REFRESH = 1;
2599sub animation_stop { 2659sub animation_stop {
2600 my ($widget) = @_; 2660 my ($widget) = @_;
2601 delete $animate_object{$widget}; 2661 delete $animate_object{$widget};
2602} 2662}
2603 2663
2604%SDL_CB = (
2605 DC::SDL_QUIT => sub { 2664$SDL_CB[DC::SDL_QUIT] = sub {
2606 crash "SDL_QUIT"; 2665 crash "SDL_QUIT";
2607 EV::unloop EV::UNLOOP_ALL; 2666 EV::unloop EV::UNLOOP_ALL;
2608 }, 2667};
2609 DC::SDL_VIDEORESIZE => sub { 2668$SDL_CB[DC::SDL_VIDEORESIZE] = sub { };
2610 },
2611 DC::SDL_VIDEOEXPOSE => sub { 2669$SDL_CB[DC::SDL_VIDEOEXPOSE] = sub {
2612 DC::UI::full_refresh; 2670 DC::UI::full_refresh;
2613 }, 2671};
2614 DC::SDL_ACTIVEEVENT => sub { 2672$SDL_CB[DC::SDL_ACTIVEEVENT] = sub {
2615# not useful, as APPACTIVE includes only iconified state, not unmapped 2673# not useful, as APPACTIVE includes only iconified state, not unmapped
2616# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, DC::SDL_GetAppState;#d# 2674# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, DC::SDL_GetAppState;#d#
2617# printf "a %x\n", DC::SDL_GetAppState & DC::SDL_APPACTIVE;#d# 2675# printf "a %x\n", DC::SDL_GetAppState & DC::SDL_APPACTIVE;#d#
2618# printf "A\n" if $_[0]{state} & DC::SDL_APPACTIVE; 2676# printf "A\n" if $_[0]{state} & DC::SDL_APPACTIVE;
2619# printf "K\n" if $_[0]{state} & DC::SDL_APPINPUTFOCUS; 2677# printf "K\n" if $_[0]{state} & DC::SDL_APPINPUTFOCUS;
2620# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS; 2678# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS;
2621 }, 2679};
2622 DC::SDL_KEYDOWN => sub { 2680$SDL_CB[DC::SDL_KEYDOWN] = sub {
2623 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) { 2681 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) {
2624 # alt-enter 2682 # alt-enter
2625 video_shutdown; 2683 video_shutdown;
2626 $FULLSCREEN_ENABLE->toggle; 2684 $FULLSCREEN_ENABLE->toggle;
2627 video_init; 2685 video_init;
2628 } else { 2686 } else {
2629 &DC::UI::feed_sdl_key_down_event; 2687 &DC::UI::feed_sdl_key_down_event;
2630 } 2688 }
2631 update_modbox; 2689 update_modbox;
2632 }, 2690};
2633 DC::SDL_KEYUP => sub { 2691$SDL_CB[DC::SDL_KEYUP] = sub {
2634 &DC::UI::feed_sdl_key_up_event; 2692 &DC::UI::feed_sdl_key_up_event;
2635 update_modbox; 2693 update_modbox;
2636 }, 2694};
2637 DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event, 2695$SDL_CB[DC::SDL_MOUSEMOTION] = \&DC::UI::feed_sdl_motion_event,
2638 DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event, 2696$SDL_CB[DC::SDL_MOUSEBUTTONDOWN] = \&DC::UI::feed_sdl_button_down_event,
2639 DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event, 2697$SDL_CB[DC::SDL_MOUSEBUTTONUP] = \&DC::UI::feed_sdl_button_up_event,
2640 DC::SDL_USEREVENT => sub { 2698$SDL_CB[DC::SDL_USEREVENT] = sub {
2641 if ($_[0]{code} == 1) { 2699 if ($_[0]{code} == 1) {
2642 audio_channel_finished $_[0]{data1}; 2700 audio_channel_finished $_[0]{data1};
2643 } elsif ($_[0]{code} == 0) { 2701 } elsif ($_[0]{code} == 0) {
2644 audio_music_finished; 2702 audio_music_finished;
2645 }
2646 }, 2703 }
2647); 2704};
2648 2705
2649############################################################################# 2706#############################################################################
2650 2707
2651$SIG{INT} = $SIG{TERM} = sub { 2708$SIG{INT} = $SIG{TERM} = sub {
2652 EV::unloop; 2709 EV::unloop;
2685 fullscreen => 1, 2742 fullscreen => 1,
2686 fast => 0, 2743 fast => 0,
2687 force_opengl11 => undef, 2744 force_opengl11 => undef,
2688 disable_alpha => 0, 2745 disable_alpha => 0,
2689 smooth_movement => 1, 2746 smooth_movement => 1,
2747 smooth_transitions => 1,
2690 texture_compression => 1, 2748 texture_compression => 1,
2691 map_scale => 1, 2749 map_scale => 1,
2692 fow_enable => 1, 2750 fow_enable => 1,
2693 fow_intensity => 0, 2751 fow_intensity => 0,
2752 fow_texture => 0,
2694 map_smoothing => 1, 2753 map_smoothing => 1,
2695 gui_fontsize => 1, 2754 gui_fontsize => 1,
2696 log_fontsize => 0.7, 2755 log_fontsize => 0.7,
2697 gauge_fontsize => 1, 2756 gauge_fontsize => 1,
2698 gauge_size => 0.35, 2757 gauge_size => 0.35,
2706 effects_enable => 1, 2765 effects_enable => 1,
2707 effects_volume => 1, 2766 effects_volume => 1,
2708 bgm_enable => 1, 2767 bgm_enable => 1,
2709 bgm_volume => 0.5, 2768 bgm_volume => 0.5,
2710 output_rate => "", 2769 output_rate => "",
2711 pickup => 0, 2770 pickup => PICKUP_SPELLBOOK | PICKUP_SKILLSCROLL | PICKUP_VALUABLES,
2712 inv_sort => "mtime", 2771 inv_sort => "mtime",
2713 default => "profile", # default profile 2772 default => "profile", # default profile
2714 show_tips => 1, 2773 show_tips => 1,
2715 logview_max_par => 1000, 2774 logview_max_par => 1000,
2716 shift_fire_stop => 0, 2775 shift_fire_stop => 0,
2717 uitheme => "wood", 2776 uitheme => "wood",
2718 ); 2777 map_shift_x => -24, # arbitrary
2778 map_shift_y => +24, # arbitrary
2719 2779 );
2780
2720 while (my ($k, $v) = each %DEF_CFG) { 2781 while (my ($k, $v) = each %DEF_CFG) {
2721 $CFG->{$k} = $v unless exists $CFG->{$k}; 2782 $CFG->{$k} = $v unless exists $CFG->{$k};
2722 } 2783 }
2723 2784
2724 $CFG->{profile}{default}{host} ||= "gameserver.deliantra.net"; 2785 my @args = @ARGV;
2786
2787 my $profile = 'default';
2788
2789 for (my $i = 0; $i < @args; $i++) {
2790 if ($args[$i] =~ /^--?profile$/) {
2791 $profile = $args[$i + 1];
2792 splice @args, $i, 2, ();
2793 $i = 0;
2794 } elsif ($args[$i] =~ /^--?h/) {
2795 print STDERR "Usage: $0 [--profile name] [host [user [password]]]\n";
2796 exit 0;
2797 }
2798 }
2799
2800 $CFG->{profile}{$profile} ||= {};
2725 $PROFILE = $CFG->{profile}{default}; 2801 $PROFILE = $CFG->{profile}{$profile};
2802 $PROFILE->{host} ||= "gameserver.deliantra.net";
2803
2804 $PROFILE->{host} = $args[0] if @args > 0;
2805 $PROFILE->{user} = $args[1] if @args > 1;
2806 $PROFILE->{password} = $args[2] if @args > 2;
2726 2807
2727 # convert old bindings (only default profile matters) 2808 # convert old bindings (only default profile matters)
2728 if (my $bindings = delete $PROFILE->{bindings}) { 2809 if (my $bindings = delete $PROFILE->{bindings}) {
2729 while (my ($mod, $syms) = each %$bindings) { 2810 while (my ($mod, $syms) = each %$bindings) {
2730 while (my ($sym, $cmds) = each %$syms) { 2811 while (my ($sym, $cmds) = each %$syms) {
2736 } 2817 }
2737 } 2818 }
2738 2819
2739 sdl_init; 2820 sdl_init;
2740 2821
2822 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf";
2823 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts";
2824
2741 { 2825 {
2742 my @fonts = map DC::find_rcfile "fonts/$_", qw( 2826 my @fonts = map DC::find_rcfile "fonts/$_", qw(
2743 DejaVuSans.ttf 2827 DejaVuSans.ttf
2744 DejaVuSansMono.ttf 2828 DejaVuSansMono.ttf
2745 DejaVuSans-Bold.ttf 2829 DejaVuSans-Bold.ttf
2746 DejaVuSansMono-Bold.ttf 2830 DejaVuSansMono-Bold.ttf
2747 DejaVuSans-Oblique.ttf 2831 DejaVuSans-Oblique.ttf
2748 DejaVuSansMono-Oblique.ttf 2832 DejaVuSansMono-Oblique.ttf
2749 DejaVuSans-BoldOblique.ttf 2833 DejaVuSans-BoldOblique.ttf
2750 DejaVuSansMono-BoldOblique.ttf 2834 DejaVuSansMono-BoldOblique.ttf
2835 mona.ttf
2751 ); 2836 );
2752 2837
2753 DC::add_font $_ for @fonts; 2838 DC::add_font $_ for @fonts;
2754 2839
2755 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2840 $FONT_PROP = new_from_file DC::Font $fonts[0];
2756 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2841 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2757 2842
2758 $FONT_PROP->make_default; 2843 $FONT_PROP->make_default;
2759 2844
2803 2888
2804deliantra - A Deliantra MORPG game client 2889deliantra - A Deliantra MORPG game client
2805 2890
2806=head1 SYNOPSIS 2891=head1 SYNOPSIS
2807 2892
2808Just run it - no commandline arguments are supported. 2893 deliantra [--profile name] [host [user [password]]]
2894 deliantra --help
2809 2895
2810=head1 USAGE 2896=head1 USAGE
2811 2897
2812deliantra utilises OpenGL for all UI elements and the game. It is supposed to 2898The deliantra client utilises OpenGL for all UI elements and the game. It
2813be used in fullscreen mode and interactively. 2899is supposed to be used in fullscreen mode and interactively.
2814 2900
2815=head1 DEBUGGING 2901=head1 DEBUGGING
2816
2817 2902
2818CFPLUS_DEBUG - environment variable 2903CFPLUS_DEBUG - environment variable
2819 2904
2820 1 draw borders around widgets 2905 1 draw borders around widgets
2821 2 add low-level widget info to tooltips 2906 2 add low-level widget info to tooltips

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines