1 //  Copyright (C) 2007, 2008, 2009, 2011, 2014, 2017 Ben Asselstine
2 //
3 //  This program is free software; you can redistribute it and/or modify
4 //  it under the terms of the GNU General Public License as published by
5 //  the Free Software Foundation; either version 3 of the License, or
6 //  (at your option) any later version.
7 //
8 //  This program is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 //  GNU Library General Public License for more details.
12 //
13 //  You should have received a copy of the GNU General Public License
14 //  along with this program; if not, write to the Free Software
15 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 //  02110-1301, USA.
17 
18 #include <config.h>
19 
20 #include <gtkmm.h>
21 #include <sigc++/functors/mem_fun.h>
22 
23 #include "game-options-dialog.h"
24 
25 #include "Configuration.h"
26 #include "GameScenarioOptions.h"
27 
28 #define method(x) sigc::mem_fun(*this, &GameOptionsDialog::x)
29 
GameOptionsDialog(Gtk::Window & parent,bool readonly)30 GameOptionsDialog::GameOptionsDialog(Gtk::Window &parent, bool readonly)
31  : LwDialog(parent, "game-options-dialog.ui")
32 {
33     d_readonly = readonly;
34     xml->get_widget("difficultoptionstable", difficultoptionstable);
35     xml->get_widget("notdifficultoptionstable", notdifficultoptionstable);
36     xml->get_widget("view_enemies_switch", view_enemies_switch);
37     xml->get_widget("view_production_switch", view_production_switch);
38     xml->get_widget("quests_combobox", quests_combobox);
39     xml->get_widget("hidden_map_switch", hidden_map_switch);
40     xml->get_widget("neutral_combobox", neutral_cities_combobox);
41     xml->get_widget("vectoring_combobox", vectoring_combobox);
42     xml->get_widget("build_production_combobox", build_production_combobox);
43     xml->get_widget("sack_combobox", sack_combobox);
44     xml->get_widget("razing_combobox", razing_cities_combobox);
45     xml->get_widget("diplomacy_switch", diplomacy_switch);
46     xml->get_widget("military_advisor_switch",
47                     military_advisor_switch);
48     xml->get_widget("quick_start_combobox", quick_start_combobox);
49     xml->get_widget("cusp_of_war_switch", cusp_of_war_switch);
50     xml->get_widget("intense_combat_switch", intense_combat_switch);
51     xml->get_widget("random_turns_switch", random_turns_switch);
52     xml->get_widget("notebook", notebook);
53 }
54 
fill_in_options()55 void GameOptionsDialog::fill_in_options()
56 {
57     neutral_cities_combobox->set_active(GameScenarioOptions::s_neutral_cities);
58     vectoring_combobox->set_active(GameScenarioOptions::s_vectoring_mode);
59     build_production_combobox->set_active(GameScenarioOptions::s_build_production_mode);
60     sack_combobox->set_active(GameScenarioOptions::s_sacking_mode);
61     razing_cities_combobox->set_active(GameScenarioOptions::s_razing_cities);
62 
63     view_enemies_switch->set_active(GameScenarioOptions::s_see_opponents_stacks);
64     view_production_switch->set_active(GameScenarioOptions::s_see_opponents_production);
65     quests_combobox->set_active(int(GameScenarioOptions::s_play_with_quests));
66     hidden_map_switch->set_active(GameScenarioOptions::s_hidden_map);
67     razing_cities_combobox->set_active(int(GameScenarioOptions::s_razing_cities));
68     diplomacy_switch->set_active(GameScenarioOptions::s_diplomacy);
69     military_advisor_switch->set_active(GameScenarioOptions::s_military_advisor);
70     quick_start_combobox->set_active(Configuration::s_quick_start);
71     cusp_of_war_switch->set_active(GameScenarioOptions::s_cusp_of_war);
72     cusp_of_war_switch->set_sensitive(diplomacy_switch->get_active());
73     intense_combat_switch->set_active(GameScenarioOptions::s_intense_combat);
74     random_turns_switch->set_active(GameScenarioOptions::s_random_turns);
75     if (d_readonly)
76       {
77 	difficultoptionstable->set_sensitive(false);
78 	notdifficultoptionstable->set_sensitive(false);
79       }
80 }
81 
run()82 bool GameOptionsDialog::run()
83 {
84   std::list<sigc::connection> connections;
85     GameParameters g;
86     fill_in_options();
87     connections.push_back (view_enemies_switch->property_active().signal_changed().connect
88                            (method (on_view_enemies_switch_clicked)));
89     connections.push_back (view_production_switch->property_active().signal_changed().connect
90                            (method(on_view_production_switch_clicked)));
91     connections.push_back (quests_combobox->signal_changed().connect
92                            (method(on_quests_combobox_changed)));
93     connections.push_back (hidden_map_switch->property_active().signal_changed().connect
94                            (method(on_hidden_map_switch_clicked)));
95     connections.push_back (neutral_cities_combobox->signal_changed().connect
96                            (method(on_neutral_cities_combobox_changed)));
97     connections.push_back (vectoring_combobox->signal_changed().connect
98                            (method(on_vectoring_combobox_changed)));
99     connections.push_back (build_production_combobox->signal_changed().connect
100                            (method(on_build_production_combobox_changed)));
101     connections.push_back (sack_combobox->signal_changed().connect
102                            (method(on_sacking_combobox_changed)));
103     connections.push_back (razing_cities_combobox->signal_changed().connect
104                            (method (on_razing_cities_combobox_changed)));
105     connections.push_back (diplomacy_switch->property_active().signal_changed().connect
106                            (method (on_diplomacy_switch_clicked)));
107     connections.push_back (cusp_of_war_switch->property_active().signal_changed().connect
108                            (method(on_cusp_of_war_switch_clicked)));
109     connections.push_back (random_turns_switch->property_active().signal_changed().connect
110                            (method (on_random_turns_switch_clicked)));
111     connections.push_back (quick_start_combobox->signal_changed().connect
112                            (method (on_quick_start_combobox_changed)));
113     connections.push_back (intense_combat_switch->property_active().signal_changed().connect
114                            (method (on_intense_combat_switch_clicked)));
115     connections.push_back (military_advisor_switch->property_active().signal_changed().connect
116                            (method (on_military_advisor_switch_clicked)));
117 
118     dialog->run();
119 
120     std::list<sigc::connection>::iterator it = connections.begin();
121     for (; it != connections.end(); it++)
122       (*it).disconnect();
123     connections.clear();
124 
125     g.see_opponents_stacks = view_enemies_switch->get_active();
126     GameScenarioOptions::s_see_opponents_stacks = g.see_opponents_stacks;
127     g.see_opponents_production = view_production_switch->get_active();
128     GameScenarioOptions::s_see_opponents_production = g.see_opponents_production;
129     g.play_with_quests = GameParameters::QuestPolicy (
130 	quests_combobox->get_active_row_number());
131     GameScenarioOptions::s_play_with_quests = g.play_with_quests;
132 
133     g.hidden_map = hidden_map_switch->get_active();
134     GameScenarioOptions::s_hidden_map = g.hidden_map;
135 
136     g.neutral_cities = GameParameters::NeutralCities (
137 	neutral_cities_combobox->get_active_row_number());
138     GameScenarioOptions::s_neutral_cities = g.neutral_cities;
139     g.vectoring_mode = GameParameters::VectoringMode(
140 	vectoring_combobox->get_active_row_number());
141     GameScenarioOptions::s_vectoring_mode = g.vectoring_mode;
142     g.build_production_mode = GameParameters::BuildProductionMode(
143 	build_production_combobox->get_active_row_number());
144     GameScenarioOptions::s_build_production_mode = g.build_production_mode;
145     g.sacking_mode = GameParameters::SackingMode(
146 	sack_combobox->get_active_row_number());
147     GameScenarioOptions::s_sacking_mode = g.sacking_mode;
148     g.razing_cities = GameParameters::RazingCities (
149 	razing_cities_combobox->get_active_row_number());
150     GameScenarioOptions::s_razing_cities = g.razing_cities;
151 
152     g.diplomacy = diplomacy_switch->get_active();
153     GameScenarioOptions::s_diplomacy = g.diplomacy;
154     g.random_turns = random_turns_switch->get_active();
155     GameScenarioOptions::s_random_turns = g.random_turns;
156     g.quick_start = GameParameters::QuickStartPolicy(
157 	quick_start_combobox->get_active_row_number());
158     Configuration::s_quick_start = g.quick_start;
159     g.cusp_of_war = cusp_of_war_switch->get_active();
160     GameScenarioOptions::s_cusp_of_war = g.cusp_of_war;
161     g.intense_combat = intense_combat_switch->get_active();
162     GameScenarioOptions::s_intense_combat = g.intense_combat;
163     g.military_advisor = military_advisor_switch->get_active();
164     GameScenarioOptions::s_military_advisor = g.military_advisor;
165     //save it all to Configuration too
166     Configuration::s_see_opponents_stacks =
167       GameScenarioOptions::s_see_opponents_stacks;
168     Configuration::s_see_opponents_production =
169       GameScenarioOptions::s_see_opponents_production;
170     Configuration::s_play_with_quests = GameScenarioOptions::s_play_with_quests;
171     Configuration::s_hidden_map = GameScenarioOptions::s_hidden_map;
172     Configuration::s_neutral_cities = GameScenarioOptions::s_neutral_cities;
173     Configuration::s_vectoring_mode = GameScenarioOptions::s_vectoring_mode;
174     Configuration::s_build_production_mode = GameScenarioOptions::s_build_production_mode;
175     Configuration::s_sacking_mode = GameScenarioOptions::s_sacking_mode;
176     Configuration::s_razing_cities = GameScenarioOptions::s_razing_cities;
177     Configuration::s_diplomacy = GameScenarioOptions::s_diplomacy;
178     Configuration::s_random_turns = GameScenarioOptions::s_random_turns;
179     Configuration::s_cusp_of_war = GameScenarioOptions::s_cusp_of_war;
180     Configuration::s_intense_combat = GameScenarioOptions::s_intense_combat;
181     Configuration::s_military_advisor = GameScenarioOptions::s_military_advisor;
182     Configuration::saveConfigurationFile();
183     dialog->hide();
184     return true;
185 }
186 
on_view_enemies_switch_clicked()187 void GameOptionsDialog::on_view_enemies_switch_clicked()
188 {
189   GameScenarioOptions::s_see_opponents_stacks =
190     view_enemies_switch->get_active();
191   difficulty_option_changed.emit();
192 }
193 
on_view_production_switch_clicked()194 void GameOptionsDialog::on_view_production_switch_clicked()
195 {
196   GameScenarioOptions::s_see_opponents_production =
197     view_production_switch->get_active();
198   difficulty_option_changed.emit();
199 }
200 
on_quests_combobox_changed()201 void GameOptionsDialog::on_quests_combobox_changed()
202 {
203   GameScenarioOptions::s_play_with_quests = GameParameters::QuestPolicy
204     (quests_combobox->get_active_row_number());
205   difficulty_option_changed.emit();
206 }
207 
on_hidden_map_switch_clicked()208 void GameOptionsDialog::on_hidden_map_switch_clicked()
209 {
210   GameScenarioOptions::s_hidden_map = hidden_map_switch->get_active();
211   difficulty_option_changed.emit();
212 }
213 
on_neutral_cities_combobox_changed()214 void GameOptionsDialog::on_neutral_cities_combobox_changed()
215 {
216   GameScenarioOptions::s_neutral_cities = GameParameters::NeutralCities
217     (neutral_cities_combobox->get_active_row_number());
218   difficulty_option_changed.emit();
219 }
220 
on_vectoring_combobox_changed()221 void GameOptionsDialog::on_vectoring_combobox_changed()
222 {
223   GameScenarioOptions::s_vectoring_mode = GameParameters::VectoringMode
224     (vectoring_combobox->get_active_row_number());
225 }
226 
on_build_production_combobox_changed()227 void GameOptionsDialog::on_build_production_combobox_changed()
228 {
229   GameScenarioOptions::s_build_production_mode =
230     GameParameters::BuildProductionMode
231     (build_production_combobox->get_active_row_number());
232 }
233 
on_sacking_combobox_changed()234 void GameOptionsDialog::on_sacking_combobox_changed()
235 {
236   GameScenarioOptions::s_sacking_mode =
237     GameParameters::SackingMode (sack_combobox->get_active_row_number());
238 }
239 
on_razing_cities_combobox_changed()240 void GameOptionsDialog::on_razing_cities_combobox_changed()
241 {
242   GameScenarioOptions::s_razing_cities = GameParameters::RazingCities
243     (razing_cities_combobox->get_active_row_number());
244   difficulty_option_changed.emit();
245 }
246 
on_diplomacy_switch_clicked()247 void GameOptionsDialog::on_diplomacy_switch_clicked()
248 {
249   if (diplomacy_switch->get_active() == true)
250     cusp_of_war_switch->set_sensitive(true);
251   else
252     cusp_of_war_switch->set_sensitive(false);
253   GameScenarioOptions::s_diplomacy = diplomacy_switch->get_active();
254   difficulty_option_changed.emit();
255 }
256 
on_cusp_of_war_switch_clicked()257 void GameOptionsDialog::on_cusp_of_war_switch_clicked()
258 {
259   GameScenarioOptions::s_cusp_of_war = cusp_of_war_switch->get_active();
260 }
261 
on_random_turns_switch_clicked()262 void GameOptionsDialog::on_random_turns_switch_clicked()
263 {
264   GameScenarioOptions::s_random_turns = random_turns_switch->get_active();
265 }
266 
on_quick_start_combobox_changed()267 void GameOptionsDialog::on_quick_start_combobox_changed()
268 {
269   Configuration::s_quick_start = GameParameters::QuickStartPolicy
270     (quick_start_combobox->get_active_row_number());
271   difficulty_option_changed.emit();
272 }
273 
on_intense_combat_switch_clicked()274 void GameOptionsDialog::on_intense_combat_switch_clicked()
275 {
276   GameScenarioOptions::s_intense_combat = intense_combat_switch->get_active();
277 }
278 
on_military_advisor_switch_clicked()279 void GameOptionsDialog::on_military_advisor_switch_clicked()
280 {
281   GameScenarioOptions::s_military_advisor = military_advisor_switch->get_active();
282 }
283 
~GameOptionsDialog()284 GameOptionsDialog::~GameOptionsDialog()
285 {
286   notebook->property_show_tabs () = false;
287 }
288