(svn r4702) - NewGRF: add support for 'special' vehicle callbacks that use a different vehicle for parent scope than the first vehicle in the consist.
authorpeter1138
Tue, 02 May 2006 21:42:11 +0000
changeset 3726 a446208c7296
parent 3725 1b5ce8c7b51f
child 3727 b4d9a8ab4ce4
(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
newgrf_engine.h
--- a/newgrf_engine.c	Tue May 02 20:48:27 2006 +0000
+++ b/newgrf_engine.c	Tue May 02 21:42:11 2006 +0000
@@ -800,6 +800,52 @@
 	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)
 {
--- a/newgrf_engine.h	Tue May 02 20:48:27 2006 +0000
+++ b/newgrf_engine.h	Tue May 02 21:42:11 2006 +0000
@@ -26,6 +26,7 @@
 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)