… | |
… | |
11 | use DC::Macro; |
11 | use DC::Macro; |
12 | |
12 | |
13 | our @ISA = DC::UI::Base::; |
13 | our @ISA = DC::UI::Base::; |
14 | |
14 | |
15 | my $magicmap_tex = |
15 | my $magicmap_tex = |
16 | new_from_file DC::Texture DC::find_rcfile "magicmap.png", |
16 | new_from_resource DC::Texture "magicmap.png", |
17 | mipmap => 1, wrap => 0, internalformat => GL_ALPHA; |
17 | mipmap => 1, wrap => 0, internalformat => GL_ALPHA; |
18 | |
18 | |
19 | sub new { |
19 | sub new { |
20 | my $class = shift; |
20 | my $class = shift; |
21 | |
21 | |
… | |
… | |
432 | my $spd = $::CONN->{stat}{DC::Protocol::CS_STAT_SPEED}; |
432 | my $spd = $::CONN->{stat}{DC::Protocol::CS_STAT_SPEED}; |
433 | |
433 | |
434 | # the minimum time for a single tile movement |
434 | # the minimum time for a single tile movement |
435 | my $mintime = DC::Protocol::TICK * DC::ceil 1 / ($spd * DC::Protocol::TICK || 1); |
435 | my $mintime = DC::Protocol::TICK * DC::ceil 1 / ($spd * DC::Protocol::TICK || 1); |
436 | |
436 | |
|
|
437 | $spd *= $self->{tilesize}; |
|
|
438 | |
437 | # jump if "impossibly high" speed |
439 | # jump if "impossibly high" speed |
438 | if ( |
440 | if ( |
439 | (max abs $self->{sdx}, abs $self->{sdy}) |
441 | (max abs $self->{sdx}, abs $self->{sdy}) |
440 | > $spd * $self->{tilesize} * $mintime * 1.1 |
442 | > $spd * $mintime * 2.1 |
441 | ) { |
443 | ) { |
442 | #warn "jump ", (max abs $self->{sdx}, abs $self->{sdy}), " ", $spd * $mintime * 1.0;#d# |
444 | #warn "jump ", (max abs $self->{sdx}, abs $self->{sdy}), " ", $spd * $mintime * 2.1;#d# |
443 | $self->{sdx} = $self->{sdy} = 0; |
445 | $self->{sdx} = $self->{sdy} = 0; |
444 | } else { |
446 | } else { |
445 | $spd *= $self->{tilesize} * $diff * 1.0001; # 1.0001 so that we don't accumulate rounding errors the wrong direction |
447 | $spd *= $diff * 1.0001; # 1.0001 so that we don't accumulate rounding errors the wrong direction |
446 | |
448 | |
447 | my $dx = $self->{sdx} < 0 ? -$spd : $spd; |
449 | my $dx = $self->{sdx} < 0 ? -$spd : $spd; |
448 | my $dy = $self->{sdy} < 0 ? -$spd : $spd; |
450 | my $dy = $self->{sdy} < 0 ? -$spd : $spd; |
449 | |
451 | |
450 | if ($self->{sdx} * ($self->{sdx} - $dx) <= 0) { $self->{sdx} = 0 } else { $self->{sdx} -= $dx } |
452 | if ($self->{sdx} * ($self->{sdx} - $dx) <= 0) { $self->{sdx} = 0 } else { $self->{sdx} -= $dx } |
451 | if ($self->{sdy} * ($self->{sdy} - $dy) <= 0) { $self->{sdy} = 0 } else { $self->{sdy} -= $dy } |
453 | if ($self->{sdy} * ($self->{sdy} - $dy) <= 0) { $self->{sdy} = 0 } else { $self->{sdy} -= $dy } |
452 | |
|
|
453 | $self->update; |
|
|
454 | } |
454 | } |
|
|
455 | |
|
|
456 | $self->update; |
455 | } |
457 | } |
456 | } else { |
458 | } else { |
457 | $self->{sdx} = $self->{sdy} = 0; |
459 | $self->{sdx} = $self->{sdy} = 0; |
458 | } |
460 | } |
459 | |
461 | |
… | |
… | |
610 | sub refresh_hook { |
612 | sub refresh_hook { |
611 | my ($self) = @_; |
613 | my ($self) = @_; |
612 | |
614 | |
613 | if ($::MAP && $self->{texture_atime} < time) { |
615 | if ($::MAP && $self->{texture_atime} < time) { |
614 | my ($w, $h) = @$self{qw(w h)}; |
616 | my ($w, $h) = @$self{qw(w h)}; |
|
|
617 | |
|
|
618 | return unless $w && $h; |
615 | |
619 | |
616 | my $sw = int $::WIDTH / ($::MAPWIDGET->{tilesize} * $::CFG->{map_scale}) + 0.99; |
620 | my $sw = int $::WIDTH / ($::MAPWIDGET->{tilesize} * $::CFG->{map_scale}) + 0.99; |
617 | my $sh = int $::HEIGHT / ($::MAPWIDGET->{tilesize} * $::CFG->{map_scale}) + 0.99; |
621 | my $sh = int $::HEIGHT / ($::MAPWIDGET->{tilesize} * $::CFG->{map_scale}) + 0.99; |
618 | |
622 | |
619 | my $ox = 0.5 * ($w - $sw); |
623 | my $ox = 0.5 * ($w - $sw); |