diff options
author | PeterN <peter@fuzzle.org> | 2019-01-31 13:57:44 +0000 |
---|---|---|
committer | Ingo von Borstel <github@planetmaker.de> | 2019-01-31 14:57:44 +0100 |
commit | 23960d0f2c82a634e0ca1be720c229ac22f14962 (patch) | |
tree | 7a7c75a5e7ae19943377756d49c477d759873d3b /src/vehicle.cpp | |
parent | ba38a7ca652c00a1d0851f4d97f0b7d360df853c (diff) | |
download | openttd-23960d0f2c82a634e0ca1be720c229ac22f14962.tar.xz |
Feature: Group liveries, and livery window usability enhancements. (#7108)
* Change: Replace checkbox in livery selection window with Default option in drop down selection.
This reduces clutter in the UI and allows for primary/secondary colours to independently follow the default scheme if desired.
* Feature: Add vehicle group liveries.
Diffstat (limited to 'src/vehicle.cpp')
-rw-r--r-- | src/vehicle.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 46141ce26..a5fe2ffa7 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1886,14 +1886,24 @@ const Livery *GetEngineLivery(EngineID engine_type, CompanyID company, EngineID const Company *c = Company::Get(company); LiveryScheme scheme = LS_DEFAULT; - /* The default livery is always available for use, but its in_use flag determines - * whether any _other_ liveries are in use. */ - if (c->livery[LS_DEFAULT].in_use && (livery_setting == LIT_ALL || (livery_setting == LIT_COMPANY && company == _local_company))) { - /* Determine the livery scheme to use */ - scheme = GetEngineLiveryScheme(engine_type, parent_engine_type, v); - - /* Switch back to the default scheme if the resolved scheme is not in use */ - if (!c->livery[scheme].in_use) scheme = LS_DEFAULT; + if (livery_setting == LIT_ALL || (livery_setting == LIT_COMPANY && company == _local_company)) { + if (v != NULL) { + const Group *g = Group::GetIfValid(v->First()->group_id); + if (g != NULL) { + /* Traverse parents until we find a livery or reach the top */ + while (g->livery.in_use == 0 && g->parent != INVALID_GROUP) { + g = Group::Get(g->parent); + } + if (g->livery.in_use != 0) return &g->livery; + } + } + + /* The default livery is always available for use, but its in_use flag determines + * whether any _other_ liveries are in use. */ + if (c->livery[LS_DEFAULT].in_use != 0) { + /* Determine the livery scheme to use */ + scheme = GetEngineLiveryScheme(engine_type, parent_engine_type, v); + } } return &c->livery[scheme]; |