… | |
… | |
84 | print $fh "$ts ", @a, "\n"; |
84 | print $fh "$ts ", @a, "\n"; |
85 | $fh->flush; |
85 | $fh->flush; |
86 | } |
86 | } |
87 | |
87 | |
88 | sub _stat_numdiff { |
88 | sub _stat_numdiff { |
89 | my ($old, $new) = @_; |
89 | my ($self, $name, $old, $new) = @_; |
90 | |
90 | |
91 | my $diff = $new - $old; |
91 | my $diff = $new - $old; |
92 | $diff > 0 ? "+$diff" : $diff |
92 | |
|
|
93 | $diff = 0.01 * int $diff * 100; |
|
|
94 | |
|
|
95 | 0.1 >= abs $diff ? () |
|
|
96 | : $diff < 0 ? "$name$diff" : "$name+$diff" |
93 | } |
97 | } |
94 | |
98 | |
95 | sub _stat_skillmaskdiff { |
99 | sub _stat_skillmaskdiff { |
96 | my ($old, $new) = @_; |
100 | my ($self, $name, $old, $new) = @_; |
97 | |
101 | |
98 | my @diff; |
|
|
99 | |
|
|
100 | my $changed = $old ^ $new; |
102 | my $diff = $old ^ $new |
|
|
103 | or return; |
101 | |
104 | |
102 | my @diff = map { |
105 | my @diff = map |
103 | $changed & (1<<$_) |
106 | { |
|
|
107 | $diff & $_ |
104 | ? (($new & (1<<$_) ? "+" : "-") . "skill$_") |
108 | ? (($new & $_ ? "+" : "-") . $self->{spell_paths}{$_}) |
105 | : () |
109 | : () |
106 | } |
110 | } |
107 | 0 .. 31; # TODO |
111 | sort { $a <=> $b } keys %{$self->{spell_paths}}; |
108 | |
112 | |
109 | join "", @diff |
113 | join "", @diff |
110 | } |
114 | } |
111 | |
115 | |
112 | # all stats that are chacked against changes |
116 | # all stats that are chacked against changes |
… | |
… | |
157 | if (my $diff = $stats->{+CS_STAT_EXP64} - $prev->{+CS_STAT_EXP64}) { |
161 | if (my $diff = $stats->{+CS_STAT_EXP64} - $prev->{+CS_STAT_EXP64}) { |
158 | $self->{statusbox}->add ("$diff experience gained", group => "experience $diff", fg => [0.5, 1, 0.5, 0.8], timeout => 5); |
162 | $self->{statusbox}->add ("$diff experience gained", group => "experience $diff", fg => [0.5, 1, 0.5, 0.8], timeout => 5); |
159 | } |
163 | } |
160 | |
164 | |
161 | if ( |
165 | if ( |
162 | my @diffs = map { |
166 | my @diffs = map $_->[1]->($self, $_->[2], $prev->{$_->[0]}, $stats->{$_->[0]}), @statchange |
163 | $stats->{$_->[0]} != $prev->{$_->[0]} |
|
|
164 | ? $_->[2] . $_->[1]->($prev->{$_->[0]}, $stats->{$_->[0]}) : (); |
|
|
165 | } |
|
|
166 | @statchange |
|
|
167 | ) { |
167 | ) { |
168 | my $msg = "<b>stat change</b>: " . (join " ", @diffs); |
168 | my $msg = "<b>stat change</b>: " . (join " ", @diffs); |
169 | $self->{statusbox}->add ($msg, group => $msg, fg => [0.8, 1, 0.2, 1], timeout => 10); |
169 | $self->{statusbox}->add ($msg, group => $msg, fg => [0.8, 1, 0.2, 1], timeout => 10); |
170 | } |
170 | } |
171 | } |
171 | } |
… | |
… | |
422 | } |
422 | } |
423 | |
423 | |
424 | sub face_update { |
424 | sub face_update { |
425 | my ($self, $facenum, $face) = @_; |
425 | my ($self, $facenum, $face) = @_; |
426 | |
426 | |
427 | $self->{tilecache}->put ($face->{id} => $face->{image}); #TODO: try to avoid duplicate writes |
427 | $self->{tilecache}->put ($face->{id} => $face->{image}) |
|
|
428 | if $self->{tilecache}->get ($face->{id}) ne $face->{image}; |
428 | |
429 | |
429 | $self->set_texture ($face->{id} => delete $face->{image}); |
430 | $self->set_texture ($face->{id} => delete $face->{image}); |
430 | } |
431 | } |
431 | |
432 | |
432 | sub set_texture { |
433 | sub set_texture { |
… | |
… | |
651 | |
652 | |
652 | sub update_containers { |
653 | sub update_containers { |
653 | my ($self) = @_; |
654 | my ($self) = @_; |
654 | |
655 | |
655 | $CFClient::UI::ROOT->on_refresh ("update_containers_$self" => sub { |
656 | $CFClient::UI::ROOT->on_refresh ("update_containers_$self" => sub { |
656 | for my $tag (keys %{ delete $self->{update_container} }) { |
657 | my $todo = delete $self->{update_container} |
|
|
658 | or return; |
|
|
659 | |
|
|
660 | for my $tag (keys %$todo) { |
657 | if ($tag == 0) { |
661 | if ($tag == 0) { |
658 | update_floorbox; |
662 | update_floorbox; |
659 | $::INVR->set_items ($self->{container}{0}) |
663 | $::INVR->set_items ($self->{container}{0}) |
660 | if $tag == $self->{open_container}; |
664 | if $tag == $self->{open_container}; |
661 | } elsif ($tag == $self->{player}{tag}) { |
665 | } elsif ($tag == $self->{player}{tag}) { |
… | |
… | |
705 | set_opencont ($::CONN, $item->{tag}, CFClient::Item::desc_string $item); |
709 | set_opencont ($::CONN, $item->{tag}, CFClient::Item::desc_string $item); |
706 | |
710 | |
707 | } else { |
711 | } else { |
708 | $self->{update_container}{$item->{container}}++; |
712 | $self->{update_container}{$item->{container}}++; |
709 | $self->update_containers; |
713 | $self->update_containers; |
710 | # if ($item->{container} == 0) { |
|
|
711 | # update_floorbox; |
|
|
712 | # update_container (0); |
|
|
713 | # } elsif ($item->{container} == $self->{player}{tag}) { |
|
|
714 | # $::INV->set_items ($self->{container}{$item->{container}}) |
|
|
715 | # } |
|
|
716 | } |
714 | } |
717 | } |
715 | } |
718 | |
716 | |
719 | sub player_update { |
717 | sub player_update { |
720 | my ($self, $player) = @_; |
718 | my ($self, $player) = @_; |
… | |
… | |
922 | sub destroy { |
920 | sub destroy { |
923 | my ($self) = @_; |
921 | my ($self) = @_; |
924 | |
922 | |
925 | #Carp::cluck "debug\n";#d# #todo# enable: destroy gets called twice because scalar keys {} is 1 |
923 | #Carp::cluck "debug\n";#d# #todo# enable: destroy gets called twice because scalar keys {} is 1 |
926 | |
924 | |
|
|
925 | $self->{conn}->send ("ext npc_dialog_end $self->{token}") if $self->{token}; |
927 | delete $self->{conn}{npc_dialog}; |
926 | delete $self->{conn}{npc_dialog}; |
928 | $self->{conn}->disconnect_ext ($self->{token}); |
927 | $self->{conn}->disconnect_ext ($self->{token}); |
929 | |
928 | |
930 | $self->SUPER::destroy; |
929 | $self->SUPER::destroy; |
931 | } |
930 | } |