summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2005-03-24 13:59:44 +0000
committertruelight <truelight@openttd.org>2005-03-24 13:59:44 +0000
commit88ef277dc3678610bf2b47437dcbcc00f6fbe333 (patch)
tree0b128e45836acd883ea7d555799b51783e559d1c /misc.c
parentccd6a0614f57518fffec7bd5fa4c07e9eb1bfd2d (diff)
downloadopenttd-88ef277dc3678610bf2b47437dcbcc00f6fbe333.tar.xz
(svn r2041) -Fix: not all vehicles did get a day_proc call (because of rounding errors)
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/misc.c b/misc.c
index 21cfb1994..648233973 100644
--- a/misc.c
+++ b/misc.c
@@ -557,48 +557,68 @@ static const uint16 _autosave_months[] = {
0x001, // every 12 months
};
-void IncreaseDate(void)
+/**
+ * Runs the day_proc of 'amount' vehicles.
+ */
+static void RunVehicleDayProc(uint amount)
{
- const int vehicles_per_day = (1 << (sizeof(_date_fract) * 8)) / 885;
- uint i;
+ Vehicle *v;
VehicleID ctr;
- int t;
- YearMonthDay ymd;
+ uint i;
- if (_game_mode == GM_MENU) {
- _tick_counter++;
+ ctr = _vehicle_id_ctr_day;
+
+ /* If the CTR is already over the size of the pool, don't even run the for-loop */
+ if (ctr >= GetVehiclePoolSize()) {
+ _vehicle_id_ctr_day += amount;
return;
}
- /*if the day changed, call the vehicle event but only update a part of the vehicles
- old max was i!= 12. But with that and a bigger number of vehicles (2560), per day only
- a part of it could be done, namely: function called max_size date_fract (uint16) / 885 x 12 ==>
- 65536 / 885 = 74; 74x12 = 888. So max 888. Any vehicles above that were not _on_new_vehicle_day_proc'd
- eg. aged.
- So new code updates it for max vehicles.
- (_vehicles_size / maximum number of times ctr is incremented before reset ) + 1 (to get last vehicles too)
- max size of _date_fract / 885 (added each tick) is number of times before ctr is reset.
- Calculation might look complicated, but compiler just replaces it with 35, so that's ok
- */
+ for (i = 0; i < amount; i++, ctr++) {
+ /* Skip non-existing vehicles */
+ if (ctr >= GetVehiclePoolSize()) {
+ _vehicle_id_ctr_day += amount;
+ return;
+ }
- ctr = _vehicle_id_ctr_day;
- for (i = 0; i != ((uint)GetVehiclePoolSize() / vehicles_per_day) + 1 && ctr != GetVehiclePoolSize(); i++) {
- Vehicle *v = GetVehicle(ctr++);
- if ((t = v->type) != 0)
- _on_new_vehicle_day_proc[t - 0x10](v);
+ v = GetVehicle(ctr);
+ if (v->type != 0)
+ _on_new_vehicle_day_proc[v->type - 0x10](v);
}
+
_vehicle_id_ctr_day = ctr;
+}
+
+void IncreaseDate(void)
+{
+ uint32 total_vehicles = (1 << _vehicle_pool.block_size_bits) * _vehicle_pool.max_blocks;
+ YearMonthDay ymd;
+
+ if (_game_mode == GM_MENU) {
+ _tick_counter++;
+ return;
+ }
+
+ RunVehicleDayProc(total_vehicles / DAY_TICKS);
/* increase day, and check if a new day is there? */
_tick_counter++;
- _date_fract += 885;
- if (_date_fract >= 885)
+ _date_fract++;
+ if (_date_fract < DAY_TICKS)
return;
+ _date_fract = 0;
+
+ printf("%d\n", _frame_counter);
/* yeah, increse day counter and call various daily loops */
_date++;
+ /* We have a hole because of rounding errors, between the last vehicle checked and the max amount
+ * of vehicles.. correct for that problem here */
+ RunVehicleDayProc(total_vehicles - _vehicle_id_ctr_day);
+
+ assert(_vehicle_id_ctr_day == total_vehicles);
_vehicle_id_ctr_day = 0;
TextMessageDailyLoop();