|
|
|
@ -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();
|
|
|
|
|