Skip to content

Commit

Permalink
Restore unit bars after moving even if the animator is disabled
Browse files Browse the repository at this point in the history
This fixes an issue where unit bars disappeared for individual units
after a movement action with Quick Replays on or when using the Skip
Animations replay option, so that they'd only reappear after playing an
attack or select animation (or any other animation, probably).

The cause was that these options cause the replay code to hold a CVideo
lock, which causes the unit_display::unit_mover::finish() to return
early without restoring the animated unit's bars. Since this also makes
the u_d::unit_mover not hide the bars in the first place, it wouldn't
normally be an issue; the bug is actually caused by an interaction with
actions::unit_mover::do_move(), which unconditionally hides a unit's
bars for every movement step.

Since I don't want to call unit::set_standing() more times than
necessary (even though a::u_m::do_move() appears to do just that), I
decided to have u_d::u_m::finish() reset the unit's state even when
it's not supposed to do anything due to display locks.

I also added comments in a::u_m::do_move() and u_d::u_m::finish() to
warn people about this interaction in case it comes up again in the
future.
  • Loading branch information
irydacea committed Jun 2, 2015
1 parent 80b22f2 commit e249945
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 1 deletion.
3 changes: 3 additions & 0 deletions changelog
Expand Up @@ -31,6 +31,9 @@ Version 1.13.0+dev:
(bug #20337).
* Hide mod options from the user command prompt dialog in the MP lobby when
not authenticated as a mod.
* Fixed unit bars, ellipses, and orbs disappearing for individual units in
replay mode when using Skip Animations/Quick Replays if they moved without
attacking or otherwise switching to a new animation.
* WML engine:
* Added support for [object] duration=turn end
* New or updated image path functions:
Expand Down
3 changes: 3 additions & 0 deletions players_changelog
Expand Up @@ -25,6 +25,9 @@ Version 1.13.0+dev:
* Force uniform font rendering settings across X11 and Apple OS X, avoiding
color glitches resulting from incorrect applications of subpixel hinting
(bug #20337).
* Fixed unit bars, ellipses, and orbs disappearing for individual units in
replay mode when using Skip Animations/Quick Replays if they moved without
attacking or otherwise switching to a new animation.

* Miscellaneous and bug fixes:
* Fixed a segfault in [move_units_fake]
Expand Down
3 changes: 3 additions & 0 deletions src/actions/move.cpp
Expand Up @@ -504,6 +504,9 @@ namespace { // Private helpers for move_unit()
// Update the moving unit.
move_it_ = move_result.first;
move_it_->set_facing(step_from->get_relative_dir(*step_to));
// Disable bars. The expectation here is that the animation
// unit_mover::finish() will clean after us at a later point. Ugly,
// but it works.
move_it_->anim_comp().set_standing(false);
disp.invalidate_unit_after_move(*move_loc_, *step_to);
disp.invalidate(*step_to);
Expand Down
7 changes: 6 additions & 1 deletion src/unit_display.cpp
Expand Up @@ -415,8 +415,13 @@ void unit_mover::wait_for_anims()
void unit_mover::finish(unit_ptr u, map_location::DIRECTION dir)
{
// Nothing to do here if the display is not valid.
if ( !can_draw_ )
if ( !can_draw_ ) {
// Make sure to reset the unit's animation to deal with a quirk in the
// action engine where it leaves it to us to reenable bars even if the
// display is initially locked.
u->anim_comp().set_standing(true);
return;
}

const map_location & end_loc = path_[current_];
const map_location::DIRECTION final_dir = current_ == 0 ?
Expand Down

0 comments on commit e249945

Please sign in to comment.