Changeset - r10228:40d85bf74068
[Not reviewed]
master
0 2 0
frosch - 16 years ago 2008-10-10 20:09:29
frosch@openttd.org
(svn r14456) -Fix: Obiwan in catchment-area and station-spread of docks.
2 files changed with 22 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/station_cmd.cpp
Show inline comments
 
@@ -526,61 +526,71 @@ static void UpdateStationAcceptance(Stat
 
	if (st->IsBuoy()) return;
 

	
 
	Rect rect;
 
	rect.left   = MapSizeX();
 
	rect.bottom = MapSizeY();
 
	rect.right  = 0;
 
	rect.top    = 0;
 

	
 
	/* old accepted goods types */
 
	uint old_acc = GetAcceptanceMask(st);
 

	
 
	/* Put all the tiles that span an area in the table. */
 
	if (st->train_tile != 0) {
 
		MergePoint(&rect, st->train_tile);
 
		MergePoint(&rect, st->train_tile + TileDiffXY(st->trainst_w - 1, st->trainst_h - 1));
 
	}
 

	
 
	if (st->airport_tile != 0) {
 
		const AirportFTAClass *afc = st->Airport();
 

	
 
		MergePoint(&rect, st->airport_tile);
 
		MergePoint(&rect, st->airport_tile + TileDiffXY(afc->size_x - 1, afc->size_y - 1));
 
	}
 

	
 
	if (st->dock_tile != 0) MergePoint(&rect, st->dock_tile);
 
	if (st->dock_tile != 0) {
 
		MergePoint(&rect, st->dock_tile);
 
		if (IsDockTile(st->dock_tile)) {
 
			MergePoint(&rect, st->dock_tile + TileOffsByDiagDir(GetDockDirection(st->dock_tile)));
 
		} // else OilRig
 
	}
 

	
 
	for (const RoadStop *rs = st->bus_stops; rs != NULL; rs = rs->next) {
 
		MergePoint(&rect, rs->xy);
 
	}
 

	
 
	for (const RoadStop *rs = st->truck_stops; rs != NULL; rs = rs->next) {
 
		MergePoint(&rect, rs->xy);
 
	}
 

	
 
	/* And retrieve the acceptance. */
 
	AcceptedCargo accepts;
 
	assert((rect.right >= rect.left) == !st->rect.IsEmpty());
 
	if (rect.right >= rect.left) {
 
		assert(rect.left == st->rect.left);
 
		assert(rect.top == st->rect.bottom);
 
		assert(rect.right == st->rect.right);
 
		assert(rect.bottom == st->rect.top);
 
		GetAcceptanceAroundTiles(
 
			accepts,
 
			TileXY(rect.left, rect.bottom),
 
			rect.right - rect.left   + 1,
 
			rect.top   - rect.bottom + 1,
 
			_settings_game.station.modified_catchment ? FindCatchmentRadius(st) : (uint)CA_UNMODIFIED
 
		);
 
	} else {
 
		memset(accepts, 0, sizeof(accepts));
 
	}
 

	
 
	/* Adjust in case our station only accepts fewer kinds of goods */
 
	for (CargoID i = 0; i < NUM_CARGO; i++) {
 
		uint amt = min(accepts[i], 15);
 

	
 
		/* Make sure the station can accept the goods type. */
 
		bool is_passengers = IsCargoInClass(i, CC_PASSENGERS);
 
		if ((!is_passengers && !(st->facilities & (byte)~FACIL_BUS_STOP)) ||
 
				(is_passengers && !(st->facilities & (byte)~FACIL_TRUCK_STOP))) {
 
			amt = 0;
 
		}
 

	
 
		SB(st->goods[i].acceptance_pickup, GoodsEntry::ACCEPTANCE, 1, amt >= 8);
 
	}
 
@@ -2105,73 +2115,77 @@ CommandCost CmdBuildDock(TileIndex tile,
 

	
 
	tile_cur += TileOffsByDiagDir(direction);
 
	if (!IsTileType(tile_cur, MP_WATER) || GetTileSlope(tile_cur, NULL) != SLOPE_FLAT) {
 
		return_cmd_error(STR_304B_SITE_UNSUITABLE);
 
	}
 

	
 
	/* middle */
 
	Station *st = NULL;
 

	
 
	if (!_settings_game.station.adjacent_stations || !HasBit(p1, 0)) {
 
		st = GetStationAround(
 
				tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),
 
				_dock_w_chk[direction], _dock_h_chk[direction], INVALID_STATION);
 
		if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 
	}
 

	
 
	/* Find a station close to us */
 
	if (st == NULL) st = GetClosestStationFromTile(tile);
 

	
 
	if (st != NULL) {
 
		if (st->owner != _current_company) {
 
			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 
		}
 

	
 
		if (!st->rect.BeforeAddRect(tile, _dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TEST)) return CMD_ERROR;
 
		if (!st->rect.BeforeAddRect(
 
				tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),
 
				_dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TEST)) return CMD_ERROR;
 

	
 
		if (st->dock_tile != 0) return_cmd_error(STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK);
 
	} else {
 
		/* allocate and initialize new station */
 
		/* allocate and initialize new station */
 
		if (!Station::CanAllocateItem()) return_cmd_error(STR_3008_TOO_MANY_STATIONS_LOADING);
 

	
 
		if (flags & DC_EXEC) {
 
			st = new Station(tile);
 

	
 
			st->town = ClosestTownFromTile(tile, UINT_MAX);
 
			st->string_id = GenerateStationName(st, tile, STATIONNAMING_DOCK);
 

	
 
			if (IsValidCompanyID(_current_company)) {
 
				SetBit(st->town->have_ratings, _current_company);
 
			}
 
		}
 
	}
 

	
 
	if (flags & DC_EXEC) {
 
		st->dock_tile = tile;
 
		st->AddFacility(FACIL_DOCK, tile);
 

	
 
		st->rect.BeforeAddRect(tile, _dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TRY);
 
		st->rect.BeforeAddRect(
 
				tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),
 
				_dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TRY);
 

	
 
		MakeDock(tile, st->owner, st->index, direction, wc);
 

	
 
		UpdateStationVirtCoordDirty(st);
 
		UpdateStationAcceptance(st, false);
 
		InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
 
		InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_SHIPS);
 
	}
 

	
 
	return CommandCost(EXPENSES_CONSTRUCTION, _price.build_dock);
 
}
 

	
 
