# HG changeset patch # User peter1138 # Date 2019-02-27 07:00:33 # Node ID 1156340816b05a3d4f30ba984d50132c768d801e # Parent 8832ca8755a39ee43acf4b2c741dd2588a69601b Change: Add variant property to engines. diff --git a/src/engine.cpp b/src/engine.cpp --- a/src/engine.cpp +++ b/src/engine.cpp @@ -73,6 +73,7 @@ Engine::Engine(VehicleType type, EngineI this->grf_prop.local_id = base; this->list_position = base; this->preview_company = INVALID_COMPANY; + this->display_last_variant = INVALID_ENGINE; /* Check if this base engine is within the original engine data range */ if (base >= _engine_counts[type]) { @@ -93,6 +94,8 @@ Engine::Engine(VehicleType type, EngineI } /* Set cargo aging period to the default value. */ this->info.cargo_age_period = CARGO_AGING_TICKS; + /* Not a variant */ + this->info.variant_id = INVALID_ENGINE; return; } diff --git a/src/engine_base.h b/src/engine_base.h --- a/src/engine_base.h +++ b/src/engine_base.h @@ -21,6 +21,15 @@ struct WagonOverride { const SpriteGroup *group; }; +/** Flags used client-side in the purchase/autorenew engine list. */ +enum class EngineDisplayFlags : byte { + None = 0, ///< No flag set. + HasVariants = (1U << 0), ///< Set if engine has variants. + IsFolded = (1U << 1), ///< Set if display of variants should be folded (hidden). + Shaded = (1U << 2), ///< Set if engine should be masked. +}; +DECLARE_ENUM_AS_BIT_SET(EngineDisplayFlags) + typedef Pool EnginePool; extern EnginePool _engine_pool; @@ -45,6 +54,9 @@ struct Engine : EnginePool::PoolItem<&_e uint8 original_image_index; ///< Original vehicle image index, thus the image index of the overridden vehicle VehicleType type; ///< %Vehicle type, ie #VEH_ROAD, #VEH_TRAIN, etc. + EngineDisplayFlags display_flags; ///< NOSAVE client-side-only display flags for build engine list. + EngineID display_last_variant; ///< NOSAVE client-side-only last variant selected. + EngineInfo info; union { diff --git a/src/engine_type.h b/src/engine_type.h --- a/src/engine_type.h +++ b/src/engine_type.h @@ -145,6 +145,7 @@ struct EngineInfo { int8 retire_early; ///< Number of years early to retire vehicle StringID string_id; ///< Default name of engine uint16 cargo_age_period; ///< Number of ticks before carried cargo is aged. + EngineID variant_id; ///< Engine variant ID. If set, will be treated specially in purchase lists. }; /** diff --git a/src/newgrf.cpp b/src/newgrf.cpp --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1334,6 +1334,10 @@ static ChangeInfoResult RailVehicleChang rvi->curve_speed_mod = buf->ReadWord(); break; + case 0x2F: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_TRAIN, buf->ReadWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1528,6 +1532,10 @@ static ChangeInfoResult RoadVehicleChang break; } + case 0x26: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_ROAD, buf->ReadWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1700,6 +1708,10 @@ static ChangeInfoResult ShipVehicleChang break; } + case 0x20: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_SHIP, buf->ReadWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1854,6 +1866,10 @@ static ChangeInfoResult AircraftVehicleC avi->max_range = buf->ReadWord(); break; + case 0x20: // Engine variant + ei->variant_id = GetNewEngineID(_cur.grffile, VEH_AIRCRAFT, buf->ReadWord()); + break; + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -8983,6 +8999,11 @@ static void FinaliseEngineArray() if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue; + /* Set appropriate flags on variant engine */ + if (e->info.variant_id != INVALID_ENGINE) { + Engine::Get(e->info.variant_id)->display_flags |= EngineDisplayFlags::HasVariants; + } + /* Skip wagons, there livery is defined via the engine */ if (e->type != VEH_TRAIN || e->u.rail.railveh_type != RAILVEH_WAGON) { LiveryScheme ls = GetEngineLiveryScheme(e->index, INVALID_ENGINE, nullptr); diff --git a/src/table/engines.h b/src/table/engines.h --- a/src/table/engines.h +++ b/src/table/engines.h @@ -24,7 +24,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MT(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MT(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /** * Writes the properties of a multiple-unit train into the EngineInfo struct. @@ -37,7 +37,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MM(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MM(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /** * Writes the properties of a train carriage into the EngineInfo struct. @@ -50,7 +50,7 @@ * @see MT * @note the 5 between b and f is the load amount */ -#define MW(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MW(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /** * Writes the properties of a road vehicle into the EngineInfo struct. @@ -63,7 +63,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MR(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MR(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /** * Writes the properties of a ship into the EngineInfo struct. @@ -75,7 +75,7 @@ * @param f Bitmask of the climates * @note the 10 between b and f is the load amount */ -#define MS(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MS(a, b, c, d, e, f) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, e, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /** * Writes the properties of an aeroplane into the EngineInfo struct. @@ -86,7 +86,7 @@ * @param e Bitmask of the climates * @note the 20 between b and e is the load amount */ -#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS } +#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, CARGO_AGING_TICKS, INVALID_ENGINE } /* Climates * T = Temperate