1 /***************************************************************************
2  *      Mechanized Assault and Exploration Reloaded Projectfile            *
3  *                                                                         *
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 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
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 General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18  ***************************************************************************/
19 
20 #include "ui/graphical/menu/windows/windowgamesettings/windowgamesettings.h"
21 #include "ui/graphical/menu/windows/windowgamesettings/gamesettings.h"
22 #include "main.h"
23 #include "pcx.h"
24 #include "ui/graphical/menu/widgets/label.h"
25 #include "ui/graphical/menu/widgets/pushbutton.h"
26 #include "ui/graphical/menu/widgets/checkbox.h"
27 #include "ui/graphical/menu/widgets/radiogroup.h"
28 #include "ui/graphical/menu/widgets/lineedit.h"
29 #include "ui/graphical/menu/widgets/tools/validatorint.h"
30 
31 //------------------------------------------------------------------------------
cWindowGameSettings(bool forHotSeatGame_)32 cWindowGameSettings::cWindowGameSettings (bool forHotSeatGame_) :
33 	cWindow (LoadPCX (GFXOD_OPTIONS)),
34 	forHotSeatGame (forHotSeatGame_)
35 {
36 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (0, 13), getPosition() + cPosition (getArea().getMaxCorner().x(), 23)), lngPack.i18n ("Text~Others~Game_Options"), FONT_LATIN_NORMAL, eAlignmentType::CenterHorizontal));
37 
38 	int currentLine = 57;
39 	const int lineHeight = 16;
40 
41 	//
42 	// Resources
43 	//
44 
45 	// Metal
46 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Metal") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
47 	auto metalRadioGroup = addChild (std::make_unique<cRadioGroup> ());
48 	metalLimitedCheckBox = metalRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Limited"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
49 	metalNormalCheckBox = metalRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86, currentLine), lngPack.i18n ("Text~Option~Normal"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
50 	metalHighCheckBox = metalRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 2, currentLine), lngPack.i18n ("Text~Option~High"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
51 	metalTooMuchCheckBox = metalRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 3, currentLine), lngPack.i18n ("Text~Option~TooMuch"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
52 	currentLine += lineHeight;
53 
54 	// Oil
55 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Oil") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
56 	auto oilRadioGroup = addChild (std::make_unique<cRadioGroup> ());
57 	oilLimitedCheckBox = oilRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Limited"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
58 	oilNormalCheckBox = oilRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86, currentLine), lngPack.i18n ("Text~Option~Normal"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
59 	oilHighCheckBox = oilRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 2, currentLine), lngPack.i18n ("Text~Option~High"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
60 	oilTooMuchCheckBox = oilRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 3, currentLine), lngPack.i18n ("Text~Option~TooMuch"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
61 	currentLine += lineHeight;
62 
63 	// Gold
64 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Gold") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
65 	auto goldRadioGroup = addChild (std::make_unique<cRadioGroup> ());
66 	goldLimitedCheckBox = goldRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Limited"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
67 	goldNormalCheckBox = goldRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86, currentLine), lngPack.i18n ("Text~Option~Normal"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
68 	goldHighCheckBox = goldRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 2, currentLine), lngPack.i18n ("Text~Option~High"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
69 	goldTooMuchCheckBox = goldRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 3, currentLine), lngPack.i18n ("Text~Option~TooMuch"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
70 	currentLine += lineHeight;
71 
72 	// Density
73 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Resource_Density") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
74 	auto densityRadioGroup = addChild (std::make_unique<cRadioGroup> ());
75 	densitySparseCheckBox = densityRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Sparse"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
76 	densityNormalCheckBox = densityRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86, currentLine), lngPack.i18n ("Text~Option~Normal"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
77 	densityDenseCheckBox = densityRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 2, currentLine), lngPack.i18n ("Text~Option~Dense"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
78 	densityTooMuchCheckBox = densityRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 86 * 3, currentLine), lngPack.i18n ("Text~Option~TooMuch"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
79 	currentLine += lineHeight * 2;
80 
81 	//
82 	// Bridgehead
83 	//
84 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~BridgeHead") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
85 	auto bridgeheadRadioGroup = addChild (std::make_unique<cRadioGroup> ());
86 	bridgeheadMobileCheckBox = bridgeheadRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Mobile"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
87 	bridgeheadDefiniteCheckBox = bridgeheadRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 173, currentLine), lngPack.i18n ("Text~Option~Definite"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
88 	currentLine += lineHeight;
89 
90 	//
91 	// Game type
92 	//
93 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Game_Type") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
94 	auto gameTypeRadioGroup = addChild (std::make_unique<cRadioGroup> ());
95 	gameTypeTurnsCheckBox = gameTypeRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~Type_Turns"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
96 	gameTypeSimultaneousCheckBox = gameTypeRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 173, currentLine), lngPack.i18n ("Text~Option~Type_Simu"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
97 	signalConnectionManager.connect (gameTypeTurnsCheckBox->toggled, [this]()
98 	{
99 		if (gameTypeTurnsCheckBox->isChecked()) disableTurnEndDeadlineOptions();
100 		else enableTurnEndDeadlineOptions();
101 	});
102 	if (forHotSeatGame)
103 	{
104 		gameTypeTurnsCheckBox->disable();
105 		gameTypeTurnsCheckBox->hide();
106 		gameTypeSimultaneousCheckBox->disable();
107 		gameTypeSimultaneousCheckBox->hide();
108 	}
109 	currentLine += lineHeight * 2;
110 
111 	//
112 	// Clans
113 	//
114 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Clans") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
115 	auto clansRadioGroup = addChild (std::make_unique<cRadioGroup> ());
116 	clansOnCheckBox = clansRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Option~On"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
117 	clansOffCheckBox = clansRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 64, currentLine), lngPack.i18n ("Text~Option~Off"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
118 	currentLine += lineHeight * 2;
119 
120 	auto savedLine = currentLine;
121 
122 	//
123 	// Credits
124 	//
125 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Credits_start") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
126 	currentLine += lineHeight;
127 	auto creditsRadioGroup = addChild (std::make_unique<cRadioGroup> ());
128 
129 	creditsNoneCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~None") + " (" + iToStr (cGameSettings::defaultCreditsNone) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
130 	currentLine += lineHeight;
131 	creditsLowCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~Low") + " (" + iToStr (cGameSettings::defaultCreditsLow) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
132 	currentLine += lineHeight;
133 	creditsLimitedCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~Limited") + " (" + iToStr (cGameSettings::defaultCreditsLimited) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
134 	currentLine += lineHeight;
135 	creditsNormalCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~Normal") + " (" + iToStr (cGameSettings::defaultCreditsNormal) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
136 	currentLine += lineHeight;
137 	creditsHighCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~High") + " (" + iToStr (cGameSettings::defaultCreditsHigh) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
138 	currentLine += lineHeight;
139 	creditsMoreCheckBox = creditsRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (140, currentLine), lngPack.i18n ("Text~Option~More") + " (" + iToStr (cGameSettings::defaultCreditsMore) + ")", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
140 	currentLine += lineHeight * 2;
141 
142 	auto savedLine2 = currentLine;
143 
144 	//
145 	// Victory conditions
146 	//
147 	currentLine = savedLine;
148 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (300, currentLine), getPosition() + cPosition (400, currentLine + 10)), lngPack.i18n ("Text~Comp~GameEndsAt") + ":", FONT_LATIN_NORMAL, eAlignmentType::Left));
149 	auto victoryRadioGroup = addChild (std::make_unique<cRadioGroup> ());
150 	currentLine += lineHeight;
151 
152 	savedLine = currentLine;
153 
154 	victoryTurns0CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (380, currentLine), iToStr (cGameSettings::defaultVictoryTurnsOption0) + " " + lngPack.i18n ("Text~Comp~Turns"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
155 	currentLine += lineHeight;
156 	victoryTurns1CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (380, currentLine), iToStr (cGameSettings::defaultVictoryTurnsOption1) + " " + lngPack.i18n ("Text~Comp~Turns"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
157 	currentLine += lineHeight;
158 	victoryTurns2CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (380, currentLine), iToStr (cGameSettings::defaultVictoryTurnsOption2) + " " + lngPack.i18n ("Text~Comp~Turns"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
159 	currentLine += lineHeight;
160 
161 	currentLine = savedLine;
162 
163 	victoryPoints0CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (500, currentLine), iToStr (cGameSettings::defaultVictoryPointsOption0) + " " + lngPack.i18n ("Text~Comp~Points"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
164 	currentLine += lineHeight;
165 	victoryPoints1CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (500, currentLine), iToStr (cGameSettings::defaultVictoryPointsOption1) + " " + lngPack.i18n ("Text~Comp~Points"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
166 	currentLine += lineHeight;
167 	victoryPoints2CheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (500, currentLine), iToStr (cGameSettings::defaultVictoryPointsOption2) + " " + lngPack.i18n ("Text~Comp~Points"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
168 	currentLine += lineHeight;
169 
170 	victoryNoLimitCheckBox = victoryRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (440, currentLine), lngPack.i18n ("Text~Comp~NoLimit"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly, true));
171 	currentLine += lineHeight;
172 
173 	// Turn Limit
174 	currentLine = savedLine2;
175 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)), lngPack.i18n ("Text~Title~Turn_limit"), FONT_LATIN_NORMAL, eAlignmentType::Left));
176 	auto turnLimitRadioGroup = addChild (std::make_unique<cRadioGroup> ());
177 	turnLimitNoLimitCheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Settings~Unlimited_11"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
178 	turnLimit0CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85, currentLine), iToStr (cGameSettings::defaultTurnLimitOption0.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
179 	turnLimit1CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40, currentLine), iToStr (cGameSettings::defaultTurnLimitOption1.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
180 	turnLimit2CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 2, currentLine), iToStr (cGameSettings::defaultTurnLimitOption2.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
181 	turnLimit3CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 3, currentLine), iToStr (cGameSettings::defaultTurnLimitOption3.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
182 	turnLimit4CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 4, currentLine), iToStr (cGameSettings::defaultTurnLimitOption4.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
183 	turnLimit5CheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 5, currentLine), iToStr (cGameSettings::defaultTurnLimitOption5.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
184 	currentLine += lineHeight;
185 	turnLimitCustomCheckBox = turnLimitRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Title~Custom_11") + lngPack.i18n ("Text~Punctuation~Colon"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
186 	signalConnectionManager.connect (turnLimitCustomCheckBox->toggled, [this]() { if (turnLimitCustomCheckBox->isChecked()) turnLimitCustomLineEdit->enable(); else turnLimitCustomLineEdit->disable(); });
187 	turnLimitCustomLineEdit = addChild (std::make_unique<cLineEdit> (cBox<cPosition> (getPosition() + cPosition (240 + 85, currentLine), getPosition() + cPosition (240 + 85 + 30, currentLine + lineHeight))));
188 	addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (240 + 85 + 30, currentLine), getPosition() + cPosition (240 + 85 + 30 + 10, currentLine + 10)), "s", FONT_LATIN_NORMAL, eAlignmentType::Left));
189 	turnLimitCustomLineEdit->setText ("410");
190 	turnLimitCustomLineEdit->setValidator (std::make_unique<cValidatorInt> (0, std::numeric_limits<int>::max()));
191 	turnLimitCustomLineEdit->disable();
192 	currentLine += lineHeight;
193 
194 	// Turn End Deadline
195 	turnEndDeadlineLabel = addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (64, currentLine), getPosition() + cPosition (230, currentLine + 10)),  lngPack.i18n ("Text~Title~Turn_end") + lngPack.i18n ("Text~Punctuation~Colon"), FONT_LATIN_NORMAL, eAlignmentType::Left));
196 	auto turnEndTurnDeadlineRadioGroup = addChild (std::make_unique<cRadioGroup> ());
197 	turnEndTurnDeadlineNoLimitCheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Settings~Unlimited_11"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
198 	turnEndTurnDeadline0CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption0.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
199 	turnEndTurnDeadline1CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption1.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
200 	turnEndTurnDeadline2CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 2, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption2.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
201 	turnEndTurnDeadline3CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 3, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption3.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
202 	turnEndTurnDeadline4CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 4, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption4.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
203 	turnEndTurnDeadline5CheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240 + 85 + 40 * 5, currentLine), iToStr (cGameSettings::defaultEndTurnDeadlineOption5.count()) + "s", FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
204 	currentLine += lineHeight;
205 	turnEndTurnDeadlineCustomCheckBox = turnEndTurnDeadlineRadioGroup->addButton (std::make_unique<cCheckBox> (getPosition() + cPosition (240, currentLine), lngPack.i18n ("Text~Title~Custom_11") + lngPack.i18n ("Text~Punctuation~Colon"), FONT_LATIN_NORMAL, eCheckBoxTextAnchor::Left, eCheckBoxType::TextOnly));
206 	signalConnectionManager.connect (turnEndTurnDeadlineCustomCheckBox->toggled, [this]() { if (turnEndTurnDeadlineCustomCheckBox->isChecked()) turnEndTurnDeadlineLineEdit->enable(); else turnEndTurnDeadlineLineEdit->disable(); });
207 	turnEndTurnDeadlineLineEdit = addChild (std::make_unique<cLineEdit> (cBox<cPosition> (getPosition() + cPosition (240 + 85, currentLine), getPosition() + cPosition (240 + 85 + 30, currentLine + lineHeight))));
208 	turnEndDeadlineSecondsLabel = addChild (std::make_unique<cLabel> (cBox<cPosition> (getPosition() + cPosition (240 + 85 + 30, currentLine), getPosition() + cPosition (240 + 85 + 30 + 10, currentLine + 10)), "s", FONT_LATIN_NORMAL, eAlignmentType::Left));
209 	turnEndTurnDeadlineLineEdit->setText ("105");
210 	turnEndTurnDeadlineLineEdit->setValidator (std::make_unique<cValidatorInt> (0, std::numeric_limits<int>::max()));
211 	turnEndTurnDeadlineLineEdit->disable();
212 	currentLine += lineHeight;
213 
214 	if (forHotSeatGame)
215 	{
216 		disableTurnEndDeadlineOptions();
217 	}
218 
219 	//
220 	// Buttons
221 	//
222 	auto okButton = addChild (std::make_unique<cPushButton> (getPosition() + cPosition (390, 440), ePushButtonType::StandardBig, lngPack.i18n ("Text~Others~OK")));
223 	signalConnectionManager.connect (okButton->clicked, std::bind (&cWindowGameSettings::okClicked, this));
224 
225 	auto backButton = addChild (std::make_unique<cPushButton> (getPosition() + cPosition (50, 440), ePushButtonType::StandardBig, lngPack.i18n ("Text~Others~Back")));
226 	signalConnectionManager.connect (backButton->clicked, std::bind (&cWindowGameSettings::backClicked, this));
227 }
228 
229 //------------------------------------------------------------------------------
~cWindowGameSettings()230 cWindowGameSettings::~cWindowGameSettings()
231 {}
232 
233 //------------------------------------------------------------------------------
applySettings(const cGameSettings & gameSettings)234 void cWindowGameSettings::applySettings (const cGameSettings& gameSettings)
235 {
236 	switch (gameSettings.getMetalAmount())
237 	{
238 		case eGameSettingsResourceAmount::Limited:
239 			metalLimitedCheckBox->setChecked (true);
240 			break;
241 		default:
242 		case eGameSettingsResourceAmount::Normal:
243 			metalNormalCheckBox->setChecked (true);
244 			break;
245 		case eGameSettingsResourceAmount::High:
246 			metalHighCheckBox->setChecked (true);
247 			break;
248 		case eGameSettingsResourceAmount::TooMuch:
249 			metalTooMuchCheckBox->setChecked (true);
250 			break;
251 	}
252 
253 	switch (gameSettings.getOilAmount())
254 	{
255 		case eGameSettingsResourceAmount::Limited:
256 			oilLimitedCheckBox->setChecked (true);
257 			break;
258 		default:
259 		case eGameSettingsResourceAmount::Normal:
260 			oilNormalCheckBox->setChecked (true);
261 			break;
262 		case eGameSettingsResourceAmount::High:
263 			oilHighCheckBox->setChecked (true);
264 			break;
265 		case eGameSettingsResourceAmount::TooMuch:
266 			oilTooMuchCheckBox->setChecked (true);
267 			break;
268 	}
269 
270 	switch (gameSettings.getGoldAmount())
271 	{
272 		case eGameSettingsResourceAmount::Limited:
273 			goldLimitedCheckBox->setChecked (true);
274 			break;
275 		default:
276 		case eGameSettingsResourceAmount::Normal:
277 			goldNormalCheckBox->setChecked (true);
278 			break;
279 		case eGameSettingsResourceAmount::High:
280 			goldHighCheckBox->setChecked (true);
281 			break;
282 		case eGameSettingsResourceAmount::TooMuch:
283 			goldTooMuchCheckBox->setChecked (true);
284 			break;
285 	}
286 
287 	switch (gameSettings.getResourceDensity())
288 	{
289 		case eGameSettingsResourceDensity::Sparse:
290 			densitySparseCheckBox->setChecked (true);
291 			break;
292 		default:
293 		case eGameSettingsResourceDensity::Normal:
294 			densityNormalCheckBox->setChecked (true);
295 			break;
296 		case eGameSettingsResourceDensity::Dense:
297 			densityDenseCheckBox->setChecked (true);
298 			break;
299 		case eGameSettingsResourceDensity::TooMuch:
300 			densityTooMuchCheckBox->setChecked (true);
301 			break;
302 	}
303 
304 	switch (gameSettings.getBridgeheadType())
305 	{
306 		case eGameSettingsBridgeheadType::Mobile:
307 			bridgeheadMobileCheckBox->setChecked (true);
308 			break;
309 		default:
310 		case eGameSettingsBridgeheadType::Definite:
311 			bridgeheadDefiniteCheckBox->setChecked (true);
312 			break;
313 	}
314 
315 	switch (gameSettings.getGameType())
316 	{
317 		case eGameSettingsGameType::Turns:
318 			gameTypeTurnsCheckBox->setChecked (true);
319 			break;
320 		default:
321 		case eGameSettingsGameType::Simultaneous:
322 			gameTypeSimultaneousCheckBox->setChecked (true);
323 			break;
324 	}
325 
326 	if (gameSettings.getClansEnabled()) clansOnCheckBox->setChecked (true);
327 	else clansOffCheckBox->setChecked (true);
328 
329 	if (gameSettings.getStartCredits() < cGameSettings::defaultCreditsLow) creditsNoneCheckBox->setChecked (true);
330 	else if (gameSettings.getStartCredits() < cGameSettings::defaultCreditsLimited) creditsLowCheckBox->setChecked (true);
331 	else if (gameSettings.getStartCredits() < cGameSettings::defaultCreditsNormal) creditsLimitedCheckBox->setChecked (true);
332 	else if (gameSettings.getStartCredits() < cGameSettings::defaultCreditsHigh) creditsNormalCheckBox->setChecked (true);
333 	else if (gameSettings.getStartCredits() < cGameSettings::defaultCreditsMore) creditsHighCheckBox->setChecked (true);
334 	else creditsMoreCheckBox->setChecked (true);
335 
336 	switch (gameSettings.getVictoryCondition())
337 	{
338 		case eGameSettingsVictoryCondition::Turns:
339 			if (gameSettings.getVictoryTurns() < cGameSettings::defaultVictoryTurnsOption1) victoryTurns0CheckBox->setChecked (true);
340 			else if (gameSettings.getVictoryTurns() < cGameSettings::defaultVictoryTurnsOption2) victoryTurns1CheckBox->setChecked (true);
341 			else victoryTurns2CheckBox->setChecked (true);
342 			break;
343 		case eGameSettingsVictoryCondition::Points:
344 			if (gameSettings.getVictoryPoints() < cGameSettings::defaultVictoryPointsOption1) victoryPoints0CheckBox->setChecked (true);
345 			else if (gameSettings.getVictoryPoints() < cGameSettings::defaultVictoryPointsOption2) victoryPoints1CheckBox->setChecked (true);
346 			else victoryPoints2CheckBox->setChecked (true);
347 			break;
348 		default:
349 		case eGameSettingsVictoryCondition::Death:
350 			victoryNoLimitCheckBox->setChecked (true);
351 			break;
352 	}
353 
354 	if (gameSettings.isTurnLimitActive())
355 	{
356 		if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption0) turnLimit0CheckBox->setChecked (true);
357 		else if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption1) turnLimit1CheckBox->setChecked (true);
358 		else if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption2) turnLimit2CheckBox->setChecked (true);
359 		else if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption3) turnLimit3CheckBox->setChecked (true);
360 		else if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption4) turnLimit4CheckBox->setChecked (true);
361 		else if (gameSettings.getTurnLimit() == cGameSettings::defaultTurnLimitOption5) turnLimit5CheckBox->setChecked (true);
362 		else
363 		{
364 			turnLimitCustomCheckBox->setChecked (true);
365 			turnLimitCustomLineEdit->setText (iToStr (gameSettings.getTurnLimit().count()));
366 		}
367 	}
368 	else
369 	{
370 		turnLimitNoLimitCheckBox->setChecked (true);
371 	}
372 
373 	if (gameSettings.isTurnEndDeadlineActive())
374 	{
375 		if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption0) turnEndTurnDeadline0CheckBox->setChecked (true);
376 		else if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption1) turnEndTurnDeadline1CheckBox->setChecked (true);
377 		else if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption2) turnEndTurnDeadline2CheckBox->setChecked (true);
378 		else if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption3) turnEndTurnDeadline3CheckBox->setChecked (true);
379 		else if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption4) turnEndTurnDeadline4CheckBox->setChecked (true);
380 		else if (gameSettings.getTurnEndDeadline() == cGameSettings::defaultEndTurnDeadlineOption5) turnEndTurnDeadline5CheckBox->setChecked (true);
381 		else
382 		{
383 			turnEndTurnDeadlineCustomCheckBox->setChecked (true);
384 			turnEndTurnDeadlineLineEdit->setText (iToStr (gameSettings.getTurnEndDeadline().count()));
385 		}
386 	}
387 	else
388 	{
389 		turnEndTurnDeadlineNoLimitCheckBox->setChecked (true);
390 	}
391 }
392 
393 //------------------------------------------------------------------------------
getGameSettings() const394 cGameSettings cWindowGameSettings::getGameSettings() const
395 {
396 	cGameSettings gameSettings;
397 
398 	if (metalLimitedCheckBox->isChecked()) gameSettings.setMetalAmount (eGameSettingsResourceAmount::Limited);
399 	else if (metalHighCheckBox->isChecked()) gameSettings.setMetalAmount (eGameSettingsResourceAmount::High);
400 	else if (metalTooMuchCheckBox->isChecked()) gameSettings.setMetalAmount (eGameSettingsResourceAmount::TooMuch);
401 	else gameSettings.setMetalAmount (eGameSettingsResourceAmount::Normal);
402 
403 	if (oilLimitedCheckBox->isChecked()) gameSettings.setOilAmount (eGameSettingsResourceAmount::Limited);
404 	else if (oilHighCheckBox->isChecked()) gameSettings.setOilAmount (eGameSettingsResourceAmount::High);
405 	else if (oilTooMuchCheckBox->isChecked()) gameSettings.setOilAmount (eGameSettingsResourceAmount::TooMuch);
406 	else gameSettings.setOilAmount (eGameSettingsResourceAmount::Normal);
407 
408 	if (goldLimitedCheckBox->isChecked()) gameSettings.setGoldAmount (eGameSettingsResourceAmount::Limited);
409 	else if (goldHighCheckBox->isChecked()) gameSettings.setGoldAmount (eGameSettingsResourceAmount::High);
410 	else if (goldTooMuchCheckBox->isChecked()) gameSettings.setGoldAmount (eGameSettingsResourceAmount::TooMuch);
411 	else gameSettings.setGoldAmount (eGameSettingsResourceAmount::Normal);
412 
413 	if (densitySparseCheckBox->isChecked()) gameSettings.setResourceDensity (eGameSettingsResourceDensity::Sparse);
414 	else if (densityDenseCheckBox->isChecked()) gameSettings.setResourceDensity (eGameSettingsResourceDensity::Dense);
415 	else if (densityTooMuchCheckBox->isChecked()) gameSettings.setResourceDensity (eGameSettingsResourceDensity::TooMuch);
416 	else gameSettings.setResourceDensity (eGameSettingsResourceDensity::Normal);
417 
418 	if (bridgeheadMobileCheckBox->isChecked()) gameSettings.setBridgeheadType (eGameSettingsBridgeheadType::Mobile);
419 	else gameSettings.setBridgeheadType (eGameSettingsBridgeheadType::Definite);
420 
421 	if (forHotSeatGame) gameSettings.setGameType (eGameSettingsGameType::HotSeat);
422 	else if (gameTypeTurnsCheckBox->isChecked()) gameSettings.setGameType (eGameSettingsGameType::Turns);
423 	else gameSettings.setGameType (eGameSettingsGameType::Simultaneous);
424 
425 	gameSettings.setClansEnabled (clansOnCheckBox->isChecked());
426 
427 	if (creditsNoneCheckBox->isChecked()) gameSettings.setStartCredits (cGameSettings::defaultCreditsNone);
428 	else if (creditsLowCheckBox->isChecked()) gameSettings.setStartCredits (cGameSettings::defaultCreditsLow);
429 	else if (creditsLimitedCheckBox->isChecked()) gameSettings.setStartCredits (cGameSettings::defaultCreditsLimited);
430 	else if (creditsHighCheckBox->isChecked()) gameSettings.setStartCredits (cGameSettings::defaultCreditsHigh);
431 	else if (creditsMoreCheckBox->isChecked()) gameSettings.setStartCredits (cGameSettings::defaultCreditsMore);
432 	else gameSettings.setStartCredits (cGameSettings::defaultCreditsNormal);
433 
434 	if (victoryTurns0CheckBox->isChecked() || victoryTurns1CheckBox->isChecked() || victoryTurns2CheckBox->isChecked())
435 	{
436 		gameSettings.setVictoryCondition (eGameSettingsVictoryCondition::Turns);
437 		if (victoryTurns0CheckBox->isChecked()) gameSettings.setVictoryTurns (cGameSettings::defaultVictoryTurnsOption0);
438 		else if (victoryTurns1CheckBox->isChecked()) gameSettings.setVictoryTurns (cGameSettings::defaultVictoryTurnsOption1);
439 		else gameSettings.setVictoryTurns (cGameSettings::defaultVictoryTurnsOption2);
440 	}
441 	else if (victoryPoints0CheckBox->isChecked() || victoryPoints1CheckBox->isChecked() || victoryPoints2CheckBox->isChecked())
442 	{
443 		gameSettings.setVictoryCondition (eGameSettingsVictoryCondition::Points);
444 		if (victoryPoints0CheckBox->isChecked()) gameSettings.setVictoryPoints (cGameSettings::defaultVictoryPointsOption0);
445 		else if (victoryPoints1CheckBox->isChecked()) gameSettings.setVictoryPoints (cGameSettings::defaultVictoryPointsOption1);
446 		else gameSettings.setVictoryPoints (cGameSettings::defaultVictoryPointsOption2);
447 	}
448 	else gameSettings.setVictoryCondition (eGameSettingsVictoryCondition::Death);
449 
450 	gameSettings.setTurnLimitActive (!turnLimitNoLimitCheckBox->isChecked());
451 
452 	if (turnLimit0CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption0);
453 	else if (turnLimit1CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption1);
454 	else if (turnLimit2CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption2);
455 	else if (turnLimit3CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption3);
456 	else if (turnLimit4CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption4);
457 	else if (turnLimit5CheckBox->isChecked()) gameSettings.setTurnLimit (cGameSettings::defaultTurnLimitOption5);
458 	else if (turnLimitCustomCheckBox->isChecked()) gameSettings.setTurnLimit (std::chrono::seconds (atoi (turnLimitCustomLineEdit->getText().c_str())));
459 
460 	gameSettings.setTurnEndDeadlineActive (!turnEndTurnDeadlineNoLimitCheckBox->isChecked());
461 
462 	if (turnEndTurnDeadline0CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption0);
463 	else if (turnEndTurnDeadline1CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption1);
464 	else if (turnEndTurnDeadline2CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption2);
465 	else if (turnEndTurnDeadline3CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption3);
466 	else if (turnEndTurnDeadline4CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption4);
467 	else if (turnEndTurnDeadline5CheckBox->isChecked()) gameSettings.setTurnEndDeadline (cGameSettings::defaultEndTurnDeadlineOption5);
468 	else if (turnEndTurnDeadlineCustomCheckBox->isChecked()) gameSettings.setTurnEndDeadline (std::chrono::seconds (std::atoi (turnEndTurnDeadlineLineEdit->getText().c_str())));
469 
470 	return gameSettings;
471 }
472 
473 //------------------------------------------------------------------------------
okClicked()474 void cWindowGameSettings::okClicked()
475 {
476 	done();
477 }
478 
479 //------------------------------------------------------------------------------
backClicked()480 void cWindowGameSettings::backClicked()
481 {
482 	close();
483 }
484 
485 //------------------------------------------------------------------------------
disableTurnEndDeadlineOptions()486 void cWindowGameSettings::disableTurnEndDeadlineOptions()
487 {
488 	turnEndTurnDeadlineNoLimitCheckBox->disable();
489 	turnEndTurnDeadlineNoLimitCheckBox->hide();
490 	turnEndTurnDeadline0CheckBox->disable();
491 	turnEndTurnDeadline0CheckBox->hide();
492 	turnEndTurnDeadline1CheckBox->disable();
493 	turnEndTurnDeadline1CheckBox->hide();
494 	turnEndTurnDeadline2CheckBox->disable();
495 	turnEndTurnDeadline2CheckBox->hide();
496 	turnEndTurnDeadline3CheckBox->disable();
497 	turnEndTurnDeadline3CheckBox->hide();
498 	turnEndTurnDeadline4CheckBox->disable();
499 	turnEndTurnDeadline4CheckBox->hide();
500 	turnEndTurnDeadline5CheckBox->disable();
501 	turnEndTurnDeadline5CheckBox->hide();
502 	turnEndTurnDeadlineCustomCheckBox->disable();
503 	turnEndTurnDeadlineCustomCheckBox->hide();
504 	turnEndTurnDeadlineLineEdit->disable();
505 	turnEndTurnDeadlineLineEdit->hide();
506 
507 	turnEndDeadlineLabel->hide();
508 	turnEndDeadlineSecondsLabel->hide();
509 }
510 
511 //------------------------------------------------------------------------------
enableTurnEndDeadlineOptions()512 void cWindowGameSettings::enableTurnEndDeadlineOptions()
513 {
514 	turnEndTurnDeadlineNoLimitCheckBox->enable();
515 	turnEndTurnDeadlineNoLimitCheckBox->show();
516 	turnEndTurnDeadline0CheckBox->enable();
517 	turnEndTurnDeadline0CheckBox->show();
518 	turnEndTurnDeadline1CheckBox->enable();
519 	turnEndTurnDeadline1CheckBox->show();
520 	turnEndTurnDeadline2CheckBox->enable();
521 	turnEndTurnDeadline2CheckBox->show();
522 	turnEndTurnDeadline3CheckBox->enable();
523 	turnEndTurnDeadline3CheckBox->show();
524 	turnEndTurnDeadline4CheckBox->enable();
525 	turnEndTurnDeadline4CheckBox->show();
526 	turnEndTurnDeadline5CheckBox->enable();
527 	turnEndTurnDeadline5CheckBox->show();
528 	turnEndTurnDeadlineCustomCheckBox->enable();
529 	turnEndTurnDeadlineCustomCheckBox->show();
530 	turnEndTurnDeadlineLineEdit->enable();
531 	turnEndTurnDeadlineLineEdit->show();
532 
533 	turnEndDeadlineLabel->show();
534 	turnEndDeadlineSecondsLabel->show();
535 }