# HG changeset patch # User smatz # Date 1200599346 0 # Node ID 1549b7f9d0a83c0cbccdc646f2baca30c5593841 # Parent 7f1498dba00e64b4251b48adcee2f255a1572574 (svn r11908) -Fix: update crossing when merging a company, when building a crossing and after loading older savegame diff -r 7f1498dba00e -r 1549b7f9d0a8 src/economy.cpp --- a/src/economy.cpp Thu Jan 17 19:41:05 2008 +0000 +++ b/src/economy.cpp Thu Jan 17 19:49:06 2008 +0000 @@ -41,6 +41,7 @@ #include "sound_func.h" #include "track_type.h" #include "track_func.h" +#include "road_func.h" #include "rail_map.h" #include "signal_func.h" #include "gfx_func.h" @@ -432,7 +433,9 @@ if (new_player != PLAYER_SPECTATOR) { /* Update all signals because there can be new segment that was owned by two players - * and signals were not propagated */ + * and signals were not propagated + * Similiar with crossings - it is needed to bar crossings that weren't before + * because of different owner of crossing and approaching train */ tile = 0; do { @@ -442,6 +445,8 @@ Track track = RemoveFirstTrack(&tracks); if (HasSignalOnTrack(tile, track)) AddTrackToSignalBuffer(tile, track, new_player); } while (tracks != TRACK_BIT_NONE); + } else if (IsLevelCrossingTile(tile) && IsTileOwner(tile, new_player)) { + UpdateLevelCrossing(tile); } } while (++tile != MapSize()); diff -r 7f1498dba00e -r 1549b7f9d0a8 src/openttd.cpp --- a/src/openttd.cpp Thu Jan 17 19:41:05 2008 +0000 +++ b/src/openttd.cpp Thu Jan 17 19:49:06 2008 +0000 @@ -65,6 +65,7 @@ #include "vehicle_func.h" #include "sound_func.h" #include "variables.h" +#include "road_func.h" #include "bridge_map.h" #include "clear_map.h" @@ -2313,6 +2314,13 @@ } } + if (CheckSavegameVersion(86)) { + /* Now all crossings should be in correct state */ + for (TileIndex t = 0; t < map_size; t++) { + if (IsLevelCrossingTile(t)) UpdateLevelCrossing(t); + } + } + return InitializeWindowsAndCaches(); } diff -r 7f1498dba00e -r 1549b7f9d0a8 src/rail_cmd.cpp --- a/src/rail_cmd.cpp Thu Jan 17 19:41:05 2008 +0000 +++ b/src/rail_cmd.cpp Thu Jan 17 19:49:06 2008 +0000 @@ -383,6 +383,7 @@ (track == TRACK_Y && road == ROAD_X)) { if (flags & DC_EXEC) { MakeRoadCrossing(tile, GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY), _current_player, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile)); + UpdateLevelCrossing(tile); } break; } diff -r 7f1498dba00e -r 1549b7f9d0a8 src/road_cmd.cpp --- a/src/road_cmd.cpp Thu Jan 17 19:41:05 2008 +0000 +++ b/src/road_cmd.cpp Thu Jan 17 19:49:06 2008 +0000 @@ -32,6 +32,7 @@ #include "vehicle_func.h" #include "vehicle_base.h" #include "sound_func.h" +#include "road_func.h" #include "table/sprites.h" #include "table/strings.h" @@ -486,6 +487,7 @@ YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile))); /* Always add road to the roadtypes (can't draw without it) */ MakeRoadCrossing(tile, _current_player, _current_player, _current_player, GetTileOwner(tile), roaddir, GetRailType(tile), RoadTypeToRoadTypes(rt) | ROADTYPES_ROAD, p2); + UpdateLevelCrossing(tile); MarkTileDirtyByTile(tile); } return CommandCost(EXPENSES_CONSTRUCTION, _price.build_road * (rt == ROADTYPE_ROAD ? 2 : 4)); @@ -1343,11 +1345,9 @@ { switch (GetRoadTileType(tile)) { case ROAD_TILE_CROSSING: - if (v->type == VEH_TRAIN && !IsCrossingBarred(tile)) { - /* train crossing a road */ - SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v); - BarCrossing(tile); - MarkTileDirtyByTile(tile); + if (v->type == VEH_TRAIN) { + /* it should be barred */ + assert(IsCrossingBarred(tile)); } break; diff -r 7f1498dba00e -r 1549b7f9d0a8 src/road_func.h --- a/src/road_func.h Thu Jan 17 19:41:05 2008 +0000 +++ b/src/road_func.h Thu Jan 17 19:49:06 2008 +0000 @@ -136,4 +136,6 @@ */ RoadTypes GetPlayerRoadtypes(const PlayerID p); +void UpdateLevelCrossing(TileIndex tile); + #endif /* ROAD_FUNC_H */ diff -r 7f1498dba00e -r 1549b7f9d0a8 src/train_cmd.cpp --- a/src/train_cmd.cpp Thu Jan 17 19:41:05 2008 +0000 +++ b/src/train_cmd.cpp Thu Jan 17 19:49:06 2008 +0000 @@ -1685,7 +1685,7 @@ * @param tile tile to update * @pre tile is a rail-road crossing */ -void UpdateTrainCrossing(TileIndex tile) +void UpdateLevelCrossing(TileIndex tile) { assert(IsLevelCrossingTile(tile)); @@ -1773,11 +1773,11 @@ ClrBit(v->u.rail.flags, VRF_REVERSING); /* update crossing we were approaching */ - if (crossing != INVALID_TILE) UpdateTrainCrossing(crossing); + if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing); /* maybe we are approaching crossing now, after reversal */ crossing = TrainApproachingCrossingTile(v); - if (crossing != INVALID_TILE) UpdateTrainCrossing(crossing); + if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing); } /** Reverse train. @@ -2856,7 +2856,7 @@ END_ENUM_WAGONS(v) /* must be updated after the train has been marked crashed */ - if (crossing != INVALID_TILE) UpdateTrainCrossing(crossing); + if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing); } static uint CountPassengersInTrain(const Vehicle* v) @@ -3148,7 +3148,7 @@ * (above) or the last vehicle moves. */ if (v->Next() == NULL) { TrainMovedChangeSignals(gp.old_tile, ReverseDiagDir(enterdir)); - if (IsLevelCrossingTile(gp.old_tile)) UpdateTrainCrossing(gp.old_tile); + if (IsLevelCrossingTile(gp.old_tile)) UpdateLevelCrossing(gp.old_tile); } } } @@ -3211,7 +3211,7 @@ v = NULL; // make sure nobody will won't try to read 'v' anymore /* check if the wagon was on a road/rail-crossing */ - if (IsLevelCrossingTile(tile)) UpdateTrainCrossing(tile); + if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile); /* Update signals */ if (IsTileType(tile, MP_TUNNELBRIDGE) || IsTileDepotType(tile, TRANSPORT_RAIL)) {