diff options
Diffstat (limited to 'src/newgrf_railtype.cpp')
-rw-r--r-- | src/newgrf_railtype.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index d4f6dcd4c..5f4c3d921 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -77,7 +77,7 @@ static const SpriteGroup *RailTypeResolveReal(const ResolverObject *object, cons return NULL; } -static inline void NewRailTypeResolver(ResolverObject *res, TileIndex tile, TileContext context, const GRFFile *grffile) +static inline void NewRailTypeResolver(ResolverObject *res, TileIndex tile, TileContext context, const GRFFile *grffile, uint32 param1 = 0, uint32 param2 = 0) { res->GetRandomBits = &RailTypeGetRandomBits; res->GetTriggers = &RailTypeGetTriggers; @@ -89,8 +89,8 @@ static inline void NewRailTypeResolver(ResolverObject *res, TileIndex tile, Tile res->u.routes.context = context; res->callback = CBID_NO_CALLBACK; - res->callback_param1 = 0; - res->callback_param2 = 0; + res->callback_param1 = param1; + res->callback_param2 = param2; res->ResetState(); res->grffile = grffile; @@ -122,6 +122,32 @@ SpriteID GetCustomRailSprite(const RailtypeInfo *rti, TileIndex tile, RailTypeSp } /** + * Get the sprite to draw for a given signal. + * @param rti The rail type data (spec). + * @param tile The tile to get the sprite for. + * @param type Signal type. + * @param var Signal variant. + * @param state Signal state. + * @param gui Is the sprite being used on the map or in the GUI? + * @return The sprite to draw. + */ +SpriteID GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, SignalState state, bool gui) +{ + if (rti->group[RTSG_SIGNALS] == NULL) return 0; + + ResolverObject object; + + uint32 param1 = gui ? 0x10 : 0x00; + uint32 param2 = (type << 16) | (var << 8) | state; + NewRailTypeResolver(&object, tile, TCX_NORMAL, rti->grffile[RTSG_SIGNALS], param1, param2); + + const SpriteGroup *group = SpriteGroup::Resolve(rti->group[RTSG_SIGNALS], &object); + if (group == NULL || group->GetNumResults() == 0) return 0; + + return group->GetResult(); +} + +/** * Perform a reverse railtype lookup to get the GRF internal ID. * @param railtype The global (OpenTTD) railtype. * @param grffile The GRF to do the lookup for. |