1
0
Fork 0

(svn r19398) -Codechange: move the desync cache checking code to its own function. Also make the drive through and cargo list checks only run when 'desync' debugging is enabled.

release/1.1
rubidium 2010-03-13 14:58:37 +00:00
parent bf2c06bedb
commit 86f14f8e72
1 changed files with 94 additions and 82 deletions

View File

@ -1082,31 +1082,18 @@ void SwitchToMode(SwitchMode new_mode)
/** /**
* State controlling game loop. * Check the validity of some of the caches.
* The state must not be changed from anywhere but here. * Especially in the sense of desyncs between
* That check is enforced in DoCommand. * the cached value and what the value would
* be when calculated from the 'base' data.
*/ */
void StateGameLoop() static void CheckCaches()
{ {
/* dont execute the state loop during pause */ /* Return here so it is easy to add checks that are run
if (_pause_mode != PM_UNPAUSED) { * always to aid testing of caches. */
CallWindowTickEvent(); if (_debug_desync_level > 1) return;
return;
}
if (IsGeneratingWorld()) return;
ClearStorageChanges(false); /* Strict checking of the road stop cache entries */
if (_game_mode == GM_EDITOR) {
RunTileLoop();
CallVehicleTicks();
CallLandscapeTick();
ClearStorageChanges(true);
CallWindowTickEvent();
NewsLoop();
} else {
/* Temporary strict checking of the road stop cache entries */
const RoadStop *rs; const RoadStop *rs;
FOR_ALL_ROADSTOPS(rs) { FOR_ALL_ROADSTOPS(rs) {
if (IsStandardRoadStopTile(rs->xy)) continue; if (IsStandardRoadStopTile(rs->xy)) continue;
@ -1116,7 +1103,6 @@ void StateGameLoop()
rs->GetEntry(DIAGDIR_NW)->CheckIntegrity(rs); rs->GetEntry(DIAGDIR_NW)->CheckIntegrity(rs);
} }
if (_debug_desync_level > 1) {
Vehicle *v; Vehicle *v;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v != v->First()) continue; if (v != v->First()) continue;
@ -1168,10 +1154,8 @@ void StateGameLoop()
break; break;
} }
} }
}
/* Check whether the caches are still valid */ /* Check whether the caches are still valid */
Vehicle *v;
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
byte buff[sizeof(VehicleCargoList)]; byte buff[sizeof(VehicleCargoList)];
memcpy(buff, &v->cargo, sizeof(VehicleCargoList)); memcpy(buff, &v->cargo, sizeof(VehicleCargoList));
@ -1188,6 +1172,34 @@ void StateGameLoop()
assert(memcmp(&st->goods[c].cargo, buff, sizeof(StationCargoList)) == 0); assert(memcmp(&st->goods[c].cargo, buff, sizeof(StationCargoList)) == 0);
} }
} }
}
/**
* State controlling game loop.
* The state must not be changed from anywhere but here.
* That check is enforced in DoCommand.
*/
void StateGameLoop()
{
/* dont execute the state loop during pause */
if (_pause_mode != PM_UNPAUSED) {
CallWindowTickEvent();
return;
}
if (IsGeneratingWorld()) return;
ClearStorageChanges(false);
if (_game_mode == GM_EDITOR) {
RunTileLoop();
CallVehicleTicks();
CallLandscapeTick();
ClearStorageChanges(true);
CallWindowTickEvent();
NewsLoop();
} else {
CheckCaches();
/* All these actions has to be done from OWNER_NONE /* All these actions has to be done from OWNER_NONE
* for multiplayer compatibility */ * for multiplayer compatibility */