Move the end level data accessors to wesnoth.scenario (#5861)

This commit is contained in:
Celtic Minstrel 2021-06-17 20:41:48 -04:00 committed by GitHub
parent 525d65bc2f
commit 67ba27b8a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 94 additions and 98 deletions

View File

@ -110,4 +110,6 @@ end)
if wesnoth.kernel_type() == 'Game Lua Kernel' then
wesnoth.get_traits = wesnoth.deprecate_api('wesnoth.get_traits', 'wesnoth.game_config.global_traits', 1, nil, function() return wesnoth.game_config.global_traits end)
wesnoth.end_level = wesnoth.deprecate_api('wesnoth.end_level', 'wesnoth.scenario.end_level_data assignment', 1, nil, function(cfg) wesnoth.scenario.end_level_data = cfg end)
wesnoth.get_end_level_data = wesnoth.deprecate_api('wesnoth.get_end_level_data', 'wesnoth.scenario.end_level_data', 1, nil, function() return wesnoth.scenario.end_level_data end)
end

View File

@ -1,5 +1,5 @@
function wesnoth.wml_conditionals.proceed_to_next_scenario(cfg)
local endlevel_data = wesnoth.get_end_level_data()
local endlevel_data = wesnoth.scenario.end_level_data
if not endlevel_data then
return false

View File

@ -92,7 +92,7 @@ function wesnoth.wml_actions.endlevel(cfg)
end
end
wesnoth.end_level {
wesnoth.scenario.end_level_data = {
carryover_report = cfg.carryover_report,
save = cfg.save,
replay_save = cfg.replay_save,

View File

@ -1192,6 +1192,61 @@ namespace {
}
}
static int impl_end_level_data_get(lua_State* L)
{
const end_level_data& data = *static_cast<end_level_data*>(lua_touserdata(L, 1));
const char* m = luaL_checkstring(L, 2);
return_bool_attrib("linger_mode", data.transient.linger_mode);
return_bool_attrib("reveal_map", data.transient.reveal_map);
return_bool_attrib("carryover_report", data.transient.carryover_report);
return_bool_attrib("prescenario_save", data.prescenario_save);
return_bool_attrib("replay_save", data.replay_save);
return_bool_attrib("proceed_to_next_level", data.proceed_to_next_level);
return_bool_attrib("is_victory", data.is_victory);
return_bool_attrib("is_loss", !data.is_victory);
return_cstring_attrib("result", data.is_victory ? "victory" : "loss"); // to match wesnoth.end_level()
return_string_attrib("test_result", data.test_result);
return_cfg_attrib("__cfg", data.to_config_full());
return 0;
}
namespace {
struct end_level_committer {
end_level_committer(end_level_data& data, play_controller& pc) : data_(data), pc_(pc) {}
~end_level_committer() {
pc_.set_end_level_data(data_);
}
private:
end_level_data& data_;
play_controller& pc_;
};
}
int game_lua_kernel::impl_end_level_data_set(lua_State* L)
{
end_level_data& data = *static_cast<end_level_data*>(lua_touserdata(L, 1));
const char* m = luaL_checkstring(L, 2);
end_level_committer commit(data, play_controller_);
modify_bool_attrib("linger_mode", data.transient.linger_mode = value);
modify_bool_attrib("reveal_map", data.transient.reveal_map = value);
modify_bool_attrib("carryover_report", data.transient.carryover_report = value);
modify_bool_attrib("prescenario_save", data.prescenario_save = value);
modify_bool_attrib("replay_save", data.replay_save = value);
modify_string_attrib("test_result", data.test_result = value);
return 0;
}
static int impl_end_level_data_collect(lua_State* L)
{
end_level_data* data = static_cast<end_level_data*>(lua_touserdata(L, 1));
data->~end_level_data();
return 0;
}
/**
* Gets some scenario data (__index metamethod).
* - Arg 1: userdata (ignored).
@ -1235,6 +1290,25 @@ int game_lua_kernel::impl_scenario_get(lua_State *L)
lua_push(L, mods);
return 1;
}
if(strcmp(m, "end_level_data") == 0) {
if (!play_controller_.is_regular_game_end()) {
return 0;
}
auto data = play_controller_.get_end_level_data();
new(L) end_level_data(data);
if(luaL_newmetatable(L, "end level data")) {
static luaL_Reg const callbacks[] {
{ "__index", &impl_end_level_data_get},
{ "__newindex", &dispatch<&game_lua_kernel::impl_end_level_data_set>},
{ "__gc", &impl_end_level_data_collect},
{ nullptr, nullptr }
};
luaL_setfuncs(L, callbacks, 0);
}
lua_setmetatable(L, -2);
return 1;
}
if(classification.is_multiplayer()) {
return_cfgref_attrib("mp_settings", play_controller_.get_mp_settings().to_config());
@ -1264,6 +1338,22 @@ int game_lua_kernel::impl_scenario_set(lua_State *L)
modify_bool_attrib("show_credits", classification.end_credits = value);
modify_string_attrib("end_text", classification.end_text = value);
modify_int_attrib("end_text_duration", classification.end_text_duration = value);
if(strcmp(m, "end_level_data") == 0) {
vconfig cfg(luaW_checkvconfig(L, 3));
end_level_data data;
data.proceed_to_next_level = cfg["proceed_to_next_level"].to_bool(true);
data.transient.carryover_report = cfg["carryover_report"].to_bool(true);
data.prescenario_save = cfg["save"].to_bool(true);
data.replay_save = cfg["replay_save"].to_bool(true);
data.transient.linger_mode = cfg["linger_mode"].to_bool(true) && !teams().empty();
data.transient.reveal_map = cfg["reveal_map"].to_bool(true);
data.is_victory = cfg["result"] == "victory";
data.test_result = cfg["test_result"].str(LEVEL_RESULT::enum_to_string(LEVEL_RESULT::TEST_NOT_SET));
play_controller_.set_end_level_data(data);
return 1;
}
return 0;
}
@ -1394,98 +1484,6 @@ int game_lua_kernel::intf_clear_messages(lua_State*)
return 0;
}
static int impl_end_level_data_get(lua_State* L)
{
const end_level_data& data = *static_cast<end_level_data*>(lua_touserdata(L, 1));
const char* m = luaL_checkstring(L, 2);
return_bool_attrib("linger_mode", data.transient.linger_mode);
return_bool_attrib("reveal_map", data.transient.reveal_map);
return_bool_attrib("carryover_report", data.transient.carryover_report);
return_bool_attrib("prescenario_save", data.prescenario_save);
return_bool_attrib("replay_save", data.replay_save);
return_bool_attrib("proceed_to_next_level", data.proceed_to_next_level);
return_bool_attrib("is_victory", data.is_victory);
return_bool_attrib("is_loss", !data.is_victory);
return_cstring_attrib("result", data.is_victory ? "victory" : "loss"); // to match wesnoth.end_level()
return_string_attrib("test_result", data.test_result);
return_cfg_attrib("__cfg", data.to_config_full());
return 0;
}
namespace {
struct end_level_committer {
end_level_committer(end_level_data& data, play_controller& pc) : data_(data), pc_(pc) {}
~end_level_committer() {
pc_.set_end_level_data(data_);
}
private:
end_level_data& data_;
play_controller& pc_;
};
}
int game_lua_kernel::impl_end_level_data_set(lua_State* L)
{
end_level_data& data = *static_cast<end_level_data*>(lua_touserdata(L, 1));
const char* m = luaL_checkstring(L, 2);
end_level_committer commit(data, play_controller_);
modify_bool_attrib("linger_mode", data.transient.linger_mode = value);
modify_bool_attrib("reveal_map", data.transient.reveal_map = value);
modify_bool_attrib("carryover_report", data.transient.carryover_report = value);
modify_bool_attrib("prescenario_save", data.prescenario_save = value);
modify_bool_attrib("replay_save", data.replay_save = value);
modify_string_attrib("test_result", data.test_result = value);
return 0;
}
static int impl_end_level_data_collect(lua_State* L)
{
end_level_data* data = static_cast<end_level_data*>(lua_touserdata(L, 1));
data->~end_level_data();
return 0;
}
int game_lua_kernel::intf_get_end_level_data(lua_State* L)
{
if (!play_controller_.is_regular_game_end()) {
return 0;
}
auto data = play_controller_.get_end_level_data();
new(L) end_level_data(data);
if(luaL_newmetatable(L, "end level data")) {
static luaL_Reg const callbacks[] {
{ "__index", &impl_end_level_data_get},
{ "__newindex", &dispatch<&game_lua_kernel::impl_end_level_data_set>},
{ "__gc", &impl_end_level_data_collect},
{ nullptr, nullptr }
};
luaL_setfuncs(L, callbacks, 0);
}
lua_setmetatable(L, -2);
return 1;
}
int game_lua_kernel::intf_end_level(lua_State *L)
{
vconfig cfg(luaW_checkvconfig(L, 1));
end_level_data data;
data.proceed_to_next_level = cfg["proceed_to_next_level"].to_bool(true);
data.transient.carryover_report = cfg["carryover_report"].to_bool(true);
data.prescenario_save = cfg["save"].to_bool(true);
data.replay_save = cfg["replay_save"].to_bool(true);
data.transient.linger_mode = cfg["linger_mode"].to_bool(true) && !teams().empty();
data.transient.reveal_map = cfg["reveal_map"].to_bool(true);
data.is_victory = cfg["result"] == "victory";
data.test_result = cfg["test_result"].str(LEVEL_RESULT::enum_to_string(LEVEL_RESULT::TEST_NOT_SET));
play_controller_.set_end_level_data(data);
return 0;
}
int game_lua_kernel::intf_end_turn(lua_State* L)
{
//note that next_player_number = 1, next_player_number = nteams+1 both set the next team to be the first team
@ -4010,7 +4008,6 @@ game_lua_kernel::game_lua_kernel(game_state & gs, play_controller & pc, reports
{ "cancel_action", &dispatch<&game_lua_kernel::intf_cancel_action > },
{ "clear_messages", &dispatch<&game_lua_kernel::intf_clear_messages > },
{ "end_turn", &dispatch<&game_lua_kernel::intf_end_turn > },
{ "end_level", &dispatch<&game_lua_kernel::intf_end_level > },
{ "find_cost_map", &dispatch<&game_lua_kernel::intf_find_cost_map > },
{ "find_path", &dispatch<&game_lua_kernel::intf_find_path > },
{ "find_reach", &dispatch<&game_lua_kernel::intf_find_reach > },
@ -4018,7 +4015,6 @@ game_lua_kernel::game_lua_kernel(game_state & gs, play_controller & pc, reports
{ "find_vision_range", &dispatch<&game_lua_kernel::intf_find_vision_range > },
{ "fire_event", &dispatch2<&game_lua_kernel::intf_fire_event, false > },
{ "fire_event_by_id", &dispatch2<&game_lua_kernel::intf_fire_event, true > },
{ "get_end_level_data", &dispatch<&game_lua_kernel::intf_get_end_level_data > },
{ "get_time_of_day", &dispatch<&game_lua_kernel::intf_get_time_of_day > },
{ "get_max_liminal_bonus", &dispatch<&game_lua_kernel::intf_get_max_liminal_bonus > },
{ "log_replay", &dispatch<&game_lua_kernel::intf_log_replay > },

View File

@ -106,9 +106,7 @@ class game_lua_kernel : public lua_kernel_base
int impl_scenario_set(lua_State *L);
int impl_current_get(lua_State *L);
int intf_clear_messages(lua_State*);
int intf_end_level(lua_State*);
int impl_end_level_data_set(lua_State*);
int intf_get_end_level_data(lua_State*);
int intf_end_turn(lua_State*);
int intf_find_cost_map(lua_State *L);
int intf_find_path(lua_State *L);