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 }