diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 36336e7fa0..58e4c50641 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -694,6 +694,9 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus (*st)->string_id = GenerateStationName(*st, area.tile, name_class); if (Company::IsValidID(_current_company)) { + if (_local_company == _current_company && !HasBit((*st)->town->have_ratings, _current_company)) { + ZoningTownAuthorityRatingChange(); + } SetBit((*st)->town->have_ratings, _current_company); } } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 5265ecc3c3..4207852fc1 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -46,6 +46,7 @@ #include "ai/ai.hpp" #include "game/game.hpp" #include "zoom_func.h" +#include "zoning.h" #include "table/strings.h" #include "table/town_land.h" @@ -3622,7 +3623,8 @@ void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags) return; } - int rating = GetRating(t); + const int prev_rating = GetRating(t); + int rating = prev_rating; if (add < 0) { if (rating > max) { rating += add; @@ -3637,6 +3639,9 @@ void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags) if (_town_rating_test) { _town_test_ratings[t] = rating; } else { + if (_local_company == _current_company && (!HasBit(t->have_ratings, _current_company) || ((prev_rating > 0) != (rating > 0)))) { + ZoningTownAuthorityRatingChange(); + } SetBit(t->have_ratings, _current_company); t->ratings[_current_company] = rating; t->UpdateVirtCoord(); diff --git a/src/zoning.h b/src/zoning.h index 4ea457245d..39eab5f744 100644 --- a/src/zoning.h +++ b/src/zoning.h @@ -62,6 +62,7 @@ void ZoningMarkDirtyStationCoverageArea(const Station *st, ZoningModeMask mask = inline void ZoningMarkDirtyStationCoverageArea(const Waypoint *st) { } // no-op void ZoningStationWindowOpenClose(const Station *st); +void ZoningTownAuthorityRatingChange(); void SetZoningMode(bool inner, ZoningEvaluationMode mode); diff --git a/src/zoning_cmd.cpp b/src/zoning_cmd.cpp index 342e68f791..e94022ce1a 100644 --- a/src/zoning_cmd.cpp +++ b/src/zoning_cmd.cpp @@ -477,6 +477,16 @@ void ZoningStationWindowOpenClose(const Station *st) if (mask != ZMM_NOTHING) ZoningMarkDirtyStationCoverageArea(st, mask); } +void ZoningTownAuthorityRatingChange() +{ + ZoningModeMask mask = ZMM_NOTHING; + if (_zoning.inner == ZEM_AUTHORITY) mask |= ZMM_INNER; + if (_zoning.outer == ZEM_AUTHORITY) mask |= ZMM_OUTER; + if (mask != ZMM_NOTHING) { + MarkWholeScreenDirty(); + } +} + void ClearZoningCaches() { _zoning_cache_inner.clear();