move::move(config const& cfg, bool hidden) : action(cfg,hidden) , unit_underlying_id_(0) , unit_id_() , route_(new pathfind::marked_route()) , movement_cost_(0) , turn_number_(0) , arrow_(new arrow(hidden)) , fake_unit_() , arrow_brightness_() , arrow_texture_() , mover_() , fake_unit_hidden_(false) { // Construct and validate unit_ unit_map::iterator unit_itor = resources::units->find(cfg["unit_"]); if(unit_itor == resources::units->end()) throw action::ctor_err("move: Invalid underlying_id"); unit_underlying_id_ = unit_itor->underlying_id(); // Construct and validate route_ config const& route_cfg = cfg.child("route_"); if(!route_cfg) throw action::ctor_err("move: Invalid route_"); route_->move_cost = route_cfg["move_cost"]; BOOST_FOREACH(config const& loc_cfg, route_cfg.child_range("step")) { route_->steps.push_back(map_location(loc_cfg["x"],loc_cfg["y"])); } BOOST_FOREACH(config const& mark_cfg, route_cfg.child_range("mark")) { route_->marks[map_location(mark_cfg["x"],mark_cfg["y"])] = pathfind::marked_route::mark(mark_cfg["turns"], mark_cfg["zoc"].to_bool(), mark_cfg["capture"].to_bool(), mark_cfg["invisible"].to_bool()); } // Validate route_ some more std::vector<map_location> const& steps = route_->steps; if(steps.empty()) throw action::ctor_err("move: Invalid route_"); // Construct arrow_ arrow_->set_color(team::get_side_color_index(side_number())); arrow_->set_style(arrow::STYLE_STANDARD); arrow_->set_path(route_->steps); // Construct fake_unit_ fake_unit_ = fake_unit_ptr( unit_ptr(new unit(*get_unit())) , resources::fake_units ); if(hidden) fake_unit_->set_hidden(true); fake_unit_->anim_comp().set_ghosted(true); unit_display::move_unit(route_->steps, fake_unit_.get_unit_ptr(), false); //get facing right fake_unit_->set_location(route_->steps.back()); this->init(); }
/* Note: Hide the unit in its current location; do not actually remove it. * Otherwise the status displays will be wrong during the movement. */ void unit_mover::replace_temporary(unit_ptr u) { if ( disp_ == nullptr ) // No point in creating a temp unit with no way to display it. return; // Save the hidden state of the unit. was_hidden_ = u->get_hidden(); // Make our temporary unit mostly match u... temp_unit_ptr_ = fake_unit_ptr(unit_ptr(new unit(*u)), resources::fake_units); // ... but keep the temporary unhidden and hide the original. temp_unit_ptr_->set_hidden(false); u->set_hidden(true); // Update cached data. is_enemy_ = (*resources::teams)[u->side()-1].is_enemy(disp_->viewing_side()); }
/** @return null pointer */ virtual fake_unit_ptr get_fake_unit() { return fake_unit_ptr(); }