--- deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/12 19:10:52 1.115 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/21 15:04:27 1.125 @@ -68,24 +68,31 @@ $self->{music_map}{$face} = $chksum; # check if already cached - CFPlus::DB::get resmap => $chksum, sub { - my ($meta) = @_; - - if (defined $meta) { - $self->{music_meta}{$chksum} = $self->{json_coder}->decode ($meta); + CFPlus::DB::get "res-metadata" => $chksum, sub { + my ($meta_json) = @_; + my $path = CFPlus::DB::path_of_res $chksum; + + if (defined $meta_json) { + my $meta = $self->{json_coder}->decode ($meta_json); + $meta->{path} = $path; + $self->{music_meta}{$chksum} = $meta; + &::audio_music_set ($self->{songs}); } else { ::message ({ markup => "starting to download song #$face/$pri, check your output-rate setting if your connection gets laggy." }); $self->ask_face ($face, -100 - $pri, undef, sub { my $len = length $_[1]; - my ($meta, $data) = unpack "(w/a*)*", $_[1]; - - CFPlus::DB::write_file $chksum, $data, sub { }; - CFPlus::DB::put resmap => $chksum => $meta, sub { }; + my ($meta_json, $data) = unpack "(w/a*)*", $_[1]; - $self->{music_meta}{$chksum} = $self->{json_coder}->decode ($meta); - ::message ({ markup => "downloaded song #$face, size $len octets" }); - - &::audio_music_set ($self->{songs}); + CFPlus::DB::write_file $path, $data, sub { + CFPlus::DB::put "res-metadata" => $chksum => $meta_json, sub { + my $meta = $self->{json_coder}->decode ($meta_json); + $meta->{path} = $path; + $self->{music_meta}{$chksum} = $meta; + + ::message ({ markup => "downloaded song #$face, size $len octets" }); + &::audio_music_set ($self->{songs}); + }; + }; }); } } @@ -94,8 +101,6 @@ if (my $play = $ev->{play}) { &::audio_music_set ($self->{songs} = [map $self->{music_map}{$_}, @$play]); - use Data::Dumper; - warn Dumper $self->{songs};#d# } }); @@ -122,6 +127,7 @@ $self->{widget}{$_[0]} }); + # widgetset new $self->connect_ext (ws_n => sub { my ($arg) = @_; @@ -130,6 +136,7 @@ }; }); + # widgetset destroy $self->connect_ext (ws_d => sub { my ($arg) = @_; @@ -140,6 +147,7 @@ for values %{$ws->{w}}; }); + # widgetset destroy $self->connect_ext (ws_c => sub { my ($arg) = @_; @@ -179,6 +187,7 @@ } }); + # widget call $self->connect_ext (w_c => sub { my ($arg) = @_; @@ -195,24 +204,28 @@ } }); + # widget set $self->connect_ext (w_s => sub { my ($arg) = @_; my $w = $self->{widget}{$arg->{id}} or return; - $w->{$arg->{name}} = $arg->{value}; + $w->{$_->[0]} = $_->[1] + for @{ $arg->{attr} }; }); + # widget get $self->connect_ext (w_g => sub { my ($arg) = @_; my $w = $self->{widget}{$arg->{id}} or return; - $self->send_exti_msg (w_r => rid => $arg->{rid}, res => [$w->{$arg->{name}}]); + $self->send_exti_msg (w_r => rid => $arg->{rid}, res => [map $w->{$_}, @{$arg->{attr}}]); }); + # destroy widgets on logout $self->{on_stop_game_guard} = $self->{map_widget}{root}->connect (stop_game => sub { for my $ws (values %{delete $self->{widgetset} || {}}) { $_->destroy @@ -435,12 +448,16 @@ if (grep +(exists $stats->{$_}) != (exists $prev->{$_}), @skills) { $sktbl->clear; - $sktbl->add (0, 0, new CFPlus::UI::Label text => "Experience", align => 1); - $sktbl->add (1, 0, new CFPlus::UI::Label text => "Lvl.", align => 1); - $sktbl->add (2, 0, new CFPlus::UI::Label text => "Skill", expand => 1); - $sktbl->add (3, 0, new CFPlus::UI::Label text => "Experience", align => 1); - $sktbl->add (4, 0, new CFPlus::UI::Label text => "Lvl.", align => 1); - $sktbl->add (5, 0, new CFPlus::UI::Label text => "Skill", expand => 1); + my @add; + + push @add, + 0, 0, (new CFPlus::UI::Label text => "Experience", align => 1), + 1, 0, (new CFPlus::UI::Label text => "Lvl.", align => 1), + 2, 0, (new CFPlus::UI::Label text => "Skill", expand => 1), + 3, 0, (new CFPlus::UI::Label text => "Experience", align => 1), + 4, 0, (new CFPlus::UI::Label text => "Lvl.", align => 1), + 5, 0, (new CFPlus::UI::Label text => "Skill", expand => 1), + ; my $TOOLTIP_ALL = "\n\nLeft click - ready skill\nMiddle click - use spell\nRight click - further options"; @@ -478,15 +495,19 @@ 1 }; - $sktbl->add ($x * 3 + 0, $y, $self->{stat_widget_exp}{$idx} = new CFPlus::UI::Label - 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, - can_events => 1, can_hover => 1, tooltip => (CFPlus::Pod::section_label skill_description => $name) . $TOOLTIP_ALL); + push @add, + $x * 3 + 0, $y, ($self->{stat_widget_exp}{$idx} = new CFPlus::UI::Label + align => 1, font => $::FONT_FIXED, fg => [1, 1, 0], on_button_down => $spell_cb, @TOOLTIP_EXP), + $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), + $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); } + + $sktbl->add_at (@add); } for (grep exists $stats->{$_}, @skills) { @@ -763,12 +784,28 @@ sub set_texture { my ($self, $id, $data) = @_; + return unless $self->{map}; + $self->{texture}[$id] = my $tex = new_from_image CFPlus::Texture $data, minify => 1, mipmap => 1; $self->{map}->set_texture ($id, @$tex{qw(name w h s t)}, @{$tex->{minified}}); $self->{map_widget}->update; + + $_->() for @{(delete $self->{face_cb}{$id}) || []}; +} + +sub connect_face_update { + my ($self, $id, $cb) = @_; + + push @{$self->{face_cb}{$id}}, $cb; + + CFPlus::guard { + @{$self->{face_cb}{$id}} + = grep $_ != $cb, + @{$self->{face_cb}{$id}}; + } } sub sound_play { @@ -962,6 +999,8 @@ $::FLOORBOX->clear; + my @add; + my $row; for (sort { $a->{count} <=> $b->{count} } values %{ $::CONN->{container}{$::CONN->{open_container} || 0} }) { if ($row < 6) { @@ -969,24 +1008,27 @@ local $_->{desc_widget}; # hack to force recreation of widget CFPlus::Item::update_widgets $_; - $::FLOORBOX->add (0, $row, $_->{face_widget}); - $::FLOORBOX->add (1, $row, $_->{desc_widget}); + push @add, + 0, $row, $_->{face_widget}, + 1, $row, $_->{desc_widget}; $row++; } else { - $::FLOORBOX->add (1, $row, new CFPlus::UI::Button + push @add, 1, $row, new CFPlus::UI::Button text => "More...", on_activate => sub { ::toggle_player_page ($::INVENTORY_PAGE); 0 }, - ); + ; last; } } if ($::CONN->{open_container}) { - $::FLOORBOX->add (1, $row++, new CFPlus::UI::Button + push @add, 1, $row++, new CFPlus::UI::Button text => "Close container", on_activate => sub { $::CONN->send ("apply $::CONN->{open_container}") } - ); + ; } + + $::FLOORBOX->add_at (@add); }); $::WANT_REFRESH++;