variables in lua mapgen, fixes #3657

In campaigns The lua mapgenerator code has now access to the
variables from the last scenario via wesnoth.get_variable.
This commit is contained in:
gfgtdf 2018-10-26 17:48:05 +02:00
parent 05a397ddde
commit 20b36d2713
7 changed files with 39 additions and 16 deletions

View file

@ -20,14 +20,15 @@
#include <string>
lua_map_generator::lua_map_generator(const config & cfg)
lua_map_generator::lua_map_generator(const config & cfg, const config* vars)
: id_(cfg["id"])
, config_name_(cfg["config_name"])
, user_config_(cfg["user_config"])
, create_map_(cfg["create_map"])
, create_scenario_(cfg["create_scenario"])
, lk_()
, lk_(vars)
, generator_data_(cfg)
, vars_(vars)
{
lk_.load_core();
const char* required[] {"id", "config_name", "create_map"};

View file

@ -23,7 +23,7 @@
class lua_map_generator : public map_generator {
public:
lua_map_generator(const config & cfg);
lua_map_generator(const config & cfg, const config* vars);
bool allow_user_config() const override { return !user_config_.empty(); }
@ -47,4 +47,5 @@ private:
mapgen_lua_kernel lk_;
config generator_data_;
const config* vars_;
};

View file

@ -25,7 +25,7 @@
static lg::log_domain log_config("config");
#define ERR_CF LOG_STREAM(err, log_config)
map_generator* create_map_generator(const std::string& name, const config &cfg)
map_generator* create_map_generator(const std::string& name, const config &cfg, const config* vars)
{
if(name == "default" || name.empty()) {
return new default_map_generator(cfg);
@ -33,7 +33,7 @@ map_generator* create_map_generator(const std::string& name, const config &cfg)
ERR_CF << "map/scenario_generation=cave is deprecatd and will be removed soon, use map/scenario_generation=lua with lua/cave_map_generator.lua instead.\n";
return new cave_map_generator(cfg);
} else if(name == "lua") {
return new lua_map_generator(cfg);
return new lua_map_generator(cfg, vars);
} else {
return nullptr;
}
@ -41,9 +41,9 @@ map_generator* create_map_generator(const std::string& name, const config &cfg)
//function to generate a random map, from a string which describes
//the generator to use
std::string random_generate_map(const std::string& name, const config &cfg)
std::string random_generate_map(const std::string& name, const config &cfg, const config* vars)
{
std::unique_ptr<map_generator> generator(create_map_generator(name,cfg));
std::unique_ptr<map_generator> generator(create_map_generator(name, cfg, vars));
if(generator == nullptr) {
std::stringstream ss;
ss << "could not find map generator '" << name << "'";
@ -53,9 +53,9 @@ std::string random_generate_map(const std::string& name, const config &cfg)
return generator->create_map();
}
config random_generate_scenario(const std::string& name, const config &cfg)
config random_generate_scenario(const std::string& name, const config &cfg, const config* vars)
{
std::unique_ptr<map_generator> generator(create_map_generator(name,cfg));
std::unique_ptr<map_generator> generator(create_map_generator(name, cfg, vars));
if(generator == nullptr) {
std::stringstream ss;
ss << "could not find map generator '" << name << "'";

View file

@ -19,7 +19,7 @@ class map_generator;
#include <string>
std::string random_generate_map(const std::string& parms, const config &cfg);
config random_generate_scenario(const std::string& parms, const config &cfg);
std::string random_generate_map(const std::string& parms, const config &cfg, const config* vars = nullptr);
config random_generate_scenario(const std::string& parms, const config &cfg, const config* vars = nullptr);
map_generator* create_map_generator(const std::string& name, const config &cfg);
map_generator* create_map_generator(const std::string& name, const config &cfg, const config* vars = nullptr);

View file

@ -427,7 +427,7 @@ void saved_game::expand_random_scenario()
const cursor::setter cursor_setter(cursor::WAIT);
config scenario_new =
random_generate_scenario(starting_point_["scenario_generation"], starting_point_.child("generator"));
random_generate_scenario(starting_point_["scenario_generation"], starting_point_.child("generator"), &carryover_.child_or_empty("variables"));
post_scenario_generation(starting_point_, scenario_new);
starting_point_ = std::move(scenario_new);
@ -448,7 +448,7 @@ void saved_game::expand_random_scenario()
const cursor::setter cursor_setter(cursor::WAIT);
starting_point_["map_data"] =
random_generate_map(starting_point_["map_generation"], starting_point_.child("generator"));
random_generate_map(starting_point_["map_generation"], starting_point_.child("generator"), &carryover_.child_or_empty("variables"));
}
}
}

View file

@ -40,6 +40,13 @@ static lg::log_domain log_mapgen("mapgen");
struct lua_State;
// Template which allows to push member functions to the lua kernel into lua as C functions, using a shim
typedef int (mapgen_lua_kernel::*member_callback)(lua_State *);
template <member_callback method>
int dispatch(lua_State *L) {
return ((lua_kernel_base::get_lua_kernel<mapgen_lua_kernel>(L)).*method)(L);
}
/**
* Returns a random numer, same interface as math.random.
@ -196,10 +203,11 @@ static int intf_find_path(lua_State *L)
}
mapgen_lua_kernel::mapgen_lua_kernel()
mapgen_lua_kernel::mapgen_lua_kernel(const config* vars)
: lua_kernel_base()
, random_seed_()
, default_rng_()
, vars_(vars)
{
lua_State *L = mState;
@ -218,6 +226,7 @@ mapgen_lua_kernel::mapgen_lua_kernel()
{ "create_map", &intf_terainmap_create },
{ "default_generate_height_map", &intf_default_generate_height_map },
{ "generate_default_map", &intf_default_generate },
{ "get_variable", &dispatch<&mapgen_lua_kernel::intf_get_variable> },
{ nullptr, nullptr }
};
@ -244,6 +253,16 @@ void mapgen_lua_kernel::user_config(const char * prog, const config & generator)
run_generator(prog, generator);
}
int mapgen_lua_kernel::intf_get_variable(lua_State *L)
{
if(!vars_) {
return 0;
}
char const *m = luaL_checkstring(L, 1);
variable_access_const v(m, *vars_);
return luaW_pushvariable(L, v) ? 1 : 0;
}
std::string mapgen_lua_kernel::create_map(const char * prog, const config & generator, boost::optional<uint32_t> seed) // throws game::lua_error
{
random_seed_ = seed;

View file

@ -25,7 +25,7 @@ class config;
class mapgen_lua_kernel : public lua_kernel_base {
public:
mapgen_lua_kernel();
mapgen_lua_kernel(const config* vars);
virtual std::string my_name() { return "Mapgen Lua Kernel"; }
@ -37,6 +37,8 @@ public:
std::mt19937& get_default_rng();
private:
void run_generator(const char * prog, const config & generator);
int intf_get_variable(lua_State *L);
boost::optional<uint32_t> random_seed_;
boost::optional<std::mt19937> default_rng_;
const config* vars_;
};