mirror of https://github.com/OpenTTD/OpenTTD
(svn r11898) -Fix: Update neighboured canals + signals when flooding non-flat tiles, too.
parent
978a7ca56a
commit
c579bffed2
|
@ -528,10 +528,12 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
|
||||||
* The function floods the lower halftile, if the tile has a halftile foundation.
|
* The function floods the lower halftile, if the tile has a halftile foundation.
|
||||||
*
|
*
|
||||||
* @param t The tile to flood.
|
* @param t The tile to flood.
|
||||||
|
* @return true if something was flooded.
|
||||||
*/
|
*/
|
||||||
void FloodHalftile(TileIndex t)
|
bool FloodHalftile(TileIndex t)
|
||||||
{
|
{
|
||||||
if (GetRailGroundType(t) == RAIL_GROUND_WATER) return;
|
bool flooded = false;
|
||||||
|
if (GetRailGroundType(t) == RAIL_GROUND_WATER) return flooded;
|
||||||
|
|
||||||
Slope tileh = GetTileSlope(t, NULL);
|
Slope tileh = GetTileSlope(t, NULL);
|
||||||
TrackBits rail_bits = GetTrackBits(t);
|
TrackBits rail_bits = GetTrackBits(t);
|
||||||
|
@ -542,20 +544,23 @@ void FloodHalftile(TileIndex t)
|
||||||
TrackBits to_remove = lower_track & rail_bits;
|
TrackBits to_remove = lower_track & rail_bits;
|
||||||
if (to_remove != 0) {
|
if (to_remove != 0) {
|
||||||
_current_player = OWNER_WATER;
|
_current_player = OWNER_WATER;
|
||||||
if (CmdFailed(DoCommand(t, 0, FIND_FIRST_BIT(to_remove), DC_EXEC, CMD_REMOVE_SINGLE_RAIL))) return; // not yet floodable
|
if (CmdFailed(DoCommand(t, 0, FIND_FIRST_BIT(to_remove), DC_EXEC, CMD_REMOVE_SINGLE_RAIL))) return flooded; // not yet floodable
|
||||||
|
flooded = true;
|
||||||
rail_bits = rail_bits & ~to_remove;
|
rail_bits = rail_bits & ~to_remove;
|
||||||
if (rail_bits == 0) {
|
if (rail_bits == 0) {
|
||||||
MakeShore(t);
|
MakeShore(t);
|
||||||
MarkTileDirtyByTile(t);
|
MarkTileDirtyByTile(t);
|
||||||
return;
|
return flooded;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsNonContinuousFoundation(GetRailFoundation(tileh, rail_bits))) {
|
if (IsNonContinuousFoundation(GetRailFoundation(tileh, rail_bits))) {
|
||||||
|
flooded = true;
|
||||||
SetRailGroundType(t, RAIL_GROUND_WATER);
|
SetRailGroundType(t, RAIL_GROUND_WATER);
|
||||||
MarkTileDirtyByTile(t);
|
MarkTileDirtyByTile(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return flooded;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TileIndexDiffC _trackdelta[] = {
|
static const TileIndexDiffC _trackdelta[] = {
|
||||||
|
|
|
@ -10,6 +10,6 @@ void DrawShipDepotSprite(int x, int y, int image);
|
||||||
void DrawCanalWater(TileIndex tile);
|
void DrawCanalWater(TileIndex tile);
|
||||||
void MakeWaterOrCanalDependingOnOwner(TileIndex tile, Owner o);
|
void MakeWaterOrCanalDependingOnOwner(TileIndex tile, Owner o);
|
||||||
void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o);
|
void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o);
|
||||||
void FloodHalftile(TileIndex t);
|
bool FloodHalftile(TileIndex t);
|
||||||
|
|
||||||
#endif /* WATER_H */
|
#endif /* WATER_H */
|
||||||
|
|
|
@ -605,6 +605,8 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool flooded = false; // Will be set to true, when something is flooded
|
||||||
|
|
||||||
/* Is any corner of the dest tile raised? (First two corners already checked above. */
|
/* Is any corner of the dest tile raised? (First two corners already checked above. */
|
||||||
if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
|
if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
|
||||||
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
|
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
|
||||||
|
@ -613,7 +615,7 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
|
||||||
case MP_RAILWAY: {
|
case MP_RAILWAY: {
|
||||||
if (!IsPlainRailTile(target)) break;
|
if (!IsPlainRailTile(target)) break;
|
||||||
|
|
||||||
FloodHalftile(target);
|
flooded = FloodHalftile(target);
|
||||||
|
|
||||||
Vehicle *v = FindFloodableVehicleOnTile(target);
|
Vehicle *v = FindFloodableVehicleOnTile(target);
|
||||||
if (v != NULL) FloodVehicle(v);
|
if (v != NULL) FloodVehicle(v);
|
||||||
|
@ -625,6 +627,7 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
|
||||||
case MP_TREES:
|
case MP_TREES:
|
||||||
_current_player = OWNER_WATER;
|
_current_player = OWNER_WATER;
|
||||||
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
|
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
|
||||||
|
flooded = true;
|
||||||
MakeShore(target);
|
MakeShore(target);
|
||||||
MarkTileDirtyByTile(target);
|
MarkTileDirtyByTile(target);
|
||||||
}
|
}
|
||||||
|
@ -642,14 +645,17 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
|
||||||
|
|
||||||
/* flood flat tile */
|
/* flood flat tile */
|
||||||
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
|
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
|
||||||
|
flooded = true;
|
||||||
MakeWater(target);
|
MakeWater(target);
|
||||||
MarkTileDirtyByTile(target);
|
MarkTileDirtyByTile(target);
|
||||||
/* Mark surrounding canal tiles dirty too to avoid glitches */
|
|
||||||
for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
|
|
||||||
MarkTileDirtyIfCanal(target + TileOffsByDir(dir));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flooded) {
|
||||||
|
/* Mark surrounding canal tiles dirty too to avoid glitches */
|
||||||
|
for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
|
||||||
|
MarkTileDirtyIfCanal(target + TileOffsByDir(dir));
|
||||||
|
}
|
||||||
/* update signals if needed */
|
/* update signals if needed */
|
||||||
UpdateSignalsInBuffer();
|
UpdateSignalsInBuffer();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue