(svn r2041) -Fix: not all vehicles did get a day_proc call (because of rounding errors)

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
truelight 20 years ago
parent ccd6a0614f
commit 88ef277dc3

@ -557,48 +557,68 @@ static const uint16 _autosave_months[] = {
0x001, // every 12 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; Vehicle *v;
uint i;
VehicleID ctr; VehicleID ctr;
int t; uint i;
YearMonthDay ymd;
if (_game_mode == GM_MENU) { ctr = _vehicle_id_ctr_day;
_tick_counter++;
/* 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; return;
} }
/*if the day changed, call the vehicle event but only update a part of the vehicles for (i = 0; i < amount; i++, ctr++) {
old max was i!= 12. But with that and a bigger number of vehicles (2560), per day only /* Skip non-existing vehicles */
a part of it could be done, namely: function called max_size date_fract (uint16) / 885 x 12 ==> if (ctr >= GetVehiclePoolSize()) {
65536 / 885 = 74; 74x12 = 888. So max 888. Any vehicles above that were not _on_new_vehicle_day_proc'd _vehicle_id_ctr_day += amount;
eg. aged. return;
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
*/
ctr = _vehicle_id_ctr_day; v = GetVehicle(ctr);
for (i = 0; i != ((uint)GetVehiclePoolSize() / vehicles_per_day) + 1 && ctr != GetVehiclePoolSize(); i++) { if (v->type != 0)
Vehicle *v = GetVehicle(ctr++); _on_new_vehicle_day_proc[v->type - 0x10](v);
if ((t = v->type) != 0)
_on_new_vehicle_day_proc[t - 0x10](v);
} }
_vehicle_id_ctr_day = ctr; _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? */ /* increase day, and check if a new day is there? */
_tick_counter++; _tick_counter++;
_date_fract += 885; _date_fract++;
if (_date_fract >= 885) if (_date_fract < DAY_TICKS)
return; return;
_date_fract = 0;
printf("%d\n", _frame_counter);
/* yeah, increse day counter and call various daily loops */ /* yeah, increse day counter and call various daily loops */
_date++; _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; _vehicle_id_ctr_day = 0;
TextMessageDailyLoop(); TextMessageDailyLoop();

@ -423,8 +423,7 @@ static void FixOldVehicles(void)
} }
} }
if (_vehicle_id_ctr_day > GetVehiclePoolSize()) _vehicle_id_ctr_day = 0;
_vehicle_id_ctr_day = 0;
} }
/* /*

@ -8,8 +8,8 @@
#include "saveload.h" #include "saveload.h"
enum { enum {
SAVEGAME_MAJOR_VERSION = 11, SAVEGAME_MAJOR_VERSION = 0xB,
SAVEGAME_MINOR_VERSION = 0, SAVEGAME_MINOR_VERSION = 0x1,
SAVEGAME_LOADABLE_VERSION = (SAVEGAME_MAJOR_VERSION << 8) + SAVEGAME_MINOR_VERSION SAVEGAME_LOADABLE_VERSION = (SAVEGAME_MAJOR_VERSION << 8) + SAVEGAME_MINOR_VERSION
}; };

@ -2093,9 +2093,7 @@ static void Load_VEHS(void)
} }
} }
/* This is to ensure all pointers are within the limits of if (_sl.full_version < 0x0B01)
_vehicles_size */
if (_vehicle_id_ctr_day >= GetVehiclePoolSize())
_vehicle_id_ctr_day = 0; _vehicle_id_ctr_day = 0;
} }

Loading…
Cancel
Save