Allow moving on-map units by setting unit.x an unit.y fields.

This commit is contained in:
Charles Dang 2018-02-04 03:07:37 +11:00
parent fe23166a31
commit 13cacd1d1e
2 changed files with 37 additions and 0 deletions

View file

@ -36,6 +36,7 @@ Version 1.13.10+dev:
* New wesnoth.unit_types[].advances_to getter.
* New wesnoth.unit_types[].advances_from getter.
* unit.id is now a modifiable field for off-map (Lua-only) units.
* Allow moving on-map units by setting unit.x an unit.y fields.
* Multiplayer:
* Dark Forecast: Fixed broken faction and leader selection.
* Rename the Khalifate to Dunefolk.

View file

@ -427,11 +427,47 @@ static int impl_unit_set(lua_State *L)
}
return 0;
}
if(!lu->on_map()) {
map_location loc = u.get_location();
modify_int_attrib("x", loc.set_wml_x(value); u.set_location(loc));
modify_int_attrib("y", loc.set_wml_y(value); u.set_location(loc));
modify_string_attrib("id", u.set_id(value));
} else {
const bool is_key_x = strcmp(m, "x") == 0;
const bool is_key_y = strcmp(m, "y") == 0;
// Handle moving an on-map unit
if(is_key_x || is_key_y) {
game_board* gb = resources::gameboard;
if(!gb) {
return 0;
}
map_location src = u.get_location();
map_location dst = src;
if(is_key_x) {
dst.set_wml_x(static_cast<int>(luaL_checknumber(L, 3)));
} else {
dst.set_wml_y(static_cast<int>(luaL_checknumber(L, 3)));
}
// TODO: could probably be relegated to a helper function.
if(src != dst) {
unit_map::iterator u = gb->units().end();
bool success = false;
std::tie(u, success) = gb->units().move(src, dst);
if(success) {
u->anim_comp().set_standing();
}
}
return 0;
}
}
std::string err_msg = "unknown modifiable property of unit: ";