comparison src/saveload/afterload.cpp @ 10848:51cf93516bd6 draft

(svn r15183) -Fix: stand-alone rail tiles with invalid owner were not removed. Also, make the whole check a bit more intelligent.
author smatz <smatz@openttd.org>
date Wed, 21 Jan 2009 00:14:08 +0000
parents 816dcf24bd63
children 7881d9cd55ab
comparison
equal deleted inserted replaced
10847:142685c080f0 10848:51cf93516bd6
287 } 287 }
288 288
289 ShowInfo(buffer); 289 ShowInfo(buffer);
290 } 290 }
291 291
292 /**
293 * Tries to change owner of this rail tile to a valid owner. In very old versions it could happen that
294 * a rail track had an invalid owner. When conversion isn't possible, track is removed.
295 * @param t tile to update
296 */
297 static void FixOwnerOfRailTrack(TileIndex t)
298 {
299 assert(!IsValidCompanyID(GetTileOwner(t)) && (IsLevelCrossingTile(t) || IsPlainRailTile(t)));
300
301 /* remove leftover rail piece from crossing (from very old savegames) */
302 Vehicle *v = NULL, *w;
303 FOR_ALL_VEHICLES(w) {
304 if (w->type == VEH_TRAIN && w->tile == t) {
305 v = w;
306 break;
307 }
308 }
309
310 if (v != NULL) {
311 /* when there is a train on crossing (it could happen in TTD), set owner of crossing to train owner */
312 SetTileOwner(t, v->owner);
313 return;
314 }
315
316 /* try to find any connected rail */
317 for (DiagDirection dd = DIAGDIR_BEGIN; dd < DIAGDIR_END; dd++) {
318 TileIndex tt = t + TileOffsByDiagDir(dd);
319 if (GetTileTrackStatus(t, TRANSPORT_RAIL, 0, dd) != 0 &&
320 GetTileTrackStatus(tt, TRANSPORT_RAIL, 0, ReverseDiagDir(dd)) != 0 &&
321 IsValidCompanyID(GetTileOwner(tt))) {
322 SetTileOwner(t, GetTileOwner(tt));
323 return;
324 }
325 }
326
327 if (IsLevelCrossingTile(t)) {
328 /* else change the crossing to normal road (road vehicles won't care) */
329 MakeRoadNormal(t, GetCrossingRoadBits(t), GetRoadTypes(t), GetTownIndex(t),
330 GetRoadOwner(t, ROADTYPE_ROAD), GetRoadOwner(t, ROADTYPE_TRAM), GetRoadOwner(t, ROADTYPE_HWAY));
331 return;
332 }
333
334 /* if it's not a crossing, make it clean land */
335 MakeClear(t, CLEAR_GRASS, 0);
336 }
292 337
293 bool AfterLoadGame() 338 bool AfterLoadGame()
294 { 339 {
295 typedef void (CDECL *SignalHandlerPointer)(int); 340 typedef void (CDECL *SignalHandlerPointer)(int);
296 SignalHandlerPointer prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash); 341 SignalHandlerPointer prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash);
1447 /* update even non-existing road types to update tile owner too */ 1492 /* update even non-existing road types to update tile owner too */
1448 Owner o = GetRoadOwner(t, rt); 1493 Owner o = GetRoadOwner(t, rt);
1449 if (o < MAX_COMPANIES && !IsValidCompanyID(o)) SetRoadOwner(t, rt, OWNER_NONE); 1494 if (o < MAX_COMPANIES && !IsValidCompanyID(o)) SetRoadOwner(t, rt, OWNER_NONE);
1450 } 1495 }
1451 if (IsLevelCrossing(t)) { 1496 if (IsLevelCrossing(t)) {
1452 Owner o = GetTileOwner(t); 1497 if (!IsValidCompanyID(GetTileOwner(t))) FixOwnerOfRailTrack(t);
1453 if (!IsValidCompanyID(o)) {
1454 /* remove leftover rail piece from crossing (from very old savegames) */
1455 Vehicle *v = NULL, *w;
1456 FOR_ALL_VEHICLES(w) {
1457 if (w->type == VEH_TRAIN && w->tile == t) {
1458 v = w;
1459 break;
1460 }
1461 }
1462 if (v != NULL) {
1463 /* when there is a train on crossing (it could happen in TTD), set owner of crossing to train owner */
1464 SetTileOwner(t, v->owner);
1465 } else {
1466 /* else change the crossing to normal road (road vehicles won't care) */
1467 MakeRoadNormal(t, GetCrossingRoadBits(t), GetRoadTypes(t), GetTownIndex(t),
1468 GetRoadOwner(t, ROADTYPE_ROAD), GetRoadOwner(t, ROADTYPE_TRAM), GetRoadOwner(t, ROADTYPE_HWAY));
1469 }
1470 }
1471 } 1498 }
1499 } else if (IsTileType(t, MP_RAILWAY) && IsPlainRailTile(t)) {
1500 if (!IsValidCompanyID(GetTileOwner(t))) FixOwnerOfRailTrack(t);
1472 } 1501 }
1473 } 1502 }
1474 1503
1475 /* Convert old PF settings to new */ 1504 /* Convert old PF settings to new */
1476 if (_settings_game.pf.yapf.rail_use_yapf || CheckSavegameVersion(28)) { 1505 if (_settings_game.pf.yapf.rail_use_yapf || CheckSavegameVersion(28)) {