/** * Animates a teleportation between hexes. * * @param a The starting hex. * @param b The ending hex. * @param temp_unit The unit to animate (historically, a temporary unit). * @param disp The game display. Assumed neither locked nor faked. */ static void teleport_unit_between(const map_location& a, const map_location& b, unit& temp_unit, display& disp) { if ( disp.fogged(a) && disp.fogged(b) ) { return; } temp_unit.set_location(a); if ( !disp.fogged(a) ) { // teleport disp.invalidate(a); temp_unit.set_facing(a.get_relative_dir(b)); disp.scroll_to_tiles(a, b, game_display::ONSCREEN, true, 0.0, false); unit_animator animator; animator.add_animation(&temp_unit,"pre_teleport",a); animator.start_animations(); animator.wait_for_end(); } temp_unit.set_location(b); if ( !disp.fogged(b) ) { // teleport disp.invalidate(b); temp_unit.set_facing(a.get_relative_dir(b)); disp.scroll_to_tiles(b, a, game_display::ONSCREEN, true, 0.0, false); unit_animator animator; animator.add_animation(&temp_unit,"post_teleport",b); animator.start_animations(); animator.wait_for_end(); } temp_unit.anim_comp().set_standing(); disp.update_display(); events::pump(); }
static void teleport_unit_between( const map_location& a, const map_location& b, unit& temp_unit) { game_display* disp = game_display::get_singleton(); if(!disp || disp->video().update_locked() || disp->video().faked() || (disp->fogged(a) && disp->fogged(b))) { return; } disp->scroll_to_tiles(a,b,game_display::ONSCREEN,true,0.0,false); temp_unit.set_location(a); if (!disp->fogged(a)) { // teleport disp->invalidate(temp_unit.get_location()); temp_unit.set_facing(a.get_relative_dir(b)); unit_animator animator; animator.add_animation(&temp_unit,"pre_teleport",a); animator.start_animations(); animator.wait_for_end(); } temp_unit.set_location(b); if (!disp->fogged(b)) { // teleport disp->invalidate(temp_unit.get_location()); temp_unit.set_facing(a.get_relative_dir(b)); disp->scroll_to_tiles(b,a,game_display::ONSCREEN,true,0.0,false); unit_animator animator; animator.add_animation(&temp_unit,"post_teleport",b); animator.start_animations(); animator.wait_for_end(); } temp_unit.set_standing(); disp->update_display(); events::pump(); }
static void move_unit_between(const map_location& a, const map_location& b, unit& temp_unit,unsigned int step_num,unsigned int step_left) { game_display* disp = game_display::get_singleton(); if(!disp || disp->video().update_locked() || disp->video().faked() || (disp->fogged(a) && disp->fogged(b))) { return; } temp_unit.set_location(a); disp->invalidate(temp_unit.get_location()); temp_unit.set_facing(a.get_relative_dir(b)); unit_animator animator; animator.replace_anim_if_invalid(&temp_unit,"movement",a,b,step_num, false,"",0,unit_animation::INVALID,NULL,NULL,step_left); animator.start_animations(); animator.pause_animation(); disp->scroll_to_tiles(a,b,game_display::ONSCREEN,true,0.0,false); animator.restart_animation(); // useless now, previous short draw() just did one // new_animation_frame(); int target_time = animator.get_animation_time_potential(); // target_time must be short to avoid jumpy move // std::cout << "target time: " << target_time << "\n"; // we round it to the next multile of 200 target_time += 200; target_time -= target_time%200; // This code causes backwards teleport because the time > 200 causes offset > 1.0 // which will not match with the following -1.0 // if( target_time - animator.get_animation_time_potential() < 100 ) target_time +=200; animator.wait_until(target_time); // debug code, see unit_frame::redraw() // std::cout << " end\n"; map_location arr[6]; get_adjacent_tiles(a, arr); unsigned int i; for (i = 0; i < 6; ++i) { disp->invalidate(arr[i]); } get_adjacent_tiles(b, arr); for (i = 0; i < 6; ++i) { disp->invalidate(arr[i]); } }