static CommandCost RemoveDock(Station *st, uint32 flags)
 
{
 
	if (!CheckOwnership(st->owner)) return CMD_ERROR;
 

	
 
	TileIndex tile1 = st->dock_tile;
 
	TileIndex tile2 = tile1 + TileOffsByDiagDir(GetDockDirection(tile1));
 

	
 
	if (!EnsureNoVehicleOnGround(tile1)) return CMD_ERROR;
 
	if (!EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
 

	
 
	if (flags & DC_EXEC) {
 
		DoClearSquare(tile1);
src/station_map.h
Show inline comments
 
@@ -144,48 +144,53 @@ static inline void SetStopBuiltOnTownRoa
 
/**
 
 * Gets the direction the road stop entrance points towards.
 
 */
 
static inline DiagDirection GetRoadStopDir(TileIndex t)
 
{
 
	StationGfx gfx = GetStationGfx(t);
 
	assert(IsRoadStopTile(t));
 
	if (gfx < GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET) {
 
		return (DiagDirection)(gfx);
 
	} else {
 
		return (DiagDirection)(gfx - GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET);
 
	}
 
}
 

	
 
static inline bool IsOilRig(TileIndex t)
 
{
 
	return GetStationType(t) == STATION_OILRIG;
 
}
 

	
 
static inline bool IsDock(TileIndex t)
 
{
 
	return GetStationType(t) == STATION_DOCK;
 
}
 

	
 
static inline bool IsDockTile(TileIndex t)
 
{
 
	return IsTileType(t, MP_STATION) && GetStationType(t) == STATION_DOCK;
 
}
 

	
 
static inline bool IsBuoy(TileIndex t)
 
{
 
	return GetStationType(t) == STATION_BUOY;
 
}
 

	
 
static inline bool IsBuoyTile(TileIndex t)
 
{
 
	return IsTileType(t, MP_STATION) && IsBuoy(t);
 
}
 

	
 
static inline bool IsHangarTile(TileIndex t)
 
{
 
	return IsTileType(t, MP_STATION) && IsHangar(t);
 
}
 

	
 

	
 
static inline Axis GetRailStationAxis(TileIndex t)
 
{
 
	assert(IsRailwayStation(t));
 
	return HasBit(GetStationGfx(t), 0) ? AXIS_Y : AXIS_X;
 
}
 

	
 

	
 
static inline Track GetRailStationTrack(TileIndex t)
0 comments (0 inline, 0 general)