--- deliantra/Deliantra-Client/DC/Protocol.pm 2006/11/07 22:41:27 1.87
+++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/04/04 02:43:30 1.95
@@ -8,6 +8,8 @@
use CFPlus;
use CFPlus::UI;
use CFPlus::Pod;
+use CFPlus::Macro;
+use CFPlus::Item;
use Crossfire::Protocol::Base 0.95;
@@ -40,6 +42,23 @@
} sort { $a->{par} <=> $b->{par} }
CFPlus::Pod::find command => "*";
+ $self->connect_ext (event_capabilities => sub {
+ my ($cap) = @_;
+
+ if (my $ts = $cap->{tileset}) {
+ if (my ($default) = grep $_->[2] & 1, @$ts) {
+ $self->{tileset} = $default;
+ $self->{tilesize} = $default->[3];
+ $self->setup_req (tileset => $default->[0]);
+
+ my $w = int $self->{mapw} * 32 / $self->{tilesize};
+ my $h = int $self->{maph} * 32 / $self->{tilesize};
+
+ $self->setup_req (mapsize => "${w}x${h}");
+ }
+ }
+ });
+
$self->{map_widget}->add_command (@$_)
for @cmd_help;
@@ -290,10 +309,11 @@
} elsif ($ev->{button} == 2) {
$::CONN->user_send ("use_skill $name");
} elsif ($ev->{button} == 3) {
+ my $shortname = CFPlus::shorten $name, 14;
(new CFPlus::UI::Menu
items => [
- ["bind ready_skill $name to a key" => sub { $::BIND_EDITOR->do_quick_binding (["ready_skill $name"]) }],
- ["bind use_skill $name to a key" => sub { $::BIND_EDITOR->do_quick_binding (["use_skill $name"]) }],
+ ["bind ready_skill $shortname to a key" => sub { CFPlus::Macro::quick_macro ["ready_skill $name"] }],
+ ["bind use_skill $shortname to a key" => sub { CFPlus::Macro::quick_macro ["use_skill $name"] }],
],
)->popup ($ev);
} else {
@@ -320,10 +340,18 @@
}
}
+sub macro_send {
+ my ($self, $macro) = @_;
+
+ for my $cmd (@{ $macro->{action} }) {
+ $self->send_command ($cmd);
+ }
+}
+
sub user_send {
my ($self, $command) = @_;
- push @{$self->{record}}, $command
+ $self->{record}->($command)
if $self->{record};
$self->logprint ("send: ", $command);
@@ -331,15 +359,10 @@
::status ($command);
}
-sub start_record {
- my ($self) = @_;
+sub record {
+ my ($self, $cb) = @_;
- $self->{record} = [];
-}
-
-sub stop_record {
- my ($self) = @_;
- return delete $self->{record};
+ $self->{record} = $cb;
}
sub map_scroll {
@@ -624,6 +647,8 @@
[0.74, 0.65, 0.41],
);
+ my $fg = $color[$color % @color];
+
$self->logprint ("info: ", $text);
# try to create single paragraphs of multiple lines sent by the server
@@ -633,12 +658,12 @@
$text =~ s/\[b\](.*?)\[\/b\]/\1<\/b>/g;
$text =~ s/\[color=(.*?)\](.*?)\[\/color\]/\2<\/span>/g;
- ::message ({ fg => $color[$color], markup => $_ })
+ ::message ({ fg => $fg, markup => $_ })
for split /\n/, $text;
$self->{statusbox}->add ($text,
group => $text,
- fg => $color[$color],
+ fg => $fg,
timeout => $color >= 2 ? 180 : 10,
tooltip_font => $::FONT_FIXED,
);
@@ -658,7 +683,7 @@
$spell->{message} =~ s/\n+$//;
$spell->{message} ||= "Server did not provide a description for this spell.";
- $::SPELL_PAGE->add_spell ($spell);
+ $::SPELL_LIST->add_spell ($spell);
$self->{map_widget}->add_command ("invoke $spell->{name}", CFPlus::asxml $spell->{message});
$self->{map_widget}->add_command ("cast $spell->{name}", CFPlus::asxml $spell->{message});
@@ -667,12 +692,13 @@
sub spell_delete {
my ($self, $spell) = @_;
- $::SPELL_PAGE->remove_spell ($spell);
+ $::SPELL_LIST->remove_spell ($spell);
}
sub setup {
my ($self, $setup) = @_;
+ $self->{map_widget}->set_tilesize ($self->{tilesize});
$::MAP->resize ($self->{mapw}, $self->{maph});
}
@@ -895,6 +921,8 @@
. ($self->{cfplus_ext} > 0 ? ", version $self->{cfplus_ext}" : "") ."\n"
. "map size $self->{mapw}×$self->{maph}\n"
);
+
+ ::setup_build_button ($self->{editor_support}->{builder_ui});
}
sub logged_in {
@@ -920,9 +948,18 @@
$self->send_command ("output-sync $::CFG->{output_sync}");
$self->send_command ("output-count $::CFG->{output_count}");
+ $self->send_command ("output-rate $::CFG->{output_rate}") if $::CFG->{output_rate} > 0;
$self->send_command ("pickup $::CFG->{pickup}");
}
+sub buildat {
+ my ($self, $builditem, $x, $y) = @_;
+
+ if ($self->{cfplus_ext}) {
+ $self->send_ext_msg (builder_build => dx => $x, dy => $y, (ref ($builditem) eq 'HASH') ? %$builditem : (item => $builditem));
+ }
+}
+
sub lookat {
my ($self, $x, $y) = @_;
@@ -973,7 +1010,7 @@
@_,
);
- Scalar::Util::weaken (my $this = $self);
+ CFPlus::weaken (my $this = $self);
$self->connect (delete => sub { $this->destroy; 1 });
@@ -1027,7 +1064,7 @@
sub update_options {
my ($self) = @_;
- Scalar::Util::weaken $self;
+ CFPlus::weaken $self;
$self->{options}->clear;
$self->{options}->add ($self->{bye_button});
@@ -1046,7 +1083,7 @@
sub feed {
my ($self, $msg) = @_;
- Scalar::Util::weaken $self;
+ CFPlus::weaken $self;
if ($msg->{msgtype} eq "reply") {
$self->{kw}{$_} = 1 for @{$msg->{add_topics} || []};