--- deliantra/Deliantra-Client/bin/cfplus 2006/06/03 21:59:55 1.51
+++ deliantra/Deliantra-Client/bin/cfplus 2006/06/07 06:28:30 1.64
@@ -27,7 +27,6 @@
if %PAR::LibCache;
use Time::HiRes 'time';
-use Pod::POM;
use Event;
use Crossfire;
@@ -41,6 +40,8 @@
use CFClient::UI;
use CFClient::MapWidget;
+$SIG{QUIT} = sub { Carp::cluck "QUIT" };
+
$Event::DIED = sub {
# TODO: display dialog box or so
Carp::confess $_[1];#d#TODO: remove when stable
@@ -92,6 +93,8 @@
our $SETUP_KEYBOARD;
our $SETUP_SPELLS;
+our $STATS_WINDOW;
+our $MESSAGE_WINDOW;
our $FLOORBOX;
our $GAUGES;
our $STATWIDS;
@@ -124,6 +127,187 @@
$DEBUG_STATUS->set_text ($_[0]);
}
+sub destroy_query_dialog {
+ (delete $_[0]{query_dialog})->destroy
+ if $_[0]{query_dialog};
+}
+
+# server query dialog
+sub server_query {
+ my ($conn, $flags, $prompt) = @_;
+
+ $conn->{query_dialog} = my $dialog = new CFClient::UI::FancyFrame
+ x => "center",
+ y => "center",
+ title => "Server Query",
+ child => my $vbox = new CFClient::UI::VBox,
+ ;
+
+ my @dialog = my $label = new CFClient::UI::Label
+ max_w => $::WIDTH * 0.4,
+ ellipsise => 0,
+ text => $prompt;
+
+ if ($flags & CS_QUERY_YESNO) {
+ push @dialog, my $hbox = new CFClient::UI::HBox;
+
+ $hbox->add (new CFClient::UI::Button
+ text => "No",
+ on_activate => sub {
+ $conn->send ("reply n");
+ $dialog->destroy;
+ }
+ );
+ $hbox->add (new CFClient::UI::Button
+ text => "Yes",
+ on_activate => sub {
+ $conn->send ("reply y");
+ destroy_query_dialog $conn;
+ },
+ );
+
+ $dialog->focus_in;
+
+ } elsif ($flags & CS_QUERY_SINGLECHAR) {
+ $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)";
+
+ if ($prompt =~ /Now choose a character|Press any key for the next race/i) {
+ $MESSAGE_WINDOW->show;
+
+ unshift @dialog, new CFClient::UI::Label
+ max_w => $::WIDTH * 0.4,
+ ellipsise => 0,
+ markup => "\nOr use your keyboard:\n";
+
+ unshift @dialog, my $table = new CFClient::UI::Table;
+
+ $table->add (0, 0, new CFClient::UI::Button
+ text => "Next Race",
+ on_activate => sub {
+ $conn->send ("reply n");
+ destroy_query_dialog $conn;
+ },
+ );
+ $table->add (2, 0, new CFClient::UI::Button
+ text => "Accept",
+ on_activate => sub {
+ $conn->send ("reply d");
+ destroy_query_dialog $conn;
+ },
+ );
+
+ unshift @dialog, new CFClient::UI::Label
+ max_w => $::WIDTH * 0.4,
+ ellipsise => 0,
+ markup =>
+ "Character Creation: Race\n\n"
+ . "Look at the Messages window to see a description of this race "
+ . "(or hover with your mouse over the bottommost entry in the status area in the lower left area of the screen) "
+ . "and the center of the screen to see how this race looks like "
+ . "(this is below this dialog window, you may need to click on the display area to make it visible).\n\n"
+ . "You can look at another race, or accept this race (you will come back to this race eventually, "
+ . "so you can take your time making this important choice."
+ ;
+
+ } elsif ($prompt =~ /roll new stats/) {
+ if (my $stat = delete $conn->{stat_change_with}) {
+ $conn->send ("reply $stat");
+ destroy_query_dialog $conn;
+ return;
+ }
+
+ $STATS_WINDOW->show;
+ $MESSAGE_WINDOW->hide;
+
+ unshift @dialog, new CFClient::UI::Label
+ max_w => $::WIDTH * 0.4,
+ ellipsise => 0,
+ markup => "\nOr use your keyboard:\n";
+
+ unshift @dialog, my $table = new CFClient::UI::Table;
+
+ # left: re-roll
+ $table->add (0, 0, new CFClient::UI::Button
+ text => "Roll Again",
+ on_activate => sub {
+ $conn->send ("reply y");
+ destroy_query_dialog $conn;
+ },
+ );
+
+ # center: swap stats
+ my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
+ value => $_,
+ options => [
+ [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"],
+ [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"],
+ [3 => "Con", "Constitution ($conn->{stat}{+CS_STAT_CON})"],
+ [4 => "Int", "Intelligence ($conn->{stat}{+CS_STAT_INT})"],
+ [5 => "Wis", "Wisdom ($conn->{stat}{+CS_STAT_WIS})"],
+ [6 => "Pow", "Power ($conn->{stat}{+CS_STAT_POW})"],
+ [7 => "Cha", "Charisma ($conn->{stat}{+CS_STAT_CHA})"],
+ ],
+ ), 1 .. 2;
+
+ $table->add (2, 0, new CFClient::UI::Button
+ text => "Swap Stats",
+ on_activate => sub {
+ $conn->{stat_change_with} = $sw2->{value};
+ $conn->send ("reply $sw1->{value}");
+ destroy_query_dialog $conn;
+ },
+ );
+ $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]);
+
+ # right: accept
+ $table->add (4, 0, new CFClient::UI::Button
+ text => "Accept",
+ on_activate => sub {
+ $conn->send ("reply n");
+ $STATS_WINDOW->hide;
+ destroy_query_dialog $conn;
+ },
+ );
+
+ unshift @dialog, new CFClient::UI::Label
+ max_w => $::WIDTH * 0.4,
+ ellipsise => 0,
+ markup =>
+ "Character Creation: Stats\n\n"
+ . "Look at the Stats window to see your basic stats "
+ . "(first column: 1 strength, 2 dexterity, 3 constitution, 4 intelligence, 5 wisdom, 6 power and 7 charisma).\n\n"
+ . "You can create another set of stats, swap two stat values with each other or accept the stats as they are now and continue. "
+ . "Race selection will influence those values later on."
+ ;
+ }
+
+ push @dialog, my $entry = new CFClient::UI::Entry
+ on_changed => sub {
+ $conn->send ("reply $_[1]");
+ destroy_query_dialog $conn;
+ },
+ ;
+
+ $entry->focus_in;
+
+ } else {
+ $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)";
+
+ push @dialog, my $entry = new CFClient::UI::Entry
+ $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
+ on_activate => sub {
+ $conn->send ("reply $_[1]");
+ destroy_query_dialog $conn;
+ },
+ ;
+
+ $entry->focus_in;
+ }
+
+ $vbox->add (@dialog);
+ $dialog->show;
+}
+
sub start_game {
status "logging in...";
@@ -150,6 +334,7 @@
statusbox => $STATUSBOX,
map => $MAP,
mapmap => $MAPMAP,
+ query => \&server_query,
sound_play => sub {
my ($x, $y, $soundnum, $type) = @_;
@@ -176,14 +361,15 @@
sub stop_game {
$LOGIN_BUTTON->set_text ("Login");
+ $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
$SETUP_DIALOG->show;
$INV_WINDOW->hide;
- $LOGVIEW->hide;
return unless $CONN;
status "connection closed";
+ destroy_query_dialog $CONN;
$CONN->destroy;
$CONN = 0; # false, does not autovivify
}
@@ -442,7 +628,7 @@
}
-sub make_stats_window {
+sub stats_window {
my $tgw = new CFClient::UI::FancyFrame
y => $HEIGHT * (2/8),
x => "max",
@@ -662,9 +848,19 @@
$table->clear;
- my @col = qw(Use #Users Host Uptime Version Description);
- $table->add ($_, 0, new CFClient::UI::Label align => 0, fg => [1, 1, 0], text => $col[$_])
- for 0 .. $#col;
+ my @tip = (
+ "The current number of users logged in on the server.",
+ "The hostname of the server.",
+ "The time this server has been running without being restarted.",
+ "The server software version - a '+' indicates a Crossfire+ server.",
+ "Short information about this server provided by its admins.",
+ );
+ my @col = qw(#Users Host Uptime Version Description);
+ $table->add ($_, 0, new CFClient::UI::Label
+ can_hover => 1, can_events => 1,
+ align => 0, fg => [1, 1, 0],
+ text => $col[$_], tooltip => $tip[$_])
+ for 0 .. $#col;
my @align = qw(1 0 1 1 -1);
@@ -691,16 +887,26 @@
$y++;
- $table->add (0, $y, new CFClient::UI::VBox children => [
- (new CFClient::UI::Button text => "Use", on_activate => sub {
- $HOST_ENTRY->set_text ($CFG->{host} = $host);
- $METASERVER->toggle_visibility;
- }),
+ $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [
+ (new CFClient::UI::Button
+ text => "Use",
+ tooltip => "Put this server into the Host:Port field",
+ on_activate => sub {
+ $HOST_ENTRY->set_text ($CFG->{host} = $host);
+ $METASERVER->hide;
+ },
+ ),
(new CFClient::UI::Empty expand => 1),
]);
- $table->add ($_ + 1, $y, new CFClient::UI::Label
- ellipsise => 0, align => $align[$_], text => $m->[$_], fontsize => 0.8)
+ $table->add ($_, $y, new CFClient::UI::Label
+ ellipsise => 0,
+ align => $align[$_],
+ text => $m->[$_],
+ tooltip => $tip[$_],
+ can_hover => 1,
+ can_events => 1,
+ fontsize => 0.8)
for 0 .. $#$m;
}
}
@@ -709,17 +915,21 @@
sub metaserver_dialog {
my $dialog = new CFClient::UI::FancyFrame
- title => "Server List",
- name => 'metaserver_dialog',
- x => 'center',
- y => 'center',
- child => (my $vbox = new CFClient::UI::VBox),
+ title => "Server List",
+ name => 'metaserver_dialog',
+ x => 'center',
+ y => 'center',
+ z => 3,
+ force_h => $::HEIGHT * 0.4,
+ child => (my $vbox = new CFClient::UI::VBox),
on_visibility_change => sub {
update_metaserver if $_[1];
},
;
- $vbox->add ($dialog->{table} = new CFClient::UI::Table);
+ $dialog->{table} = new CFClient::UI::Table;
+
+ $vbox->add (new CFClient::UI::ScrolledWindow expand => 1, child => $dialog->{table});
$dialog
}
@@ -752,6 +962,7 @@
other => $METASERVER,
tooltip => "Show a list of available crossfire servers",
on_activate => sub { $METASERVER->toggle_visibility },
+ on_visibility_change => sub { $METASERVER->hide unless $_[1] },
);
}
@@ -851,8 +1062,8 @@
bg => [0, 0, 0, 0.75],
x => "max",
y => 0,
- force_w => $::WIDTH / 3,
- force_h => $::HEIGHT / 5,
+ force_w => $::WIDTH * 0.4,
+ force_h => $::HEIGHT * 0.5,
child => (my $vbox = new CFClient::UI::VBox);
$vbox->add ($LOGVIEW);
@@ -905,6 +1116,7 @@
$QUIT_DIALOG = new CFClient::UI::FancyFrame
x => "center",
y => "center",
+ z => 50,
title => "Really Quit?",
;
@@ -936,41 +1148,41 @@
for (
["General", 0, 0,
- ["Enable autopickup" => CFClient::Pickup::PU_NEWMODE],
- ["Inhibit autopickup" => CFClient::Pickup::PU_INHIBIT],
- ["Stop before pickup" => CFClient::Pickup::PU_STOP],
- ["Debug autopickup" => CFClient::Pickup::PU_DEBUG],
+ ["Enable autopickup" => PICKUP_NEWMODE],
+ ["Inhibit autopickup" => PICKUP_INHIBIT],
+ ["Stop before pickup" => PICKUP_STOP],
+ ["Debug autopickup" => PICKUP_DEBUG],
],
["Weapons", 0, 6,
- ["All weapons" => CFClient::Pickup::PU_ALLWEAPON],
- ["Missile weapons" => CFClient::Pickup::PU_MISSILEWEAPON],
- ["Bows" => CFClient::Pickup::PU_BOW],
- ["Arrows" => CFClient::Pickup::PU_ARROW],
+ ["All weapons" => PICKUP_ALLWEAPON],
+ ["Missile weapons" => PICKUP_MISSILEWEAPON],
+ ["Bows" => PICKUP_BOW],
+ ["Arrows" => PICKUP_ARROW],
],
["Armour", 0, 12,
- ["Helmets" => CFClient::Pickup::PU_HELMET],
- ["Shields" => CFClient::Pickup::PU_SHIELD],
- ["Body Armour" => CFClient::Pickup::PU_ARMOUR],
- ["Boots" => CFClient::Pickup::PU_BOOTS],
- ["Gloves" => CFClient::Pickup::PU_GLOVES],
- ["Cloaks" => CFClient::Pickup::PU_CLOAK],
+ ["Helmets" => PICKUP_HELMET],
+ ["Shields" => PICKUP_SHIELD],
+ ["Body Armour" => PICKUP_ARMOUR],
+ ["Boots" => PICKUP_BOOTS],
+ ["Gloves" => PICKUP_GLOVES],
+ ["Cloaks" => PICKUP_CLOAK],
],
["Readables", 2, 2,
- ["Spellbooks" => CFClient::Pickup::PU_SPELLBOOK],
- ["Skillscrolls" => CFClient::Pickup::PU_SKILLSCROLL],
- ["Normal Books/Scrolls" => CFClient::Pickup::PU_READABLES],
+ ["Spellbooks" => PICKUP_SPELLBOOK],
+ ["Skillscrolls" => PICKUP_SKILLSCROLL],
+ ["Normal Books/Scrolls" => PICKUP_READABLES],
],
["Misc", 2, 7,
- ["Food" => CFClient::Pickup::PU_FOOD],
- ["Drinks" => CFClient::Pickup::PU_DRINK],
- ["Valuables (Money, Gems)" => CFClient::Pickup::PU_VALUABLES],
- ["Keys" => CFClient::Pickup::PU_KEY],
- ["Magical Items" => CFClient::Pickup::PU_MAGICAL],
- ["Potions" => CFClient::Pickup::PU_POTION],
- ["Magic Devices" => CFClient::Pickup::PU_MAGIC_DEVICE],
- ["Ignore cursed" => CFClient::Pickup::PU_NOT_CURSED],
- ["Jewelery" => CFClient::Pickup::PU_JEWELS],
+ ["Food" => PICKUP_FOOD],
+ ["Drinks" => PICKUP_DRINK],
+ ["Valuables (Money, Gems)" => PICKUP_VALUABLES],
+ ["Keys" => PICKUP_KEY],
+ ["Magical Items" => PICKUP_MAGICAL],
+ ["Potions" => PICKUP_POTION],
+ ["Magic Devices" => PICKUP_MAGIC_DEVICE],
+ ["Ignore cursed" => PICKUP_NOT_CURSED],
+ ["Jewelery" => PICKUP_JEWELS],
],
)
{
@@ -986,12 +1198,14 @@
state => $CFG->{pickup} & $mask,
on_changed => sub {
my ($box, $value) = @_;
+
if ($value) {
$::CFG->{pickup} |= $mask;
} else {
- $::CFG->{pickup} = $::CFG->{pickup} & ~$mask;
+ $::CFG->{pickup} &= ~$mask;
}
- $::CONN->send (sprintf "command pickup %u", $::CFG->{pickup})
+
+ $::CONN->send_command ("pickup $::CFG->{pickup}")
if defined $::CONN;
});
}
@@ -1000,7 +1214,7 @@
$table
}
-sub make_inventory_window {
+sub inventory_window {
my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
x => "center",
y => "center",
@@ -1102,7 +1316,8 @@
sub {
$SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
$SETUP_DIALOG->show;
- });
+ },
+ );
$SETUP_DIALOG->hide;
$::BIND_EDITOR->show;
},
@@ -1122,10 +1337,11 @@
$vb
}
-sub make_help_window {
+sub help_window {
my $win = new CFClient::UI::FancyFrame
x => 'center',
y => 'center',
+ z => 2,
name => 'doc_browser',
force_w => int $WIDTH * 7/8,
force_h => int $HEIGHT * 7/8,
@@ -1134,33 +1350,40 @@
$win->add (my $vbox = new CFClient::UI::VBox);
$vbox->add (my $buttons = new CFClient::UI::HBox);
- $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8);
+ $vbox->add (my $viewer = new CFClient::UI::TextScroller
+ expand => 1, fontsize => 0.8, padding_x => 4);
- for (
- [intro => "Introduction"],
- [manual => "Manual"],
- [command_help => "Commands"],
- [skill_help => "Skills"],
- ) {
- my ($pod, $label) = @$_;
+ $buttons->add (new CFClient::UI::Label text => "Choose a document to display: ");
+ $buttons->add (my $combo = new CFClient::UI::Combobox
+ value => undef,
+ options => [
+ [intro => "Introduction"],
+ [manual => "Manual"],
+ [skill_help => "Skills"],
+ [command_help => "Commands"],
+ [dmcommand_help => "DM Commands"],
+ [COPYING => "License Terms"],
+ ],
+ on_changed => sub {
+ my ($self, $pod) = @_;
- $buttons->add (new CFClient::UI::Button
- text => $label,
- on_activate => sub {
- my $parser = new Pod::POM;
- my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod");
+ my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
+ doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
- $viewer->clear;
-
- $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
- for @{ CFClient::pod_to_pango_list $pom };
+ $viewer->clear;
+
+ $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
+ for @$pom;
- $viewer->set_offset (0);
- },
- );
- }
-
- $viewer->add_paragraph ([1, 1, 0, 1], "Use one of the buttons above to display a document.");
+ $viewer->set_offset (0);
+ },
+ on_visibility_change => sub {
+ my ($self, $visible) = @_;
+ return unless $visible;
+ return if $self->{value};
+ $self->set_value ("intro");
+ },
+ );
$win
}
@@ -1210,7 +1433,7 @@
$BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0);
$STATUSBOX = new CFClient::UI::Statusbox;
- $STATUSBOX->add ("Use Alt-Enter to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]);
+ $STATUSBOX->add ("Use Alt-Enter to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
(new CFClient::UI::Frame
bg => [0, 0, 0, 0.4],
@@ -1247,10 +1470,11 @@
$MAPWIDGET->show;
$MAPWIDGET->focus_in;
- $LOGVIEW = new CFClient::UI::TextView
+ $LOGVIEW = new CFClient::UI::TextScroller
expand => 1,
font => $FONT_FIXED,
fontsize => $::CFG->{log_fontsize},
+ indent => -4,
can_hover => 1,
can_events => 1,
tooltip => "Server Log. This text viewer contains all the messages sent by the server.",
@@ -1261,46 +1485,47 @@
name => "setup_dialog",
x => 'center',
y => 'center',
+ z => 2,
force_w => $::WIDTH * 0.6,
force_h => $::HEIGHT * 0.6,
;
$SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
- filter => new CFClient::UI::ScrolledWindow xxx => 1, expand => 1, scroll_y => 1);
+ filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
$SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup,
"Configure the server to play on, your username, password and other server-related options.");
$SETUP_NOTEBOOK->add (Pickup => autopickup_setup,
- "Configure autopicking stetings, i.e. which items you will pick up automatically when walking over them.");
+ "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them.");
$SETUP_NOTEBOOK->add (Graphics => graphics_setup,
"Configure the video mode, performance, fonts and other graphical aspects of the game.");
$SETUP_NOTEBOOK->add (Audio => audio_setup,
"Configure the use of audio, sound effects and background music.");
$SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
"Lets you define, edit and delete bindings."
- . "There is a shortcut for making bindings: Left Control + Insert opens the binding editor "
+ . "There is a shortcut for making bindings: Left Control + Insert opens the binding editor "
. "with nothing set and the recording started. After doing the actions you "
- . "want to record press Insert and you will be asked to press a key-combo."
+ . "want to record press Insert and you will be asked to press a key-combo. "
. "After pressing the combo the binding will be saved automatically and the "
. "binding editor closes");
$SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
"Displays all spells you have and lets you edit keyboard shortcuts for them.");
- $BUTTONBAR = new CFClient::UI::HBox x => 0, y => 0;
+ $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
$BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
tooltip => "Toggles a dialog where you can configure all aspects of this client.");
- $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window,
+ $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW = message_window,
tooltip => "Toggles the server message log, where the client collects all messages from the server.");
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
- $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window,
+ $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => $STATS_WINDOW = stats_window,
tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times.");
- $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window,
+ $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => inventory_window,
tooltip => "Toggles the inventory window, where you can manage your loot (or treasures :). "
- ."You can also hit the Tab-key to show/hide the Inventory.");
+ . "You can also hit the Tab-key to show/hide the Inventory.");
$BUTTONBAR->add (new CFClient::UI::Button
text => "Save Config",
@@ -1312,7 +1537,7 @@
},
);
- $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window,
+ $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window,
tooltip => "View Documentation");
$BUTTONBAR->add (new CFClient::UI::Button
@@ -1570,10 +1795,10 @@
fow_intensity => 0.45,
fow_smooth => 0,
gui_fontsize => 1,
- log_fontsize => 1,
+ log_fontsize => 0.7,
gauge_fontsize=> 1,
gauge_size => 0.35,
- stat_fontsize => 1,
+ stat_fontsize => 0.7,
mapsize => 100,
host => "crossfire.schmorp.de",
say_command => 'say',
@@ -1583,6 +1808,7 @@
face_prefetch => 0,
output_sync => 1,
output_count => 1,
+ pickup => 0,
);
while (my ($k, $v) = each %DEF_CFG) {