1
// Copyright (C) 2007 Ole Laursen
2
// Copyright (C) 2007, 2008, 2009 Ben Asselstine
4
// This program is free software; you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 3 of the License, or
7
// (at your option) any later version.
9
// This program is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
// GNU Library General Public License for more details.
14
// You should have received a copy of the GNU General Public License
15
// along with this program; if not, write to the Free Software
16
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22
#include <sigc++/functors/mem_fun.h>
25
#include "new-random-map-dialog.h"
27
#include "glade-helpers.h"
31
#include "tilesetlist.h"
32
#include "armysetlist.h"
33
#include "citysetlist.h"
34
#include "shieldsetlist.h"
35
#include "ucompose.hpp"
37
#include "GameScenarioOptions.h"
40
NewRandomMapDialog::NewRandomMapDialog()
42
Glib::RefPtr<Gtk::Builder> xml
43
= Gtk::Builder::create_from_file(get_glade_path() +
44
"/new-random-map-dialog.ui");
46
xml->get_widget("dialog", dialog);
47
dialog->set_icon_from_file(File::getMiscFile("various/castle_icon.png"));
50
xml->get_widget("map_size_combobox", map_size_combobox);
51
xml->get_widget("random_map_container", random_map_container);
52
xml->get_widget("grass_scale", grass_scale);
53
xml->get_widget("water_scale", water_scale);
54
xml->get_widget("swamp_scale", swamp_scale);
55
xml->get_widget("forest_scale", forest_scale);
56
xml->get_widget("hills_scale", hills_scale);
57
xml->get_widget("mountains_scale", mountains_scale);
58
xml->get_widget("cities_scale", cities_scale);
59
xml->get_widget("ruins_scale", ruins_scale);
60
xml->get_widget("temples_scale", temples_scale);
61
xml->get_widget("accept_button", accept_button);
62
xml->get_widget("grass_random_togglebutton", grass_random_togglebutton);
63
grass_random_togglebutton->signal_toggled().connect
64
(sigc::mem_fun(*this, &NewRandomMapDialog::on_grass_random_toggled));
65
xml->get_widget("water_random_togglebutton", water_random_togglebutton);
66
water_random_togglebutton->signal_toggled().connect
67
(sigc::mem_fun(*this, &NewRandomMapDialog::on_water_random_toggled));
68
xml->get_widget("swamp_random_togglebutton", swamp_random_togglebutton);
69
swamp_random_togglebutton->signal_toggled().connect
70
(sigc::mem_fun(*this, &NewRandomMapDialog::on_swamp_random_toggled));
71
xml->get_widget("forest_random_togglebutton", forest_random_togglebutton);
72
forest_random_togglebutton->signal_toggled().connect
73
(sigc::mem_fun(*this, &NewRandomMapDialog::on_forest_random_toggled));
74
xml->get_widget("hills_random_togglebutton", hills_random_togglebutton);
75
hills_random_togglebutton->signal_toggled().connect
76
(sigc::mem_fun(*this, &NewRandomMapDialog::on_hills_random_toggled));
77
xml->get_widget("mountains_random_togglebutton", mountains_random_togglebutton);
78
mountains_random_togglebutton->signal_toggled().connect
79
(sigc::mem_fun(*this, &NewRandomMapDialog::on_mountains_random_toggled));
80
xml->get_widget("cities_random_togglebutton", cities_random_togglebutton);
81
cities_random_togglebutton->signal_toggled().connect
82
(sigc::mem_fun(*this, &NewRandomMapDialog::on_cities_random_toggled));
84
// fill in tile themes combobox
87
guint32 default_id = 0;
90
//fill in tile sizes combobox
91
tile_size_combobox = manage(new Gtk::ComboBoxText);
92
std::list<guint32> sizes;
93
Tilesetlist::getInstance()->getSizes(sizes);
94
Citysetlist::getInstance()->getSizes(sizes);
95
Armysetlist::getInstance()->getSizes(sizes);
96
for (std::list<guint32>::iterator it = sizes.begin(); it != sizes.end();
99
Glib::ustring s = String::ucompose("%1x%1", *it);
100
tile_size_combobox->append_text(s);
101
if ((*it) == Tileset::getDefaultTileSize())
102
default_id = counter;
105
tile_size_combobox->set_active(default_id);
106
xml->get_widget("tile_size_box", box);
107
box->pack_start(*tile_size_combobox, Gtk::PACK_SHRINK);
108
tile_size_combobox->signal_changed().connect
109
(sigc::mem_fun(*this, &NewRandomMapDialog::on_tile_size_changed));
111
// make new tile themes combobox
112
tile_theme_combobox = manage(new Gtk::ComboBoxText);
113
xml->get_widget("tile_theme_box", box);
114
box->pack_start(*tile_theme_combobox, Gtk::PACK_SHRINK);
116
// make new army themes combobox
117
army_theme_combobox = manage(new Gtk::ComboBoxText);
118
xml->get_widget("army_theme_box", box);
119
box->pack_start(*army_theme_combobox, Gtk::PACK_SHRINK);
121
// make new city themes combobox
122
city_theme_combobox = manage(new Gtk::ComboBoxText);
123
xml->get_widget("city_theme_box", box);
124
box->pack_start(*city_theme_combobox, Gtk::PACK_SHRINK);
128
shield_theme_combobox = manage(new Gtk::ComboBoxText);
129
Shieldsetlist *sl = Shieldsetlist::getInstance();
130
std::list<std::string> shield_themes = sl->getNames();
131
for (std::list<std::string>::iterator i = shield_themes.begin(),
132
end = shield_themes.end(); i != end; ++i)
134
if (*i == _("Default"))
135
default_id = counter;
136
shield_theme_combobox->append_text(Glib::filename_to_utf8(*i));
140
shield_theme_combobox->set_active(default_id);
142
xml->get_widget("shield_theme_box", box);
143
box->pack_start(*shield_theme_combobox, Gtk::PACK_SHRINK);
145
on_tile_size_changed();
148
map_size_combobox->set_active(MAP_SIZE_NORMAL);
149
map_size_combobox->signal_changed().connect(
150
sigc::mem_fun(*this, &NewRandomMapDialog::on_map_size_changed));
151
on_map_size_changed();
153
Gtk::Label *temples_label;
154
xml->get_widget("temples_label", temples_label);
155
temples_label->set_sensitive(false);
156
temples_scale->set_sensitive(false);
158
Gtk::Label *ruins_label;
159
xml->get_widget("ruins_label", ruins_label);
160
ruins_label->set_sensitive(false);
161
ruins_scale->set_sensitive(false);
163
xml->get_widget("cities_can_produce_allies_checkbutton",
164
cities_can_produce_allies_checkbutton);
165
grass_scale->set_value(78);
166
water_scale->set_value(7);
167
swamp_scale->set_value(2);
168
forest_scale->set_value(3);
169
hills_scale->set_value(5);
170
mountains_scale->set_value(5);
173
NewRandomMapDialog::~NewRandomMapDialog()
178
void NewRandomMapDialog::set_parent_window(Gtk::Window &parent)
180
dialog->set_transient_for(parent);
183
int NewRandomMapDialog::run()
186
int response = dialog->run();
187
if (response == Gtk::RESPONSE_ACCEPT) // accepted
189
switch (map_size_combobox->get_active_row_number()) {
191
map.width = MAP_SIZE_SMALL_WIDTH;
192
map.height = MAP_SIZE_SMALL_HEIGHT;
196
map.width = MAP_SIZE_TINY_WIDTH;
197
map.height = MAP_SIZE_TINY_HEIGHT;
200
case MAP_SIZE_NORMAL:
202
map.width = MAP_SIZE_NORMAL_WIDTH;
203
map.height = MAP_SIZE_NORMAL_HEIGHT;
207
map.tileset = Tilesetlist::getInstance()->getTilesetDir
208
(Glib::filename_from_utf8(tile_theme_combobox->get_active_text()),
209
get_active_tile_size());
211
map.shieldset = Shieldsetlist::getInstance()->getShieldsetDir
212
(Glib::filename_from_utf8(shield_theme_combobox->get_active_text()));
214
map.cityset = Citysetlist::getInstance()->getCitysetDir
215
(Glib::filename_from_utf8(city_theme_combobox->get_active_text()),
216
get_active_tile_size());
218
map.armyset = Armysetlist::getInstance()->getArmysetDir
219
(Glib::filename_from_utf8(army_theme_combobox->get_active_text()),
220
get_active_tile_size());
222
map.grass = int(grass_scale->get_value());
223
map.water = int(water_scale->get_value());
224
map.swamp = int(swamp_scale->get_value());
225
map.forest = int(forest_scale->get_value());
226
map.hills = int(hills_scale->get_value());
227
map.mountains = int(mountains_scale->get_value());
228
map.cities = int(cities_scale->get_value());
229
map.ruins = int(ruins_scale->get_value());
230
map.temples = int(temples_scale->get_value());
231
map.signposts = 0; //auto-set in driver
236
void NewRandomMapDialog::on_map_size_changed()
238
switch (map_size_combobox->get_active_row_number()) {
240
cities_scale->set_value(15);
241
ruins_scale->set_value(20);
242
temples_scale->set_value(4);
246
cities_scale->set_value(10);
247
ruins_scale->set_value(15);
248
temples_scale->set_value(4);
251
case MAP_SIZE_NORMAL:
253
cities_scale->set_value(20);
254
ruins_scale->set_value(25);
255
temples_scale->set_value(4);
260
guint32 NewRandomMapDialog::get_active_tile_size()
262
return (guint32) atoi(tile_size_combobox->get_active_text().c_str());
265
void NewRandomMapDialog::on_tile_size_changed()
267
guint32 default_id = 0;
270
accept_button->set_sensitive(true);
271
tile_theme_combobox->clear_items();
272
Tilesetlist *tl = Tilesetlist::getInstance();
273
std::list<std::string> tile_themes = tl->getNames(get_active_tile_size());
274
for (std::list<std::string>::iterator i = tile_themes.begin(),
275
end = tile_themes.end(); i != end; ++i)
277
if (*i == _("Default"))
278
default_id = counter;
279
tile_theme_combobox->append_text(Glib::filename_to_utf8(*i));
284
tile_theme_combobox->set_active(default_id);
286
accept_button->set_sensitive(false);
288
army_theme_combobox->clear_items();
289
Armysetlist *al = Armysetlist::getInstance();
290
std::list<std::string> army_themes = al->getNames(get_active_tile_size());
293
for (std::list<std::string>::iterator i = army_themes.begin(),
294
end = army_themes.end(); i != end; ++i)
296
if (*i == _("Default"))
297
default_id = counter;
298
army_theme_combobox->append_text(Glib::filename_to_utf8(*i));
303
army_theme_combobox->set_active(default_id);
305
accept_button->set_sensitive(false);
307
city_theme_combobox->clear_items();
308
Citysetlist *cl = Citysetlist::getInstance();
309
std::list<std::string> city_themes = cl->getNames(get_active_tile_size());
312
for (std::list<std::string>::iterator i = city_themes.begin(),
313
end = city_themes.end(); i != end; ++i)
315
if (*i == _("Default"))
316
default_id = counter;
317
city_theme_combobox->append_text(Glib::filename_to_utf8(*i));
322
city_theme_combobox->set_active(default_id);
324
accept_button->set_sensitive(false);
327
GameParameters NewRandomMapDialog::getParams()
330
GameParameters::Player p;
331
p.type = GameParameters::Player::HUMAN;
333
p.name = _("The Sirians");
335
g.players.push_back(p);
336
p.name = _("Elvallie");
338
g.players.push_back(p);
339
p.name = _("Storm Giants");
341
g.players.push_back(p);
342
p.name = _("The Selentines");
344
g.players.push_back(p);
345
p.name = _("Grey Dwarves");
347
g.players.push_back(p);
348
p.name = _("Horse Lords");
350
g.players.push_back(p);
351
p.name = _("Orcs of Kor");
353
g.players.push_back(p);
354
p.name = _("Lord Bane");
356
g.players.push_back(p);
359
switch (map_size_combobox->get_active_row_number()) {
361
g.map.width = MAP_SIZE_SMALL_WIDTH;
362
g.map.height = MAP_SIZE_SMALL_HEIGHT;
363
g.map.ruins = int(ruins_scale->get_value());
364
g.map.temples = int(temples_scale->get_value());
368
g.map.width = MAP_SIZE_TINY_WIDTH;
369
g.map.height = MAP_SIZE_TINY_HEIGHT;
370
g.map.ruins = int(ruins_scale->get_value());
371
g.map.temples = int(temples_scale->get_value());
374
case MAP_SIZE_NORMAL:
376
g.map.width = MAP_SIZE_NORMAL_WIDTH;
377
g.map.height = MAP_SIZE_NORMAL_HEIGHT;
378
g.map.ruins = int(ruins_scale->get_value());
379
g.map.temples = int(temples_scale->get_value());
383
if (grass_random_togglebutton->get_active())
385
int(grass_scale->get_adjustment()->get_lower()) +
386
(rand() % (int(grass_scale->get_adjustment()->get_upper()) -
387
int(grass_scale->get_adjustment()->get_lower()) + 1));
389
g.map.grass = int(grass_scale->get_value());
391
if (water_random_togglebutton->get_active())
393
int(water_scale->get_adjustment()->get_lower()) +
394
(rand() % (int(water_scale->get_adjustment()->get_upper()) -
395
int(water_scale->get_adjustment()->get_lower()) + 1));
397
g.map.water = int(water_scale->get_value());
399
if (swamp_random_togglebutton->get_active())
401
int(swamp_scale->get_adjustment()->get_lower()) +
402
(rand() % (int(swamp_scale->get_adjustment()->get_upper()) -
403
int(swamp_scale->get_adjustment()->get_lower()) + 1));
405
g.map.swamp = int(swamp_scale->get_value());
407
if (forest_random_togglebutton->get_active())
409
int(forest_scale->get_adjustment()->get_lower()) +
410
(rand() % (int(forest_scale->get_adjustment()->get_upper()) -
411
int(forest_scale->get_adjustment()->get_lower()) + 1));
413
g.map.forest = int(forest_scale->get_value());
415
if (hills_random_togglebutton->get_active())
417
int(hills_scale->get_adjustment()->get_lower()) +
418
(rand() % (int(hills_scale->get_adjustment()->get_upper()) -
419
int(hills_scale->get_adjustment()->get_lower()) + 1));
421
g.map.hills = int(hills_scale->get_value());
423
if (mountains_random_togglebutton->get_active())
425
int(mountains_scale->get_adjustment()->get_lower()) +
426
(rand() % (int(mountains_scale->get_adjustment()->get_upper()) -
427
int(mountains_scale->get_adjustment()->get_lower())
430
g.map.mountains = int(mountains_scale->get_value());
432
if (cities_random_togglebutton->get_active())
434
int(cities_scale->get_adjustment()->get_lower()) +
435
(rand() % (int(cities_scale->get_adjustment()->get_upper()) -
436
int(cities_scale->get_adjustment()->get_lower()) + 1));
438
g.map.cities = int(cities_scale->get_value());
440
Tilesetlist *tl = Tilesetlist::getInstance();
441
Armysetlist *al = Armysetlist::getInstance();
442
Shieldsetlist *sl = Shieldsetlist::getInstance();
443
Citysetlist *cl = Citysetlist::getInstance();
444
g.tile_theme = tl->getTilesetDir
445
(Glib::filename_from_utf8(tile_theme_combobox->get_active_text()),
446
get_active_tile_size());
448
g.army_theme = al->getArmysetDir
449
(Glib::filename_from_utf8(army_theme_combobox->get_active_text()),
450
get_active_tile_size());
452
g.shield_theme = sl->getShieldsetDir
453
(Glib::filename_from_utf8(shield_theme_combobox->get_active_text()));
455
g.city_theme = cl->getCitysetDir
456
(Glib::filename_from_utf8(city_theme_combobox->get_active_text()),
457
get_active_tile_size());
459
g.process_armies = GameParameters::PROCESS_ARMIES_AT_PLAYERS_TURN;
461
g.see_opponents_stacks = GameScenarioOptions::s_see_opponents_stacks;
462
g.see_opponents_production = GameScenarioOptions::s_see_opponents_production;
463
g.play_with_quests = GameScenarioOptions::s_play_with_quests;
464
g.hidden_map = GameScenarioOptions::s_hidden_map;
465
g.neutral_cities = GameScenarioOptions::s_neutral_cities;
466
g.razing_cities = GameScenarioOptions::s_razing_cities;
467
g.diplomacy = GameScenarioOptions::s_diplomacy;
468
g.random_turns = GameScenarioOptions::s_random_turns;
469
g.quick_start = Configuration::s_quick_start;
470
g.intense_combat = GameScenarioOptions::s_intense_combat;
471
g.military_advisor = GameScenarioOptions::s_military_advisor;
472
g.cities_can_produce_allies =
473
cities_can_produce_allies_checkbutton->get_active();
475
g.name = _("Autogenerated");
479
void NewRandomMapDialog::on_grass_random_toggled()
481
grass_scale->set_sensitive(!grass_random_togglebutton->get_active());
484
void NewRandomMapDialog::on_water_random_toggled()
486
water_scale->set_sensitive(!water_random_togglebutton->get_active());
489
void NewRandomMapDialog::on_swamp_random_toggled()
491
swamp_scale->set_sensitive(!swamp_random_togglebutton->get_active());
494
void NewRandomMapDialog::on_forest_random_toggled()
496
forest_scale->set_sensitive(!forest_random_togglebutton->get_active());
499
void NewRandomMapDialog::on_hills_random_toggled()
501
hills_scale->set_sensitive(!hills_random_togglebutton->get_active());
504
void NewRandomMapDialog::on_mountains_random_toggled()
506
mountains_scale->set_sensitive(!mountains_random_togglebutton->get_active());
509
void NewRandomMapDialog::on_cities_random_toggled()
511
cities_scale->set_sensitive(!cities_random_togglebutton->get_active());