Mercurial > hg > openttd
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)) { |