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.32 by root, Tue Mar 25 19:28:56 2008 UTC vs.
Revision 1.52 by root, Fri Jul 18 21:18:42 2008 UTC

97use List::Util qw(max min); 97use List::Util qw(max min);
98 98
99use Deliantra; 99use Deliantra;
100use Deliantra::Protocol::Constants; 100use Deliantra::Protocol::Constants;
101 101
102use AnyEvent::DNS;
103use AnyEvent::Socket ();
104
102use Compress::LZF; 105use Compress::LZF;
103 106
104use DC; 107use DC;
108BEGIN { $SIG{__DIE__} = sub { DC::fatal Carp::longmess "$_[0]" unless $^S } }
105use DC::OpenGL (); 109use DC::OpenGL ();
106use DC::Protocol; 110use DC::Protocol;
107use DC::DB; 111use DC::DB;
108use DC::UI; 112use DC::UI;
109use DC::UI::Canvas; 113use DC::UI::Canvas;
138our $FAST; # fast, low-quality mode, possibly useful for software-rendering 142our $FAST; # fast, low-quality mode, possibly useful for software-rendering
139 143
140our $WANT_REFRESH; 144our $WANT_REFRESH;
141 145
142our @SDL_MODES; 146our @SDL_MODES;
147our $SDL_REINIT = 1;
143our $WIDTH; 148our $WIDTH;
144our $HEIGHT; 149our $HEIGHT;
145our $FULLSCREEN; 150our $FULLSCREEN;
146our $FONTSIZE; 151our $FONTSIZE;
147 152
664 # right: accept 669 # right: accept
665 $table->add_at (4, 0, new DC::UI::Button 670 $table->add_at (4, 0, new DC::UI::Button
666 text => "Accept", 671 text => "Accept",
667 on_activate => sub { 672 on_activate => sub {
668 $conn->send ("reply n"); 673 $conn->send ("reply n");
669 $STATS_PAGE->hide;
670 destroy_query_dialog $conn; 674 destroy_query_dialog $conn;
671 0 675 0
672 }, 676 },
673 ); 677 );
674 678
726 730
727 $vbox->add (@dialog); 731 $vbox->add (@dialog);
728 $dialog->show; 732 $dialog->show;
729} 733}
730 734
731sub start_game { 735sub dc_connect {
732 status "logging in..."; 736 my ($host, $port) = @_;
733
734 $LOGIN_BUTTON->set_text ("Logout");
735 $SETUP_DIALOG->hide;
736 737
737 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 738 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
738 739
739 my ($host, $port) = split /:/, $PROFILE->{host};
740
741 $MAP = new DC::Map;
742
743 $CONN = eval { 740 $CONN =
744 new DC::Protocol 741 new DC::Protocol
745 host => $host, 742 host => $host,
746 port => $port || 13327, 743 port => $port,
747 user => $PROFILE->{user}, 744 user => $PROFILE->{user},
748 pass => $PROFILE->{password}, 745 pass => $PROFILE->{password},
749 mapw => $mapsize, 746 mapw => $mapsize,
750 maph => $mapsize, 747 maph => $mapsize,
751 748
758 query => \&server_query, 755 query => \&server_query,
759 756
760 setup_req => { 757 setup_req => {
761 smoothing => $CFG->{map_smoothing}*1, 758 smoothing => $CFG->{map_smoothing}*1,
762 }, 759 },
763 };
764 760
765 if ($CONN) { 761 on_connect => sub {
762 if ($_[0]) {
766 DC::lowdelay fileno $CONN->{fh}; 763 DC::lowdelay fileno $CONN->{fh};
767 764
768 status "login successful"; 765 status "login successful";
766 } else {
767 undef $CONN;
768 status "unable to connect: $!";
769 stop_game();
770 }
771 },
772 ;
773}
774
775sub start_game {
776 status "logging in...";
777
778 $LOGIN_BUTTON->set_text ("Logout");
779 $SETUP_DIALOG->hide;
780
781 my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327";
782
783 $MAP = new DC::Map;
784
785 # hack to make SURE we find the IP address all right
786 # can be removed once AnyEvent::DNS is proven stable.
787 if ($host eq "gameserver.deliantra.net") {
788 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
789 if ($_[0] ne "80.101.114.108") { # Perl
790 status "dns failure, using hardcoded address";
791 $host = "129.13.162.95";
792 }
793
794 dc_connect $host, $port;
795 };
769 } else { 796 } else {
770 warn $@; 797 dc_connect $host, $port;
771 status "unable to connect";
772 stop_game();
773 } 798 }
774} 799}
775 800
776sub stop_game { 801sub stop_game {
777 $LOGIN_BUTTON->set_text ("Login / Register"); 802 $LOGIN_BUTTON->set_text ("Login / Register");
840 state => $CFG->{force_opengl11}, 865 state => $CFG->{force_opengl11},
841 tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in " 866 tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in "
842 . "higher memory usage and slower performance. It will, however, help tremendously on " 867 . "higher memory usage and slower performance. It will, however, help tremendously on "
843 . "cards that claim to support a feature but fall back to software rendering. " 868 . "cards that claim to support a feature but fall back to software rendering. "
844 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, " 869 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, "
845 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you " 870 . "but cards and drivers from other vendors (ATI) are often just as bad. "
846 . "experience extremely low framerates and your card should do better, try this option.</b>", 871 . "<b>If you experience extremely low framerates and your card should do better, try this option.</b>",
847 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 } 872 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 }
873 );
874
875 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Forbid Alpha");
876 $table->add_at (1, $row++, new DC::UI::CheckBox
877 state => $CFG->{disable_alpha},
878 tooltip => "Forbid off the use of the alpha channel. This makes Deliantra look a lot worse "
879 . "by disabling a number of textures and transparency effects. Normally, these "
880 . "effects do not cost a lot of resources, but some graphics cards might fall "
881 . "back to etxremely slow rendering if this is enabled. If disabling this option "
882 . "noticably improves the framerate of the client please report this! "
883 . "<b>If you experience extremely low framerates and your card should do better, try this option.</b>",
884 on_changed => sub {
885 my ($self, $value) = @_;
886 $CFG->{disable_alpha} = $value;
887 $SDL_REINIT = 1; # SDL_SetVideoMode ignores GL attr changes
888 0
889 }
848 ); 890 );
849 891
850 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures"); 892 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures");
851 $table->add_at (1, $row++, new DC::UI::CheckBox 893 $table->add_at (1, $row++, new DC::UI::CheckBox
852 state => $CFG->{texture_compression}, 894 state => $CFG->{texture_compression},
1621 $CFG->{show_tips} = $value; 1663 $CFG->{show_tips} = $value;
1622 0 1664 0
1623 } 1665 }
1624 ); 1666 );
1625 1667
1626 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Messages Window Size"); 1668 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Window Size");
1627 $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry 1669 $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry
1628 text => $CFG->{logview_max_par}, 1670 text => $CFG->{logview_max_par},
1629 tooltip => "This is maximum number of messages remembered in the <b>Messages</b> window. If the server " 1671 tooltip => "This is maximum number of messages remembered in the <b>Message</b> window. If the server "
1630 . "sends more messages than this number, older messages get removed to save memory and " 1672 . "sends more messages than this number, older messages get removed to save memory and "
1631 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.", 1673 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.",
1632 on_changed => sub { 1674 on_changed => sub {
1633 my ($self, $value) = @_; 1675 my ($self, $value) = @_;
1634 $MESSAGE_DIST->set_max_par ($CFG->{logview_max_par} = $value*1); 1676 $MESSAGE_DIST->set_max_par ($CFG->{logview_max_par} = $value*1);
1743 1785
1744 $r 1786 $r
1745} 1787}
1746 1788
1747my %SORT_ORDER = ( 1789my %SORT_ORDER = (
1748 type => undef, 1790 type => sub {
1791 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1792 },
1749 mtime => sub { 1793 mtime => sub {
1750 my $NOW = time; 1794 my $NOW = time;
1751 sort { 1795 sort {
1752 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6; 1796 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1753 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6; 1797 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
2121 $dialog->show; 2165 $dialog->show;
2122 }; 2166 };
2123} 2167}
2124 2168
2125sub sdl_init { 2169sub sdl_init {
2126 DC::SDL_Init 2170 DC::SDL_Init DC::SDL_INIT_AUDIO #| DC::SDL_NOPARACHUTE
2127 and die "SDL::Init failed!\n"; 2171 and die "SDL::Init failed!\n";
2128} 2172}
2129 2173
2130sub video_init { 2174sub video_init {
2175 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT;
2176 $SDL_REINIT = 0;
2177
2178 @SDL_MODES = DC::SDL_ListModes 8, $CFG->{disable_alpha} ? 0 : 8;
2179 @SDL_MODES = DC::SDL_ListModes 8, 8 unless @SDL_MODES;
2180 @SDL_MODES = DC::SDL_ListModes 5, 0 unless @SDL_MODES;
2181 @SDL_MODES or DC::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
2182
2183 @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES;
2184
2131 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} >= @SDL_MODES; 2185 if (!exists $CFG->{sdl_mode} or $CFG->{sdl_mode} >= @SDL_MODES) {
2186 $CFG->{sdl_mode} = 0;
2187 for (reverse 0 .. $#SDL_MODES) {
2188 $CFG->{sdl_mode} = $_ if $SDL_MODES[$_][0] * $SDL_MODES[$_][1] >= 800 * 600;
2189 }
2190 }
2132 2191
2133 my ($old_w, $old_h) = ($WIDTH, $HEIGHT); 2192 my ($old_w, $old_h) = ($WIDTH, $HEIGHT);
2134 2193
2135 ($WIDTH, $HEIGHT, my ($rgb, $alpha)) = @{ $SDL_MODES[$CFG->{sdl_mode}] }; 2194 ($WIDTH, $HEIGHT, my ($rgb, $alpha)) = @{ $SDL_MODES[$CFG->{sdl_mode}] };
2136 $FULLSCREEN = $CFG->{fullscreen}; 2195 $FULLSCREEN = $CFG->{fullscreen};
2242 force_h => $::HEIGHT * 0.6, 2301 force_h => $::HEIGHT * 0.6,
2243 has_close_button => 1, 2302 has_close_button => 1,
2244 ; 2303 ;
2245 2304
2246 $METASERVER = metaserver_dialog; 2305 $METASERVER = metaserver_dialog;
2247 $MESSAGE_WINDOW = new DC::UI::Dockbar (name => 'message_window', title => 'Messages'); 2306 # the name is changed to not conflict with the older name as users could have hidden it
2307 $MESSAGE_WINDOW = new DC::UI::Dockbar
2308 name => "message_window2",
2309 title => 'Messages',
2310 force_w => $::WIDTH * 0.6,
2311 force_h => $::HEIGHT * 0.25,
2312 ;
2313
2248 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW; 2314 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW;
2249 2315
2250 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1, debug => 1, 2316 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1,
2251 filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1); 2317 filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
2252 2318
2253 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup, 2319 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup,
2254 "Configure the server to play on, your username and password."); 2320 "Configure the server to play on, your username and password.");
2255 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup, 2321 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup,
2273 $BUTTONBAR = new DC::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 2339 $BUTTONBAR = new DC::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
2274 2340
2275 $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 2341 $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
2276 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 2342 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
2277 2343
2278 $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW, 2344# $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW,
2279 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 2345# tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
2280 2346
2281 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D 2347 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D
2282 2348
2283 $BUTTONBAR->add (new DC::UI::Flopper text => "Playerbook", other => player_window, 2349 $BUTTONBAR->add (new DC::UI::Flopper text => "Playerbook", other => player_window,
2284 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats."); 2350 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats.");
2286 $BUTTONBAR->add (new DC::UI::Button 2352 $BUTTONBAR->add (new DC::UI::Button
2287 text => "Save Config", 2353 text => "Save Config",
2288 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 2354 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
2289 on_activate => sub { 2355 on_activate => sub {
2290 $::CFG->{layout} = DC::UI::get_layout; 2356 $::CFG->{layout} = DC::UI::get_layout;
2291 DC::write_cfg "$Deliantra::VARDIR/client.cf"; 2357 DC::write_cfg;
2292 status "Configuration Saved"; 2358 status "Configuration Saved";
2293 0 2359 0
2294 }, 2360 },
2295 ); 2361 );
2296 2362
2297 $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, 2363 $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
2298 tooltip => "View Documentation"); 2364 tooltip => "View Documentation");
2299
2300 2365
2301 $BUTTONBAR->add (new DC::UI::Button 2366 $BUTTONBAR->add (new DC::UI::Button
2302 text => "Quit", 2367 text => "Quit",
2303 tooltip => "Terminates the program", 2368 tooltip => "Terminates the program",
2304 on_activate => sub { 2369 on_activate => sub {
2319 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2384 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2320} 2385}
2321 2386
2322sub video_shutdown { 2387sub video_shutdown {
2323 DC::OpenGL::shutdown; 2388 DC::OpenGL::shutdown;
2389 DC::SDL_QuitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT;
2324 2390
2325 undef $SDL_ACTIVE; 2391 undef $SDL_ACTIVE;
2326} 2392}
2327 2393
2328my %animate_object; 2394my %animate_object;
2389# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS; 2455# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS;
2390 }, 2456 },
2391 DC::SDL_KEYDOWN => sub { 2457 DC::SDL_KEYDOWN => sub {
2392 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) { 2458 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) {
2393 # alt-enter 2459 # alt-enter
2460 video_shutdown;
2394 $FULLSCREEN_ENABLE->toggle; 2461 $FULLSCREEN_ENABLE->toggle;
2395 video_shutdown;
2396 video_init; 2462 video_init;
2397 } else { 2463 } else {
2398 &DC::UI::feed_sdl_key_down_event; 2464 &DC::UI::feed_sdl_key_down_event;
2399 } 2465 }
2400 update_modbox; 2466 update_modbox;
2421 EV::unloop; 2487 EV::unloop;
2422 #d# TODO calling exit here hangs the process in some futex 2488 #d# TODO calling exit here hangs the process in some futex
2423}; 2489};
2424 2490
2425{ 2491{
2492 DC::Pod::load_docwiki DC::find_rcfile "docwiki.pst";
2493
2426 if (-e "$Deliantra::VARDIR/client.cf") { 2494 if (-e "$Deliantra::VARDIR/client.cf") {
2427 DC::read_cfg "$Deliantra::VARDIR/client.cf"; 2495 DC::read_cfg "$Deliantra::VARDIR/client.cf";
2428 } else { 2496 } else {
2429 #TODO: compatibility cruft 2497 #TODO: compatibility cruft
2430 DC::read_cfg "$Deliantra::OLDDIR/cfplusrc"; 2498 DC::read_cfg "$Deliantra::OLDDIR/cfplusrc";
2431 print STDERR "INFO: used old configuration file\n"; 2499 print STDERR "INFO: used old configuration file\n";
2432 } 2500 }
2433 2501
2434 DC::DB::Server::run; 2502 DC::DB::Server::run;
2435 2503
2504 if ($CFG->{db_schema} < 1) {
2505 warn "INFO: upgrading database schema from 0 to 1, mapcache and tilecache will be lost\n";
2506 DC::DB::nuke_db;
2507 $CFG->{db_schema} = 1;
2508 DC::write_cfg;
2509 }
2510
2511 DC::DB::open_db;
2512
2436 DC::UI::set_layout ($::CFG->{layout}); 2513 DC::UI::set_layout ($::CFG->{layout});
2437 2514
2438 my %DEF_CFG = ( 2515 my %DEF_CFG = (
2439 sdl_mode => 0, 2516 sdl_mode => 0,
2440 fullscreen => 1, 2517 fullscreen => 1,
2441 fast => 0, 2518 fast => 0,
2442 force_opengl11 => undef, 2519 force_opengl11 => undef,
2520 disable_alpha => 0,
2443 texture_compression => 1, 2521 texture_compression => 1,
2444 map_scale => 1, 2522 map_scale => 1,
2445 fow_enable => 1, 2523 fow_enable => 1,
2446 fow_intensity => 0, 2524 fow_intensity => 0,
2447 map_smoothing => 1, 2525 map_smoothing => 1,
2464 pickup => 0, 2542 pickup => 0,
2465 inv_sort => "mtime", 2543 inv_sort => "mtime",
2466 default => "profile", # default profile 2544 default => "profile", # default profile
2467 show_tips => 1, 2545 show_tips => 1,
2468 logview_max_par => 1000, 2546 logview_max_par => 1000,
2547 shift_fire_stop => 0,
2469 ); 2548 );
2470 2549
2471 while (my ($k, $v) = each %DEF_CFG) { 2550 while (my ($k, $v) = each %DEF_CFG) {
2472 $CFG->{$k} = $v unless exists $CFG->{$k}; 2551 $CFG->{$k} = $v unless exists $CFG->{$k};
2473 } 2552 }
2486 } 2565 }
2487 } 2566 }
2488 } 2567 }
2489 2568
2490 sdl_init; 2569 sdl_init;
2491
2492 @SDL_MODES = DC::SDL_ListModes 8, 8;
2493 @SDL_MODES = DC::SDL_ListModes 5, 0 unless @SDL_MODES;
2494 @SDL_MODES or DC::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
2495
2496 @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES;
2497
2498 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
2499 2570
2500 { 2571 {
2501 my @fonts = map DC::find_rcfile "fonts/$_", qw( 2572 my @fonts = map DC::find_rcfile "fonts/$_", qw(
2502 DejaVuSans.ttf 2573 DejaVuSans.ttf
2503 DejaVuSansMono.ttf 2574 DejaVuSansMono.ttf
2541our $STARTUP_CANCEL = EV::idle sub { 2612our $STARTUP_CANCEL = EV::idle sub {
2542 undef $::STARTUP_CANCEL; 2613 undef $::STARTUP_CANCEL;
2543 $startup_done->(); 2614 $startup_done->();
2544}; 2615};
2545 2616
2617delete $SIG{__DIE__};
2546EV::loop; 2618EV::loop;
2547 2619
2548#video_shutdown; 2620#video_shutdown;
2549#audio_shutdown; 2621#audio_shutdown;
2550DC::OpenGL::quit; 2622DC::OpenGL::quit;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines