editor2: alllow different map generators to be used
This commit is contained in:
parent
f852cdfe00
commit
d3e819dd22
10 changed files with 152 additions and 24 deletions
|
@ -2,6 +2,17 @@
|
|||
### Definition of the window to create a new map in editor2.
|
||||
###
|
||||
|
||||
#define ONE_ROW_GRID
|
||||
[grid]
|
||||
[row]
|
||||
grow_factor = 0
|
||||
#enddef
|
||||
|
||||
#define ONE_ROW_GRID_END
|
||||
[/row]
|
||||
[/grid]
|
||||
#enddef
|
||||
|
||||
[window]
|
||||
id = "editor_generate_map"
|
||||
description = "Generate random map dialog."
|
||||
|
@ -27,6 +38,39 @@
|
|||
[/label]
|
||||
[/column]
|
||||
[/row]
|
||||
[row]
|
||||
grow_factor = 0
|
||||
[column]
|
||||
grow_factor = 1
|
||||
horizontal_grow = "true"
|
||||
[grid]
|
||||
[row]
|
||||
grow_factor = 0
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
[label]
|
||||
id = "current_generator"
|
||||
definition = "default"
|
||||
[/label]
|
||||
[/column]
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "right"
|
||||
[button]
|
||||
id = "next_generator"
|
||||
definition = "default"
|
||||
size_text = _ "Next Generator"
|
||||
label = _ "Next Generator"
|
||||
[/button]
|
||||
[/column]
|
||||
[/row]
|
||||
[/grid]
|
||||
[/column]
|
||||
[/row]
|
||||
[row]
|
||||
grow_factor = 0
|
||||
[column]
|
||||
|
@ -73,3 +117,6 @@
|
|||
[/grid]
|
||||
[/resolution]
|
||||
[/window]
|
||||
|
||||
#undef ONE_ROW_GRID
|
||||
#undef ONE_ROW_GRID_END
|
|
@ -69,6 +69,11 @@ cave_map_generator::cave_map_generator(const config* cfg) :
|
|||
|
||||
}
|
||||
|
||||
std::string cave_map_generator::config_name() const
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
size_t cave_map_generator::translate_x(size_t x) const
|
||||
{
|
||||
if(flipx_) {
|
||||
|
|
|
@ -32,6 +32,8 @@ public:
|
|||
void user_config(display& /* disp*/) { return; }
|
||||
|
||||
std::string name() const { return "cave"; }
|
||||
|
||||
std::string config_name() const;
|
||||
|
||||
std::string create_map(const std::vector<std::string>& args);
|
||||
config create_scenario(const std::vector<std::string>& args);
|
||||
|
|
|
@ -59,7 +59,7 @@ editor_controller::editor_controller(const config &game_config, CVideo& video)
|
|||
, rng_setter_(NULL)
|
||||
, map_context_(editor_map(game_config, 44, 33, t_translation::GRASS_LAND))
|
||||
, gui_(NULL)
|
||||
, map_generator_(NULL)
|
||||
, map_generators_()
|
||||
, size_specs_()
|
||||
, palette_()
|
||||
, brush_bar_()
|
||||
|
@ -154,8 +154,19 @@ void editor_controller::init_mouse_actions(const config& game_config)
|
|||
}
|
||||
}
|
||||
|
||||
void editor_controller::init_map_generators(const config& /*game_config*/)
|
||||
void editor_controller::init_map_generators(const config& game_config)
|
||||
{
|
||||
foreach (const config* i, game_config.get_children("multiplayer")) {
|
||||
if ((*i)["map_generation"] == "default") {
|
||||
const config* generator_cfg = i->child("generator");
|
||||
if (generator_cfg == NULL) {
|
||||
ERR_ED << "Scenario \"" << (*i)["name"] << "\" with id " << (*i)["id"] << " has map_generation=default but no [generator] tag";
|
||||
} else {
|
||||
map_generator* m = create_map_generator("", generator_cfg);
|
||||
map_generators_.push_back(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void editor_controller::load_tooltips()
|
||||
|
@ -170,11 +181,13 @@ editor_controller::~editor_controller()
|
|||
delete brush_bar_;
|
||||
delete size_specs_;
|
||||
delete floating_label_manager_;
|
||||
delete map_generator_;
|
||||
delete gui_;
|
||||
foreach (const mouse_action_map::value_type a, mouse_actions_) {
|
||||
delete a.second;
|
||||
}
|
||||
foreach (map_generator* m, map_generators_) {
|
||||
delete m;
|
||||
}
|
||||
delete prefs_disp_manager_;
|
||||
delete rng_setter_;
|
||||
delete rng_;
|
||||
|
@ -278,20 +291,13 @@ void editor_controller::save_map_as_dialog()
|
|||
|
||||
void editor_controller::generate_map_dialog()
|
||||
{
|
||||
if (map_generator_ == NULL) {
|
||||
// Initialize the map generator if it has not been used before
|
||||
const config* const toplevel_cfg = game_config_.find_child("multiplayer","id","multiplayer_Random_Map");
|
||||
const config* const cfg = toplevel_cfg == NULL ? NULL : toplevel_cfg->child("generator");
|
||||
if (cfg == NULL) {
|
||||
WRN_ED << "No random map generator\n";
|
||||
return;
|
||||
}
|
||||
else {
|
||||
map_generator_ = create_map_generator("", cfg);
|
||||
}
|
||||
if (map_generators_.empty()) {
|
||||
gui::message_dialog(gui(), _("Error"), _("No random map generators found")).show();
|
||||
return;
|
||||
}
|
||||
|
||||
gui2::teditor_generate_map dialog;
|
||||
dialog.set_map_generator(map_generator_);
|
||||
dialog.set_map_generators(map_generators_);
|
||||
dialog.set_gui(&gui());
|
||||
dialog.show(gui().video());
|
||||
|
||||
|
@ -299,7 +305,7 @@ void editor_controller::generate_map_dialog()
|
|||
if(res == gui2::twindow::OK) {
|
||||
if (!confirm_discard()) return;
|
||||
std::string map_string =
|
||||
map_generator_->create_map(std::vector<std::string>());
|
||||
dialog.get_selected_map_generator()->create_map(std::vector<std::string>());
|
||||
if (map_string.empty()) {
|
||||
gui::message_dialog(gui(), "",
|
||||
_("Map creation failed.")).show();
|
||||
|
|
|
@ -292,7 +292,7 @@ class editor_controller : public controller_base,
|
|||
/** The display object used and owned by the editor. */
|
||||
editor_display* gui_;
|
||||
|
||||
map_generator* map_generator_;
|
||||
std::vector<map_generator*> map_generators_;
|
||||
|
||||
/** Legacy object required by the legacy terrain palette and brush bar */
|
||||
size_specs* size_specs_;
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "gui/dialogs/helper.hpp"
|
||||
|
||||
#include "gui/widgets/button.hpp"
|
||||
#include "gui/widgets/label.hpp"
|
||||
#include "gui/widgets/widget.hpp"
|
||||
#include "gui/widgets/window.hpp"
|
||||
#include "gui/widgets/window_builder.hpp"
|
||||
|
@ -34,17 +35,42 @@
|
|||
namespace gui2 {
|
||||
|
||||
teditor_generate_map::teditor_generate_map()
|
||||
: map_generator_(NULL), gui_(NULL)
|
||||
: map_generators_(), current_map_generator_(0),
|
||||
current_generator_label_(NULL), gui_(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
void teditor_generate_map::do_settings(twindow& /*window*/)
|
||||
{
|
||||
if (map_generator_->allow_user_config()) {
|
||||
map_generator_->user_config(*gui_);
|
||||
map_generator* mg = get_selected_map_generator();
|
||||
if (mg->allow_user_config()) {
|
||||
mg->user_config(*gui_);
|
||||
}
|
||||
}
|
||||
|
||||
void teditor_generate_map::do_next_generator(twindow& /*window*/)
|
||||
{
|
||||
current_map_generator_++;
|
||||
current_map_generator_ %= map_generators_.size();
|
||||
update_current_generator_label();
|
||||
}
|
||||
|
||||
map_generator* teditor_generate_map::get_selected_map_generator()
|
||||
{
|
||||
assert(current_map_generator_ >= 0 && current_map_generator_ < map_generators_.size());
|
||||
return map_generators_[current_map_generator_];
|
||||
}
|
||||
|
||||
void teditor_generate_map::update_current_generator_label()
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << lexical_cast<std::string>(current_map_generator_ + 1);
|
||||
ss << "/" << lexical_cast<std::string>(map_generators_.size());
|
||||
ss << ": " << get_selected_map_generator()->name() << ", " << get_selected_map_generator()->config_name();
|
||||
ERR_ED << ss.str() << "\n";
|
||||
current_generator_label_->set_label(ss.str());
|
||||
}
|
||||
|
||||
twindow teditor_generate_map::build_window(CVideo& video)
|
||||
{
|
||||
return build(video, get_id(EDITOR_GENERATE_MAP));
|
||||
|
@ -52,11 +78,16 @@ twindow teditor_generate_map::build_window(CVideo& video)
|
|||
|
||||
void teditor_generate_map::pre_show(CVideo& /*video*/, twindow& window)
|
||||
{
|
||||
assert(map_generator_);
|
||||
assert(!map_generators_.empty());
|
||||
assert(gui_);
|
||||
current_generator_label_ = &window.get_widget<tlabel>("current_generator", false);
|
||||
tbutton& settings_button = window.get_widget<tbutton>("settings", false);
|
||||
settings_button.set_callback_mouse_left_click(
|
||||
dialog_callback<teditor_generate_map, &teditor_generate_map::do_settings>);
|
||||
tbutton& next_generator_button = window.get_widget<tbutton>("next_generator", false);
|
||||
next_generator_button.set_callback_mouse_left_click(
|
||||
dialog_callback<teditor_generate_map, &teditor_generate_map::do_next_generator>);
|
||||
update_current_generator_label();
|
||||
}
|
||||
|
||||
void teditor_generate_map::post_show(twindow& /*window*/)
|
||||
|
|
|
@ -17,21 +17,33 @@
|
|||
|
||||
#include "gui/dialogs/dialog.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
class map_generator;
|
||||
|
||||
class display;
|
||||
|
||||
namespace gui2 {
|
||||
|
||||
class tlabel;
|
||||
|
||||
class teditor_generate_map : public tdialog
|
||||
{
|
||||
public:
|
||||
teditor_generate_map();
|
||||
|
||||
/** Callback for the settings button */
|
||||
void do_settings(twindow& window);
|
||||
|
||||
void set_map_generator(map_generator* mg) { map_generator_ = mg; }
|
||||
map_generator* get_map_generator() { return map_generator_; }
|
||||
/** Callback for the next generator button */
|
||||
void do_next_generator(twindow& window);
|
||||
|
||||
void set_map_generators(std::vector<map_generator*> mg) { map_generators_ = mg; }
|
||||
std::vector<map_generator*> get_map_generators() { return map_generators_; }
|
||||
|
||||
map_generator* get_selected_map_generator();
|
||||
|
||||
void update_current_generator_label();
|
||||
|
||||
void set_gui(display* d) { gui_ = d; }
|
||||
display* get_gui() { return gui_; }
|
||||
|
@ -46,8 +58,17 @@ private:
|
|||
/** Inherited from tdialog. */
|
||||
void post_show(twindow& window);
|
||||
|
||||
map_generator* map_generator_;
|
||||
/** Available map generators */
|
||||
std::vector<map_generator*> map_generators_;
|
||||
|
||||
/** Current map generator index */
|
||||
int current_map_generator_;
|
||||
|
||||
/** Label for the current map generator */
|
||||
tlabel* current_generator_label_;
|
||||
|
||||
|
||||
/** Needed for the old-style map generator settings dialog */
|
||||
display* gui_;
|
||||
};
|
||||
|
||||
|
|
|
@ -44,6 +44,10 @@ public:
|
|||
//! Returns a string identifying the generator by name.
|
||||
//! The name should not contain spaces.
|
||||
virtual std::string name() const = 0;
|
||||
|
||||
//! Return a friendly name for the generator
|
||||
//! used to differentiate between different configs of the same generator
|
||||
virtual std::string config_name() const = 0;
|
||||
|
||||
//! Creates a new map and returns it.
|
||||
//! args may contain arguments to the map generator.
|
||||
|
|
|
@ -330,6 +330,16 @@ void default_map_generator::user_config(display& disp)
|
|||
|
||||
std::string default_map_generator::name() const { return "default"; }
|
||||
|
||||
std::string default_map_generator::config_name() const
|
||||
{
|
||||
const config* c = cfg_.child("scenario");
|
||||
if (c != NULL) {
|
||||
return (*c)["name"];
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
std::string default_map_generator::create_map(const std::vector<std::string>& args)
|
||||
{
|
||||
return generate_map(args);
|
||||
|
|
|
@ -27,6 +27,8 @@ public:
|
|||
void user_config(display& disp);
|
||||
|
||||
std::string name() const;
|
||||
|
||||
std::string config_name() const;
|
||||
|
||||
std::string create_map(const std::vector<std::string>& args);
|
||||
config create_scenario(const std::vector<std::string>& args);
|
||||
|
|
Loading…
Add table
Reference in a new issue