Add WML tag to change the map zoom level
This commit is contained in:
parent
062046760d
commit
66f4c2ba3d
5 changed files with 37 additions and 3 deletions
|
@ -15,6 +15,7 @@ Version 1.13.7+dev:
|
||||||
* Small change to animator API - facing parameter replaced with target and required to be
|
* Small change to animator API - facing parameter replaced with target and required to be
|
||||||
a space adjacent to the unit.
|
a space adjacent to the unit.
|
||||||
* New modifiable theme attribute in wesnoth.game_config
|
* New modifiable theme attribute in wesnoth.game_config
|
||||||
|
* New wesnoth.zoom() function allows changing the zoom level
|
||||||
* Multiplayer:
|
* Multiplayer:
|
||||||
* Fixed statistics being lost when reloading an MP game.
|
* Fixed statistics being lost when reloading an MP game.
|
||||||
* Performance:
|
* Performance:
|
||||||
|
@ -40,6 +41,7 @@ Version 1.13.7+dev:
|
||||||
the color as a list of its components, eg "([r, g, b, a])"
|
the color as a list of its components, eg "([r, g, b, a])"
|
||||||
* Empty tags are no longer written to the configs of [unit]s and [side]s.
|
* Empty tags are no longer written to the configs of [unit]s and [side]s.
|
||||||
* New [change_theme] tag to change the theme mid-scenario
|
* New [change_theme] tag to change the theme mid-scenario
|
||||||
|
* New [zoom] tag allows changing the zoom level from an event
|
||||||
|
|
||||||
Version 1.13.7:
|
Version 1.13.7:
|
||||||
* AI:
|
* AI:
|
||||||
|
|
|
@ -1417,6 +1417,10 @@ function wesnoth.wml_actions.change_theme(cfg)
|
||||||
wesnoth.game_config.theme = cfg.theme
|
wesnoth.game_config.theme = cfg.theme
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function wesnoth.wml_actions.zoom(cfg)
|
||||||
|
wesnoth.zoom(cfg.factor, cfg.relative)
|
||||||
|
end
|
||||||
|
|
||||||
function wesnoth.wml_conditionals.proceed_to_next_scenario(cfg)
|
function wesnoth.wml_conditionals.proceed_to_next_scenario(cfg)
|
||||||
local endlevel_data = wesnoth.get_end_level_data()
|
local endlevel_data = wesnoth.get_end_level_data()
|
||||||
if not endlevel_data then
|
if not endlevel_data then
|
||||||
|
|
|
@ -2006,7 +2006,7 @@ bool display::set_zoom(bool increase)
|
||||||
|
|
||||||
bool display::set_zoom(unsigned int amount, const bool validate_value_and_set_index)
|
bool display::set_zoom(unsigned int amount, const bool validate_value_and_set_index)
|
||||||
{
|
{
|
||||||
const unsigned int new_zoom = utils::clamp(amount, MinZoom, MaxZoom);
|
unsigned int new_zoom = utils::clamp(amount, MinZoom, MaxZoom);
|
||||||
|
|
||||||
LOG_DP << "new_zoom = " << new_zoom << std::endl;
|
LOG_DP << "new_zoom = " << new_zoom << std::endl;
|
||||||
|
|
||||||
|
@ -2016,13 +2016,22 @@ bool display::set_zoom(unsigned int amount, const bool validate_value_and_set_in
|
||||||
|
|
||||||
// Confirm this is indeed a valid zoom level.
|
// Confirm this is indeed a valid zoom level.
|
||||||
if(validate_value_and_set_index) {
|
if(validate_value_and_set_index) {
|
||||||
auto iter = std::find(zoom_levels.begin(), zoom_levels.end(), new_zoom);
|
auto iter = std::lower_bound(zoom_levels.begin(), zoom_levels.end(), new_zoom);
|
||||||
|
|
||||||
// TODO: do we need an error?
|
|
||||||
if(iter == zoom_levels.end()) {
|
if(iter == zoom_levels.end()) {
|
||||||
|
// This should never happen, since the value was already clamped earlier
|
||||||
return false;
|
return false;
|
||||||
|
} else if(iter != zoom_levels.begin()) {
|
||||||
|
float diff = *iter - *(iter - 1);
|
||||||
|
float lower = (new_zoom - *(iter - 1)) / diff;
|
||||||
|
float upper = (*iter - new_zoom) / diff;
|
||||||
|
if(lower < upper) {
|
||||||
|
// It's actually closer to the previous element.
|
||||||
|
iter--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new_zoom = *iter;
|
||||||
zoom_index_ = iter - zoom_levels.begin();
|
zoom_index_ = iter - zoom_levels.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1394,6 +1394,23 @@ int game_lua_kernel::intf_open_help(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int game_lua_kernel::intf_zoom(lua_State* L)
|
||||||
|
{
|
||||||
|
if(!game_display_) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
double factor = luaL_checknumber(L, 1);
|
||||||
|
bool relative = luaW_toboolean(L, 2);
|
||||||
|
if(relative) {
|
||||||
|
factor *= game_display_->get_zoom_factor();
|
||||||
|
}
|
||||||
|
// Passing true explicitly to avoid casting to int.
|
||||||
|
// Without doing one of the two, the call is ambiguous.
|
||||||
|
game_display_->set_zoom(factor * game_config::tile_size, true);
|
||||||
|
lua_pushnumber(L, game_display_->get_zoom_factor());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dumps a wml table or userdata wml object into a pretty string.
|
* Dumps a wml table or userdata wml object into a pretty string.
|
||||||
* - Arg 1: wml table or vconfig userdata
|
* - Arg 1: wml table or vconfig userdata
|
||||||
|
@ -4181,6 +4198,7 @@ game_lua_kernel::game_lua_kernel(game_state & gs, play_controller & pc, reports
|
||||||
{ "switch_ai", &intf_switch_ai },
|
{ "switch_ai", &intf_switch_ai },
|
||||||
{ "synchronize_choice", &intf_synchronize_choice },
|
{ "synchronize_choice", &intf_synchronize_choice },
|
||||||
{ "synchronize_choices", &intf_synchronize_choices },
|
{ "synchronize_choices", &intf_synchronize_choices },
|
||||||
|
{ "zoom", &dispatch<&game_lua_kernel::intf_zoom > },
|
||||||
{ "teleport", &dispatch<&game_lua_kernel::intf_teleport > },
|
{ "teleport", &dispatch<&game_lua_kernel::intf_teleport > },
|
||||||
{ "unit_ability", &dispatch<&game_lua_kernel::intf_unit_ability > },
|
{ "unit_ability", &dispatch<&game_lua_kernel::intf_unit_ability > },
|
||||||
{ "view_locked", &dispatch<&game_lua_kernel::intf_view_locked > },
|
{ "view_locked", &dispatch<&game_lua_kernel::intf_view_locked > },
|
||||||
|
|
|
@ -172,6 +172,7 @@ class game_lua_kernel : public lua_kernel_base
|
||||||
int intf_toggle_fog(lua_State *L, const bool clear);
|
int intf_toggle_fog(lua_State *L, const bool clear);
|
||||||
int intf_get_fog_or_shroud(lua_State *L, bool fog);
|
int intf_get_fog_or_shroud(lua_State *L, bool fog);
|
||||||
int intf_log_replay(lua_State* L);
|
int intf_log_replay(lua_State* L);
|
||||||
|
int intf_zoom(lua_State* L);
|
||||||
|
|
||||||
//private helpers
|
//private helpers
|
||||||
std::string synced_state();
|
std::string synced_state();
|
||||||
|
|
Loading…
Add table
Reference in a new issue