editor2: alllow different map generators to be used

This commit is contained in:
Tomasz Śniatowski 2008-09-04 19:11:26 +01:00
parent f852cdfe00
commit d3e819dd22
10 changed files with 152 additions and 24 deletions

View file

@ -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

View file

@ -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_) {

View file

@ -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);

View file

@ -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();

View file

@ -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_;

View file

@ -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*/)

View file

@ -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_;
};

View file

@ -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.

View file

@ -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);

View file

@ -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);