(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.

This commit is contained in:
rubidium
2010-03-13 14:58:37 +00:00
parent bf2c06bedb
commit 86f14f8e72

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 */