… | |
… | |
401 | |
401 | |
402 | if ( |
402 | if ( |
403 | my @diffs = map $_->[1]->($self, $_->[2], $prev->{$_->[0]}, $stats->{$_->[0]}), @statchange |
403 | my @diffs = map $_->[1]->($self, $_->[2], $prev->{$_->[0]}, $stats->{$_->[0]}), @statchange |
404 | ) { |
404 | ) { |
405 | my $msg = "<b>stat change</b>: " . (join " ", @diffs); |
405 | my $msg = "<b>stat change</b>: " . (join " ", @diffs); |
406 | $self->{statusbox}->add ($msg, group => "stat $msg", fg => [0.8, 1, 0.2, 1], timeout => 10); |
406 | $self->{statusbox}->add ($msg, group => "stat $msg", fg => [0.8, 1, 0.2, 1], timeout => 20); |
407 | } |
407 | } |
408 | |
408 | |
409 | $self->update_stats_window ($stats, $prev); |
409 | $self->update_stats_window ($stats, $prev); |
410 | |
410 | |
411 | $self->{prev_stats} = { %$stats }; |
411 | $self->{prev_stats} = { %$stats }; |
… | |
… | |
478 | for keys %RES_TBL; |
478 | for keys %RES_TBL; |
479 | |
479 | |
480 | my $sktbl = $::STATWIDS->{skill_tbl}; |
480 | my $sktbl = $::STATWIDS->{skill_tbl}; |
481 | my @skills = keys %{ $self->{skill_info} }; |
481 | my @skills = keys %{ $self->{skill_info} }; |
482 | |
482 | |
483 | if (grep +(exists $stats->{$_}) != (exists $prev->{$_}), @skills) { |
483 | my @order = sort { $stats->{$b->[0]}[1] <=> $stats->{$a->[0]}[1] or $a->[1] cmp $b->[1] } |
|
|
484 | map [$_, $self->{skill_info}{$_}], |
|
|
485 | grep exists $stats->{$_}, |
|
|
486 | @skills; |
|
|
487 | |
|
|
488 | if ($self->{stat_order} ne join ",", map $_->[0], @order) { |
|
|
489 | $self->{stat_order} = join ",", map $_->[0], @order; |
|
|
490 | |
484 | $sktbl->clear; |
491 | $sktbl->clear; |
485 | |
492 | |
486 | my $sw = $self->{skillwid}{""} ||= [ |
493 | my $sw = $self->{skillwid}{""} ||= [ |
487 | 0, 0, (new CFPlus::UI::Label text => "Experience", align => 1), |
494 | 0, 0, (new CFPlus::UI::Label text => "Experience", align => 1), |
488 | 1, 0, (new CFPlus::UI::Label text => "Lvl.", align => 1), |
495 | 1, 0, (new CFPlus::UI::Label text => "Lvl.", align => 1), |
… | |
… | |
500 | |
507 | |
501 | my @TOOLTIP_LVL = (tooltip => "<b>Level</b>. The level of the skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1); |
508 | my @TOOLTIP_LVL = (tooltip => "<b>Level</b>. The level of the skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1); |
502 | my @TOOLTIP_EXP = (tooltip => "<b>Experience</b>. The experience points you have in this skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1); |
509 | my @TOOLTIP_EXP = (tooltip => "<b>Experience</b>. The experience points you have in this skill.$TOOLTIP_ALL", can_events => 1, can_hover => 1); |
503 | |
510 | |
504 | my ($x, $y) = (0, 1); |
511 | my ($x, $y) = (0, 1); |
505 | for ( |
512 | for (@order) { |
506 | sort { $stats->{$b->[0]}[1] <=> $stats->{$a->[0]}[1] or $a->[1] cmp $b->[1] } |
|
|
507 | map [$_, $self->{skill_info}{$_}], |
|
|
508 | grep exists $stats->{$_}, |
|
|
509 | @skills |
|
|
510 | ) { |
|
|
511 | my ($idx, $name) = @$_; |
513 | my ($idx, $name) = @$_; |
512 | |
514 | |
513 | my $spell_cb = sub { |
515 | my $spell_cb = sub { |
514 | my ($widget, $ev) = @_; |
516 | my ($widget, $ev) = @_; |
515 | |
517 | |
… | |
… | |
560 | } |
562 | } |
561 | |
563 | |
562 | $sktbl->add_at (@add); |
564 | $sktbl->add_at (@add); |
563 | } |
565 | } |
564 | |
566 | |
565 | for (grep exists $stats->{$_}, @skills) { |
567 | for (@order) { |
|
|
568 | my ($idx, $name) = @$_; |
|
|
569 | my $val = $stats->{$idx}; |
|
|
570 | |
|
|
571 | next if $prev->{$idx}[1] eq $val->[1]; |
|
|
572 | |
566 | my $sw = $self->{skillwid}{$_}; |
573 | my $sw = $self->{skillwid}{$idx}; |
567 | $sw->[0]->set_text (::formsep ($stats->{$_}[1])); |
574 | $sw->[0]->set_text (::formsep ($val->[1])); |
568 | $sw->[1]->set_text ($stats->{$_}[0] * 1); |
575 | $sw->[1]->set_text ($val->[0] * 1); |
569 | $sw->[2]->set_value (@{$stats->{$_}}); |
576 | $sw->[2]->set_value (@$val); |
570 | } |
|
|
571 | } |
|
|
572 | |
577 | |
573 | sub macro_send { |
578 | $::GAUGES->{sklprg}->set_label ("$name %d%%"); |
574 | my ($self, $macro) = @_; |
579 | $::GAUGES->{sklprg}->set_value (@$val); |
575 | |
|
|
576 | for my $cmd (@{ $macro->{action} }) { |
|
|
577 | $self->send_command ($cmd); |
|
|
578 | } |
580 | } |
579 | } |
581 | } |
580 | |
582 | |
581 | sub user_send { |
583 | sub user_send { |
582 | my ($self, $command) = @_; |
584 | my ($self, $command) = @_; |
… | |
… | |
584 | $self->{record}->($command) |
586 | $self->{record}->($command) |
585 | if $self->{record}; |
587 | if $self->{record}; |
586 | |
588 | |
587 | $self->logprint ("send: ", $command); |
589 | $self->logprint ("send: ", $command); |
588 | $self->send_command ($command); |
590 | $self->send_command ($command); |
589 | ::status ($command); |
|
|
590 | } |
591 | } |
591 | |
592 | |
592 | sub record { |
593 | sub record { |
593 | my ($self, $cb) = @_; |
594 | my ($self, $cb) = @_; |
594 | |
595 | |
… | |
… | |
877 | # split metadata case, FT_MUSIC, FT_SOUND |
878 | # split metadata case, FT_MUSIC, FT_SOUND |
878 | if ($changed) { # new data |
879 | if ($changed) { # new data |
879 | my ($meta, $data) = unpack "(w/a*)*", $face->{data}; |
880 | my ($meta, $data) = unpack "(w/a*)*", $face->{data}; |
880 | $face->{data} = $meta; |
881 | $face->{data} = $meta; |
881 | |
882 | |
|
|
883 | # rely on strict ordering here and also on later fetch |
882 | CFPlus::DB::put res_data => $face->{name} => $data, sub { }; |
884 | CFPlus::DB::put res_data => $face->{name} => $data, sub { }; |
883 | CFPlus::DB::put res_meta => $face->{name} => $meta, sub { }; |
885 | CFPlus::DB::put res_meta => $face->{name} => $meta, sub { }; |
884 | } |
886 | } |
885 | |
887 | |
886 | $face->{data} = $self->{json_coder}->decode ($face->{data}); |
888 | $face->{data} = $self->{json_coder}->decode ($face->{data}); |
887 | |
|
|
888 | ::add_license ($face); |
889 | ::add_license ($face); |
|
|
890 | ::message ({ markup => CFPlus::asxml "downloaded resource '$face->{data}{name}', type $face->{type}." }) |
|
|
891 | if $changed; |
889 | |
892 | |
890 | if ($face->{type} == 3) { # FT_MUSIC |
893 | if ($face->{type} == 3) { # FT_MUSIC |
891 | ::message ({ markup => "downloaded song #$facenum" }) |
|
|
892 | if $changed; |
|
|
893 | |
|
|
894 | &::audio_music_push ($facenum); |
894 | &::audio_music_push ($facenum); |
895 | } elsif ($face->{type} == 5) { # FT_SOUND |
895 | } elsif ($face->{type} == 5) { # FT_SOUND |
896 | ::message ({ markup => "downloaded sound #$facenum" }) |
|
|
897 | if $changed; |
|
|
898 | |
|
|
899 | &::audio_sound_push ($facenum); |
896 | &::audio_sound_push ($facenum); |
900 | } |
897 | } |
901 | |
898 | |
902 | } else { |
899 | } else { |
903 | # flat resource case, FT_RSRC |
900 | # flat resource case, FT_RSRC |