From feece0b42c559f50893873bf4179646d9e4195cf Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 12 Oct 2010 19:48:42 +0000 Subject: [PATCH] (svn r20919) -Fix [FS#4140]: objects didn't change colour when the company changed colour. Now they do, except when the "decide colour" callback is (defined to be) used --- src/company_cmd.cpp | 3 +++ src/object_cmd.cpp | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 12947cd06e..60afe807f2 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -986,6 +986,9 @@ CommandCost CmdSetCompanyColour(TileIndex tile, DoCommandFlag flags, uint32 p1, FOR_ALL_VEHICLES(v) { if (v->owner == _current_company) v->InvalidateNewGRFCache(); } + + extern void UpdateObjectColours(const Company *c); + UpdateObjectColours(c); } return CommandCost(); } diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 0ddcf3664d..4ad51d58f1 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -128,6 +128,27 @@ void UpdateCompanyHQ(TileIndex tile, uint score) } } +/** + * Updates the colour of the object whenever a company changes. + * @param c The company the company colour changed of. + */ +void UpdateObjectColours(const Company *c) +{ + Object *obj; + FOR_ALL_OBJECTS(obj) { + Owner owner = GetTileOwner(obj->location.tile); + /* Not the current owner, so colour doesn't change. */ + if (owner != c->index) continue; + + const ObjectSpec *spec = ObjectSpec::GetByTile(obj->location.tile); + /* Using the object colour callback, so not using company colour. */ + if (HasBit(spec->callback_mask, CBM_OBJ_COLOUR)) continue; + + const Livery *l = c->livery; + obj->colour = ((spec->flags & OBJECT_FLAG_2CC_COLOUR) ? (l->colour2 * 16) : 0) + l->colour1; + } +} + extern CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z, bool check_bridge); static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags);