wb: fix 'insufficient movement' wanring when a move is interrupted

This commit is contained in:
gfgtdf 2018-05-05 19:13:22 +02:00 committed by Charles Dang
parent 2635c7014f
commit cdb98f75a4
3 changed files with 14 additions and 2 deletions

View file

@ -648,7 +648,7 @@ jamming_path::~jamming_path()
{
}
marked_route mark_route(const plain_route &rt)
marked_route mark_route(const plain_route &rt, bool update_move_cost)
{
marked_route res;
@ -660,6 +660,7 @@ marked_route mark_route(const plain_route &rt)
const unit& u = *it;
int turns = 0;
int total_costs = 0;
int movement = u.movement_left();
const team& unit_team = resources::gameboard->get_team(u.side());
bool zoc = false;
@ -691,6 +692,7 @@ marked_route mark_route(const plain_route &rt)
if (last_step) break; // finished and we used dummy move_cost
total_costs += movement;
movement = u.total_movement();
if(move_cost > movement) {
return res; //we can't reach destination
@ -701,12 +703,17 @@ marked_route mark_route(const plain_route &rt)
&& !u.get_ability_bool("skirmisher", *(i+1));
if (zoc) {
total_costs += movement;
movement = 0;
} else {
movement -= move_cost;
total_costs += move_cost;
}
}
if(update_move_cost) {
res.move_cost = total_costs;
}
return res;
}

View file

@ -198,7 +198,7 @@ plain_route a_star_search(const map_location& src, const map_location& dst,
* Add marks on a route @a rt assuming that the unit located at the first hex of
* rt travels along it.
*/
marked_route mark_route(const plain_route &rt);
marked_route mark_route(const plain_route &rt, bool update_move_cost = false);
struct shortest_path_calculator : cost_calculator
{

View file

@ -271,6 +271,9 @@ void move::execute(bool& success, bool& complete)
//FIXME: probably better to use the new calculate_new_route() instead of the above:
//calculate_new_route(final_location, steps.back());
// Of course, "better" would need to be verified.
//Update route_->move_cost
route_.reset(new pathfind::marked_route(mark_route(route_->route, true)));
arrow_->set_path(route_->steps);
}
}
@ -479,8 +482,10 @@ action::error move::check_validity() const
//check that the path is good
if(get_source_hex() != get_dest_hex()) { //skip zero-hex move used by attack subclass
// Mark the plain route to see if the move can still be done in one turn,
// which is always the case for planned moves
// TODO: this check is rather slow, skip it if the gamestat has not changed.
pathfind::marked_route checked_route = pathfind::mark_route(get_route().route);
if(checked_route.marks[checked_route.steps.back()].turns != 1) {