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.101 by root, Thu Feb 4 20:01:09 2010 UTC vs.
Revision 1.117 by root, Tue Aug 31 14:31:50 2010 UTC

17 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp"); 17 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
18 } 18 }
19 19
20 require Win32::GUI::SplashScreen; 20 require Win32::GUI::SplashScreen;
21 21
22 # initialise the resolver now, as vista forces us back to the desktop
23 # when doing this.
24 use AnyEvent::DNS ();
25 AnyEvent::DNS::resolver;
26
27 Win32::GUI::SplashScreen::Show ( 22 Win32::GUI::SplashScreen::Show (
28 -file => "$ENV{PAR_TEMP}/SPLASH.bmp", 23 -file => "$ENV{PAR_TEMP}/SPLASH.bmp",
29 ); 24 );
25
26 # initialise the resolver now, as vista forces us back to the desktop
27 # when doing this later.
28 require AnyEvent::DNS;
29 AnyEvent::DNS::resolver ();
30 30
31 $startup_done = sub { 31 $startup_done = sub {
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 {
144our $NOW; 143our $NOW;
145 144
146our $CFG; 145our $CFG;
147our $PROFILE; # current profile 146our $PROFILE; # current profile
148our $FAST; # fast, low-quality mode, possibly useful for software-rendering 147our $FAST; # fast, low-quality mode, possibly useful for software-rendering
148our $DELIANTRA_DEBUG = $ENV{DELIANTRA_DEBUG} * 1;
149 149
150our $WANT_REFRESH; 150our $WANT_REFRESH;
151 151
152our $MODE_SLIDER; 152our $MODE_SLIDER;
153our $CAVEAT_LABEL; 153our $CAVEAT_LABEL;
518 audio_music_push; 518 audio_music_push;
519} 519}
520 520
521sub audio_init { 521sub audio_init {
522 if ($CFG->{audio_enable}) { 522 if ($CFG->{audio_enable}) {
523 if (length $CFG->{audio_driver}) {
524 local $ENV{SDL_AUDIODRIVER} = $CFG->{audio_driver};
525 DC::SDL_Init DC::SDL_INIT_AUDIO
526 and die "SDL::Init failed!\n";
527 } else {
528 DC::SDL_Init DC::SDL_INIT_AUDIO
529 and die "SDL::Init failed!\n";
530 }
531
523 $ENV{MIX_EFFECTSMAXSPEED} = 1; 532 $ENV{MIX_EFFECTSMAXSPEED} = 1;
524 $SDL_MIXER = !DC::Mix_OpenAudio 533 $SDL_MIXER = !DC::Mix_OpenAudio
525 $CFG->{audio_hw_frequency}, 534 $CFG->{audio_hw_frequency},
526 DC::MIX_DEFAULT_FORMAT, 535 DC::MIX_DEFAULT_FORMAT,
527 $CFG->{audio_hw_channels}, 536 $CFG->{audio_hw_channels},
557 %AUDIO_PLAY = (); 566 %AUDIO_PLAY = ();
558 %AUDIO_CHUNK = (); 567 %AUDIO_CHUNK = ();
559 568
560 DC::Mix_CloseAudio if $SDL_MIXER; 569 DC::Mix_CloseAudio if $SDL_MIXER;
561 undef $SDL_MIXER; 570 undef $SDL_MIXER;
571
572 DC::SDL_QuitSubSystem DC::SDL_INIT_AUDIO;
562} 573}
563 574
564############################################################################# 575#############################################################################
565 576
566sub destroy_query_dialog { 577sub destroy_query_dialog {
807 user => $PROFILE->{user}, 818 user => $PROFILE->{user},
808 pass => $PROFILE->{password}, 819 pass => $PROFILE->{password},
809 mapw => $mapw, 820 mapw => $mapw,
810 maph => $maph, 821 maph => $maph,
811 822
823 c_version => {
824 client => "deliantra",
812 client => "$DC::VERSION $] $^O", 825 clientver => $DC::VERSION,
826 gl_vendor => DC::OpenGL::gl_vendor,
827 gl_version => DC::OpenGL::gl_version,
828 },
813 829
814 map_widget => $MAPWIDGET, 830 map_widget => $MAPWIDGET,
815 statusbox => $STATUSBOX, 831 statusbox => $STATUSBOX,
816 map => $MAP, 832 map => $MAP,
817 mapmap => $MAPMAP, 833 mapmap => $MAPMAP,
849 865
850 # hack to make SURE we find the IP address all right 866 # hack to make SURE we find the IP address all right
851 # can be removed once AnyEvent::DNS is proven stable. 867 # can be removed once AnyEvent::DNS is proven stable.
852 if ($host eq "gameserver.deliantra.net") { 868 if ($host eq "gameserver.deliantra.net") {
853 AnyEvent::DNS::a "dnstest.deliantra.net", sub { 869 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
854 if ($_[0] ne "80.101.114.108") { # Perl 870 if ($_[0] ne "80.101.114.108") { # P-e-r-l
855 status "dns failure, trying differently"; 871 status "dns failure, trying differently";
856 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" }; 872 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" };
857 unless (defined $host) { 873 unless (defined $host) {
858 status "dns failure, using hardcoded address"; 874 status "dns failure, using hardcoded address";
859 $host = "129.13.162.95"; 875 $host = "194.126.175.154";
860 } 876 }
861 } 877 }
862 878
863 dc_connect $host, $port; 879 dc_connect $host, $port;
864 }; 880 };
1140 ]); 1156 ]);
1141 1157
1142 my $text = !$freq 1158 my $text = !$freq
1143 ? "audio is off" 1159 ? "audio is off"
1144 : "audio is enabled\n" 1160 : "audio is enabled\n"
1161 . "driver: " . DC::SDL_AudioDriverName . "\n"
1145 . "frequency (Hz): $freq\n" 1162 . "frequency (Hz): $freq\n"
1146 . "channels: $chans\n" 1163 . "channels: $chans\n"
1147 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n" 1164 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n"
1148 . "music decoders available: " . (join ", ", DC::MixMusic::decoders); 1165 . "music decoders available: " . (join ", ", DC::MixMusic::decoders);
1149 1166
1150 $AUDIO_INFO->set_text ($text); 1167 $AUDIO_INFO->set_text ($text);
1151} 1168}
1152 1169
1153sub audio_setup { 1170sub audio_setup {
1156 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]); 1173 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]);
1157 1174
1158 my $row = 0; 1175 my $row = 0;
1159 1176
1160 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable"); 1177 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable");
1161 $table->add_at (1, $row++, new DC::UI::CheckBox 1178 $table->add_at (1, $row, new DC::UI::CheckBox
1162 state => $CFG->{audio_enable}, 1179 state => $CFG->{audio_enable},
1163 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", 1180 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.",
1164 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 } 1181 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 }
1182 );
1183 $table->add_at (2, $row++, my $driver = new DC::UI::HBox expand => 1);
1184
1185 $driver->add (new DC::UI::Label align => 1, text => " Audio driver override");
1186 $driver->add (new DC::UI::Entry
1187 text => $CFG->{audio_driver},
1188 template => "dsound1234",
1189 tooltip => "You can override the audio driver to use here. Leaving it empty will result "
1190 . "in Deliantra picking one automatically. GNU/Linux users often prefer specific "
1191 . "drivers though, and can experiment with <b>alsa</b>, <b>dsp</b>, <b>esd</b>, <b>pulse</b>, <b>arts</b>, <b>nas</b> "
1192 . "or other system-specific drivers. Selecting the wrong driver here will simply result"
1193 . "in no sound.",
1194 on_changed => sub { my ($self, $value) = @_; $CFG->{audio_driver} = $value; 1 }
1165 ); 1195 );
1166 1196
1167 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects"); 1197 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects");
1168 $table->add_at (1, $row, new DC::UI::CheckBox 1198 $table->add_at (1, $row, new DC::UI::CheckBox
1169 expand => 1, state => $CFG->{effects_enable}, 1199 expand => 1, state => $CFG->{effects_enable},
1182 ); 1212 );
1183 1213
1184 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music"); 1214 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music");
1185 $table->add_at (1, $row, new DC::UI::CheckBox 1215 $table->add_at (1, $row, new DC::UI::CheckBox
1186 expand => 1, state => $CFG->{bgm_enable}, 1216 expand => 1, state => $CFG->{bgm_enable},
1187 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 1217 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played. Needs server reconnect to take effect.",
1188 on_changed => sub { 1218 on_changed => sub {
1189 $CFG->{bgm_enable} = $_[1]; 1219 $CFG->{bgm_enable} = $_[1];
1190 $CONN->update_fx_want if $CONN; 1220 $CONN->update_fx_want if $CONN;
1191 audio_music_push; 1221 audio_music_push;
1192 1 1222 1
1203 c_colspan => 2, expand => 1, 1233 c_colspan => 2, expand => 1,
1204 value => $CFG->{audio_hw_frequency}, 1234 value => $CFG->{audio_hw_frequency},
1205 options => [ 1235 options => [
1206 [ 0, "default" , "Use System Default"], 1236 [ 0, "default" , "Use System Default"],
1207 [11025, "11 kHz" , "11kHz (low quality)"], 1237 [11025, "11 kHz" , "11kHz (low quality)"],
1208 [22050, "22 kHz" , "22kHz (reduced quality)"], 1238 [22050, "22 kHz" , "22kHz (reduced quality, recommended)"],
1209 [44100, "44.1 kHz", "44.1kHz (cd quality)"], 1239 [44100, "44.1 kHz", "44.1kHz (cd quality)"],
1210 [48000, "48 kHz" , "48kHz (studio quality)"], 1240 [48000, "48 kHz" , "48kHz (studio quality, not recommended)"],
1211 ], 1241 ],
1212 tooltip => "The sampling frequency to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.", 1242 tooltip => "The sampling frequency to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.",
1213 on_changed => sub { 1243 on_changed => sub {
1214 $CFG->{audio_hw_frequency} = $_[1]; 1244 $CFG->{audio_hw_frequency} = $_[1];
1215 audio_tab_update; 1245 audio_tab_update;
1239 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency"); 1269 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency");
1240 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector 1270 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector
1241 c_colspan => 2, expand => 1, 1271 c_colspan => 2, expand => 1,
1242 value => $CFG->{audio_hw_chunksize}, 1272 value => $CFG->{audio_hw_chunksize},
1243 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback " 1273 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback "
1244 . "is stuttering, increase this value. Values of 50-100ms are optimal.", 1274 . "is stuttering, increase this value. Values of 50-150ms are optimal.",
1245 on_changed => sub { 1275 on_changed => sub {
1246 $CFG->{audio_hw_chunksize} = $_[1]; 1276 $CFG->{audio_hw_chunksize} = $_[1];
1247 audio_tab_update; 1277 audio_tab_update;
1248 1 1278 1
1249 } 1279 }
1329 &set_gauge_window_fontsize; 1359 &set_gauge_window_fontsize;
1330 1360
1331 $win 1361 $win
1332} 1362}
1333 1363
1364our $BW_WATCHER;
1365
1366sub debug_toggle($) {
1367 $DELIANTRA_DEBUG ^= $_[0];
1368
1369 if ($DELIANTRA_DEBUG & 16) {
1370 $BW_WATCHER = EV::periodic 0, 1, 0, sub {
1371 return unless $CONN;
1372 debug sprintf "%8.2gKB/s", $CONN->{octets_in} / 1e3;
1373 $CONN->{octets_in} = 0;
1374 };
1375 } else {
1376 undef $BW_WATCHER;
1377 }
1378
1379}
1380
1334sub debug_setup { 1381sub debug_setup {
1335 my $table = new DC::UI::Table; 1382 my $table = new DC::UI::Table;
1336 1383
1337 $table->add_at (0, 0, new DC::UI::Label text => "Widget Borders"); 1384 $table->add_at (0, 0, new DC::UI::Label text => "Widget Borders");
1338 $table->add_at (1, 0, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 }); 1385 $table->add_at (1, 0, new DC::UI::CheckBox on_changed => sub { debug_toggle 1; 0 });
1339 $table->add_at (0, 1, new DC::UI::Label text => "Tooltip Widget Info"); 1386 $table->add_at (0, 1, new DC::UI::Label text => "Tooltip Widget Info");
1340 $table->add_at (1, 1, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 }); 1387 $table->add_at (1, 1, new DC::UI::CheckBox on_changed => sub { debug_toggle 2; 0 });
1341 $table->add_at (0, 2, new DC::UI::Label text => "Show FPS"); 1388 $table->add_at (0, 2, new DC::UI::Label text => "Show FPS");
1342 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 1389 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { debug_toggle 4; 0 });
1343 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips"); 1390 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips");
1344 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 1391 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { debug_toggle 8; 0 });
1392 $table->add_at (0, 4, new DC::UI::Label text => "Show Bandwidth");
1393 $table->add_at (1, 4, new DC::UI::CheckBox on_changed => sub { debug_toggle 16; 0 });
1394
1345 $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } ); 1395 $table->add_at (0, 6, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } );
1346
1347 $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d# 1396 $table->add_at (0, 7, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d#
1348 1397
1349 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0); 1398 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0);
1350 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2); 1399 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2);
1351 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 ); 1400 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1352 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2); 1401 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2);
1473 para => ["Paralysation", 1522 para => ["Paralysation",
1474 "<b>Paralysation</b> (this resistance affects the chance you get paralysed)"], 1523 "<b>Paralysation</b> (this resistance affects the chance you get paralysed)"],
1475 deat => ["Death", 1524 deat => ["Death",
1476 "<b>Death</b> (resistance against death spells)"], 1525 "<b>Death</b> (resistance against death spells)"],
1477 phys => ["Physical", 1526 phys => ["Physical",
1478 "<b>Physical</b> (this is the resistance against physical attacks, like when a monster hit you in melee combat. The value displayed here is also displayed in the 'Arm' field on the left.)"], 1527 "<b>Physical</b> (this is the resistance against physical attacks, like when a monster hit you in melee combat. The value displayed here is also displayed as the 'Arm' secondary stat.)"],
1479 blind => ["Blind", 1528 blind => ["Blind",
1480 "<b>Blind</b> (blind resistance affects the chance of a successful blinding attack)"], 1529 "<b>Blind</b> (blind resistance affects the chance of a successful blinding attack)"],
1481 fear => ["Fear", 1530 fear => ["Fear",
1482 "<b>Fear</b> (this attack will drive you away from monsters who cast this and hit you successfully, being resistant to this helps a lot when fighting those monsters)"], 1531 "<b>Fear</b> (this attack will drive you away from monsters who cast this and hit you successfully, being resistant to this helps a lot when fighting those monsters)"],
1483 tund => ["Turn undead", 1532 tund => ["Turn undead",
1673 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), 1722 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1674 ); 1723 );
1675 1724
1676 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username"); 1725 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username");
1677 $table->add_at (1, 4, new DC::UI::Entry 1726 $table->add_at (1, 4, new DC::UI::Entry
1678 text => $CFG->{profile}{default}{user}, 1727 text => $PROFILE->{user},
1679 tooltip => "The name of your character on the server. The name is case-sensitive!", 1728 tooltip => "The name of your character on the server. The name is case-sensitive!",
1680 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1729 on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 }
1681 ); 1730 );
1682 1731
1683 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password"); 1732 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password");
1684 $table->add_at (1, 5, new DC::UI::Entry 1733 $table->add_at (1, 5, new DC::UI::Entry
1685 text => $CFG->{profile}{default}{password}, 1734 text => $PROFILE->{password},
1686 hidden => 1, 1735 hidden => 1,
1687 tooltip => "The password for your character.", 1736 tooltip => "The password for your character.",
1688 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1737 on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 }
1689 ); 1738 );
1690 1739
1691 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button 1740 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1692 expand => 1, 1741 expand => 1,
1693 text => "Login / Register", 1742 text => "Login / Register",
1729 $table->add_at (1, $row, my $vbox = new DC::UI::VBox); 1778 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1730 1779
1731 $vbox->add ( 1780 $vbox->add (
1732 $HOST_ENTRY = new DC::UI::Entry 1781 $HOST_ENTRY = new DC::UI::Entry
1733 expand => 1, 1782 expand => 1,
1734 text => $CFG->{profile}{default}{host}, 1783 text => $PROFILE->{host},
1735 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)", 1784 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)",
1736 on_changed => sub { 1785 on_changed => sub {
1737 my ($self, $value) = @_; 1786 my ($self, $value) = @_;
1738 $CFG->{profile}{default}{host} = $value; 1787 $PROFILE->{host} = $value;
1739 1 1788 1
1740 } 1789 }
1741 ); 1790 );
1742 1791
1743 if (0) { #d# disabled 1792 if (0) { #d# disabled
1942 $r 1991 $r
1943} 1992}
1944 1993
1945my %SORT_ORDER = ( 1994my %SORT_ORDER = (
1946 type => sub { 1995 type => sub {
1996 use sort 'stable';
1947 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_ 1997 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1948 }, 1998 },
1949 mtime => sub { 1999 mtime => sub {
2000 use sort 'stable';
1950 my $NOW = time; 2001 my $NOW = time;
1951 sort { 2002 sort {
1952 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6; 2003 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1953 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6; 2004 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1954 2005
1955 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 2006 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1956 or $btime <=> $atime 2007 or $btime <=> $atime
1957 or $a->{type} <=> $b->{type} 2008 or $a->{type} <=> $b->{type}
1958 } @_ 2009 } @_
1959 }, 2010 },
1960 weight => sub { sort { 2011 weight => sub {
2012 use sort 'stable';
2013 sort {
1961 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 2014 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1962 or $a->{type} <=> $b->{type} 2015 or $a->{type} <=> $b->{type}
1963 } @_ }, 2016 } @_
2017 },
1964); 2018);
1965 2019
1966sub inventory_widget { 2020sub inventory_widget {
1967 my $hb = new DC::UI::HBox homogeneous => 1; 2021 my $hb = new DC::UI::HBox homogeneous => 1;
1968 2022
2409 2463
2410 $dialog->show; 2464 $dialog->show;
2411 }; 2465 };
2412} 2466}
2413 2467
2414sub sdl_init {
2415 DC::SDL_Init DC::SDL_INIT_AUDIO #| DC::SDL_NOPARACHUTE
2416 and die "SDL::Init failed!\n";
2417}
2418
2419sub video_init { 2468sub video_init {
2420 DC::set_theme $CFG->{uitheme}; 2469 DC::set_theme $CFG->{uitheme};
2421 2470
2422 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; 2471 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT;
2423 $SDL_REINIT = 0; 2472 $SDL_REINIT = 0;
2482 2531
2483 $DEBUG_STATUS = new DC::UI::Label 2532 $DEBUG_STATUS = new DC::UI::Label
2484 padding => 0, 2533 padding => 0,
2485 z => 100, 2534 z => 100,
2486 force_x => "max", 2535 force_x => "max",
2487 force_y => 0; 2536 force_y => 20;
2488 $DEBUG_STATUS->show; 2537 $DEBUG_STATUS->show;
2489 2538
2490 $STATUSBOX = new DC::UI::Statusbox; 2539 $STATUSBOX = new DC::UI::Statusbox;
2491 2540
2492 $MODBOX = new DC::UI::Label 2541 $MODBOX = new DC::UI::Label
2620my $animate_timer; 2669my $animate_timer;
2621 2670
2622my $fps = 9; 2671my $fps = 9;
2623 2672
2624sub force_refresh { 2673sub force_refresh {
2625 if ($ENV{CFPLUS_DEBUG} & 4) { 2674 if ($DELIANTRA_DEBUG & 4) {
2626 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02; 2675 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02;
2627 debug sprintf "%3.2f", $fps; 2676 debug sprintf "%3.2f", $fps;
2628 } 2677 }
2629 2678
2630 undef $WANT_REFRESH; 2679 undef $WANT_REFRESH;
2776 shift_fire_stop => 0, 2825 shift_fire_stop => 0,
2777 uitheme => "wood", 2826 uitheme => "wood",
2778 map_shift_x => -24, # arbitrary 2827 map_shift_x => -24, # arbitrary
2779 map_shift_y => +24, # arbitrary 2828 map_shift_y => +24, # arbitrary
2780 ); 2829 );
2781 2830
2782 while (my ($k, $v) = each %DEF_CFG) { 2831 while (my ($k, $v) = each %DEF_CFG) {
2783 $CFG->{$k} = $v unless exists $CFG->{$k}; 2832 $CFG->{$k} = $v unless exists $CFG->{$k};
2784 } 2833 }
2785 2834
2786 $CFG->{profile}{default}{host} ||= "gameserver.deliantra.net"; 2835 my @args = @ARGV;
2836
2837 # OS X passes some process serial number of other shit. they
2838 # could have used an env var or any other sane mechanism. but
2839 # would it be os x then? no...
2840 shift @args if $args[0] =~ /^-psn_/;
2841
2842 my $profile = 'default';
2843
2844 for (my $i = 0; $i < @args; $i++) {
2845 if ($args[$i] =~ /^--?profile$/) {
2846 $profile = $args[$i + 1];
2847 splice @args, $i, 2, ();
2848 $i = 0;
2849 } elsif ($args[$i] =~ /^--?h/) {
2850 print STDERR "Usage: $0 [--profile name] [host [user [password]]]\n";
2851 exit 0;
2852 }
2853 }
2854
2855 $CFG->{profile}{$profile} ||= {};
2787 $PROFILE = $CFG->{profile}{default}; 2856 $PROFILE = $CFG->{profile}{$profile};
2857 $PROFILE->{host} ||= "gameserver.deliantra.net";
2858
2859 $PROFILE->{host} = $args[0] if @args > 0;
2860 $PROFILE->{user} = $args[1] if @args > 1;
2861 $PROFILE->{password} = $args[2] if @args > 2;
2788 2862
2789 # convert old bindings (only default profile matters) 2863 # convert old bindings (only default profile matters)
2790 if (my $bindings = delete $PROFILE->{bindings}) { 2864 if (my $bindings = delete $PROFILE->{bindings}) {
2791 while (my ($mod, $syms) = each %$bindings) { 2865 while (my ($mod, $syms) = each %$bindings) {
2792 while (my ($sym, $cmds) = each %$syms) { 2866 while (my ($sym, $cmds) = each %$syms) {
2795 action => $cmds, 2869 action => $cmds,
2796 }; 2870 };
2797 } 2871 }
2798 } 2872 }
2799 } 2873 }
2800
2801 sdl_init;
2802 2874
2803 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf"; 2875 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf";
2804 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts"; 2876 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts";
2805 2877
2806 { 2878 {
2815 DejaVuSansMono-BoldOblique.ttf 2887 DejaVuSansMono-BoldOblique.ttf
2816 mona.ttf 2888 mona.ttf
2817 ); 2889 );
2818 2890
2819 DC::add_font $_ for @fonts; 2891 DC::add_font $_ for @fonts;
2820 2892
2821 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2893 $FONT_PROP = new_from_file DC::Font $fonts[0];
2822 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2894 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2823 2895
2824 $FONT_PROP->make_default; 2896 $FONT_PROP->make_default;
2825 2897
2837# } 2909# }
2838# my $t2 = Time::HiRes::time; 2910# my $t2 = Time::HiRes::time;
2839# warn $t2-$t1; 2911# warn $t2-$t1;
2840# } 2912# }
2841 2913
2914 DC::IMG_Init;
2842 video_init; 2915 video_init;
2843 audio_init; 2916 audio_init;
2844 } 2917 }
2845 2918
2846 show_tip_of_the_day if $CFG->{show_tips}; 2919 show_tip_of_the_day if $CFG->{show_tips};
2848 our $STARTUP_CANCEL = EV::idle sub { 2921 our $STARTUP_CANCEL = EV::idle sub {
2849 undef $::STARTUP_CANCEL; 2922 undef $::STARTUP_CANCEL;
2850 $startup_done->(); 2923 $startup_done->();
2851 }; 2924 };
2852 2925
2926 debug_toggle 0;
2927
2853 delete $SIG{__DIE__}; 2928 delete $SIG{__DIE__};
2854 EV::loop; 2929 EV::loop;
2855 2930
2856 DC::write_cfg if $CFG->{config_autosave}; 2931 DC::write_cfg if $CFG->{config_autosave};
2857 2932
2869 2944
2870deliantra - A Deliantra MORPG game client 2945deliantra - A Deliantra MORPG game client
2871 2946
2872=head1 SYNOPSIS 2947=head1 SYNOPSIS
2873 2948
2874Just run it - no commandline arguments are supported. 2949 deliantra [--profile name] [host [user [password]]]
2950 deliantra --help
2875 2951
2876=head1 USAGE 2952=head1 USAGE
2877 2953
2878deliantra utilises OpenGL for all UI elements and the game. It is supposed to 2954The deliantra client utilises OpenGL for all UI elements and the game. It
2879be used in fullscreen mode and interactively. 2955is supposed to be used in fullscreen mode and interactively.
2880 2956
2881=head1 DEBUGGING 2957=head1 DEBUGGING
2882 2958
2883
2884CFPLUS_DEBUG - environment variable 2959DELIANTRA_DEBUG - environment variable
2885 2960
2886 1 draw borders around widgets 2961 1 draw borders around widgets
2887 2 add low-level widget info to tooltips 2962 2 add low-level widget info to tooltips
2888 4 show fps 2963 4 show fps
2889 8 suppress tooltips 2964 8 suppress tooltips
2965 16 show bandwidth downstream
2890 2966
2891=head1 AUTHOR 2967=head1 AUTHOR
2892 2968
2893Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org> 2969Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org>
2894 2970

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines