--- a/src/date.cpp Sun Oct 28 15:40:18 2007 +0000
+++ b/src/date.cpp Sun Oct 28 16:00:51 2007 +0000
@@ -220,7 +220,11 @@
for (i = daytick; i < total; i += DAY_TICKS) {
Vehicle *v = GetVehicle(i);
- if (v->IsValid()) _on_new_vehicle_day_proc[v->type](v);
+ if (v->IsValid()) {
+ /* Call the 32-day callback if needed */
+ CheckVehicle32Day(v);
+ _on_new_vehicle_day_proc[v->type](v);
+ }
}
}
--- a/src/newgrf_callbacks.h Sun Oct 28 15:40:18 2007 +0000
+++ b/src/newgrf_callbacks.h Sun Oct 28 16:00:51 2007 +0000
@@ -134,7 +134,7 @@
CBID_VEHICLE_START_STOP_CHECK = 0x31,
/** Called for every vehicle every 32 days (not all on same date though). */
- CBID_VEHICLE_32DAY_CALLBACK = 0x32, // not implemented
+ CBID_VEHICLE_32DAY_CALLBACK = 0x32,
/** Called to play a special sound effect */
CBID_VEHICLE_SOUND_EFFECT = 0x33,
--- a/src/newgrf_engine.cpp Sun Oct 28 15:40:18 2007 +0000
+++ b/src/newgrf_engine.cpp Sun Oct 28 16:00:51 2007 +0000
@@ -1050,6 +1050,10 @@
assert(!first);
if (v->Next() != NULL) DoTriggerVehicle(v->Next(), VEHICLE_TRIGGER_ANY_NEW_CARGO, base_random_bits, false);
break;
+
+ case VEHICLE_TRIGGER_CALLBACK_32:
+ /* Do not do any recursion */
+ break;
}
}
--- a/src/newgrf_engine.h Sun Oct 28 15:40:18 2007 +0000
+++ b/src/newgrf_engine.h Sun Oct 28 16:00:51 2007 +0000
@@ -49,6 +49,8 @@
VEHICLE_TRIGGER_EMPTY = 4,
/* Not triggered externally (called for the whole chain if we got NEW_CARGO) */
VEHICLE_TRIGGER_ANY_NEW_CARGO = 8,
+ /* Externally triggered for each vehicle in chain */
+ VEHICLE_TRIGGER_CALLBACK_32 = 10,
};
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
--- a/src/vehicle.cpp Sun Oct 28 15:40:18 2007 +0000
+++ b/src/vehicle.cpp Sun Oct 28 16:00:51 2007 +0000
@@ -1398,6 +1398,15 @@
return found;
}
+void CheckVehicle32Day(Vehicle *v)
+{
+ if ((v->day_counter & 0x1F) != 0) return;
+
+ uint16 callback = GetVehicleCallback(CBID_VEHICLE_32DAY_CALLBACK, 0, 0, v->engine_type, v);
+ if (callback == CALLBACK_FAILED) return;
+ if (HASBIT(callback, 0)) TriggerVehicle(v, VEHICLE_TRIGGER_CALLBACK_32); // Trigger vehicle trigger 10
+ if (HASBIT(callback, 1)) v->colormap = PAL_NONE; // Update colormap via callback 2D
+}
void DecreaseVehicleValue(Vehicle *v)
{
--- a/src/vehicle.h Sun Oct 28 15:40:18 2007 +0000
+++ b/src/vehicle.h Sun Oct 28 16:00:51 2007 +0000
@@ -591,6 +591,7 @@
byte VehicleRandomBits();
void ResetVehiclePosHash();
void ResetVehicleColorMap();
+void CheckVehicle32Day(Vehicle *v);
bool CanRefitTo(EngineID engine_type, CargoID cid_to);
CargoID FindFirstRefittableCargo(EngineID engine_type);