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.97 by root, Thu Nov 26 07:19:12 2009 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 {
134 DC::fatal Carp::longmess $@; 133 DC::fatal Carp::longmess $@;
135}; 134};
136 135
137my $MAX_FPS = 60; 136my $MAX_FPS = 60;
138 137
138our $DEFAULT_SERVER = "gameserver.deliantra.net";
139
139our $META_SERVER = "http://metaserver.schmorp.de/current.json"; 140our $META_SERVER = "http://metaserver.schmorp.de/current.json";
140 141
141our $LAST_REFRESH; 142our $LAST_REFRESH;
142our $NOW; 143our $NOW;
143 144
144our $CFG; 145our $CFG;
145our $PROFILE; # current profile 146our $PROFILE; # current profile
146our $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;
147 149
148our $WANT_REFRESH; 150our $WANT_REFRESH;
149 151
150our $MODE_SLIDER; 152our $MODE_SLIDER;
151our $CAVEAT_LABEL; 153our $CAVEAT_LABEL;
516 audio_music_push; 518 audio_music_push;
517} 519}
518 520
519sub audio_init { 521sub audio_init {
520 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
521 $ENV{MIX_EFFECTSMAXSPEED} = 1; 532 $ENV{MIX_EFFECTSMAXSPEED} = 1;
522 $SDL_MIXER = !DC::Mix_OpenAudio 533 $SDL_MIXER = !DC::Mix_OpenAudio
523 $CFG->{audio_hw_frequency}, 534 $CFG->{audio_hw_frequency},
524 DC::MIX_DEFAULT_FORMAT, 535 DC::MIX_DEFAULT_FORMAT,
525 $CFG->{audio_hw_channels}, 536 $CFG->{audio_hw_channels},
539 sub audio_tab_update; 550 sub audio_tab_update;
540 audio_tab_update; 551 audio_tab_update;
541} 552}
542 553
543sub audio_shutdown { 554sub audio_shutdown {
555 if ($SDL_MIXER) {
556 DC::MixMusic::halt;
557 DC::Mix_AllocateChannels 0;
558 }
559
544 undef $MUSIC_PLAYER; 560 undef $MUSIC_PLAYER;
545 undef $MUSIC_PLAYING_META; 561 undef $MUSIC_PLAYING_META;
546 undef $MUSIC_PLAYING_DATA; 562 undef $MUSIC_PLAYING_DATA;
547 563
548 $MUSIC_WANT = []; 564 $MUSIC_WANT = [];
549 @MUSIC_JINGLE = (); 565 @MUSIC_JINGLE = ();
550 %AUDIO_PLAY = (); 566 %AUDIO_PLAY = ();
551 %AUDIO_CHUNK = (); 567 %AUDIO_CHUNK = ();
552 568
553 DC::MixMusic::halt;
554 DC::Mix_AllocateChannels 0;
555 DC::Mix_CloseAudio if $SDL_MIXER; 569 DC::Mix_CloseAudio if $SDL_MIXER;
556 undef $SDL_MIXER; 570 undef $SDL_MIXER;
571
572 DC::SDL_QuitSubSystem DC::SDL_INIT_AUDIO;
557} 573}
558 574
559############################################################################# 575#############################################################################
560 576
561sub destroy_query_dialog { 577sub destroy_query_dialog {
802 user => $PROFILE->{user}, 818 user => $PROFILE->{user},
803 pass => $PROFILE->{password}, 819 pass => $PROFILE->{password},
804 mapw => $mapw, 820 mapw => $mapw,
805 maph => $maph, 821 maph => $maph,
806 822
823 c_version => {
824 client => "deliantra",
807 client => "$DC::VERSION $] $^O", 825 clientver => $DC::VERSION,
826 gl_vendor => DC::OpenGL::gl_vendor,
827 gl_version => DC::OpenGL::gl_version,
828 },
808 829
809 map_widget => $MAPWIDGET, 830 map_widget => $MAPWIDGET,
810 statusbox => $STATUSBOX, 831 statusbox => $STATUSBOX,
811 map => $MAP, 832 map => $MAP,
812 mapmap => $MAPMAP, 833 mapmap => $MAPMAP,
830 ; 851 ;
831} 852}
832 853
833sub start_game { 854sub start_game {
834 status "logging in..."; 855 status "logging in...";
856
857 my $server = $PROFILE->{host} || $DEFAULT_SERVER;
858 my ($host, $port) = AnyEvent::Socket::parse_hostport $server, "deliantra=13327"
859 or return status "$server: unable to parse server address, try an empty field.";
835 860
836 $LOGIN_BUTTON->set_text ("Logout"); 861 $LOGIN_BUTTON->set_text ("Logout");
837 $SETUP_DIALOG->hide; 862 $SETUP_DIALOG->hide;
838
839 my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327";
840 863
841 $MAP = new DC::Map; 864 $MAP = new DC::Map;
842 865
843 # hack to make SURE we find the IP address all right 866 # hack to make SURE we find the IP address all right
844 # can be removed once AnyEvent::DNS is proven stable. 867 # can be removed once AnyEvent::DNS is proven stable.
845 if ($host eq "gameserver.deliantra.net") { 868 if ($host eq "gameserver.deliantra.net") {
846 AnyEvent::DNS::a "dnstest.deliantra.net", sub { 869 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
847 if ($_[0] ne "80.101.114.108") { # Perl 870 if ($_[0] ne "80.101.114.108") { # P-e-r-l
848 status "dns failure, trying differently"; 871 status "dns failure, trying differently";
849 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" }; 872 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" };
850 unless (defined $host) { 873 unless (defined $host) {
851 status "dns failure, using hardcoded address"; 874 status "dns failure, using hardcoded address";
852 $host = "129.13.162.95"; 875 $host = "194.126.175.154";
853 } 876 }
854 } 877 }
855 878
856 dc_connect $host, $port; 879 dc_connect $host, $port;
857 }; 880 };
1027 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, " 1050 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, "
1028 . "then disable this option. Changes take effect immdiately.", 1051 . "then disable this option. Changes take effect immdiately.",
1029 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 } 1052 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 }
1030 ); 1053 );
1031 1054
1055 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Smooth Transitions");
1056 $table->add_at (1, $row++, new DC::UI::CheckBox
1057 state => $CFG->{smooth_transitions},
1058 tooltip => "<b>Smooth Transitions</b> tries to blend the fog of war and lighting smoothly between updates. "
1059 . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, "
1060 . "then disable this option. Requires Smooth Movement and OpenGL Multitexturing. Changes take effect immdiately.",
1061 on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_transitions} = $value; 0 }
1062 );
1063
1064
1032 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale"); 1065 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale");
1033 $table->add_at (1, $row++, new DC::UI::Slider 1066 $table->add_at (1, $row++, new DC::UI::Slider
1034 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 1067 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
1035 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 1068 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
1036 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } 1069 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
1048 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War"); 1081 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War");
1049 $table->add_at (1, $row++, new DC::UI::CheckBox 1082 $table->add_at (1, $row++, new DC::UI::CheckBox
1050 state => $CFG->{fow_enable}, 1083 state => $CFG->{fow_enable},
1051 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 1084 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
1052 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } 1085 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
1086 );
1087
1088 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Pattern");
1089 $table->add_at (1, $row++, new DC::UI::ImageButton
1090 tex => $DC::MapWidget::TEX_HIDDEN[$CFG->{fow_texture}],
1091 bg => [0.3, 0.3, 0.2],
1092 force_w => 64,
1093 force_h => 64,
1094 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.",
1095 on_activate => sub {
1096 my ($self) = @_;
1097 $CFG->{fow_texture} = ($CFG->{fow_texture} + 1) % @DC::MapWidget::TEX_HIDDEN;
1098 $self->set_texture ($DC::MapWidget::TEX_HIDDEN[$CFG->{fow_texture}]);
1099 $MAPWIDGET->update;
1100 }
1053 ); 1101 );
1054 1102
1055 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity"); 1103 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity");
1056 $table->add_at (1, $row++, new DC::UI::Slider 1104 $table->add_at (1, $row++, new DC::UI::Slider
1057 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 1105 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
1108 ]); 1156 ]);
1109 1157
1110 my $text = !$freq 1158 my $text = !$freq
1111 ? "audio is off" 1159 ? "audio is off"
1112 : "audio is enabled\n" 1160 : "audio is enabled\n"
1161 . "driver: " . DC::SDL_AudioDriverName . "\n"
1113 . "frequency (Hz): $freq\n" 1162 . "frequency (Hz): $freq\n"
1114 . "channels: $chans"; 1163 . "channels: $chans\n"
1164 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n"
1165 . "music decoders available: " . (join ", ", DC::MixMusic::decoders);
1115 1166
1116 $AUDIO_INFO->set_text ($text); 1167 $AUDIO_INFO->set_text ($text);
1117} 1168}
1118 1169
1119sub audio_setup { 1170sub audio_setup {
1122 $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]);
1123 1174
1124 my $row = 0; 1175 my $row = 0;
1125 1176
1126 $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");
1127 $table->add_at (1, $row++, new DC::UI::CheckBox 1178 $table->add_at (1, $row, new DC::UI::CheckBox
1128 state => $CFG->{audio_enable}, 1179 state => $CFG->{audio_enable},
1129 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.",
1130 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 }
1131 ); 1195 );
1132 1196
1133 $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");
1134 $table->add_at (1, $row, new DC::UI::CheckBox 1198 $table->add_at (1, $row, new DC::UI::CheckBox
1135 expand => 1, state => $CFG->{effects_enable}, 1199 expand => 1, state => $CFG->{effects_enable},
1148 ); 1212 );
1149 1213
1150 $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");
1151 $table->add_at (1, $row, new DC::UI::CheckBox 1215 $table->add_at (1, $row, new DC::UI::CheckBox
1152 expand => 1, state => $CFG->{bgm_enable}, 1216 expand => 1, state => $CFG->{bgm_enable},
1153 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.",
1154 on_changed => sub { 1218 on_changed => sub {
1155 $CFG->{bgm_enable} = $_[1]; 1219 $CFG->{bgm_enable} = $_[1];
1156 $CONN->update_fx_want if $CONN; 1220 $CONN->update_fx_want if $CONN;
1157 audio_music_push; 1221 audio_music_push;
1158 1 1222 1
1169 c_colspan => 2, expand => 1, 1233 c_colspan => 2, expand => 1,
1170 value => $CFG->{audio_hw_frequency}, 1234 value => $CFG->{audio_hw_frequency},
1171 options => [ 1235 options => [
1172 [ 0, "default" , "Use System Default"], 1236 [ 0, "default" , "Use System Default"],
1173 [11025, "11 kHz" , "11kHz (low quality)"], 1237 [11025, "11 kHz" , "11kHz (low quality)"],
1174 [22050, "22 kHz" , "22kHz (reduced quality)"], 1238 [22050, "22 kHz" , "22kHz (reduced quality, recommended)"],
1175 [44100, "44.1 kHz", "44.1kHz (cd quality)"], 1239 [44100, "44.1 kHz", "44.1kHz (cd quality)"],
1176 [48000, "48 kHz" , "48kHz (studio quality)"], 1240 [48000, "48 kHz" , "48kHz (studio quality, not recommended)"],
1177 ], 1241 ],
1178 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.",
1179 on_changed => sub { 1243 on_changed => sub {
1180 $CFG->{audio_hw_frequency} = $_[1]; 1244 $CFG->{audio_hw_frequency} = $_[1];
1181 audio_tab_update; 1245 audio_tab_update;
1205 $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");
1206 $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
1207 c_colspan => 2, expand => 1, 1271 c_colspan => 2, expand => 1,
1208 value => $CFG->{audio_hw_chunksize}, 1272 value => $CFG->{audio_hw_chunksize},
1209 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 "
1210 . "is stuttering, increase this value. Values of 50-100ms are optimal.", 1274 . "is stuttering, increase this value. Values of 50-150ms are optimal.",
1211 on_changed => sub { 1275 on_changed => sub {
1212 $CFG->{audio_hw_chunksize} = $_[1]; 1276 $CFG->{audio_hw_chunksize} = $_[1];
1213 audio_tab_update; 1277 audio_tab_update;
1214 1 1278 1
1215 } 1279 }
1295 &set_gauge_window_fontsize; 1359 &set_gauge_window_fontsize;
1296 1360
1297 $win 1361 $win
1298} 1362}
1299 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
1300sub debug_setup { 1381sub debug_setup {
1301 my $table = new DC::UI::Table; 1382 my $table = new DC::UI::Table;
1302 1383
1303 $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");
1304 $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 });
1305 $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");
1306 $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 });
1307 $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");
1308 $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 });
1309 $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");
1310 $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
1311 $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() } );
1312
1313 $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#
1314 1397
1315 $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);
1316 $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);
1317 $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 );
1318 $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);
1439 para => ["Paralysation", 1522 para => ["Paralysation",
1440 "<b>Paralysation</b> (this resistance affects the chance you get paralysed)"], 1523 "<b>Paralysation</b> (this resistance affects the chance you get paralysed)"],
1441 deat => ["Death", 1524 deat => ["Death",
1442 "<b>Death</b> (resistance against death spells)"], 1525 "<b>Death</b> (resistance against death spells)"],
1443 phys => ["Physical", 1526 phys => ["Physical",
1444 "<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.)"],
1445 blind => ["Blind", 1528 blind => ["Blind",
1446 "<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)"],
1447 fear => ["Fear", 1530 fear => ["Fear",
1448 "<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)"],
1449 tund => ["Turn undead", 1532 tund => ["Turn undead",
1639 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]),
1640 ); 1723 );
1641 1724
1642 $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");
1643 $table->add_at (1, 4, new DC::UI::Entry 1726 $table->add_at (1, 4, new DC::UI::Entry
1644 text => $CFG->{profile}{default}{user}, 1727 text => $PROFILE->{user},
1645 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!",
1646 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1729 on_changed => sub { my ($self, $value) = @_; $PROFILE->{user} = $value; 1 }
1647 ); 1730 );
1648 1731
1649 $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");
1650 $table->add_at (1, 5, new DC::UI::Entry 1733 $table->add_at (1, 5, new DC::UI::Entry
1651 text => $CFG->{profile}{default}{password}, 1734 text => $PROFILE->{password},
1652 hidden => 1, 1735 hidden => 1,
1653 tooltip => "The password for your character.", 1736 tooltip => "The password for your character.",
1654 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1737 on_changed => sub { my ($self, $value) = @_; $PROFILE->{password} = $value; 1 }
1655 ); 1738 );
1656 1739
1657 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button 1740 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1658 expand => 1, 1741 expand => 1,
1659 text => "Login / Register", 1742 text => "Login / Register",
1695 $table->add_at (1, $row, my $vbox = new DC::UI::VBox); 1778 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1696 1779
1697 $vbox->add ( 1780 $vbox->add (
1698 $HOST_ENTRY = new DC::UI::Entry 1781 $HOST_ENTRY = new DC::UI::Entry
1699 expand => 1, 1782 expand => 1,
1700 text => $CFG->{profile}{default}{host}, 1783 text => $PROFILE->{host},
1701 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>)",
1702 on_changed => sub { 1785 on_changed => sub {
1703 my ($self, $value) = @_; 1786 my ($self, $value) = @_;
1704 $CFG->{profile}{default}{host} = $value; 1787 $PROFILE->{host} = $value;
1705 1 1788 1
1706 } 1789 }
1707 ); 1790 );
1708 1791
1709 if (0) { #d# disabled 1792 if (0) { #d# disabled
1908 $r 1991 $r
1909} 1992}
1910 1993
1911my %SORT_ORDER = ( 1994my %SORT_ORDER = (
1912 type => sub { 1995 type => sub {
1996 use sort 'stable';
1913 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_ 1997 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1914 }, 1998 },
1915 mtime => sub { 1999 mtime => sub {
2000 use sort 'stable';
1916 my $NOW = time; 2001 my $NOW = time;
1917 sort { 2002 sort {
1918 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;
1919 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;
1920 2005
1921 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 2006 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1922 or $btime <=> $atime 2007 or $btime <=> $atime
1923 or $a->{type} <=> $b->{type} 2008 or $a->{type} <=> $b->{type}
1924 } @_ 2009 } @_
1925 }, 2010 },
1926 weight => sub { sort { 2011 weight => sub {
2012 use sort 'stable';
2013 sort {
1927 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 2014 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1928 or $a->{type} <=> $b->{type} 2015 or $a->{type} <=> $b->{type}
1929 } @_ }, 2016 } @_
2017 },
1930); 2018);
1931 2019
1932sub inventory_widget { 2020sub inventory_widget {
1933 my $hb = new DC::UI::HBox homogeneous => 1; 2021 my $hb = new DC::UI::HBox homogeneous => 1;
1934 2022
2375 2463
2376 $dialog->show; 2464 $dialog->show;
2377 }; 2465 };
2378} 2466}
2379 2467
2380sub sdl_init {
2381 DC::SDL_Init DC::SDL_INIT_AUDIO #| DC::SDL_NOPARACHUTE
2382 and die "SDL::Init failed!\n";
2383}
2384
2385sub video_init { 2468sub video_init {
2386 DC::set_theme $CFG->{uitheme}; 2469 DC::set_theme $CFG->{uitheme};
2387 2470
2388 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; 2471 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT;
2389 $SDL_REINIT = 0; 2472 $SDL_REINIT = 0;
2448 2531
2449 $DEBUG_STATUS = new DC::UI::Label 2532 $DEBUG_STATUS = new DC::UI::Label
2450 padding => 0, 2533 padding => 0,
2451 z => 100, 2534 z => 100,
2452 force_x => "max", 2535 force_x => "max",
2453 force_y => 0; 2536 force_y => 20;
2454 $DEBUG_STATUS->show; 2537 $DEBUG_STATUS->show;
2455 2538
2456 $STATUSBOX = new DC::UI::Statusbox; 2539 $STATUSBOX = new DC::UI::Statusbox;
2457 2540
2458 $MODBOX = new DC::UI::Label 2541 $MODBOX = new DC::UI::Label
2586my $animate_timer; 2669my $animate_timer;
2587 2670
2588my $fps = 9; 2671my $fps = 9;
2589 2672
2590sub force_refresh { 2673sub force_refresh {
2591 if ($ENV{CFPLUS_DEBUG} & 4) { 2674 if ($DELIANTRA_DEBUG & 4) {
2592 $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;
2593 debug sprintf "%3.2f", $fps; 2676 debug sprintf "%3.2f", $fps;
2594 } 2677 }
2595 2678
2596 undef $WANT_REFRESH; 2679 undef $WANT_REFRESH;
2709 fullscreen => 1, 2792 fullscreen => 1,
2710 fast => 0, 2793 fast => 0,
2711 force_opengl11 => undef, 2794 force_opengl11 => undef,
2712 disable_alpha => 0, 2795 disable_alpha => 0,
2713 smooth_movement => 1, 2796 smooth_movement => 1,
2797 smooth_transitions => 1,
2714 texture_compression => 1, 2798 texture_compression => 1,
2715 map_scale => 1, 2799 map_scale => 1,
2716 fow_enable => 1, 2800 fow_enable => 1,
2717 fow_intensity => 0, 2801 fow_intensity => 0,
2802 fow_texture => 0,
2718 map_smoothing => 1, 2803 map_smoothing => 1,
2719 gui_fontsize => 1, 2804 gui_fontsize => 1,
2720 log_fontsize => 0.7, 2805 log_fontsize => 0.7,
2721 gauge_fontsize => 1, 2806 gauge_fontsize => 1,
2722 gauge_size => 0.35, 2807 gauge_size => 0.35,
2740 shift_fire_stop => 0, 2825 shift_fire_stop => 0,
2741 uitheme => "wood", 2826 uitheme => "wood",
2742 map_shift_x => -24, # arbitrary 2827 map_shift_x => -24, # arbitrary
2743 map_shift_y => +24, # arbitrary 2828 map_shift_y => +24, # arbitrary
2744 ); 2829 );
2745 2830
2746 while (my ($k, $v) = each %DEF_CFG) { 2831 while (my ($k, $v) = each %DEF_CFG) {
2747 $CFG->{$k} = $v unless exists $CFG->{$k}; 2832 $CFG->{$k} = $v unless exists $CFG->{$k};
2748 } 2833 }
2749 2834
2750 $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} ||= {};
2751 $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;
2752 2862
2753 # convert old bindings (only default profile matters) 2863 # convert old bindings (only default profile matters)
2754 if (my $bindings = delete $PROFILE->{bindings}) { 2864 if (my $bindings = delete $PROFILE->{bindings}) {
2755 while (my ($mod, $syms) = each %$bindings) { 2865 while (my ($mod, $syms) = each %$bindings) {
2756 while (my ($sym, $cmds) = each %$syms) { 2866 while (my ($sym, $cmds) = each %$syms) {
2759 action => $cmds, 2869 action => $cmds,
2760 }; 2870 };
2761 } 2871 }
2762 } 2872 }
2763 } 2873 }
2764
2765 sdl_init;
2766 2874
2767 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf"; 2875 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf";
2768 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts"; 2876 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts";
2769 2877
2770 { 2878 {
2779 DejaVuSansMono-BoldOblique.ttf 2887 DejaVuSansMono-BoldOblique.ttf
2780 mona.ttf 2888 mona.ttf
2781 ); 2889 );
2782 2890
2783 DC::add_font $_ for @fonts; 2891 DC::add_font $_ for @fonts;
2784 2892
2785 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2893 $FONT_PROP = new_from_file DC::Font $fonts[0];
2786 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2894 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2787 2895
2788 $FONT_PROP->make_default; 2896 $FONT_PROP->make_default;
2789 2897
2801# } 2909# }
2802# my $t2 = Time::HiRes::time; 2910# my $t2 = Time::HiRes::time;
2803# warn $t2-$t1; 2911# warn $t2-$t1;
2804# } 2912# }
2805 2913
2914 DC::IMG_Init;
2806 video_init; 2915 video_init;
2807 audio_init; 2916 audio_init;
2808 } 2917 }
2809 2918
2810 show_tip_of_the_day if $CFG->{show_tips}; 2919 show_tip_of_the_day if $CFG->{show_tips};
2812 our $STARTUP_CANCEL = EV::idle sub { 2921 our $STARTUP_CANCEL = EV::idle sub {
2813 undef $::STARTUP_CANCEL; 2922 undef $::STARTUP_CANCEL;
2814 $startup_done->(); 2923 $startup_done->();
2815 }; 2924 };
2816 2925
2926 debug_toggle 0;
2927
2817 delete $SIG{__DIE__}; 2928 delete $SIG{__DIE__};
2818 EV::loop; 2929 EV::loop;
2819 2930
2820 DC::write_cfg if $CFG->{config_autosave}; 2931 DC::write_cfg if $CFG->{config_autosave};
2821 2932
2833 2944
2834deliantra - A Deliantra MORPG game client 2945deliantra - A Deliantra MORPG game client
2835 2946
2836=head1 SYNOPSIS 2947=head1 SYNOPSIS
2837 2948
2838Just run it - no commandline arguments are supported. 2949 deliantra [--profile name] [host [user [password]]]
2950 deliantra --help
2839 2951
2840=head1 USAGE 2952=head1 USAGE
2841 2953
2842deliantra 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
2843be used in fullscreen mode and interactively. 2955is supposed to be used in fullscreen mode and interactively.
2844 2956
2845=head1 DEBUGGING 2957=head1 DEBUGGING
2846 2958
2847
2848CFPLUS_DEBUG - environment variable 2959DELIANTRA_DEBUG - environment variable
2849 2960
2850 1 draw borders around widgets 2961 1 draw borders around widgets
2851 2 add low-level widget info to tooltips 2962 2 add low-level widget info to tooltips
2852 4 show fps 2963 4 show fps
2853 8 suppress tooltips 2964 8 suppress tooltips
2965 16 show bandwidth downstream
2854 2966
2855=head1 AUTHOR 2967=head1 AUTHOR
2856 2968
2857Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org> 2969Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org>
2858 2970

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines