(svn r11910) -Fix: play 'ding-ding' crossing sound in more cases (except gameload and crossing construction)

-Fix: crossing sound is bound to tile, not to vehicle
This commit is contained in:
smatz 2008-01-17 20:41:33 +00:00
parent ac0fa7f69f
commit 8d077b16d8
6 changed files with 31 additions and 25 deletions

View File

@ -2317,7 +2317,7 @@ bool AfterLoadGame()
if (CheckSavegameVersion(86)) {
/* Now all crossings should be in correct state */
for (TileIndex t = 0; t < map_size; t++) {
if (IsLevelCrossingTile(t)) UpdateLevelCrossing(t);
if (IsLevelCrossingTile(t)) UpdateLevelCrossing(t, false);
}
}

View File

@ -383,7 +383,7 @@ CommandCost CmdBuildSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32 p
(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);
UpdateLevelCrossing(tile, false);
}
break;
}

View File

@ -487,7 +487,7 @@ CommandCost CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
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);
UpdateLevelCrossing(tile, false);
MarkTileDirtyByTile(tile);
}
return CommandCost(EXPENSES_CONSTRUCTION, _price.build_road * (rt == ROADTYPE_ROAD ? 2 : 4));

View File

@ -136,6 +136,6 @@ bool ValParamRoadType(const RoadType rt);
*/
RoadTypes GetPlayerRoadtypes(const PlayerID p);
void UpdateLevelCrossing(TileIndex tile);
void UpdateLevelCrossing(TileIndex tile, bool sound = true);
#endif /* ROAD_FUNC_H */

View File

@ -191,25 +191,28 @@ static inline TrackBits GetCrossingRailBits(TileIndex tile)
return AxisToTrackBits(OtherAxis(GetCrossingRoadAxis(tile)));
}
static inline void UnbarCrossing(TileIndex t)
{
assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
ClrBit(_m[t].m4, 5);
}
static inline void BarCrossing(TileIndex t)
{
assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
SetBit(_m[t].m4, 5);
}
static inline bool IsCrossingBarred(TileIndex t)
{
assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
return HasBit(_m[t].m4, 5);
}
static inline void SetCrossingBarred(TileIndex t, bool barred)
{
assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
SB(_m[t].m4, 5, 1, barred);
}
static inline void UnbarCrossing(TileIndex t)
{
SetCrossingBarred(t, false);
}
static inline void BarCrossing(TileIndex t)
{
SetCrossingBarred(t, true);
}
#define IsOnDesert IsOnSnow
static inline bool IsOnSnow(TileIndex t)
{

View File

@ -1683,20 +1683,23 @@ static Vehicle *TrainApproachingCrossing(TileIndex tile)
/**
* Sets correct crossing state
* @param tile tile to update
* @param sound should we play sound?
* @pre tile is a rail-road crossing
*/
void UpdateLevelCrossing(TileIndex tile)
void UpdateLevelCrossing(TileIndex tile, bool sound)
{
assert(IsLevelCrossingTile(tile));
UnbarCrossing(tile);
/* train on crossing || train approaching crossing */
if (VehicleFromPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile)) {
BarCrossing(tile);
}
bool new_state = VehicleFromPos(tile, NULL, &TrainOnTileEnum) || TrainApproachingCrossing(tile);
MarkTileDirtyByTile(tile);
if (new_state != IsCrossingBarred(tile)) {
if (new_state && sound) {
SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile);
}
SetCrossingBarred(tile, new_state);
MarkTileDirtyByTile(tile);
}
}
@ -3458,7 +3461,7 @@ static bool TrainCheckIfLineEnds(Vehicle *v)
/* approaching a rail/road crossing? then make it red */
if (IsLevelCrossingTile(tile) && !IsCrossingBarred(tile)) {
BarCrossing(tile);
SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v);
SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile);
MarkTileDirtyByTile(tile);
}