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:
parent
05a397ddde
commit
20b36d2713
7 changed files with 39 additions and 16 deletions
|
@ -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"};
|
||||
|
|
|
@ -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_;
|
||||
};
|
||||
|
|
|
@ -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 << "'";
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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_;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue