diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 7d7e3b0384..876b3132f6 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -192,6 +192,7 @@ static const CheatEntry _cheats_ui[] = { {CNM_ALL, SLF_NOT_IN_SAVE, STR_CHEAT_INFLATION_COST, &_economy.inflation_prices, &_extra_cheats.inflation_cost.been_used, nullptr }, {CNM_ALL, SLF_NOT_IN_SAVE, STR_CHEAT_INFLATION_INCOME, &_economy.inflation_payment, &_extra_cheats.inflation_income.been_used, nullptr }, {CNM_ALL, SLE_BOOL, STR_CHEAT_STATION_RATING, &_extra_cheats.station_rating.value, &_extra_cheats.station_rating.been_used, nullptr }, + {CNM_ALL, SLE_BOOL, STR_CHEAT_TOWN_RATING, &_extra_cheats.town_rating.value, &_extra_cheats.town_rating.been_used, nullptr }, }; static bool IsCheatAllowed(CheatNetworkMode mode) @@ -442,7 +443,7 @@ struct CheatWindow : Window { } if (value != oldvalue) { - if (_networking || btn == CHT_STATION_RATING) { + if (_networking || btn == CHT_STATION_RATING || btn == CHT_TOWN_RATING) { if (btn != CHT_MONEY) DoCommandP(0, (uint32)btn, (uint32)value, CMD_CHEAT_SETTING); } else { WriteValue(ce->variable, ce->type, (int64)value); diff --git a/src/cheat_type.h b/src/cheat_type.h index f7eb37ac08..883e43b801 100644 --- a/src/cheat_type.h +++ b/src/cheat_type.h @@ -41,6 +41,7 @@ struct ExtraCheats { Cheat inflation_cost; ///< inflation cost factor Cheat inflation_income; ///< inflation income factor Cheat station_rating; ///< 100% station rating + Cheat town_rating; ///< 100% town local authority rating }; /** Available cheats. */ @@ -56,6 +57,7 @@ enum CheatNumbers { CHT_INFLATION_COST, ///< Change inflation cost factor CHT_INFLATION_INCOME,///< Change inflation income factor CHT_STATION_RATING, ///< 100% station ratings + CHT_TOWN_RATING, ///< 100% town local authority ratings CHT_NUM_CHEATS, ///< Number of cheats. }; diff --git a/src/lang/english.txt b/src/lang/english.txt index 639cbe169e..fad1ce830d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2275,6 +2275,7 @@ STR_CHEAT_INFLATION_COST_QUERY_CAPT :{WHITE}Change i STR_CHEAT_INFLATION_INCOME :{LTBLUE}Change inflation income factor: {ORANGE}{DECIMAL} STR_CHEAT_INFLATION_INCOME_QUERY_CAPT :{WHITE}Change inflation income factor STR_CHEAT_STATION_RATING :{LTBLUE}Stations ratings fixed at 100%: {ORANGE}{STRING1} +STR_CHEAT_TOWN_RATING :{LTBLUE}Town local authority ratings fixed at Outstanding: {ORANGE}{STRING1} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Colour Scheme diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index 53325a470a..f78fddea7f 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -286,6 +286,10 @@ CommandCost CmdCheatSetting(TileIndex tile, DoCommandFlag flags, uint32 p1, uint cht = &_extra_cheats.station_rating; break; + case CHT_TOWN_RATING: + cht = &_extra_cheats.town_rating; + break; + default: return CMD_ERROR; } @@ -298,6 +302,10 @@ CommandCost CmdCheatSetting(TileIndex tile, DoCommandFlag flags, uint32 p1, uint extern void UpdateAllStationRatings(); UpdateAllStationRatings(); } + if (p1 == CHT_TOWN_RATING) { + extern void UpdateAllTownRatings(); + UpdateAllTownRatings(); + } } return CommandCost(); } diff --git a/src/saveload/cheat_sl.cpp b/src/saveload/cheat_sl.cpp index 6b4a9433d5..e2402638fd 100644 --- a/src/saveload/cheat_sl.cpp +++ b/src/saveload/cheat_sl.cpp @@ -29,6 +29,7 @@ static ExtraCheatNameDesc _extra_cheat_descs[] = { { "inflation_cost", &_extra_cheats.inflation_cost }, { "inflation_income", &_extra_cheats.inflation_income }, { "station_rating", &_extra_cheats.station_rating }, + { "town_rating", &_extra_cheats.town_rating }, }; /** diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 24134b400f..6f1b433be3 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -717,6 +717,9 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus ZoningTownAuthorityRatingChange(); } SetBit((*st)->town->have_ratings, _current_company); + if (_extra_cheats.town_rating.value) { + (*st)->town->ratings[_current_company] = RATING_MAXIMUM; + } } } } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index ee46f57b08..833dd1311a 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -814,6 +814,7 @@ static CommandCost ClearTile_Town(TileIndex tile, DoCommandFlag flags) if (rating > t->ratings[_current_company] && !(flags & DC_NO_TEST_TOWN_RATING) && !_cheats.magic_bulldozer.value + && !_extra_cheats.town_rating.value && _settings_game.difficulty.town_council_tolerance != TOWN_COUNCIL_INDIFFERENT) { SetDParam(0, t->index); return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS); @@ -3228,6 +3229,9 @@ CommandCost CmdTownRating(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (!Company::IsValidID(company_id)) return CMD_ERROR; int16 new_rating = Clamp((int16)GB(p2, 0, 16), RATING_MINIMUM, RATING_MAXIMUM); + if (_extra_cheats.town_rating.value) { + new_rating = RATING_MAXIMUM; + } if (flags & DC_EXEC) { t->ratings[company_id] = new_rating; InvalidateWindowData(WC_TOWN_AUTHORITY, town_id); @@ -3711,6 +3715,8 @@ static void ForAllStationsNearTown(Town *t, Func func) static void UpdateTownRating(Town *t) { + if (_extra_cheats.town_rating.value) return; + /* Increase company ratings if they're low */ for (const Company *c : Company::Iterate()) { if (t->ratings[c->index] < RATING_GROWTH_MAXIMUM) { @@ -4034,13 +4040,15 @@ void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags) /* if magic_bulldozer cheat is active, town doesn't penalize for removing stuff */ if (t == nullptr || (flags & DC_NO_MODIFY_TOWN_RATING) || !Company::IsValidID(_current_company) || - (_cheats.magic_bulldozer.value && add < 0)) { + ((_cheats.magic_bulldozer.value || _extra_cheats.town_rating.value) && add < 0)) { return; } const int prev_rating = GetRating(t); int rating = prev_rating; - if (add < 0) { + if (_extra_cheats.town_rating.value) { + rating = RATING_MAXIMUM; + } else if (add < 0) { if (rating > max) { rating += add; if (rating < max) rating = max; @@ -4064,6 +4072,26 @@ void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags) } } + +void UpdateAllTownRatings() +{ + if (_extra_cheats.town_rating.value) { + for (Town *t : Town::Iterate()) { + if (Company::IsValidID(_local_company) && HasBit(t->have_ratings, _local_company) && t->ratings[_local_company] <= 0) { + ZoningTownAuthorityRatingChange(); + } + uint8 c; + FOR_EACH_SET_BIT(c, t->have_ratings) { + t->ratings[c] = RATING_MAXIMUM; + } + if (t->have_ratings != 0) { + t->UpdateVirtCoord(); + SetWindowDirty(WC_TOWN_AUTHORITY, t->index); + } + } + } +} + /** * Does the town authority allow the (destructive) action of the current company? * @param flags Checking flags of the command. @@ -4075,7 +4103,7 @@ CommandCost CheckforTownRating(DoCommandFlag flags, Town *t, TownRatingCheckType { /* if magic_bulldozer cheat is active, town doesn't restrict your destructive actions */ if (t == nullptr || !Company::IsValidID(_current_company) || - _cheats.magic_bulldozer.value || (flags & DC_NO_TEST_TOWN_RATING)) { + _cheats.magic_bulldozer.value || _extra_cheats.town_rating.value || (flags & DC_NO_TEST_TOWN_RATING)) { return CommandCost(); }