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