ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/cfplus
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.119 by root, Fri Sep 29 00:56:06 2006 UTC vs.
Revision 1.136 by root, Fri Dec 8 14:59:54 2006 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2
3my $startup_done = sub { };
4
5# do splash-screen thingy on win32
6BEGIN {
7 if (%PAR::LibCache && $^O eq "MSWin32") {
8 while (my ($filename, $zip) = each %PAR::LibCache) {
9 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
10 }
11
12 require Win32::GUI::SplashScreen;
13
14 Win32::GUI::SplashScreen::Show (
15 -file => "$ENV{PAR_TEMP}/SPLASH.bmp",
16 );
17
18 $startup_done = sub {
19 Win32::GUI::SplashScreen::Done (1);
20 };
21 }
22}
2 23
3use strict; 24use strict;
4use utf8; 25use utf8;
26
27use Carp 'verbose';
5 28
6# do things only needed for single-binary version (par) 29# do things only needed for single-binary version (par)
7BEGIN { 30BEGIN {
8 if (%PAR::LibCache) { 31 if (%PAR::LibCache) {
9 @INC = grep ref, @INC; # weed out all paths except pars loader refs 32 @INC = grep ref, @INC; # weed out all paths except pars loader refs
10 33
11 while (my ($filename, $zip) = each %PAR::LibCache) { 34 while (my ($filename, $zip) = each %PAR::LibCache) {
12 for ($zip->memberNames) { 35 for ($zip->memberNames) {
13 next unless /^\/root\/(.*)/; 36 next unless /^root\/(.*)/;
14 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1") 37 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1")
15 unless -e "$ENV{PAR_TEMP}/$1"; 38 unless -e "$ENV{PAR_TEMP}/$1";
16 } 39 }
17 } 40 }
18 41
45$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 68$SIG{QUIT} = sub { Carp::cluck "QUIT" };
46$SIG{PIPE} = 'IGNORE'; 69$SIG{PIPE} = 'IGNORE';
47 70
48$Event::Eval = 0; 71$Event::Eval = 0;
49$Event::DIED = sub { 72$Event::DIED = sub {
50 # TODO: display dialog box or so 73 CFPlus::fatal Carp::longmess $_[1]
51 Carp::cluck $_[1];#d#TODO: remove when stable
52 return;#d#
53 CFPlus::fatal ($_[1]);
54}; 74};
55
56our $VERSION = '0.9';
57 75
58my $MAX_FPS = 60; 76my $MAX_FPS = 60;
59my $MIN_FPS = 5; # unused as of yet 77my $MIN_FPS = 5; # unused as of yet
60 78
61our $META_SERVER = "crossfire.real-time.com:13326"; 79our $META_SERVER = "http://metaserver.schmorp.de/current.json";
62 80
63our $LAST_REFRESH; 81our $LAST_REFRESH;
64our $NOW; 82our $NOW;
65 83
66our $CFG; 84our $CFG;
67our $CONN; 85our $CONN;
86our $PROFILE; # current profile
68our $FAST; # fast, low-quality mode, possibly useful for software-rendering 87our $FAST; # fast, low-quality mode, possibly useful for software-rendering
69 88
70our $WANT_REFRESH; 89our $WANT_REFRESH;
71our $CAN_REFRESH; 90our $CAN_REFRESH;
72 91
103 122
104our $INVENTORY_PAGE; 123our $INVENTORY_PAGE;
105our $STATS_PAGE; 124our $STATS_PAGE;
106our $SKILL_PAGE; 125our $SKILL_PAGE;
107our $SPELL_PAGE; 126our $SPELL_PAGE;
127our $SPELL_LIST;
108 128
109our $HELP_WINDOW; 129our $HELP_WINDOW;
110our $MESSAGE_WINDOW; 130our $MESSAGE_WINDOW;
111our $FLOORBOX; 131our $FLOORBOX;
112our $GAUGES; 132our $GAUGES;
130our $BIND_EDITOR; 150our $BIND_EDITOR;
131our $BIND_UPD_CB; 151our $BIND_UPD_CB;
132 152
133our $PICKUP_CFG; 153our $PICKUP_CFG;
134 154
155our $IN_BUILD_MODE;
156our $BUILD_BUTTON;
157
135sub status { 158sub status {
136 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 159 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
137} 160}
138 161
139sub debug { 162sub debug {
140 $DEBUG_STATUS->set_text ($_[0]); 163 $DEBUG_STATUS->set_text ($_[0]);
164}
165
166sub message {
167 my ($para) = @_;
168
169 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
170
171 $para->{markup} = "<span foreground='#ffffff'>$time</span> $para->{markup}";
172
173 $LOGVIEW->add_paragraph ($para);
174 $LOGVIEW->scroll_to_bottom;
141} 175}
142 176
143sub destroy_query_dialog { 177sub destroy_query_dialog {
144 (delete $_[0]{query_dialog})->destroy 178 (delete $_[0]{query_dialog})->destroy
145 if $_[0]{query_dialog}; 179 if $_[0]{query_dialog};
344 status "logging in..."; 378 status "logging in...";
345 379
346 $LOGIN_BUTTON->set_text ("Logout"); 380 $LOGIN_BUTTON->set_text ("Logout");
347 $SETUP_DIALOG->hide; 381 $SETUP_DIALOG->hide;
348 382
383 $PROFILE = $CFG->{profile}{default};
384
349 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 385 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
350 386
351 my ($host, $port) = split /:/, $CFG->{profile}{default}{host}; 387 my ($host, $port) = split /:/, $PROFILE->{host};
352 388
353 $MAP = new CFPlus::Map $mapsize, $mapsize; 389 $MAP = new CFPlus::Map;
354 390
355 $CONN = eval { 391 $CONN = eval {
356 new CFPlus::Protocol 392 new CFPlus::Protocol
357 host => $host, 393 host => $host,
358 port => $port || 13327, 394 port => $port || 13327,
359 user => $CFG->{profile}{default}{user}, 395 user => $PROFILE->{user},
360 pass => $CFG->{profile}{default}{password}, 396 pass => $PROFILE->{password},
361 mapw => $mapsize, 397 mapw => $mapsize,
362 maph => $mapsize, 398 maph => $mapsize,
363 399
364 client => "cfplus $VERSION $] $^O", 400 client => "cfplus $CFPlus::VERSION $] $^O",
365 401
366 map_widget => $MAPWIDGET, 402 map_widget => $MAPWIDGET,
367 logview => $LOGVIEW, 403 logview => $LOGVIEW,
368 statusbox => $STATUSBOX, 404 statusbox => $STATUSBOX,
369 map => $MAP, 405 map => $MAP,
396sub stop_game { 432sub stop_game {
397 $LOGIN_BUTTON->set_text ("Login"); 433 $LOGIN_BUTTON->set_text ("Login");
398 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER); 434 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
399 $SETUP_DIALOG->show; 435 $SETUP_DIALOG->show;
400 $PL_WINDOW->hide; 436 $PL_WINDOW->hide;
401 $SPELL_PAGE->clear_spells; 437 $SPELL_LIST->clear_spells;
402 438
403 return unless $CONN; 439 return unless $CONN;
404 440
405 status "connection closed"; 441 status "connection closed";
406 442
633 $table->add (1, 1, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 }); 669 $table->add (1, 1, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
634 $table->add (0, 2, new CFPlus::UI::Label text => "Show FPS"); 670 $table->add (0, 2, new CFPlus::UI::Label text => "Show FPS");
635 $table->add (1, 2, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 671 $table->add (1, 2, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
636 $table->add (0, 3, new CFPlus::UI::Label text => "Suppress Tooltips"); 672 $table->add (0, 3, new CFPlus::UI::Label text => "Suppress Tooltips");
637 $table->add (1, 3, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 673 $table->add (1, 3, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
674 $table->add (0, 4, new CFPlus::UI::Button text => "die on click(tm)", on_activate => sub { die "violator" } );
638 675
639 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05); 676 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
640 677
641 for my $x (0..2) { 678 for my $x (0..2) {
642 for my $y (0 .. 2) { 679 for my $y (0 .. 2) {
646 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 }, 683 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 },
647 ); 684 );
648 } 685 }
649 } 686 }
650 687
688 $table->add (0, 5, new CFPlus::UI::TextEdit text => "line1\0152\0153");#d#
651 689
652 $table 690 $table
653} 691}
654 692
655sub stats_window { 693sub stats_window {
824 862
825 my $table = $METASERVER->{table}; 863 my $table = $METASERVER->{table};
826 $table->clear; 864 $table->clear;
827 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list..."); 865 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list...");
828 866
829 my $buf; 867 my $ok = 0;
830 868
831 my $fh = new IO::Socket::INET PeerHost => $META_SERVER, Blocking => 0; 869 CFPlus::background {
870 my $ua = CFPlus::lwp_useragent;
832 871
833 unless ($fh) { 872 CFPlus::background_msg CFPlus::from_json +(CFPlus::lwp_check $ua->get ($META_SERVER))->decoded_content;
834 $label->set_text ("unable to contact metaserver: $!"); 873 } sub {
835 return; 874 my ($msg) = @_;
836 } 875 if ($msg) {
837
838 Event->io (fd => $fh, poll => 'r', cb => sub {
839 my $res = sysread $fh, $buf, 8192, length $buf;
840
841 if (!defined $res) {
842 $_[0]->w->cancel;
843 $label->set_text ("error while retrieving server list: $!");
844 } elsif ($res == 0) {
845 $_[0]->w->cancel;
846 status "server list retrieved";
847
848 utf8::decode $buf if utf8::valid $buf;
849
850 $table->clear; 876 $table->clear;
851 877
852 my @tip = ( 878 my @tip = (
853 "The current number of users logged in on the server.", 879 "The current number of users logged in on the server.",
854 "The hostname of the server.", 880 "The hostname of the server.",
864 for 0 .. $#col; 890 for 0 .. $#col;
865 891
866 my @align = qw(1 0 1 1 -1); 892 my @align = qw(1 0 1 1 -1);
867 893
868 my $y = 0; 894 my $y = 0;
869 for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) { 895 for my $m (
896 sort {
897 $b->{version} <=> $a->{version}
898 or $b->{users} <=> $a->{users}
899 }
900 @{ $msg->{servers} }
901 ) {
870 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) = @$m; 902 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) =
903 @$m{qw(ip age hostname users version description ibytes obytes uptime)};
871 904
872 for ($desc) { 905 for ($desc) {
873 s/<br>/\n/gi; 906 s/<br>/\n/gi;
874 s/<li>/\n· /gi; 907 s/<li>/\n· /gi;
875 s/<.*?>//sgi; 908 s/<.*?>//sgi;
876 s/&/&amp;/g; 909 s/&amp;/&/g;
877 s/</&lt;/g; 910 s/&lt;/</g;
878 s/>/&gt;/g; 911 s/&gt;/>/g;
879 } 912 }
880 913
881 $uptime = sprintf "%dd %02d:%02d:%02d", 914 $uptime = sprintf "%dd %02d:%02d:%02d",
882 (int $m->[8] / 86400), 915 (int $uptime / 86400),
883 (int $m->[8] / 3600) % 24, 916 (int $uptime / 3600) % 24,
884 (int $m->[8] / 60) % 60, 917 (int $uptime / 60) % 60,
885 $m->[8] % 60; 918 $uptime % 60;
886 919
887 $m = [$users, $host, $uptime, $version, $desc]; 920 $m = [$users, $host, $uptime, $version, $desc];
888 921
889 $y++; 922 $y++;
890 923
900 ), 933 ),
901 (new CFPlus::UI::Empty expand => 1), 934 (new CFPlus::UI::Empty expand => 1),
902 ]); 935 ]);
903 936
904 $table->add ($_, $y, new CFPlus::UI::Label 937 $table->add ($_, $y, new CFPlus::UI::Label
938 max_w => $::WIDTH * 0.4,
905 ellipsise => 0, 939 ellipsise => 0,
906 align => $align[$_], 940 align => $align[$_],
907 text => $m->[$_], 941 text => $m->[$_],
908 tooltip => $tip[$_], 942 tooltip => $tip[$_],
943 fg => ($m->[3] =~ /\+$/ ? [1, 1, 1] : [.7, .7, .7]),
909 can_hover => 1, 944 can_hover => 1,
910 can_events => 1, 945 can_events => 1,
911 fontsize => 0.8) 946 fontsize => 0.8)
912 for 0 .. $#$m; 947 for 0 .. $#$m;
913 } 948 }
949 } else {
950 $ok or $label->set_text ("error while contacting metaserver");
914 } 951 }
915 }); 952 };
953
916} 954}
917 955
918sub metaserver_dialog { 956sub metaserver_dialog {
919 my $vbox = new CFPlus::UI::VBox; 957 my $vbox = new CFPlus::UI::VBox;
920 my $table = new CFPlus::UI::Table; 958 my $table = new CFPlus::UI::Table;
924 title => "Server List", 962 title => "Server List",
925 name => 'metaserver_dialog', 963 name => 'metaserver_dialog',
926 x => 'center', 964 x => 'center',
927 y => 'center', 965 y => 'center',
928 z => 3, 966 z => 3,
967 force_w => $::WIDTH * 0.9,
929 force_h => $::HEIGHT * 0.4, 968 force_h => $::HEIGHT * 0.7,
930 child => $vbox, 969 child => $vbox,
931 has_close_button => 1, 970 has_close_button => 1,
932 table => $table, 971 table => $table,
933 on_visibility_change => sub { 972 on_visibility_change => sub {
934 update_metaserver ($_[0]) if $_[1]; 973 update_metaserver ($_[0]) if $_[1];
1054 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox 1093 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox
1055 state => $CFG->{show_tips}, 1094 state => $CFG->{show_tips},
1056 tooltip => "Show the <b>Tip of the day</b> window at startup?", 1095 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1057 on_changed => sub { 1096 on_changed => sub {
1058 my ($self, $value) = @_; 1097 my ($self, $value) = @_;
1059 $CFG->{shop_tips} = $value; 1098 $CFG->{show_tips} = $value;
1060 0 1099 0
1061 } 1100 }
1062 ); 1101 );
1063 1102
1064 $vbox->add (new CFPlus::UI::FancyFrame 1103 $vbox->add (new CFPlus::UI::FancyFrame
1155 ["Boots" => PICKUP_BOOTS], 1194 ["Boots" => PICKUP_BOOTS],
1156 ["Gloves" => PICKUP_GLOVES], 1195 ["Gloves" => PICKUP_GLOVES],
1157 ["Cloaks" => PICKUP_CLOAK], 1196 ["Cloaks" => PICKUP_CLOAK],
1158 ], 1197 ],
1159 1198
1160 ["Readables", 2, 2, 1199 ["Readables", 2, 0,
1161 ["Spellbooks" => PICKUP_SPELLBOOK], 1200 ["Spellbooks" => PICKUP_SPELLBOOK],
1162 ["Skillscrolls" => PICKUP_SKILLSCROLL], 1201 ["Skillscrolls" => PICKUP_SKILLSCROLL],
1163 ["Normal Books/Scrolls" => PICKUP_READABLES], 1202 ["Normal Books/Scrolls" => PICKUP_READABLES],
1164 ], 1203 ],
1165 ["Misc", 2, 7, 1204 ["Misc", 2, 5,
1166 ["Food" => PICKUP_FOOD], 1205 ["Food" => PICKUP_FOOD],
1167 ["Drinks" => PICKUP_DRINK], 1206 ["Drinks" => PICKUP_DRINK],
1168 ["Valuables (Money, Gems)" => PICKUP_VALUABLES], 1207 ["Valuables (Money, Gems)" => PICKUP_VALUABLES],
1169 ["Keys" => PICKUP_KEY], 1208 ["Keys" => PICKUP_KEY],
1170 ["Magical Items" => PICKUP_MAGICAL], 1209 ["Magical Items" => PICKUP_MAGICAL],
1171 ["Potions" => PICKUP_POTION], 1210 ["Potions" => PICKUP_POTION],
1172 ["Magic Devices" => PICKUP_MAGIC_DEVICE], 1211 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1173 ["Ignore cursed" => PICKUP_NOT_CURSED], 1212 ["Ignore cursed" => PICKUP_NOT_CURSED],
1174 ["Jewelery" => PICKUP_JEWELS], 1213 ["Jewelery" => PICKUP_JEWELS],
1214 ["Flesh" => PICKUP_FLESH],
1175 ], 1215 ],
1176 ["Weight/Value ratio", 2, 17] 1216 ["Weight/Value ratio", 2, 17]
1177 ) 1217 )
1178 { 1218 {
1179 my ($title, $x, $y, @bits) = @$_; 1219 my ($title, $x, $y, @bits) = @$_;
1229 $table 1269 $table
1230} 1270}
1231 1271
1232my %SORT_ORDER = ( 1272my %SORT_ORDER = (
1233 type => undef, 1273 type => undef,
1234 mtime => sub { sort { 1274 mtime => sub {
1275 my $NOW = time;
1276 sort {
1277 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1278 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1279
1235 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 1280 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1236 or $b->{mtime} <=> $a->{mtime} 1281 or $btime <=> $atime
1237 or $a->{type} <=> $b->{type} 1282 or $a->{type} <=> $b->{type}
1283 } @_
1238 } @_ }, 1284 },
1239 weight => sub { sort { 1285 weight => sub { sort {
1240 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 1286 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1241 or $a->{type} <=> $b->{type} 1287 or $a->{type} <=> $b->{type}
1242 } @_ }, 1288 } @_ },
1243); 1289);
1268 #TODO# update to weigh/maxweight 1314 #TODO# update to weigh/maxweight
1269 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1); 1315 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1);
1270 1316
1271 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1317 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1);
1272 $sw1->add ($INV = new CFPlus::UI::Inventory); 1318 $sw1->add ($INV = new CFPlus::UI::Inventory);
1319 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1273 1320
1274 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1321 $hb->add (my $vb2 = new CFPlus::UI::VBox);
1275 1322
1276 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox); 1323 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox);
1277 1324
1317 $ntb->add ( 1364 $ntb->add (
1318 "Skills (F3)" => $SKILL_PAGE = skill_window, 1365 "Skills (F3)" => $SKILL_PAGE = skill_window,
1319 "Shows all your Skills." 1366 "Shows all your Skills."
1320 ); 1367 );
1321 1368
1322 my $spellsw = new CFPlus::UI::ScrolledWindow (expand => 1, scroll_y => 1); 1369 my $spellsw = $SPELL_PAGE = new CFPlus::UI::ScrolledWindow (expand => 1, scroll_y => 1);
1323 $spellsw->add ($SPELL_PAGE = new CFPlus::UI::SpellList); 1370 $spellsw->add ($SPELL_LIST = new CFPlus::UI::SpellList);
1324 $ntb->add ( 1371 $ntb->add (
1325 "Spellbook (F4)" => $spellsw, 1372 "Spellbook (F4)" => $spellsw,
1326 "Displays all spells you have and lets you edit keyboard shortcuts for them." 1373 "Displays all spells you have and lets you edit keyboard shortcuts for them."
1327 ); 1374 );
1328 $ntb->add ( 1375 $ntb->add (
1346 1393
1347 my $refresh; 1394 my $refresh;
1348 $refresh = $BIND_UPD_CB = sub { 1395 $refresh = $BIND_UPD_CB = sub {
1349 $binding_list->clear (); 1396 $binding_list->clear ();
1350 1397
1398 return unless $PROFILE;
1399
1351 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { 1400 for my $mod (keys %{$PROFILE->{bindings}}) {
1352 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { 1401 for my $sym (keys %{$PROFILE->{bindings}{$mod}}) {
1353 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1402 my $cmds = $PROFILE->{bindings}{$mod}{$sym};
1354 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1403 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1355 1404
1356 my $lbl = join "; ", @$cmds; 1405 my $lbl = join "; ", @$cmds;
1357 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym); 1406 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym);
1358 $binding_list->add (my $hb = new CFPlus::UI::HBox); 1407 $binding_list->add (my $hb = new CFPlus::UI::HBox);
1359 $hb->add (new CFPlus::UI::Button 1408 $hb->add (new CFPlus::UI::Button
1360 text => "delete", 1409 text => "delete",
1361 tooltip => "Deletes the binding", 1410 tooltip => "Deletes the binding",
1362 on_activate => sub { 1411 on_activate => sub {
1363 $binding_list->remove ($hb); 1412 $binding_list->remove ($hb);
1364 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1413 delete $PROFILE->{bindings}{$mod}{$sym};
1365 0 1414 0
1366 }); 1415 });
1367 1416
1368 $hb->add (new CFPlus::UI::Button 1417 $hb->add (new CFPlus::UI::Button
1369 text => "edit", 1418 text => "edit",
1370 tooltip => "Edits the binding", 1419 tooltip => "Edits the binding",
1371 on_activate => sub { 1420 on_activate => sub {
1372 $::BIND_EDITOR->set_binding ( 1421 $::BIND_EDITOR->set_binding (
1373 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, 1422 $mod, $sym, $PROFILE->{bindings}{$mod}{$sym},
1374 sub { 1423 sub {
1375 my ($nmod, $nsym, $ncmds) = @_; 1424 my ($nmod, $nsym, $ncmds) = @_;
1376 $::BIND_EDITOR->cfg_unbind ($mod, $sym); 1425 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1377 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds); 1426 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1378 $refresh->(); 1427 $refresh->();
1817 ); 1866 );
1818 1867
1819 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, 1868 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
1820 tooltip => "View Documentation"); 1869 tooltip => "View Documentation");
1821 1870
1871
1822 $BUTTONBAR->add (new CFPlus::UI::Button 1872 $BUTTONBAR->add (new CFPlus::UI::Button
1823 text => "Quit", 1873 text => "Quit",
1824 tooltip => "Terminates the program", 1874 tooltip => "Terminates the program",
1825 on_activate => sub { 1875 on_activate => sub {
1826 if ($CONN) { 1876 if ($CONN) {
1837 } 1887 }
1838 1888
1839 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1889 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1840} 1890}
1841 1891
1892sub setup_build_button {
1893 my ($enabled) = @_;
1894 if ($enabled) {
1895 $BUILD_BUTTON ||= new CFPlus::UI::Button
1896 text => "Build",
1897 tooltip => "Opens the ingame builder",
1898 on_activate => sub {
1899 if ($CONN) {
1900 $CONN->send_ext_req (builder_player_items => sub {
1901 open_ingame_editor ($_[0]) if exists $_[0]->{items};
1902 });
1903 }
1904 0
1905 };
1906 $BUTTONBAR->add ($BUILD_BUTTON);
1907 } else {
1908 $BUILD_BUTTON->hide if $BUILD_BUTTON;
1909 }
1910}
1911
1912sub open_ingame_editor {
1913 my ($msg) = @_;
1914
1915 my $win = new CFPlus::UI::Toplevel
1916 x => 0,
1917 y => 'center',
1918 z => 4,
1919 name => 'builder_window',
1920 force_w => int $WIDTH * 1/4,
1921 force_h => int $HEIGHT * 3/4,
1922 title => "In game builder",
1923 has_close_button => 1;
1924
1925 my $r = new CFPlus::UI::ScrolledWindow (
1926 expand => 1,
1927 scroll_y => 1
1928 );
1929 $r->add (my $vb = new CFPlus::UI::VBox);
1930 $win->add ($r);
1931
1932
1933 $vb->add (
1934 new CFPlus::UI::Button
1935 text => "Disable build mode",
1936 on_activate => sub { $::IN_BUILD_MODE = undef }
1937 );
1938 $vb->add (
1939 new CFPlus::UI::Button
1940 text => "ERASE",
1941 on_activate => sub { $::IN_BUILD_MODE = { do_erase => 1 } }
1942 );
1943
1944 for my $itemarchname (
1945 sort {
1946 $msg->{items}->{$a}->{build_arch_name}
1947 cmp $msg->{items}->{$b}->{build_arch_name}
1948 } keys %{$msg->{items}}
1949 ) {
1950 my $info = $msg->{items}->{$itemarchname};
1951 $vb->add (
1952 new CFPlus::UI::Button text => $info->{build_arch_name},
1953 on_activate => sub {
1954 $::IN_BUILD_MODE = { item => $itemarchname, info => $info };
1955
1956 if (grep { $msg->{items}->{$itemarchname}->{$_} } qw/has_connection has_name has_text/) {
1957 build_mode_query_arch_info ();
1958 }
1959 }
1960 );
1961 }
1962
1963 $win->show;
1964}
1965
1966sub build_mode_query_arch_info {
1967 my ($iteminfo) = $::IN_BUILD_MODE;
1968 my $itemarchname = $iteminfo->{item};
1969 my $info = $iteminfo->{info};
1970
1971 my $dialog = new CFPlus::UI::Toplevel
1972 x => "center",
1973 y => "center",
1974 z => 50,
1975 force_w => int $WIDTH * 1/2,
1976 title => "Enter information for placement of '$itemarchname'",
1977 has_close_button => 1;
1978
1979 $dialog->add (my $vb = new CFPlus::UI::VBox expand => 1);
1980
1981 $vb->add (my $table = new CFPlus::UI::Table expand => 1);
1982 my $row = 0;
1983 if ($info->{has_name}) {
1984 $table->add (0, $row, new CFPlus::UI::Label text => "Name:");
1985 $table->add (1, $row++, new CFPlus::UI::Entry expand => 1, on_changed => sub { $::IN_BUILD_MODE->{name} = $_[1]; 0 });
1986 }
1987 if ($info->{has_text}) {
1988 $table->add (0, $row, new CFPlus::UI::Label text => "Text:");
1989 $table->add (1, $row++, new CFPlus::UI::Entry expand => 1, on_changed => sub { $::IN_BUILD_MODE->{text} = $_[1]; 0 });
1990 }
1991 if ($info->{has_connection}) {
1992 $table->add (0, $row, new CFPlus::UI::Label text => "Connection ID:");
1993 $table->add (1, $row++,
1994 new CFPlus::UI::Entry
1995 expand => 1,
1996 on_changed => sub { $::IN_BUILD_MODE->{connection} = $_[1]; 0 },
1997 tooltip => "Enter the connection ID here. The connection ID connects actors like a lever to a gate or a magic ear to a gate"
1998 );
1999 }
2000
2001 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
2002 $hb->add (new CFPlus::UI::Button
2003 text => "Close",
2004 expand => 1,
2005 on_activate => sub { $dialog->hide; 0 },
2006 );
2007 $dialog->show;
2008}
2009
1842sub video_shutdown { 2010sub video_shutdown {
1843 CFPlus::OpenGL::shutdown; 2011 CFPlus::OpenGL::shutdown;
1844 2012
1845 undef $SDL_ACTIVE; 2013 undef $SDL_ACTIVE;
1846} 2014}
1877 CFPlus::Mix_AllocateChannels 8; 2045 CFPlus::Mix_AllocateChannels 8;
1878 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128; 2046 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128;
1879 2047
1880 audio_music_finished; 2048 audio_music_finished;
1881 2049
2050 local $_;
1882 while (<$fh>) { 2051 while (<$fh>) {
1883 next if /^\s*#/; 2052 next if /^\s*#/;
1884 next if /^\s*$/; 2053 next if /^\s*$/;
1885 2054
1886 my ($file, $volume, $event) = split /\s+/, $_, 3; 2055 my ($file, $volume, $event) = split /\s+/, $_, 3;
2020 log_fontsize => 0.7, 2189 log_fontsize => 0.7,
2021 gauge_fontsize => 1, 2190 gauge_fontsize => 1,
2022 gauge_size => 0.35, 2191 gauge_size => 0.35,
2023 stat_fontsize => 0.7, 2192 stat_fontsize => 0.7,
2024 mapsize => 100, 2193 mapsize => 100,
2025 say_command => 'say', 2194 say_command => 'chat',
2026 audio_enable => 1, 2195 audio_enable => 1,
2027 bgm_enable => 1, 2196 bgm_enable => 1,
2028 bgm_volume => 0.25, 2197 bgm_volume => 0.25,
2029 face_prefetch => 0, 2198 face_prefetch => 0,
2030 output_sync => 1, 2199 output_sync => 1,
2084# } 2253# }
2085# my $t2 = Time::HiRes::time; 2254# my $t2 = Time::HiRes::time;
2086# warn $t2-$t1; 2255# warn $t2-$t1;
2087# } 2256# }
2088 2257
2258 $startup_done->();
2259
2089 video_init; 2260 video_init;
2090 audio_init; 2261 audio_init;
2091} 2262}
2092 2263
2093show_tip_of_the_day if $CFG->{show_tips}; 2264show_tip_of_the_day if $CFG->{show_tips};

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines