--- deliantra/Deliantra-Client/DC/Protocol.pm 2006/08/13 02:43:22 1.72
+++ deliantra/Deliantra-Client/DC/Protocol.pm 2006/12/09 02:21:25 1.91
@@ -8,13 +8,17 @@
use CFPlus;
use CFPlus::UI;
use CFPlus::Pod;
+use CFPlus::Macro;
+use CFPlus::Item;
+
+use Crossfire::Protocol::Base 0.95;
use base 'Crossfire::Protocol::Base';
sub new {
my $class = shift;
- my $self = $class->SUPER::new (@_);
+ my $self = $class->SUPER::new (@_, setup_req => { extmap => 1 });
$self->{map_widget}->clr_commands;
@@ -35,7 +39,8 @@
map ["$cmd$_", $text],
sort { (length $a) <=> (length $b) }
@args
- } CFPlus::Pod::find command_help => "*";
+ } sort { $a->{par} <=> $b->{par} }
+ CFPlus::Pod::find command => "*";
$self->{map_widget}->add_command (@$_)
for @cmd_help;
@@ -43,14 +48,23 @@
$self->{noface} = new_from_file CFPlus::Texture
CFPlus::find_rcfile "noface.png", minify => 1, mipmap => 1;
+ {
+ $self->{dialogue} = my $tex = new_from_file CFPlus::Texture
+ CFPlus::find_rcfile "dialogue.png", minify => 1, mipmap => 1;
+ $self->{map}->set_texture (1, @$tex{qw(name w h s t)}, @{$tex->{minified}});
+ }
+
$self->{open_container} = 0;
# "global"
- $self->{tilecache} = CFPlus::db_table "tilecache";
- $self->{facemap} = CFPlus::db_table "facemap";
+ $self->{tilecache} = CFPlus::db_table "tilecache"
+ or die "tilecache: unable to open database table";
+ $self->{facemap} = CFPlus::db_table "facemap"
+ or die "facemap: unable to open database table";
# per server
- $self->{mapcache} = CFPlus::db_table "mapcache_$self->{host}_$self->{port}";
+ $self->{mapcache} = CFPlus::db_table "mapcache_$self->{host}_$self->{port}"
+ or die "mapcache_$self->{host}_$self->{port}: unable to open database table";
$self
}
@@ -260,7 +274,6 @@
my @TOOLTIP_LVL = (tooltip => "Level. The level of the skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1);
my @TOOLTIP_EXP = (tooltip => "Experience. The experience points you have in this skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1);
- my @TOOLTIP_NAME = (tooltip => "Name. The name of the skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1);
my ($x, $y) = (0, 1);
for (
@@ -279,10 +292,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 {
@@ -296,7 +310,8 @@
text => "0", align => 1, font => $::FONT_FIXED, fg => [1, 1, 0], on_button_down => $spell_cb, @TOOLTIP_EXP);
$sktbl->add ($x * 3 + 1, $y, $self->{stat_widget_lvl}{$idx} = new CFPlus::UI::Label
text => "0", align => 1, font => $::FONT_FIXED, fg => [0, 1, 0], padding_x => 4, on_button_down => $spell_cb, @TOOLTIP_LVL);
- $sktbl->add ($x * 3 + 2, $y, new CFPlus::UI::Label text => $name, on_button_down => $spell_cb, @TOOLTIP_NAME);
+ $sktbl->add ($x * 3 + 2, $y, new CFPlus::UI::Label text => $name, on_button_down => $spell_cb,
+ can_events => 1, can_hover => 1, tooltip => (CFPlus::Pod::section_label skill_description => $name) . $TOOLTIP_ALL);
$x++ and ($x, $y) = (0, $y + 1);
}
@@ -308,27 +323,29 @@
}
}
+sub macro_send {
+ my ($self, $macro) = @_;
+
+ for my $cmd (@{ $macro->{action} }) {
+ $self->send_command ($cmd);
+ }
+}
+
sub user_send {
my ($self, $command) = @_;
- if ($self->{record}) {
- push @{$self->{record}}, $command;
- }
+ $self->{record}->($command)
+ if $self->{record};
$self->logprint ("send: ", $command);
$self->send_command ($command);
::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 {
@@ -340,7 +357,7 @@
sub feed_map1a {
my ($self, $data) = @_;
- $self->{map}->map1a_update ($data);
+ $self->{map}->map1a_update ($data, $self->{setup}{extmap});
$self->{map_widget}->update;
}
@@ -615,8 +632,6 @@
$self->logprint ("info: ", $text);
- my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
-
# try to create single paragraphs of multiple lines sent by the server
$text =~ s/(?<=\S)\n(?=\w)/ /g;
@@ -624,9 +639,8 @@
$text =~ s/\[b\](.*?)\[\/b\]/\1<\/b>/g;
$text =~ s/\[color=(.*?)\](.*?)\[\/color\]/\2<\/span>/g;
- $self->{logview}->add_paragraph ({ fg => $color[$color], markup => $_ })
- for map "$time $_", split /\n/, $text;
- $self->{logview}->scroll_to_bottom;
+ ::message ({ fg => $color[$color], markup => $_ })
+ for split /\n/, $text;
$self->{statusbox}->add ($text,
group => $text,
@@ -650,7 +664,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});
@@ -659,7 +673,13 @@
sub spell_delete {
my ($self, $spell) = @_;
- $::SPELL_PAGE->remove_spell ($spell);
+ $::SPELL_LIST->remove_spell ($spell);
+}
+
+sub setup {
+ my ($self, $setup) = @_;
+
+ $::MAP->resize ($self->{mapw}, $self->{maph});
}
sub addme_success {
@@ -875,10 +895,14 @@
. "protocol version $self->{version}\n"
. "minimap support $yesno[$self->{setup}{mapinfocmd} > 0]\n"
. "extended command support $yesno[$self->{setup}{extcmd} > 0]\n"
+ . "editing support $yesno[!!$self->{editor_support}]\n"
+ . "map attributes $yesno[$self->{setup}{extmap} > 0]\n"
. "cfplus support $yesno[$self->{cfplus_ext} > 0]"
. ($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 {
@@ -888,6 +912,15 @@
$self->{cfplus_ext} = $_[0]{version};
$self->update_server_info;
+ if ($self->{cfplus_ext} >= 2) {
+ $self->send_ext_req ("editor_support", sub {
+ $self->{editor_support} = $_[0];
+ $self->update_server_info;
+
+ 0
+ });
+ }
+
0
});
@@ -898,6 +931,14 @@
$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) = @_;
@@ -923,7 +964,7 @@
sub destroy {
my ($self) = @_;
- $self->{npc_dialog}->destroy
+ (delete $self->{npc_dialog})->destroy
if $self->{npc_dialog};
$self->SUPER::destroy;
@@ -931,7 +972,7 @@
package CFPlus::NPCDialog;
-our @ISA = 'CFPlus::UI::FancyFrame';
+our @ISA = 'CFPlus::UI::Toplevel';
sub new {
my $class = shift;
@@ -960,11 +1001,7 @@
$vbox->add (new CFPlus::UI::Label text => "Message Entry:");
$vbox->add ($self->{entry} = new CFPlus::UI::Entry
- tooltip => "Enter a message you want to tell the NPC and press return.\n\n"
- . "Sometimes you have to tell an NPC something you cannot find out during "
- . "a normal conversation (such as a password). In those cases you have to use "
- . "this text entry. You can also enter responses manually instead of using the response "
- . "buttons below.",
+ tooltip => "#npc_message_entry",
on_activate => sub {
my ($entry, $text) = @_;
@@ -1049,7 +1086,7 @@
$self->send ($kw);
};
- chr 0xfffc
+ "\x{fffc}"
}giex;
$self->{textview}->add_paragraph ({ markup => $text, widget => \@link });
@@ -1086,3 +1123,4 @@
}
1
+