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.18 by root, Wed Dec 26 21:03:21 2007 UTC vs.
Revision 1.51 by root, Thu Jul 17 15:23:43 2008 UTC

78} 78}
79 79
80# prepend private library directory 80# prepend private library directory
81BEGIN { 81BEGIN {
82 for (grep !ref, @INC) { 82 for (grep !ref, @INC) {
83 my $path = "$_/Deliantra/Client/private/dc"; 83 my $path = "$_/Deliantra/Client/private";
84 if (-d $path) { 84 if (-d $path) {
85 unshift @INC, $path; 85 unshift @INC, $path;
86 last; 86 last;
87 } 87 }
88 } 88 }
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 "$@" 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;
110use DC::UI::Inventory; 114use DC::UI::Inventory;
111use DC::UI::SpellList; 115use DC::UI::SpellList;
112use DC::UI::Dockable; 116use DC::UI::Dockable;
117use DC::UI::Dockbar;
113use DC::UI::MessageWindow; 118use DC::UI::MessageWindow;
114use DC::UI::ChatView; 119use DC::UI::ChatView;
120use DC::MessageDistributor;
115use DC::Pod; 121use DC::Pod;
116use DC::MapWidget; 122use DC::MapWidget;
117use DC::Macro; 123use DC::Macro;
118 124
119$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 125$SIG{QUIT} = sub { Carp::cluck "QUIT" };
122$EV::DIED = sub { 128$EV::DIED = sub {
123 DC::fatal Carp::longmess $@; 129 DC::fatal Carp::longmess $@;
124}; 130};
125 131
126my $MAX_FPS = 60; 132my $MAX_FPS = 60;
127my $MIN_FPS = 5; # unused as of yet
128 133
129our $META_SERVER = "http://metaserver.schmorp.de/current.json"; 134our $META_SERVER = "http://metaserver.schmorp.de/current.json";
130 135
131our $LAST_REFRESH; 136our $LAST_REFRESH;
132our $NOW; 137our $NOW;
179our $SPELL_PAGE; 184our $SPELL_PAGE;
180our $SPELL_LIST; 185our $SPELL_LIST;
181 186
182our $HELP_WINDOW; 187our $HELP_WINDOW;
183our $MESSAGE_WINDOW; 188our $MESSAGE_WINDOW;
189our $MESSAGE_DIST;
184our $FLOORBOX; 190our $FLOORBOX;
185our $GAUGES; 191our $GAUGES;
186our $STATWIDS; 192our $STATWIDS;
187 193
188our $SDL_ACTIVE; 194our $SDL_ACTIVE;
189our %SDL_CB; 195our %SDL_CB;
190 196
191our $ALT_ENTER_MESSAGE; 197our $ALT_ENTER_MESSAGE;
192our $STATUSBOX; 198our $STATUSBOX;
199our $MODBOX;
193our $DEBUG_STATUS; 200our $DEBUG_STATUS;
194 201
195our $INV; 202our $INV;
196our $INVR; 203our $INVR;
197our $INVR_HB; 204our $INVR_HB;
205sub debug { 212sub debug {
206 $DEBUG_STATUS->set_text ($_[0]); 213 $DEBUG_STATUS->set_text ($_[0]);
207} 214}
208 215
209sub message { 216sub message {
210 $MESSAGE_WINDOW->message (@_); 217 $MESSAGE_DIST->message (@_);
218}
219
220sub update_modbox {
221 my $mod = DC::SDL_GetModState;
222
223 my $markup;
224
225 $markup .= $mod & DC::KMOD_CTRL
226 ? ($MAPWIDGET->{ctrl} ? "[REPEAT]" : "[<span foreground='#888'>REPEAT</span>]")
227 : "[<span foreground='#888'> once </span>]";
228
229 $markup .= $mod & DC::KMOD_SHIFT
230 ? ($MAPWIDGET->{shft} ? "[FIRE]" : "[<span foreground='#888'>FIRE</span>]")
231 : "[<span foreground='#888'>move</span>]";
232
233 $markup .= $mod & (DC::KMOD_ALT | DC::KMOD_META)
234 ? "[ALT]"
235 : "[<span foreground='#888'>alt</span>]";
236
237 $markup .= $mod & DC::KMOD_NUM
238 ? "[NUM]"
239 : "[<span foreground='#888'>num</span>]";
240
241 # <tt> around next statement works around some bug that keeps the
242 # "font =>" from being used on windows
243 $MODBOX->set_markup ("<tt>$markup</tt>");
211} 244}
212 245
213############################################################################# 246#############################################################################
214#TODO: maybe move into own audio module... 247#TODO: maybe move into own audio module...
215 248
635 # right: accept 668 # right: accept
636 $table->add_at (4, 0, new DC::UI::Button 669 $table->add_at (4, 0, new DC::UI::Button
637 text => "Accept", 670 text => "Accept",
638 on_activate => sub { 671 on_activate => sub {
639 $conn->send ("reply n"); 672 $conn->send ("reply n");
640 $STATS_PAGE->hide;
641 destroy_query_dialog $conn; 673 destroy_query_dialog $conn;
642 0 674 0
643 }, 675 },
644 ); 676 );
645 677
654 [Cha => CS_STAT_CHA], 686 [Cha => CS_STAT_CHA],
655 ) { 687 ) {
656 my ($name, $id) = @$_; 688 my ($name, $id) = @$_;
657 $hbox->add (new DC::UI::Label 689 $hbox->add (new DC::UI::Label
658 markup => "$conn->{stat}{$id} <span foreground='yellow'>$name</span>", 690 markup => "$conn->{stat}{$id} <span foreground='yellow'>$name</span>",
659 align => 0,
660 expand => 1, 691 expand => 1,
661 can_events => 1, 692 can_events => 1,
662 can_hover => 1, 693 can_hover => 1,
663 tooltip => "#stat_$name", 694 tooltip => "#stat_$name",
664 ); 695 );
698 729
699 $vbox->add (@dialog); 730 $vbox->add (@dialog);
700 $dialog->show; 731 $dialog->show;
701} 732}
702 733
703sub start_game { 734sub dc_connect {
704 status "logging in..."; 735 my ($host, $port) = @_;
705
706 $LOGIN_BUTTON->set_text ("Logout");
707 $SETUP_DIALOG->hide;
708 736
709 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 737 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
710 738
711 my ($host, $port) = split /:/, $PROFILE->{host};
712
713 $MAP = new DC::Map;
714
715 $CONN = eval { 739 $CONN =
716 new DC::Protocol 740 new DC::Protocol
717 host => $host, 741 host => $host,
718 port => $port || 13327, 742 port => $port,
719 user => $PROFILE->{user}, 743 user => $PROFILE->{user},
720 pass => $PROFILE->{password}, 744 pass => $PROFILE->{password},
721 mapw => $mapsize, 745 mapw => $mapsize,
722 maph => $mapsize, 746 maph => $mapsize,
723 747
724 client => "cfplus $DC::VERSION $] $^O", 748 client => "$DC::VERSION $] $^O",
725 749
726 map_widget => $MAPWIDGET, 750 map_widget => $MAPWIDGET,
727 statusbox => $STATUSBOX, 751 statusbox => $STATUSBOX,
728 map => $MAP, 752 map => $MAP,
729 mapmap => $MAPMAP, 753 mapmap => $MAPMAP,
730 query => \&server_query, 754 query => \&server_query,
731 755
732 setup_req => { 756 setup_req => {
733 smoothing => $CFG->{map_smoothing}*1, 757 smoothing => $CFG->{map_smoothing}*1,
734 }, 758 },
735 };
736 759
737 if ($CONN) { 760 on_connect => sub {
761 if ($_[0]) {
738 DC::lowdelay fileno $CONN->{fh}; 762 DC::lowdelay fileno $CONN->{fh};
739 763
740 status "login successful"; 764 status "login successful";
765 } else {
766 undef $CONN;
767 status "unable to connect: $!";
768 stop_game();
769 }
770 },
771 ;
772}
773
774sub start_game {
775 status "logging in...";
776
777 $LOGIN_BUTTON->set_text ("Logout");
778 $SETUP_DIALOG->hide;
779
780 my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327";
781
782 $MAP = new DC::Map;
783
784 # hack to make SURE we find the IP address all right
785 # can be removed once AnyEvent::DNS is proven stable.
786 if ($host eq "gameserver.deliantra.net") {
787 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
788 if ($_[0] ne "80.101.114.108") { # Perl
789 status "dns failure, using hardcoded address";
790 $host = "129.13.162.95";
791 }
792
793 dc_connect $host, $port;
794 };
741 } else { 795 } else {
742 status "unable to connect"; 796 dc_connect $host, $port;
743 stop_game();
744 } 797 }
745} 798}
746 799
747sub stop_game { 800sub stop_game {
748 $LOGIN_BUTTON->set_text ("Login / Register"); 801 $LOGIN_BUTTON->set_text ("Login / Register");
770 823
771 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]); 824 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]);
772 825
773 my $row = 0; 826 my $row = 0;
774 827
775 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "OpenGL Info"); 828 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "OpenGL Info");
776 $table->add_at (1, $row++, new DC::UI::Label valign => 0, fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version, 829 $table->add_at (1, $row++, new DC::UI::Label fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version,
777 can_events => 1, 830 can_events => 1,
778 tooltip => "<tt><span size='8192'>" . (DC::OpenGL::gl_extensions) . "</span></tt>"); 831 tooltip => "<tt><span size='8192'>" . (DC::OpenGL::gl_extensions) . "</span></tt>");
779 832
780 my $vidmode_tooltip = 833 my $vidmode_tooltip =
781 "<b>Video Mode.</b> The video mode to use for fullscreen (and the window size for windowed operation). " 834 "<b>Video Mode.</b> The video mode to use for fullscreen (and the window size for windowed operation). "
782 . "The format is <i>width</i> x <i>height</i> \@ <i>depth-per-channel</i> + <i>alpha-channel</i>."; 835 . "The format is <i>width</i> x <i>height</i> \@ <i>depth-per-channel</i> + <i>alpha-channel</i>.";
783 836
784 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Video Mode"); 837 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Video Mode");
785 $table->add_at (1, $row++, my $hbox = new DC::UI::HBox); 838 $table->add_at (1, $row++, my $hbox = new DC::UI::HBox);
786 839
787 $hbox->add (my $mode_slider = new DC::UI::Slider 840 $hbox->add (my $mode_slider = new DC::UI::Slider
788 force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1], 841 force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1],
789 tooltip => $vidmode_tooltip); 842 tooltip => $vidmode_tooltip);
790 $hbox->add (my $mode_label = new DC::UI::Label 843 $hbox->add (my $mode_label = new DC::UI::Label
791 align => 0, valign => 0, height => 0.8, template => "9999x9999@9+9", 844 height => 0.8, template => "9999x9999@9+9",
792 can_events => 1, tooltip => $vidmode_tooltip); 845 can_events => 1, tooltip => $vidmode_tooltip);
793 846
794 $mode_slider->connect (changed => sub { 847 $mode_slider->connect (changed => sub {
795 my ($self, $value) = @_; 848 my ($self, $value) = @_;
796 849
797 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value; 850 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value;
798 $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]}); 851 $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]});
799 }); 852 });
800 $mode_slider->emit (changed => $mode_slider->{range}[0]); 853 $mode_slider->emit (changed => $mode_slider->{range}[0]);
801 854
802 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fullscreen"); 855 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fullscreen");
803 $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::CheckBox 856 $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::CheckBox
804 state => $CFG->{fullscreen}, 857 state => $CFG->{fullscreen},
805 tooltip => "Bring the client into fullscreen mode.", 858 tooltip => "Bring the client into fullscreen mode.",
806 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } 859 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
807 ); 860 );
808 861
809 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Force OpenGL 1.1"); 862 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Force OpenGL 1.1");
810 $table->add_at (1, $row++, new DC::UI::CheckBox 863 $table->add_at (1, $row++, new DC::UI::CheckBox
811 state => $CFG->{force_opengl11}, 864 state => $CFG->{force_opengl11},
812 tooltip => "Limit CFPlus to use OpenGL 1.1 features only. This will normally result in " 865 tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in "
813 . "higher memory usage and slower performance. It will, however, help tremendously on " 866 . "higher memory usage and slower performance. It will, however, help tremendously on "
814 . "cards that claim to support a feature but fall back to software rendering. " 867 . "cards that claim to support a feature but fall back to software rendering. "
815 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, " 868 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, "
816 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you " 869 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you "
817 . "experience extremely low framerates and your card should do better, try this option.</b>", 870 . "experience extremely low framerates and your card should do better, try this option.</b>",
818 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 } 871 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 }
819 ); 872 );
820 873
821 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Compress Textures"); 874 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures");
822 $table->add_at (1, $row++, new DC::UI::CheckBox 875 $table->add_at (1, $row++, new DC::UI::CheckBox
823 state => $CFG->{texture_compression}, 876 state => $CFG->{texture_compression},
824 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but " 877 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but "
825 . "will save a lot of memory and increase performance. The compression algorithm " 878 . "will save a lot of memory and increase performance. The compression algorithm "
826 . "can differ form card to card, so your mileage may vary. This setting is ignored in " 879 . "can differ form card to card, so your mileage may vary. This setting is ignored in "
827 . "forced OpenGL 1.1 mode.", 880 . "forced OpenGL 1.1 mode.",
828 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 } 881 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 }
829 ); 882 );
830 883
831 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 884 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fast & Ugly");
832 $table->add_at (1, $row++, new DC::UI::CheckBox 885 $table->add_at (1, $row++, new DC::UI::CheckBox
833 state => $CFG->{fast}, 886 state => $CFG->{fast},
834 tooltip => "Lower the visual quality considerably to speed up rendering.", 887 tooltip => "Lower the visual quality considerably to speed up rendering.",
835 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } 888 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
836 ); 889 );
837 890
838 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 891 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "GUI Fontsize");
839 $table->add_at (1, $row++, new DC::UI::Slider 892 $table->add_at (1, $row++, new DC::UI::Slider
840 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 893 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
841 tooltip => "The base font size used by most GUI elements that do not have their own setting.", 894 tooltip => "The base font size used by most GUI elements that do not have their own setting.",
842 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 }, 895 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 },
843 ); 896 );
844 897
845 $table->add_at (1, $row++, new DC::UI::Button 898 $table->add_at (1, $row++, new DC::UI::Button
846 expand => 1, align => 0, text => "Apply", 899 expand => 1, text => "Apply",
847 tooltip => "Apply the video settings above.", 900 tooltip => "Apply the video settings above.",
848 on_activate => sub { 901 on_activate => sub {
849 video_shutdown (); 902 video_shutdown ();
850 video_init (); 903 video_init ();
851 0 904 0
852 } 905 }
853 ); 906 );
854 907
855 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Map Scale"); 908 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale");
856 $table->add_at (1, $row++, new DC::UI::Slider 909 $table->add_at (1, $row++, new DC::UI::Slider
857 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 910 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
858 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 911 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
859 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } 912 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
860 ); 913 );
861 914
862 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Map Smoothing"); 915 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Smoothing");
863 $table->add_at (1, $row++, new DC::UI::CheckBox 916 $table->add_at (1, $row++, new DC::UI::CheckBox
864 state => $CFG->{map_smoothing}, 917 state => $CFG->{map_smoothing},
865 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. " 918 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. "
866 . "This increases load on the graphics subsystem and works only with TRT servers. " 919 . "This increases load on the graphics subsystem and works only with TRT servers. "
867 . "Changes take effect at next login only.", 920 . "Changes take effect at next login only.",
868 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } 921 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 }
869 ); 922 );
870 923
871 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fog of War"); 924 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War");
872 $table->add_at (1, $row++, new DC::UI::CheckBox 925 $table->add_at (1, $row++, new DC::UI::CheckBox
873 state => $CFG->{fow_enable}, 926 state => $CFG->{fow_enable},
874 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 927 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
875 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } 928 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
876 ); 929 );
877 930
878 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "FoW Intensity"); 931 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity");
879 $table->add_at (1, $row++, new DC::UI::Slider 932 $table->add_at (1, $row++, new DC::UI::Slider
880 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 933 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
881 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", 934 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.",
882 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 } 935 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 }
883 ); 936 );
884 937
885 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 938 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Fontsize");
886 $table->add_at (1, $row++, new DC::UI::Slider 939 $table->add_at (1, $row++, new DC::UI::Slider
887 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 940 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
888 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, " 941 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, "
889 . "but you still need to press apply to correctly re-layout the widget.", 942 . "but you still need to press apply to correctly re-layout the widget.",
890 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, 943 on_changed => sub { $MESSAGE_DIST->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
891 ); 944 );
892 945
893 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 946 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge fontsize");
894 $table->add_at (1, $row++, new DC::UI::Slider 947 $table->add_at (1, $row++, new DC::UI::Slider
895 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 948 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
896 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", 949 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
897 on_changed => sub { 950 on_changed => sub {
898 $CFG->{gauge_fontsize} = $_[1]; 951 $CFG->{gauge_fontsize} = $_[1];
899 &set_gauge_window_fontsize; 952 &set_gauge_window_fontsize;
900 0 953 0
901 } 954 }
902 ); 955 );
903 956
904 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Gauge size"); 957 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge size");
905 $table->add_at (1, $row++, new DC::UI::Slider 958 $table->add_at (1, $row++, new DC::UI::Slider
906 range => [$CFG->{gauge_size}, 0.2, 0.8], 959 range => [$CFG->{gauge_size}, 0.2, 0.8],
907 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", 960 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.",
908 on_changed => sub { 961 on_changed => sub {
909 $CFG->{gauge_size} = $_[1]; 962 $CFG->{gauge_size} = $_[1];
943 996
944 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]); 997 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]);
945 998
946 my $row = 0; 999 my $row = 0;
947 1000
948 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Audio Enable"); 1001 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable");
949 $table->add_at (1, $row++, new DC::UI::CheckBox 1002 $table->add_at (1, $row++, new DC::UI::CheckBox
950 state => $CFG->{audio_enable}, 1003 state => $CFG->{audio_enable},
951 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.", 1004 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.",
952 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 } 1005 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 }
953 ); 1006 );
954 1007
955 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Sound Effects"); 1008 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects");
956 $table->add_at (1, $row, new DC::UI::CheckBox 1009 $table->add_at (1, $row, new DC::UI::CheckBox
957 expand => 1, state => $CFG->{effects_enable}, 1010 expand => 1, state => $CFG->{effects_enable},
958 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.", 1011 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.",
959 on_changed => sub { 1012 on_changed => sub {
960 $CFG->{effects_enable} = $_[1]; 1013 $CFG->{effects_enable} = $_[1];
967 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this " 1020 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this "
968 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.", 1021 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.",
969 on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 } 1022 on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 }
970 ); 1023 );
971 1024
972 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Background Music"); 1025 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music");
973 $table->add_at (1, $row, new DC::UI::CheckBox 1026 $table->add_at (1, $row, new DC::UI::CheckBox
974 expand => 1, state => $CFG->{bgm_enable}, 1027 expand => 1, state => $CFG->{bgm_enable},
975 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 1028 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
976 on_changed => sub { 1029 on_changed => sub {
977 $CFG->{bgm_enable} = $_[1]; 1030 $CFG->{bgm_enable} = $_[1];
984 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 1037 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
985 tooltip => "The volume of the background music. Changes are instant.", 1038 tooltip => "The volume of the background music. Changes are instant.",
986 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } 1039 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 }
987 ); 1040 );
988 1041
989 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Frequency"); 1042 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Frequency");
990 $table->add_at (1, $row++, new DC::UI::Selector 1043 $table->add_at (1, $row++, new DC::UI::Selector
991 c_colspan => 2, expand => 1, 1044 c_colspan => 2, expand => 1,
992 value => $CFG->{audio_hw_frequency}, 1045 value => $CFG->{audio_hw_frequency},
993 options => [ 1046 options => [
994 [ 0, "default" , "Use System Default"], 1047 [ 0, "default" , "Use System Default"],
1003 audio_tab_update; 1056 audio_tab_update;
1004 1 1057 1
1005 } 1058 }
1006 ); 1059 );
1007 1060
1008 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Channels"); 1061 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Channels");
1009 $table->add_at (1, $row++, new DC::UI::Selector 1062 $table->add_at (1, $row++, new DC::UI::Selector
1010 c_colspan => 2, expand => 1, 1063 c_colspan => 2, expand => 1,
1011 value => $CFG->{audio_hw_channels}, 1064 value => $CFG->{audio_hw_channels},
1012 options => [ 1065 options => [
1013 [0, "default" , "Use System Default"], 1066 [0, "default" , "Use System Default"],
1022 audio_tab_update; 1075 audio_tab_update;
1023 1 1076 1
1024 } 1077 }
1025 ); 1078 );
1026 1079
1027 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Latency"); 1080 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency");
1028 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector 1081 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector
1029 c_colspan => 2, expand => 1, 1082 c_colspan => 2, expand => 1,
1030 value => $CFG->{audio_hw_chunksize}, 1083 value => $CFG->{audio_hw_chunksize},
1031 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback " 1084 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback "
1032 . "is stuttering, increase this value. Values of 50-100ms are optimal.", 1085 . "is stuttering, increase this value. Values of 50-100ms are optimal.",
1036 1 1089 1
1037 } 1090 }
1038 ); 1091 );
1039 1092
1040 # should really be a slider 1093 # should really be a slider
1041 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Mixer Voices"); 1094 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Mixer Voices");
1042 $table->add_at (1, $row++, new DC::UI::ValSlider 1095 $table->add_at (1, $row++, new DC::UI::ValSlider
1043 c_colspan => 2, expand => 1, 1096 c_colspan => 2, expand => 1,
1044 tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.", 1097 tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.",
1045 range => [$::CFG->{audio_mix_channels}, 4, 32, 0, 1], 1098 range => [$::CFG->{audio_mix_channels}, 4, 32, 0, 1],
1046 template => ">= 99", 1099 template => ">= 99",
1052 1; 1105 1;
1053 } 1106 }
1054 ); 1107 );
1055 1108
1056 $table->add_at (1, $row++, new DC::UI::Button 1109 $table->add_at (1, $row++, new DC::UI::Button
1057 c_colspan => 2, expand => 1, align => 0, text => "Apply", 1110 c_colspan => 2, expand => 1, text => "Apply",
1058 tooltip => "Apply the audio settings", 1111 tooltip => "Apply the audio settings",
1059 on_activate => sub { 1112 on_activate => sub {
1060 audio_shutdown (); 1113 audio_shutdown ();
1061 audio_init (); 1114 audio_init ();
1062 0 1115 0
1112 $hb->add (my $hg = new DC::UI::Gauge type => 'hp', tooltip => "#stat_health"); 1165 $hb->add (my $hg = new DC::UI::Gauge type => 'hp', tooltip => "#stat_health");
1113 $hb->add (my $mg = new DC::UI::Gauge type => 'mana', tooltip => "#stat_mana"); 1166 $hb->add (my $mg = new DC::UI::Gauge type => 'mana', tooltip => "#stat_mana");
1114 $hb->add (my $gg = new DC::UI::Gauge type => 'grace', tooltip => "#stat_grace"); 1167 $hb->add (my $gg = new DC::UI::Gauge type => 'grace', tooltip => "#stat_grace");
1115 $hb->add (my $fg = new DC::UI::Gauge type => 'food', tooltip => "#stat_food"); 1168 $hb->add (my $fg = new DC::UI::Gauge type => 'food', tooltip => "#stat_food");
1116 1169
1117 $vbox->add (my $exp = new DC::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); 1170 $vbox->add (my $exp = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp");
1118 $vbox->add (my $prg = new DC::UI::ExperienceProgress); 1171 $vbox->add (my $prg = new DC::UI::ExperienceProgress);
1119 $vbox->add (my $sklprg = new DC::UI::ExperienceProgress); 1172 $vbox->add (my $sklprg = new DC::UI::ExperienceProgress);
1120 $vbox->add (my $rng = new DC::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); 1173 $vbox->add (my $rng = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged");
1121 1174
1122 $GAUGES = { 1175 $GAUGES = {
1123 exp => $exp, prg => $prg, sklprg => $sklprg, 1176 exp => $exp, prg => $prg, sklprg => $sklprg,
1124 win => $win, range => $rng, 1177 win => $win, range => $rng,
1125 hp => $hg, mana => $mg, grace => $gg, food => $fg, 1178 hp => $hg, mana => $mg, grace => $gg, food => $fg,
1141 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 1194 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
1142 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips"); 1195 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips");
1143 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 1196 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
1144 $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } ); 1197 $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } );
1145 1198
1146 $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153");#d# 1199 $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d#
1147 1200
1148 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0); 1201 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0);
1149 $t->add_at (0,0, new DC::UI::Label text => "a a a a", c_rowspan => 1, c_colspan => 2); 1202 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2);
1150 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1); 1203 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1151 $t->add_at (1,2, new DC::UI::Label text => "c c c c", c_rowspan => 1, c_colspan => 2); 1204 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2);
1152 $t->add_at (0,1, new DC::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1); 1205 $t->add_at (0,1, new DC::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1153 $t->add_at (1,1, new DC::UI::Label text => "e"); 1206 $t->add_at (1,1, new DC::UI::Label text => "e");
1154 1207
1155 $table->add_at (7, 6, my $c = new DC::UI::Canvas); 1208 $table->add_at (7, 6, my $c = new DC::UI::Canvas);
1156 1209
1157 $c->add_items ({ 1210 $c->add_items ({
1191 $vb->add (new DC::UI::FancyFrame 1244 $vb->add (new DC::UI::FancyFrame
1192 label => "Player", 1245 label => "Player",
1193 child => (my $pi = new DC::UI::VBox), 1246 child => (my $pi = new DC::UI::VBox),
1194 ); 1247 );
1195 1248
1196 $pi->add ($STATWIDS->{title} = new DC::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 1249 $pi->add ($STATWIDS->{title} = new DC::UI::Label text => "Title:", expand => 1, align => 0,
1197 can_hover => 1, can_events => 1, 1250 can_hover => 1, can_events => 1,
1198 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 1251 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
1199 $pi->add ($STATWIDS->{map} = new DC::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, 1252 $pi->add ($STATWIDS->{map} = new DC::UI::Label align => 0, text => "Map:", expand => 1,
1200 can_hover => 1, can_events => 1, 1253 can_hover => 1, can_events => 1,
1201 tooltip => "The map you are currently on (if supported by the server)."); 1254 tooltip => "The map you are currently on (if supported by the server).");
1202 1255
1203 $pi->add (my $hb0 = new DC::UI::HBox); 1256 $pi->add (my $hb0 = new DC::UI::HBox);
1204 $hb0->add ($STATWIDS->{weight} = new DC::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1, 1257 $hb0->add ($STATWIDS->{weight} = new DC::UI::Label text => "Weight:", expand => 1, align => 0,
1205 can_hover => 1, can_events => 1, 1258 can_hover => 1, can_events => 1,
1206 tooltip => "The weight of the player including all inventory items."); 1259 tooltip => "The weight of the player including all inventory items.");
1207 $hb0->add ($STATWIDS->{m_weight} = new DC::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1, 1260 $hb0->add ($STATWIDS->{m_weight} = new DC::UI::Label align => 0, text => "Max weight:", expand => 1,
1208 can_hover => 1, can_events => 1, 1261 can_hover => 1, can_events => 1,
1209 tooltip => "The weight limit: you cannot carry more than this."); 1262 tooltip => "The weight limit: you cannot carry more than this.");
1210 1263
1211 $vb->add (new DC::UI::FancyFrame 1264 $vb->add (new DC::UI::FancyFrame
1212 label => "Primary/Secondary Statistics", 1265 label => "Primary/Secondary Statistics",
1233 [2, 5, st_wspd => "WSp", 10.54], 1286 [2, 5, st_wspd => "WSp", 10.54],
1234 ) { 1287 ) {
1235 my ($col, $row, $id, $label, $template) = @$_; 1288 my ($col, $row, $id, $label, $template) = @$_;
1236 1289
1237 $tbl->add_at ($col , $row, $STATWIDS->{$id} = new DC::UI::Label 1290 $tbl->add_at ($col , $row, $STATWIDS->{$id} = new DC::UI::Label
1238 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, 1291 font => $FONT_FIXED, can_hover => 1, can_events => 1,
1239 align => +1, template => $template, tooltip => "#stat_$label"); 1292 align => 1, template => $template, tooltip => "#stat_$label");
1240 $tbl->add_at ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new DC::UI::Label 1293 $tbl->add_at ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new DC::UI::Label
1241 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, 1294 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2,
1242 align => -1, text => $label, tooltip => "#stat_$label"); 1295 align => 0, text => $label, tooltip => "#stat_$label");
1243 } 1296 }
1244 1297
1245 $vb->add (new DC::UI::FancyFrame 1298 $vb->add (new DC::UI::FancyFrame
1246 label => "Resistancies", 1299 label => "Resistancies",
1247 child => (my $tbl2 = new DC::UI::Table expand => 1), 1300 child => (my $tbl2 = new DC::UI::Table expand => 1, col_expand => [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0]),
1248 ); 1301 );
1249 1302
1250 my $row = 0; 1303 my $row = 0;
1251 my $col = 0; 1304 my $col = 0;
1252 1305
1291 1344
1292 for (qw/slow holyw conf fire depl magic 1345 for (qw/slow holyw conf fire depl magic
1293 drain acid pois para deat phys 1346 drain acid pois para deat phys
1294 blind fear tund elec cold ghit/) 1347 blind fear tund elec cold ghit/)
1295 { 1348 {
1296 $tbl2->add_at ($col, $row, 1349 $tbl2->add_at ($col + 2, $row,
1297 $STATWIDS->{"res_$_"} = 1350 $STATWIDS->{"res_$_"} =
1298 new DC::UI::Label 1351 new DC::UI::Label
1299 font => $FONT_FIXED, 1352 font => $FONT_FIXED,
1300 template => "-100%", 1353 template => "-100%",
1301 align => +1, 1354 align => 1,
1302 valign => 0,
1303 can_events => 1, 1355 can_events => 1,
1304 can_hover => 1, 1356 can_hover => 1,
1305 tooltip => $resist_names{$_}->[1], 1357 tooltip => $resist_names{$_}->[1],
1306 ); 1358 );
1307 $tbl2->add_at ($col + 1, $row, new DC::UI::Image 1359 $tbl2->add_at ($col + 1, $row, new DC::UI::Image
1309 can_hover => 1, 1361 can_hover => 1,
1310 can_events => 1, 1362 can_events => 1,
1311 path => "ui/resist/resist_$_.png", 1363 path => "ui/resist/resist_$_.png",
1312 tooltip => $resist_names{$_}->[1], 1364 tooltip => $resist_names{$_}->[1],
1313 ); 1365 );
1314 $tbl2->add_at ($col + 2, $row, new DC::UI::Label 1366 $tbl2->add_at ($col + 0, $row, new DC::UI::Label
1315 text => $resist_names{$_}->[0], 1367 text => $resist_names{$_}->[0],
1316 font => $FONT_FIXED, 1368 font => $FONT_FIXED,
1369 align => 1,
1317 can_hover => 1, 1370 can_hover => 1,
1318 can_events => 1, 1371 can_events => 1,
1319 tooltip => $resist_names{$_}->[1], 1372 tooltip => $resist_names{$_}->[1],
1320 ); 1373 );
1321 1374
1322 $row++; 1375 $row++;
1323 if ($row % 6 == 0) { 1376 if ($row % 6 == 0) {
1324 $col += 3; 1377 $col += 4;
1325 $row = 0; 1378 $row = 0;
1326 } 1379 }
1327 } 1380 }
1328 1381
1329 #update_stats_window ({}); 1382 #update_stats_window ({});
1375 "The time this server has been running without being restarted.", 1428 "The time this server has been running without being restarted.",
1376 "Short information about this server provided by its admins.", 1429 "Short information about this server provided by its admins.",
1377 ); 1430 );
1378 my @col = qw(#Users Host Uptime Version Description); 1431 my @col = qw(#Users Host Uptime Version Description);
1379 $table->add_at ($_, 0, new DC::UI::Label 1432 $table->add_at ($_, 0, new DC::UI::Label
1380 can_hover => 1, can_events => 1, 1433 can_hover => 1, can_events => 1, fg => [1, 1, 0],
1381 align => 0, fg => [1, 1, 0],
1382 text => $col[$_], tooltip => $tip[$_]) 1434 text => $col[$_], tooltip => $tip[$_])
1383 for 0 .. $#col; 1435 for 0 .. $#col;
1384 1436
1385 my @align = qw(1 0 1 1 -1); 1437 my @align = qw(1 0.5 1 1 0);
1386 1438
1387 my $y = 0; 1439 my $y = 0;
1388 for my $m (@{ $msg->{servers} }) { 1440 for my $m (@{ $msg->{servers} }) {
1389 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime, $highlight) = 1441 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime, $highlight) =
1390 @$m{qw(ip age hostname users version description ibytes obytes uptime highlight)}; 1442 @$m{qw(ip age hostname users version description ibytes obytes uptime highlight)};
1471 $vbox->add (new DC::UI::FancyFrame 1523 $vbox->add (new DC::UI::FancyFrame
1472 label => "Login Settings", 1524 label => "Login Settings",
1473 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), 1525 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1474 ); 1526 );
1475 1527
1476 $table->add_at (0, 4, new DC::UI::Label valign => 0, align => 1, text => "Username"); 1528 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username");
1477 $table->add_at (1, 4, new DC::UI::Entry 1529 $table->add_at (1, 4, new DC::UI::Entry
1478 text => $CFG->{profile}{default}{user}, 1530 text => $CFG->{profile}{default}{user},
1479 tooltip => "The name of your character on the server.", 1531 tooltip => "The name of your character on the server.",
1480 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1532 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 }
1481 ); 1533 );
1482 1534
1483 $table->add_at (0, 5, new DC::UI::Label valign => 0, align => 1, text => "Password"); 1535 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password");
1484 $table->add_at (1, 5, new DC::UI::Entry 1536 $table->add_at (1, 5, new DC::UI::Entry
1485 text => $CFG->{profile}{default}{password}, 1537 text => $CFG->{profile}{default}{password},
1486 hidden => 1, 1538 hidden => 1,
1487 tooltip => "The password for your character.", 1539 tooltip => "The password for your character.",
1488 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1540 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 }
1489 ); 1541 );
1490 1542
1491 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button 1543 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1492 expand => 1, 1544 expand => 1,
1493 align => 0,
1494 text => "Login / Register", 1545 text => "Login / Register",
1495 tooltip => "This button will either login to the account configured above or register a new account.", 1546 tooltip => "This button will either login to the account configured above or register a new account.",
1496 on_activate => sub { 1547 on_activate => sub {
1497 $CONN ? stop_game 1548 $CONN ? stop_game
1498 : start_game; 1549 : start_game;
1501 ); 1552 );
1502 1553
1503 $vbox->add (new DC::UI::FancyFrame 1554 $vbox->add (new DC::UI::FancyFrame
1504 label => "Registering", 1555 label => "Registering",
1505 min_h => 200, 1556 min_h => 200,
1506 child => (new DC::UI::Label valign => -1, ellipsise => 0, 1557 child => (new DC::UI::Label valign => 0, ellipsise => 0,
1507 markup => 1558 markup =>
1508 "To register a new account, choose a username that hasn't been taken yet and " 1559 "To register a new account, choose a username that hasn't been taken yet and "
1509 . "try to log-in. Follow the instructions in the Log tab in the message window.", 1560 . "try to log-in. Follow the instructions in the Log tab in the message window.",
1510 ), 1561 ),
1511 ); 1562 );
1521 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), 1572 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1522 ); 1573 );
1523 1574
1524 my $row = 0; 1575 my $row = 0;
1525 1576
1526 $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Host:Port"); 1577 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Host:Port");
1527 { 1578 {
1528 $table->add_at (1, $row, my $vbox = new DC::UI::VBox); 1579 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1529 1580
1530 $vbox->add ( 1581 $vbox->add (
1531 $HOST_ENTRY = new DC::UI::Entry 1582 $HOST_ENTRY = new DC::UI::Entry
1532 expand => 1, 1583 expand => 1,
1533 text => $CFG->{profile}{default}{host}, 1584 text => $CFG->{profile}{default}{host},
1534 tooltip => "The hostname or ip address of the Deliantra server to connect to", 1585 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)",
1535 on_changed => sub { 1586 on_changed => sub {
1536 my ($self, $value) = @_; 1587 my ($self, $value) = @_;
1537 $CFG->{profile}{default}{host} = $value; 1588 $CFG->{profile}{default}{host} = $value;
1538 1 1589 1
1539 } 1590 }
1542 if (0) { #d# disabled 1593 if (0) { #d# disabled
1543 $vbox->add (new DC::UI::Button 1594 $vbox->add (new DC::UI::Button
1544 expand => 1, 1595 expand => 1,
1545 text => "Server List", 1596 text => "Server List",
1546 other => $METASERVER, 1597 other => $METASERVER,
1547 tooltip => "Show a list of available crossfire servers", 1598 tooltip => "Show a list of available Deliantra servers",
1548 on_activate => sub { $METASERVER->toggle_visibility; 0 }, 1599 on_activate => sub { $METASERVER->toggle_visibility; 0 },
1549 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 1 }, 1600 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 1 },
1550 ); 1601 );
1551 }#d# 1602 }#d#
1552 } 1603 }
1553 1604
1554 $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Map Size"); 1605 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Map Size");
1555 $table->add_at (1, $row, new DC::UI::Slider 1606 $table->add_at (1, $row, new DC::UI::Slider
1556 force_w => 100, 1607 force_w => 100,
1557 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1608 range => [$CFG->{mapsize}, 10, 100, 0, 1],
1558 tooltip => "This is the size of the portion of the map update the server sends you. " 1609 tooltip => "This is the size of the portion of the map update the server sends you. "
1559 . "If you set this to a high value you will be able to see further, " 1610 . "If you set this to a high value you will be able to see further, "
1560 . "but you also increase bandwidth requirements and latency. " 1611 . "but you also increase bandwidth requirements and latency. "
1561 . "This option is only used once at log-in.", 1612 . "This option is only used once at log-in.",
1562 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 1 }, 1613 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 1 },
1563 ); 1614 );
1564 1615
1565 $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Output-Rate"); 1616 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Output-Rate");
1566 $table->add_at (1, $row, new DC::UI::Entry 1617 $table->add_at (1, $row, new DC::UI::Entry
1567 text => $CFG->{output_rate}, 1618 text => $CFG->{output_rate},
1568 tooltip => "The maximum bandwidth in bytes per second that the server should not exceed " 1619 tooltip => "The maximum bandwidth in bytes per second that the server should not exceed "
1569 . "when sending data. When 0 or unset, the server " 1620 . "when sending data. When 0 or unset, the server "
1570 . "default will be used, which is usually around 100kb/s. Most servers will " 1621 . "default will be used, which is usually around 100kb/s. Most servers will "
1583sub client_setup { 1634sub client_setup {
1584 my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]; 1635 my $table = new DC::UI::Table expand => 1, col_expand => [0, 1];
1585 1636
1586 my $row = 0; 1637 my $row = 0;
1587 1638
1588 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Tip of the day"); 1639 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Tip of the day");
1589 $table->add_at (1, $row++, new DC::UI::CheckBox 1640 $table->add_at (1, $row++, new DC::UI::CheckBox
1590 state => $CFG->{show_tips}, 1641 state => $CFG->{show_tips},
1591 tooltip => "Show the <b>Tip of the day</b> window at startup?", 1642 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1592 on_changed => sub { 1643 on_changed => sub {
1593 my ($self, $value) = @_; 1644 my ($self, $value) = @_;
1594 $CFG->{show_tips} = $value; 1645 $CFG->{show_tips} = $value;
1595 0 1646 0
1596 } 1647 }
1597 ); 1648 );
1598 1649
1599 $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Messages Window Size"); 1650 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Window Size");
1600 $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry 1651 $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry
1601 text => $CFG->{logview_max_par}, 1652 text => $CFG->{logview_max_par},
1602 tooltip => "This is maximum number of messages remembered in the <b>Messages</b> window. If the server " 1653 tooltip => "This is maximum number of messages remembered in the <b>Message</b> window. If the server "
1603 . "sends more messages than this number, older messages get removed to save memory and " 1654 . "sends more messages than this number, older messages get removed to save memory and "
1604 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.", 1655 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.",
1605 on_changed => sub { 1656 on_changed => sub {
1606 my ($self, $value) = @_; 1657 my ($self, $value) = @_;
1607 $MESSAGE_WINDOW->set_max_para ($CFG->{logview_max_par} = $value*1); 1658 $MESSAGE_DIST->set_max_par ($CFG->{logview_max_par} = $value*1);
1608 0 1659 0
1609 }, 1660 },
1610 ); 1661 );
1611 1662
1612 $table 1663 $table
1716 1767
1717 $r 1768 $r
1718} 1769}
1719 1770
1720my %SORT_ORDER = ( 1771my %SORT_ORDER = (
1721 type => undef, 1772 type => sub {
1773 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1774 },
1722 mtime => sub { 1775 mtime => sub {
1723 my $NOW = time; 1776 my $NOW = time;
1724 sort { 1777 sort {
1725 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6; 1778 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1726 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6; 1779 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1738 1791
1739sub inventory_widget { 1792sub inventory_widget {
1740 my $hb = new DC::UI::HBox homogeneous => 1; 1793 my $hb = new DC::UI::HBox homogeneous => 1;
1741 1794
1742 $hb->add (my $vb1 = new DC::UI::VBox); 1795 $hb->add (my $vb1 = new DC::UI::VBox);
1743 $vb1->add (new DC::UI::Label align => 0, text => "Player"); 1796 $vb1->add (new DC::UI::Label text => "Player");
1744 1797
1745 $vb1->add (my $hb1 = new DC::UI::HBox); 1798 $vb1->add (my $hb1 = new DC::UI::HBox);
1746 1799
1747 use sort 'stable'; 1800 use sort 'stable';
1748 1801
1758 $INV->set_sort_order ($SORT_ORDER{$_[1]}); 1811 $INV->set_sort_order ($SORT_ORDER{$_[1]});
1759 }, 1812 },
1760 ); 1813 );
1761 $hb1->add (new DC::UI::Label text => "Weight: ", align => 1, expand => 1); 1814 $hb1->add (new DC::UI::Label text => "Weight: ", align => 1, expand => 1);
1762 #TODO# update to weigh/maxweight 1815 #TODO# update to weigh/maxweight
1763 $hb1->add ($STATWIDS->{i_weight} = new DC::UI::Label align => -1); 1816 $hb1->add ($STATWIDS->{i_weight} = new DC::UI::Label align => 0);
1764 1817
1765 $vb1->add (my $sw1 = new DC::UI::ScrolledWindow expand => 1, scroll_y => 1); 1818 $vb1->add (my $sw1 = new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
1766 $sw1->add ($INV = new DC::UI::Inventory); 1819 $sw1->add ($INV = new DC::UI::Inventory);
1767 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}}); 1820 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1768 1821
1948 my @path = DC::Pod::full_path_of $node; 2001 my @path = DC::Pod::full_path_of $node;
1949 pop @path; # drop current node 2002 pop @path; # drop current node
1950 2003
1951 for my $node (@path) { 2004 for my $node (@path) {
1952 $buttons->add (new DC::UI::Button 2005 $buttons->add (new DC::UI::Button
1953 text => $node->{kw}[0], 2006 text => $node->[DC::Pod::N_KW][0],
1954 tooltip => "go to <i>" . (DC::asxml DC::Pod::full_path $node) . "</i>", 2007 tooltip => "go to <i>" . (DC::asxml DC::Pod::full_path $node) . "</i>",
1955 on_activate => sub { 2008 on_activate => sub {
1956 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = (); 2009 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1957 $load_node->($node); 2010 $load_node->($node);
1958 }, 2011 },
1959 ); 2012 );
1960 $buttons->add (new DC::UI::Label text => "/"); 2013 $buttons->add (new DC::UI::Label text => "/");
1961 } 2014 }
1962 2015
1963 $buttons->add (new DC::UI::Label text => $node->{kw}[0], padding_x => 4, padding_y => 4); 2016 $buttons->add (new DC::UI::Label text => $node->[DC::Pod::N_KW][0], padding_x => 4, padding_y => 4);
1964 2017
1965 $curnode = $node; 2018 $curnode = $node;
1966 2019
1967 $viewer->clear; 2020 $viewer->clear;
1968 $viewer->add_paragraph (DC::Pod::as_paragraphs DC::Pod::section_of $curnode); 2021 $viewer->add_paragraph (DC::Pod::as_paragraphs DC::Pod::section_of $curnode);
2147 force_x => "max", 2200 force_x => "max",
2148 force_y => 0; 2201 force_y => 0;
2149 $DEBUG_STATUS->show; 2202 $DEBUG_STATUS->show;
2150 2203
2151 $STATUSBOX = new DC::UI::Statusbox; 2204 $STATUSBOX = new DC::UI::Statusbox;
2152 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]); 2205
2206 $MODBOX = new DC::UI::Label
2207 can_events => 1,
2208 can_hover => 1,
2209 markup => "",
2210 align => 0,
2211 font => $FONT_FIXED,
2212 tooltip => "#modifier_box",
2213 tooltip_width => 0.67,
2214 ;
2215
2216 update_modbox;
2153 2217
2154 (new DC::UI::Frame 2218 (new DC::UI::Frame
2155 bg => [0, 0, 0, 0.4], 2219 bg => [0, 0, 0, 0.4],
2156 force_x => 0, 2220 force_x => 0,
2157 force_y => "max", 2221 force_y => "max",
2158 child => $STATUSBOX, 2222 child => (my $LR = new DC::UI::VBox),
2159 )->show; 2223 )->show;
2224
2225 $LR->add ($STATUSBOX);
2226 $LR->add ($MODBOX);
2227 $LR->add (new DC::UI::Label
2228 align => 0,
2229 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode",
2230 fontsize => 0.5,
2231 fg => [1, 1, 0, 0.7],
2232 );
2160 2233
2161 DC::UI::Toplevel->new ( 2234 DC::UI::Toplevel->new (
2162 title => "Minimap", 2235 title => "Minimap",
2163 name => "mapmap", 2236 name => "mapmap",
2164 x => 0, 2237 x => 0,
2172 2245
2173 $MAPWIDGET = new DC::MapWidget; 2246 $MAPWIDGET = new DC::MapWidget;
2174 $MAPWIDGET->connect (activate_console => sub { 2247 $MAPWIDGET->connect (activate_console => sub {
2175 my ($mapwidget, $preset) = @_; 2248 my ($mapwidget, $preset) = @_;
2176 2249
2177 $MESSAGE_WINDOW->activate_console ($preset) 2250 $MESSAGE_DIST->activate_console ($preset)
2178 if $MESSAGE_WINDOW; 2251 if $MESSAGE_DIST;
2179 }); 2252 });
2180 $MAPWIDGET->show; 2253 $MAPWIDGET->show;
2181 $MAPWIDGET->grab_focus; 2254 $MAPWIDGET->grab_focus;
2182 2255
2183 $COMPLETER = new DC::MapWidget::Command:: 2256 $COMPLETER = new DC::MapWidget::Command::
2195 force_h => $::HEIGHT * 0.6, 2268 force_h => $::HEIGHT * 0.6,
2196 has_close_button => 1, 2269 has_close_button => 1,
2197 ; 2270 ;
2198 2271
2199 $METASERVER = metaserver_dialog; 2272 $METASERVER = metaserver_dialog;
2273 # the name is changed to not conflict with the older name as users could have hidden it
2200 $MESSAGE_WINDOW = new DC::UI::MessageWindow; 2274 $MESSAGE_WINDOW = new DC::UI::Dockbar
2275 name => "message_window2",
2276 title => 'Messages',
2277 force_w => $::WIDTH * 0.6,
2278 force_h => $::HEIGHT * 0.25,
2279 ;
2201 2280
2281 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW;
2282
2202 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1, debug => 1, 2283 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1,
2203 filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1); 2284 filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
2204 2285
2205 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup, 2286 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup,
2206 "Configure the server to play on, your username and password."); 2287 "Configure the server to play on, your username and password.");
2207 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup, 2288 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup,
2225 $BUTTONBAR = new DC::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 2306 $BUTTONBAR = new DC::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
2226 2307
2227 $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 2308 $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
2228 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 2309 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
2229 2310
2230 $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW, 2311# $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW,
2231 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 2312# tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
2232 2313
2233 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 2314 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
2234 2315
2235 $BUTTONBAR->add (new DC::UI::Flopper text => "Playerbook", other => player_window, 2316 $BUTTONBAR->add (new DC::UI::Flopper text => "Playerbook", other => player_window,
2236 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats."); 2317 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats.");
2238 $BUTTONBAR->add (new DC::UI::Button 2319 $BUTTONBAR->add (new DC::UI::Button
2239 text => "Save Config", 2320 text => "Save Config",
2240 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 2321 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
2241 on_activate => sub { 2322 on_activate => sub {
2242 $::CFG->{layout} = DC::UI::get_layout; 2323 $::CFG->{layout} = DC::UI::get_layout;
2243 DC::write_cfg "$Deliantra::VARDIR/client.cf"; 2324 DC::write_cfg;
2244 status "Configuration Saved"; 2325 status "Configuration Saved";
2245 0 2326 0
2246 }, 2327 },
2247 ); 2328 );
2248 2329
2249 $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, 2330 $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
2250 tooltip => "View Documentation"); 2331 tooltip => "View Documentation");
2251
2252 2332
2253 $BUTTONBAR->add (new DC::UI::Button 2333 $BUTTONBAR->add (new DC::UI::Button
2254 text => "Quit", 2334 text => "Quit",
2255 tooltip => "Terminates the program", 2335 tooltip => "Terminates the program",
2256 on_activate => sub { 2336 on_activate => sub {
2294 $DC::UI::ROOT->draw; 2374 $DC::UI::ROOT->draw;
2295 DC::SDL_GL_SwapBuffers; 2375 DC::SDL_GL_SwapBuffers;
2296 $LAST_REFRESH = $NOW; 2376 $LAST_REFRESH = $NOW;
2297} 2377}
2298 2378
2299my $want_refresh = EV::idle_ns \&force_refresh; 2379my $want_refresh = EV::prepare_ns \&force_refresh;
2300 2380
2301my $input = EV::periodic 0, 1/60, undef, sub { 2381my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub {
2302 $NOW = time; 2382 $NOW = EV::now;
2303 2383
2304 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2384 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
2305 for DC::poll_events; 2385 for DC::poll_events;
2306 2386
2307 if (%animate_object) { 2387 if (%animate_object) {
2345 # alt-enter 2425 # alt-enter
2346 $FULLSCREEN_ENABLE->toggle; 2426 $FULLSCREEN_ENABLE->toggle;
2347 video_shutdown; 2427 video_shutdown;
2348 video_init; 2428 video_init;
2349 } else { 2429 } else {
2350 DC::UI::feed_sdl_key_down_event ($_[0]); 2430 &DC::UI::feed_sdl_key_down_event;
2351 } 2431 }
2432 update_modbox;
2352 }, 2433 },
2353 DC::SDL_KEYUP => \&DC::UI::feed_sdl_key_up_event, 2434 DC::SDL_KEYUP => sub {
2435 &DC::UI::feed_sdl_key_up_event;
2436 update_modbox;
2437 },
2354 DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event, 2438 DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event,
2355 DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event, 2439 DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event,
2356 DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event, 2440 DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event,
2357 DC::SDL_USEREVENT => sub { 2441 DC::SDL_USEREVENT => sub {
2358 if ($_[0]{code} == 1) { 2442 if ($_[0]{code} == 1) {
2369 EV::unloop; 2453 EV::unloop;
2370 #d# TODO calling exit here hangs the process in some futex 2454 #d# TODO calling exit here hangs the process in some futex
2371}; 2455};
2372 2456
2373{ 2457{
2458 DC::Pod::load_docwiki DC::find_rcfile "docwiki.pst";
2459
2374 if (-e "$Deliantra::VARDIR/client.cf") { 2460 if (-e "$Deliantra::VARDIR/client.cf") {
2375 DC::read_cfg "$Deliantra::VARDIR/client.cf"; 2461 DC::read_cfg "$Deliantra::VARDIR/client.cf";
2376 } else { 2462 } else {
2377 #TODO: compatibility cruft 2463 #TODO: compatibility cruft
2378 DC::read_cfg "$Deliantra::OLDDIR/cfplusrc"; 2464 DC::read_cfg "$Deliantra::OLDDIR/cfplusrc";
2379 print STDERR "INFO: used old configuratrion file\n"; 2465 print STDERR "INFO: used old configuration file\n";
2380 } 2466 }
2381 2467
2382 DC::DB::Server::run; 2468 DC::DB::Server::run;
2469
2470 if ($CFG->{db_schema} < 1) {
2471 warn "INFO: upgrading database schema from 0 to 1, mapcache and tilecache will be lost\n";
2472 DC::DB::nuke_db;
2473 $CFG->{db_schema} = 1;
2474 DC::write_cfg;
2475 }
2476
2477 DC::DB::open_db;
2383 2478
2384 DC::UI::set_layout ($::CFG->{layout}); 2479 DC::UI::set_layout ($::CFG->{layout});
2385 2480
2386 my %DEF_CFG = ( 2481 my %DEF_CFG = (
2387 sdl_mode => 0, 2482 sdl_mode => 0,
2412 pickup => 0, 2507 pickup => 0,
2413 inv_sort => "mtime", 2508 inv_sort => "mtime",
2414 default => "profile", # default profile 2509 default => "profile", # default profile
2415 show_tips => 1, 2510 show_tips => 1,
2416 logview_max_par => 1000, 2511 logview_max_par => 1000,
2512 shift_fire_stop => 0,
2417 ); 2513 );
2418 2514
2419 while (my ($k, $v) = each %DEF_CFG) { 2515 while (my ($k, $v) = each %DEF_CFG) {
2420 $CFG->{$k} = $v unless exists $CFG->{$k}; 2516 $CFG->{$k} = $v unless exists $CFG->{$k};
2421 } 2517 }
2457 DejaVuSansMono-BoldOblique.ttf 2553 DejaVuSansMono-BoldOblique.ttf
2458 ); 2554 );
2459 2555
2460 DC::add_font $_ for @fonts; 2556 DC::add_font $_ for @fonts;
2461 2557
2462 DC::pango_init;
2463
2464 $FONT_PROP = new_from_file DC::Font $fonts[0]; 2558 $FONT_PROP = new_from_file DC::Font $fonts[0];
2465 $FONT_FIXED = new_from_file DC::Font $fonts[1]; 2559 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2466 2560
2467 $FONT_PROP->make_default; 2561 $FONT_PROP->make_default;
2562
2563 DC::pango_init;
2468 } 2564 }
2469 2565
2470# compare mono (ft) vs. rgba (cairo) 2566# compare mono (ft) vs. rgba (cairo)
2471# ft - 1.8s, cairo 3s, even in alpha-only mode 2567# ft - 1.8s, cairo 3s, even in alpha-only mode
2472# for my $rgba (0..1) { 2568# for my $rgba (0..1) {
2489our $STARTUP_CANCEL = EV::idle sub { 2585our $STARTUP_CANCEL = EV::idle sub {
2490 undef $::STARTUP_CANCEL; 2586 undef $::STARTUP_CANCEL;
2491 $startup_done->(); 2587 $startup_done->();
2492}; 2588};
2493 2589
2590delete $SIG{__DIE__};
2494EV::loop; 2591EV::loop;
2495 2592
2496#video_shutdown; 2593#video_shutdown;
2497#audio_shutdown; 2594#audio_shutdown;
2498DC::OpenGL::quit; 2595DC::OpenGL::quit;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines