From e0d69933f607b7ec20dfe69a2a699c4db6c2ccd1 Mon Sep 17 00:00:00 2001 From: frosch Date: Fri, 13 Dec 2013 20:21:04 +0000 Subject: (svn r26157) -Feature: [NewGRF] Vehicle variable 4D for determining the position within an articulated vehicle. --- src/newgrf_engine.cpp | 12 ++++++++++++ src/vehicle_base.h | 2 ++ 2 files changed, 14 insertions(+) (limited to 'src') diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 3119524b5..3b48aba83 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -627,6 +627,17 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object, if (!v->IsPrimaryVehicle()) return 0; return v->GetCurrentMaxSpeed(); + case 0x4D: // Position within articulated vehicle + if (!HasBit(v->grf_cache.cache_valid, NCVV_POSITION_IN_VEHICLE)) { + byte artic_before = 0; + for (const Vehicle *u = v; u->IsArticulatedPart(); u = u->Previous()) artic_before++; + byte artic_after = 0; + for (const Vehicle *u = v; u->HasArticulatedPart(); u = u->Next()) artic_after++; + v->grf_cache.position_in_vehicle = artic_before | artic_after << 8; + SetBit(v->grf_cache.cache_valid, NCVV_POSITION_IN_VEHICLE); + } + return v->grf_cache.position_in_vehicle; + /* Variables which use the parameter */ case 0x60: // Count consist's engine ID occurrence if (v->type != VEH_TRAIN) return v->GetEngine()->grf_prop.local_id == parameter ? 1 : 0; @@ -1293,6 +1304,7 @@ void FillNewGRFVehicleCache(const Vehicle *v) { 0x41, NCVV_POSITION_SAME_ID_LENGTH }, { 0x42, NCVV_CONSIST_CARGO_INFORMATION }, { 0x43, NCVV_COMPANY_INFORMATION }, + { 0x4D, NCVV_POSITION_IN_VEHICLE }, }; assert_compile(NCVV_END == lengthof(cache_entries)); diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 4c37847d9..261b8ed03 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -58,6 +58,7 @@ enum NewGRFCacheValidValues { NCVV_POSITION_SAME_ID_LENGTH = 1, ///< This bit will be set if the NewGRF var 41 currently stored is valid. NCVV_CONSIST_CARGO_INFORMATION = 2, ///< This bit will be set if the NewGRF var 42 currently stored is valid. NCVV_COMPANY_INFORMATION = 3, ///< This bit will be set if the NewGRF var 43 currently stored is valid. + NCVV_POSITION_IN_VEHICLE = 4, ///< This bit will be set if the NewGRF var 4D currently stored is valid. NCVV_END, ///< End of the bits. }; @@ -68,6 +69,7 @@ struct NewGRFCache { uint32 position_same_id_length; ///< Cache for NewGRF var 41. uint32 consist_cargo_information; ///< Cache for NewGRF var 42. (Note: The cargotype is untranslated in the cache because the accessing GRF is yet unknown.) uint32 company_information; ///< Cache for NewGRF var 43. + uint32 position_in_vehicle; ///< Cache for NewGRF var 4D. uint8 cache_valid; ///< Bitset that indicates which cache values are valid. }; -- cgit v1.2.3-54-g00ecf