From a38c8605b09e272d9def47b163ecf4220b94bad0 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Tue, 2 May 2006 21:42:11 +0000 Subject: [PATCH] (svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist. --- newgrf_engine.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ newgrf_engine.h | 1 + 2 files changed, 47 insertions(+) diff --git a/newgrf_engine.c b/newgrf_engine.c index de61aa01a6..5c386ccc99 100644 --- a/newgrf_engine.c +++ b/newgrf_engine.c @@ -800,6 +800,52 @@ uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineI return group->g.callback.result; } +/** + * Evaluate a newgrf callback for vehicles with a different vehicle for parent scope. + * @param callback The callback to evalute + * @param param1 First parameter of the callback + * @param param2 Second parameter of the callback + * @param engine Engine type of the vehicle to evaluate the callback for + * @param v The vehicle to evaluate the callback for, or NULL if it doesnt exist yet + * @param parent The vehicle to use for parent scope + * @return The value the callback returned, or CALLBACK_FAILED if it failed + */ +uint16 GetVehicleCallbackParent(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent) +{ + const SpriteGroup *group; + ResolverObject object; + CargoID cargo; + + NewVehicleResolver(&object, v); + + object.callback = callback; + object.callback_param1 = param1; + object.callback_param2 = param2; + + object.u.vehicle.parent = parent; + + cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type]; + + group = engine_custom_sprites[engine][cargo]; + + if (v != NULL && v->type == VEH_Train) { + const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine); + + if (overset != NULL) group = overset; + } + + group = Resolve(group, &object); + + if ((group == NULL || group->type != SGT_CALLBACK) && cargo != GC_DEFAULT) { + // This group is empty but perhaps there'll be a default one. + group = Resolve(engine_custom_sprites[engine][GC_DEFAULT], &object); + } + + if (group == NULL || group->type != SGT_CALLBACK) + return CALLBACK_FAILED; + + return group->g.callback.result; +} static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_random_bits, bool first) { diff --git a/newgrf_engine.h b/newgrf_engine.h index e610f4050e..248de61ee1 100644 --- a/newgrf_engine.h +++ b/newgrf_engine.h @@ -26,6 +26,7 @@ void SetEngineGRF(EngineID engine, uint32 grfid); uint32 GetEngineGRFID(EngineID engine); uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v); +uint16 GetVehicleCallbackParent(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v, const Vehicle *parent); bool UsesWagonOverride(const Vehicle *v); #define GetCustomVehicleSprite(v, direction) GetCustomEngineSprite(v->engine_type, v, direction) #define GetCustomVehicleIcon(et, direction) GetCustomEngineSprite(et, NULL, direction)