Changeset - r7948:c37d06109abc
[Not reviewed]
master
0 6 1
rubidium - 17 years ago 2007-11-24 08:45:04
rubidium@openttd.org
(svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
7 files changed with 57 insertions and 16 deletions:
0 comments (0 inline, 0 general)
src/dock_gui.cpp
Show inline comments
 
@@ -16,6 +16,7 @@
 
#include "sound.h"
 
#include "command.h"
 
#include "variables.h"
 
#include "water.h"
 

	
 
static void ShowBuildDockStationPicker();
 
static void ShowBuildDocksDepotPicker();
src/functions.h
Show inline comments
 
@@ -17,10 +17,6 @@ void DrawClearLandTile(const TileInfo *t
 
void DrawClearLandFence(const TileInfo *ti);
 
void TileLoopClearHelper(TileIndex tile);
 

	
 
/* water_land.cpp */
 
void DrawShipDepotSprite(int x, int y, int image);
 
void TileLoop_Water(TileIndex tile);
 

	
 
/* players.cpp */
 
bool CheckPlayerHasMoney(CommandCost cost);
 
void SubtractMoneyFromPlayer(CommandCost cost);
src/industry_cmd.cpp
Show inline comments
 
@@ -40,6 +40,7 @@
 
#include "misc/autoptr.hpp"
 
#include "autoslope.h"
 
#include "transparency.h"
 
#include "water.h"
 

	
 
void ShowIndustryViewWindow(int industry);
 
void BuildOilRig(TileIndex tile);
src/rail_cmd.cpp
Show inline comments
 
@@ -41,6 +41,7 @@
 
#include "misc/autoptr.hpp"
 
#include "autoslope.h"
 
#include "transparency.h"
 
#include "water.h"
 

	
 
const byte _track_sloped_sprites[14] = {
 
	14, 15, 22, 13,
src/station_cmd.cpp
Show inline comments
 
@@ -44,6 +44,7 @@
 
#include "strings.h"
 
#include "autoslope.h"
 
#include "transparency.h"
 
#include "water.h"
 

	
 
DEFINE_OLD_POOL_GENERIC(Station, Station)
 
DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop)
 
@@ -1899,12 +1900,7 @@ static CommandCost RemoveBuoy(Station *s
 
		/* We have to set the water tile's state to the same state as before the
 
		 * buoy was placed. Otherwise one could plant a buoy on a canal edge,
 
		 * remove it and flood the land (if the canal edge is at level 0) */
 
		Owner o = GetTileOwner(tile);
 
		if (o == OWNER_WATER) {
 
			MakeWater(tile);
 
		} else {
 
			MakeCanal(tile, o);
 
		}
 
		MakeWaterOrCanalDependingOnSurroundings(tile, GetTileOwner(tile));
 
		MarkTileDirtyByTile(tile);
 

	
 
		UpdateStationVirtCoordDirty(st);
 
@@ -2040,7 +2036,7 @@ static CommandCost RemoveDock(Station *s
 

	
 
	if (flags & DC_EXEC) {
 
		DoClearSquare(tile1);
 
		MakeWater(tile2);
 
		MakeWaterOrCanalDependingOnSurroundings(tile2, st->owner);
 

	
 
		st->rect.AfterRemoveTile(st, tile1);
 
		st->rect.AfterRemoveTile(st, tile2);
 
@@ -2064,9 +2060,6 @@ const DrawTileSprites *GetStationTileLay
 
	return &_station_display_datas[st][gfx];
 
}
 

	
 
/* For drawing canal edges on buoys */
 
extern void DrawCanalWater(TileIndex tile);
 

	
 
static void DrawTile_Station(TileInfo *ti)
 
{
 
	const DrawTileSprites *t = NULL;
src/water.h
Show inline comments
 
new file 100644
 
/* $Id$ */
 

	
 
/** @file water.h Functions related to water (management) */
 

	
 
#ifndef WATER_H
 
#define WATER_H
 

	
 
void TileLoop_Water(TileIndex tile);
 
void DrawShipDepotSprite(int x, int y, int image);
 
void DrawCanalWater(TileIndex tile);
 
void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o);
 

	
 
#endif /* WATER_H */
src/water_cmd.cpp
Show inline comments
 
@@ -55,6 +55,42 @@ static const SpriteID _water_shore_sprit
 
static Vehicle *FindFloodableVehicleOnTile(TileIndex tile);
 
static void FloodVehicle(Vehicle *v);
 

	
 
/**
 
 * Makes a tile canal or water depending on the surroundings.
 
 * This as for example docks and shipdepots do not store
 
 * whether the tile used to be canal or 'normal' water.
 
 * @param t the tile to change.
 
 * @param o the owner of the new tile.
 
 */
 
void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o)
 
{
 
	assert(GetTileSlope(t, NULL) == SLOPE_FLAT);
 

	
 
	/* Non-sealevel -> canal */
 
	if (TileHeight(t) != 0) {
 
		MakeCanal(t, o);
 
		return;
 
	}
 

	
 
	bool has_water = false;
 
	bool has_canal = false;
 

	
 
	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
 
		TileIndex neighbour = TileAddByDiagDir(t, dir);
 
		if (IsTileType(neighbour, MP_WATER)) {
 
			has_water |= IsSea(neighbour) || IsCoast(neighbour);
 
			has_canal |= IsCanal(neighbour);
 
		}
 
	}
 
	if (has_canal || !has_water) {
 
		MakeCanal(t, o);
 
	} else {
 
		MakeWater(t);
 
	}
 
	MarkTileDirtyByTile(t);
 
}
 

	
 

	
 
/** Build a ship depot.
 
 * @param tile tile where ship depot is built
 
 * @param flags type of operation
 
@@ -178,8 +214,8 @@ static CommandCost RemoveShiplift(TileIn
 

	
 
	if (flags & DC_EXEC) {
 
		DoClearSquare(tile);
 
		DoClearSquare(tile + delta);
 
		DoClearSquare(tile - delta);
 
		MakeWaterOrCanalDependingOnSurroundings(tile + delta, _current_player);
 
		MakeWaterOrCanalDependingOnSurroundings(tile - delta, _current_player);
 
	}
 

	
 
	return CommandCost(_price.clear_water * 2);
0 comments (0 inline, 0 general)