From 67ba27b8a3176760af670b227d5d57877c5aa496 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 17 Jun 2021 20:41:48 -0400 Subject: [PATCH] Move the end level data accessors to wesnoth.scenario (#5861) --- data/lua/core/_initial.lua | 2 + data/lua/wml-conditionals.lua | 2 +- data/lua/wml/endlevel.lua | 2 +- src/scripting/game_lua_kernel.cpp | 184 +++++++++++++++--------------- src/scripting/game_lua_kernel.hpp | 2 - 5 files changed, 94 insertions(+), 98 deletions(-) diff --git a/data/lua/core/_initial.lua b/data/lua/core/_initial.lua index 6ec8021e83d..86980f576cf 100644 --- a/data/lua/core/_initial.lua +++ b/data/lua/core/_initial.lua @@ -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 diff --git a/data/lua/wml-conditionals.lua b/data/lua/wml-conditionals.lua index d503c3e1da7..00e618cb06a 100644 --- a/data/lua/wml-conditionals.lua +++ b/data/lua/wml-conditionals.lua @@ -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 diff --git a/data/lua/wml/endlevel.lua b/data/lua/wml/endlevel.lua index 7a0b92f1fc2..38daf3fe2d9 100644 --- a/data/lua/wml/endlevel.lua +++ b/data/lua/wml/endlevel.lua @@ -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, diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 10af8e6f645..57a37cbc08b 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -1192,6 +1192,61 @@ namespace { } } +static int impl_end_level_data_get(lua_State* L) +{ + const end_level_data& data = *static_cast(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(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(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(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(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(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 > }, diff --git a/src/scripting/game_lua_kernel.hpp b/src/scripting/game_lua_kernel.hpp index a521b129c90..b8a3654f583 100644 --- a/src/scripting/game_lua_kernel.hpp +++ b/src/scripting/game_lua_kernel.hpp @@ -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);