27 | case WID_AIC_NUMBER:
| 27 | } |
---|
28 | SetDParam(0, GetGameSettings().difficulty.max_no_competitors);
| | |
---|
29 | break;
| | |
---|
30 | case WID_AIC_CHANGE:
| | |
---|
31 | switch (selected_slot) {
| | |
---|
32 | case OWNER_DEITY:
| | |
---|
33 | SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT);
| | |
---|
34 | break;
| | |
---|
35 |
| | |
---|
36 | case INVALID_COMPANY:
| | |
---|
37 | SetDParam(0, STR_AI_CONFIG_CHANGE_NONE);
| | |
---|
38 | break;
| | |
---|
39 |
| | |
---|
40 | default:
| | |
---|
41 | SetDParam(0, STR_AI_CONFIG_CHANGE_AI);
| | |
---|
42 | break;
| | |
---|
43 | }
| | |
---|
44 | break;
| | |
---|
45 | }
| | |
---|
46 | }
| | |
---|
47 |
| | |
---|
48 | virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
| | |
---|
49 | {
| | |
---|
50 | switch (widget) {
| | |
---|
51 | case WID_AIC_GAMELIST: {
| | |
---|
52 | this->line_height = max((uint)FONT_HEIGHT_NORMAL, GetSpriteSize(SPR_SQUARE).height) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
| | |
---|
53 | size->height = 1 * this->line_height;
| | |
---|
54 | break;
| | |
---|
55 | }
| | |
---|
56 |
| | |
---|
57 | case WID_AIC_LIST: {
| | |
---|
58 |
| | |
---|
59 | this->line_height = max((uint)FONT_HEIGHT_NORMAL, GetSpriteSize(SPR_SQUARE).height) + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
| | |
---|
60 | size->height = 15 * this->line_height;
| | |
---|
61 | break;
| | |
---|
62 | }
| | |
---|
63 |
| | |
---|
64 | case WID_AIC_CHANGE: {
| | |
---|
65 | size->width = max(GetStringBoundingBox(STR_AI_CONFIG_CHANGE).width + GetStringBoundingBox(STR_AI_CONFIG_CHANGE_GAMESCRIPT).width,
| | |
---|
66 | max(GetStringBoundingBox(STR_AI_CONFIG_CHANGE).width + GetStringBoundingBox(STR_AI_CONFIG_CHANGE_NONE).width,
| | |
---|
67 | GetStringBoundingBox(STR_AI_CONFIG_CHANGE).width + GetStringBoundingBox(STR_AI_CONFIG_CHANGE_AI).width));
| | |
---|
68 | break;
| | |
---|
69 | }
| | |
---|
70 |
| | |
---|
71 | case WID_AIC_CONFIGURE: {
| | |
---|
72 | size->width = max(GetStringBoundingBox(STR_AI_CONFIG_CONFIGURE).width, GetStringBoundingBox(STR_AI_DEBUG_SETTINGS).width);
| | |
---|
73 | break;
| | |
---|
74 | }
| | |
---|
75 | }
| | |
---|
76 | }
| | |
---|
77 |
| | |
---|
78 | /**
| | |
---|
79 | * Can the AI config in the given company slot be edited?
| | |
---|
80 | * @param slot The slot to query.
| | |
---|
81 | * @return True if and only if the given AI Config slot can e edited.
| | |
---|
82 | */
| | |
---|
83 | static bool IsEditable(CompanyID slot)
| | |
---|
84 | {
| | |
---|
85 | if (slot == OWNER_DEITY) return _game_mode != GM_NORMAL || Game::GetInstance() != NULL;
| | |
---|
86 |
| | |
---|
87 | if (_game_mode != GM_NORMAL) {
| | |
---|
88 | return slot >= 0 && slot < MAX_COMPANIES;
| | |
---|
89 | }
| | |
---|
90 | if (Company::IsValidHumanID(slot) || slot < 0) return false;
| | |
---|
91 |
| | |
---|
92 | return slot < MAX_COMPANIES;
| | |
---|
93 | }
| | |
---|
94 |
| | |
---|
95 | virtual void DrawWidget(const Rect &r, int widget) const
| | |
---|
96 | {
| | |
---|
97 | switch (widget) {
| | |
---|
98 | case WID_AIC_GAMELIST: {
| | |
---|
99 | uint widest_cid = 0;
| | |
---|
100 | for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
| | |
---|
101 | SetDParam(0, i + 1);
| | |
---|
102 | widest_cid = max(GetStringBoundingBox(STR_JUST_INT).width, widest_cid);
| | |
---|
103 | }
| | |
---|
104 |
| | |
---|
105 | Dimension square = GetSpriteSize(SPR_SQUARE);
| | |
---|
106 | uint square_y_offset = (line_height - square.height) / 2;
| | |
---|
107 |
| | |
---|
108 | StringID text = STR_AI_CONFIG_NONE;
| | |
---|
109 | if (GameConfig::GetConfig()->GetInfo() != NULL) {
| | |
---|
110 | SetDParamStr(0, GameConfig::GetConfig()->GetInfo()->GetName());
| | |
---|
111 | text = STR_JUST_RAW_STRING;
| | |
---|
112 | }
| | |
---|
113 |
| | |
---|
114 | DrawSprite(SPR_SQUARE,
| | |
---|
115 | IsEditable(OWNER_DEITY) ? (_game_mode == GM_NORMAL) ? (IsDead(OWNER_DEITY)) ? PALETTE_TO_RED : PALETTE_TO_GREEN : PALETTE_TO_BLUE : PALETTE_TO_GREY,
| | |
---|
116 | r.left + WD_MATRIX_LEFT, r.top + square_y_offset);
| | |
---|
117 | DrawString(r.left + WD_MATRIX_LEFT + square.width + WD_MATRIX_LEFT + widest_cid + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, r.top + WD_MATRIX_TOP, text,
| | |
---|
118 | (this->selected_slot == OWNER_DEITY) ? TC_WHITE : (IsEditable(OWNER_DEITY) ? (_game_mode == GM_NORMAL) ? (IsDead(OWNER_DEITY)) ? TC_RED : TC_GREEN : TC_ORANGE : TC_SILVER));
| | |
---|
119 |
| | |
---|
120 | break;
| | |
---|
121 | }
| | |
---|
122 |
| | |
---|
123 | case WID_AIC_LIST: {
| | |
---|
124 | int y = r.top;
| | |
---|
125 |
| | |
---|
126 | uint widest_cid = 0;
| | |
---|
127 | for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
| | |
---|
128 | SetDParam(0, i + 1);
| | |
---|
129 | widest_cid = max(GetStringBoundingBox(STR_JUST_INT).width, widest_cid);
| | |
---|
130 | }
| | |
---|
131 |
| | |
---|
132 | Dimension square = GetSpriteSize(SPR_SQUARE);
| | |
---|
133 | uint square_y_offset = (line_height - square.height) / 2;
| | |
---|
134 |
| | |
---|
135 | StringID rai = STR_AI_CONFIG_RANDOM_AI;
| | |
---|
136 | uint rai_width = GetStringBoundingBox(rai).width;
| | |
---|
137 |
| | |
---|
138 | for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
| | |
---|
139 | SetDParam(0, i + 1);
| | |
---|
140 | StringID cid = STR_JUST_INT;
| | |
---|
141 | DrawString(r.left + WD_MATRIX_LEFT + square.width, r.left + WD_MATRIX_LEFT + square.width + widest_cid, y + WD_MATRIX_TOP, cid, TC_LIGHT_BLUE, SA_RIGHT);
| | |
---|
142 |
| | |
---|
143 | StringID text;
| | |
---|
144 | if (_game_mode == GM_NORMAL && Company::IsValidHumanID(i)) {
| | |
---|
145 | text = STR_AI_CONFIG_HUMAN_PLAYER;
| | |
---|
146 | } else if (AIConfig::GetConfig((CompanyID)i)->GetInfo() != NULL) {
| | |
---|
147 | SetDParamStr(0, AIConfig::GetConfig((CompanyID)i)->GetInfo()->GetName());
| | |
---|
148 | text = STR_JUST_RAW_STRING;
| | |
---|
149 | } else {
| | |
---|
150 | text = rai;
| | |
---|
151 | }
| | |
---|
152 | uint text_width = GetStringBoundingBox(text).width;
| | |
---|
153 |
| | |
---|
154 | DrawSprite(SPR_SQUARE,
| | |
---|
155 | IsEditable((CompanyID)i) ? Company::IsValidAiID(i) ? IsDead((CompanyID)i) ? PALETTE_TO_RED : PALETTE_TO_GREEN : _game_mode != GM_NORMAL ? PALETTE_TO_BLUE : PALETTE_TO_ORANGE : PALETTE_TO_GREY,
| | |
---|
156 | r.left + WD_MATRIX_LEFT, y + square_y_offset);
| | |
---|
157 |
| | |
---|
158 | DrawString(r.left + WD_MATRIX_LEFT + square.width + WD_MATRIX_LEFT + widest_cid + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT - rai_width - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, text,
| | |
---|
159 | (this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? Company::IsValidAiID(i) ? IsDead((CompanyID)i) ? TC_RED : TC_GREEN : TC_ORANGE : TC_SILVER));
| | |
---|
160 |
| | |
---|
161 | if (_game_mode == GM_NORMAL && Company::IsValidAiID(i) && AIConfig::GetConfig((CompanyID)i)->IsRandom()) {
| | |
---|
162 | DrawString(min(r.left + WD_MATRIX_LEFT + square.width + WD_MATRIX_LEFT + widest_cid + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT - rai_width - WD_MATRIX_RIGHT), r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, rai,
| | |
---|
163 | (this->selected_slot == i) ? TC_WHITE : (IsEditable((CompanyID)i) ? Company::IsValidAiID(i) ? IsDead((CompanyID)i) ? TC_RED : TC_GREEN : TC_ORANGE : TC_SILVER), SA_RIGHT);
| | |
---|
164 | }
| | |
---|
165 | y += this->line_height;
| | |
---|
166 | }
| | |
---|
167 | break;
| | |
---|
168 | }
| | |
---|
169 | }
| | |
---|
170 | }
| | |
---|
171 |
| | |
---|
172 | virtual void OnClick(Point pt, int widget, int click_count)
| | |
---|
173 | {
| | |
---|
174 | if (widget >= WID_AIC_TEXTFILE && widget < WID_AIC_TEXTFILE + TFT_END) {
| | |
---|
175 | if (this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot) == NULL) return;
| | |
---|
176 |
| | |
---|
177 | ShowScriptTextfileWindow((TextfileType)(widget - WID_AIC_TEXTFILE), this->selected_slot);
| | |
---|
178 | return;
| | |
---|
179 | }
| | |
---|
180 |
| | |
---|
181 | switch (widget) {
| | |
---|
182 | case WID_AIC_DECREASE:
| | |
---|
183 | case WID_AIC_INCREASE: {
| | |
---|
184 | int new_value;
| | |
---|
185 | if (widget == WID_AIC_DECREASE) {
| | |
---|
186 | new_value = max(0, GetGameSettings().difficulty.max_no_competitors - 1);
| | |
---|
187 | } else {
| | |
---|
188 | new_value = min(MAX_COMPANIES, GetGameSettings().difficulty.max_no_competitors + 1);
| | |
---|
189 | }
| | |
---|
190 | IConsoleSetSetting("difficulty.max_no_competitors", new_value);
| | |
---|
191 | this->InvalidateData();
| | |
---|
192 | break;
| | |
---|
193 | }
| | |
---|
194 |
| | |
---|
195 | case WID_AIC_GAMELIST: {
| | |
---|
196 | this->selected_slot = OWNER_DEITY;
| | |
---|
197 | this->InvalidateData();
| | |
---|
198 | if (click_count > 1 && this->selected_slot != INVALID_COMPANY && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)this->selected_slot);
| | |
---|
199 | break;
| | |
---|
200 | }
| | |
---|
201 |
| | |
---|
202 | case WID_AIC_LIST: { // Select a slot
| | |
---|
203 | this->selected_slot = (CompanyID)this->GetRowFromWidget(pt.y, widget, 0, this->line_height);
| | |
---|
204 | this->InvalidateData();
| | |
---|
205 | if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowAIListWindow((CompanyID)this->selected_slot);
| | |
---|
206 | break;
| | |
---|
207 | }
| | |
---|
208 |
| | |
---|
209 | case WID_AIC_MOVE_UP:
| | |
---|
210 | if (IsEditable(this->selected_slot) && IsDead(this->selected_slot) && IsEditable((CompanyID)(this->selected_slot - 1)) && IsDead((CompanyID)(this->selected_slot - 1))) {
| | |
---|
211 | Swap(GetGameSettings().ai_config[this->selected_slot], GetGameSettings().ai_config[this->selected_slot - 1]);
| | |
---|
212 | this->selected_slot--;
| | |
---|
213 | this->InvalidateData();
| | |
---|
214 | }
| | |
---|
215 | break;
| | |
---|
216 |
| | |
---|
217 | case WID_AIC_MOVE_DOWN:
| | |
---|
218 | if (IsEditable(this->selected_slot) && IsDead(this->selected_slot) && IsEditable((CompanyID)(this->selected_slot + 1)) && IsDead((CompanyID)(this->selected_slot + 1))) {
| | |
---|
219 | Swap(GetGameSettings().ai_config[this->selected_slot], GetGameSettings().ai_config[this->selected_slot + 1]);
| | |
---|
220 | this->selected_slot++;
| | |
---|
221 | this->InvalidateData();
| | |
---|
222 | }
| | |
---|
223 | break;
| | |
---|
224 |
| | |
---|
225 | case WID_AIC_CHANGE: // choose other AI
| | |
---|
226 | ShowAIListWindow((CompanyID)this->selected_slot);
| | |
---|
227 | break;
| | |
---|
228 |
| | |
---|
229 | case WID_AIC_CONFIGURE: // change the settings for an AI
| | |
---|
230 | ShowAISettingsWindow((CompanyID)this->selected_slot);
| | |
---|
231 | break;
| | |
---|
232 |
| | |
---|
233 | case WID_AIC_CLOSE:
| | |
---|
234 | delete this;
| | |
---|
235 | break;
| | |
---|
236 |
| | |
---|
237 | case WID_AIC_CONTENT_DOWNLOAD:
| | |
---|
238 | if (!_network_available) {
| | |
---|
239 | ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
| | |
---|
240 | } else {
| | |
---|
241 | #if defined(ENABLE_NETWORK)
| | |
---|
242 | ShowNetworkContentListWindow(NULL, CONTENT_TYPE_AI, CONTENT_TYPE_GAME);
| | |
---|
243 | #endif
| | |
---|
244 | }
| | |
---|
245 | break;
| | |
---|
246 | }
| | |
---|
247 | }
| | |
---|
248 |
| | |
---|
249 | /**
| | |
---|
250 | * Some data on this window has become invalid.
| | |
---|
251 | * @param data Information about the changed data.
| | |
---|
252 | * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
| | |
---|
253 | */
| | |
---|
254 | virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
| | |
---|
255 | {
| | |
---|
256 | if (!IsEditable(this->selected_slot)) {
| | |
---|
257 | this->selected_slot = INVALID_COMPANY;
| | |
---|
258 | }
| | |
---|
259 |
| | |
---|
260 | if (!gui_scope) return;
| | |
---|
261 |
| | |
---|
262 | this->SetWidgetDisabledState(WID_AIC_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0);
| | |
---|
263 | this->SetWidgetDisabledState(WID_AIC_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES);
| | |
---|
264 | this->SetWidgetDisabledState(WID_AIC_CHANGE, this->selected_slot == INVALID_COMPANY || _game_mode == GM_NORMAL && (this->selected_slot == OWNER_DEITY || !IsDead(this->selected_slot)));
| | |
---|
265 | this->SetWidgetDisabledState(WID_AIC_CONFIGURE, this->selected_slot == INVALID_COMPANY || GetConfig(this->selected_slot)->GetConfigList()->size() == 0);
| | |
---|
266 |
| | |
---|
267 | /* Display either Settings or Configure button */
| | |
---|
268 | NWidgetCore *configure_button = this->GetWidget<NWidgetCore>(WID_AIC_CONFIGURE);
| | |
---|
269 | if (_game_mode == GM_NORMAL && this->selected_slot != INVALID_COMPANY && !IsDead(this->selected_slot)) {
| | |
---|
270 | configure_button->SetDataTip(STR_AI_DEBUG_SETTINGS, STR_AI_DEBUG_SETTINGS_TOOLTIP);
| | |
---|
271 | } else {
| | |
---|
272 | configure_button->SetDataTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP);
| | |
---|
273 | }
| | |
---|
274 |
| | |
---|
275 | this->SetWidgetDisabledState(WID_AIC_MOVE_UP, this->selected_slot == INVALID_COMPANY || this->selected_slot == OWNER_DEITY || !IsDead(this->selected_slot) || !IsEditable((CompanyID)(this->selected_slot - 1)) || !IsDead((CompanyID)(this->selected_slot - 1)));
| | |
---|
276 | this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || this->selected_slot == OWNER_DEITY || !IsDead(this->selected_slot) || !IsEditable((CompanyID)(this->selected_slot + 1)) || !IsDead((CompanyID)(this->selected_slot + 1)));
| | |
---|
277 |
| | |
---|
278 | for (TextfileType tft = TFT_BEGIN; tft < TFT_END; tft++) {
| | |
---|
279 | this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == INVALID_COMPANY || (GetConfig(this->selected_slot)->GetTextfile(tft, this->selected_slot) == NULL));
| | |
---|
280 | }
| | |
---|
281 | }
| | |
---|
282 | }; | | |
---|