Changeset - r8530:f024ec651ac7
[Not reviewed]
master
0 1 0
belugas - 16 years ago 2008-02-11 01:06:44
belugas@openttd.org
(svn r12105) -Codechange: Use TransportType instead of guessing what kind of bridge we are preparing to build
1 file changed with 29 insertions and 19 deletions:
0 comments (0 inline, 0 general)
src/tunnelbridge_cmd.cpp
Show inline comments
 
@@ -174,14 +174,14 @@ bool CheckBridge_Stuff(byte bridge_type,
 
 * - p2 = (bit 8-..) - rail type or road types.
 
 * - p2 = (bit 15  ) - set means road bridge.
 
 */
 
CommandCost CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 
{
 
	uint bridge_type;
 
	RailType railtype;
 
	RoadTypes roadtypes;
 
	RailType railtype = INVALID_RAILTYPE;
 
	RoadTypes roadtypes = ROADTYPES_NONE;
 
	uint x;
 
	uint y;
 
	uint sx;
 
	uint sy;
 
	TileIndex tile_start;
 
	TileIndex tile_end;
 
@@ -194,27 +194,35 @@ CommandCost CmdBuildBridge(TileIndex end
 
	uint bridge_len;
 
	Axis direction;
 
	CommandCost cost(EXPENSES_CONSTRUCTION);
 
	CommandCost ret;
 
	bool replace_bridge = false;
 
	uint replaced_bridge_type;
 
	TransportType transport_type;
 

	
 
	/* unpack parameters */
 
	bridge_type = GB(p2, 0, 8);
 

	
 
	transport_type = (TransportType)GB(p2, 15, 2);
 
	/* For now, only TRANSPORT_RAIL and TRANSPORT_ROAD are allowed.
 
	 * But let not this stops us for preparing the future */
 
	if (transport_type >= TRANSPORT_WATER) return CMD_ERROR;
 

	
 
	if (p1 >= MapSize()) return CMD_ERROR;
 

	
 
	/* type of bridge */
 
	if (HasBit(p2, 15)) {
 
		railtype = INVALID_RAILTYPE; // road bridge
 
		roadtypes = (RoadTypes)GB(p2, 8, 3);
 
		if (!AreValidRoadTypes(roadtypes) || !HasRoadTypesAvail(_current_player, roadtypes)) return CMD_ERROR;
 
	} else {
 
		if (!ValParamRailtype((RailType)GB(p2, 8, 8))) return CMD_ERROR;
 
		railtype = (RailType)GB(p2, 8, 8);
 
		roadtypes = ROADTYPES_NONE;
 
	switch (transport_type) {
 
		case TRANSPORT_ROAD:
 
			roadtypes = (RoadTypes)GB(p2, 8, 3);
 
			if (!AreValidRoadTypes(roadtypes) || !HasRoadTypesAvail(_current_player, roadtypes)) return CMD_ERROR;
 
			break;
 

	
 
		case TRANSPORT_RAIL:
 
			railtype = (RailType)GB(p2, 8, 8);
 
			if (!ValParamRailtype(railtype)) return CMD_ERROR;
 
			break;
 
	}
 

	
 
	x = TileX(end_tile);
 
	y = TileY(end_tile);
 
	sx = TileX(p1);
 
	sy = TileY(p1);
 
@@ -247,14 +255,12 @@ CommandCost CmdBuildBridge(TileIndex end
 

	
 
	CommandCost terraform_cost_north = CheckBridgeSlopeNorth(direction, &tileh_start, &z_start);
 
	CommandCost terraform_cost_south = CheckBridgeSlopeSouth(direction, &tileh_end, &z_end);
 

	
 
	if (z_start != z_end) return_cmd_error(STR_BRIDGEHEADS_NOT_SAME_HEIGHT);
 

	
 
	TransportType transport_type = railtype == INVALID_RAILTYPE ? TRANSPORT_ROAD : TRANSPORT_RAIL;
 

	
 
	if (IsBridgeTile(tile_start) && IsBridgeTile(tile_end) &&
 
			GetOtherBridgeEnd(tile_start) == tile_end &&
 
			GetTunnelBridgeTransportType(tile_start) == transport_type) {
 
		/* Replace a current bridge. */
 

	
 
		/* If this is a railway bridge, make sure the railtypes match. */
 
@@ -337,18 +343,22 @@ CommandCost CmdBuildBridge(TileIndex end
 

	
 
	/* do the drill? */
 
	if (flags & DC_EXEC) {
 
		DiagDirection dir = AxisToDiagDir(direction);
 
		Owner owner = (replace_bridge && IsTileOwner(tile_start, OWNER_TOWN)) ? OWNER_TOWN : _current_player;
 

	
 
		if (railtype != INVALID_RAILTYPE) {
 
			MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype);
 
			MakeRailBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), railtype);
 
		} else {
 
			MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir, roadtypes);
 
			MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
 
		switch (transport_type) {
 
			case TRANSPORT_RAIL:
 
				MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype);
 
				MakeRailBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), railtype);
 
				break;
 

	
 
			case TRANSPORT_ROAD:
 
				MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir, roadtypes);
 
				MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
 
				break;
 
		}
 
		MarkTileDirtyByTile(tile_start);
 
		MarkTileDirtyByTile(tile_end);
 
	}
 

	
 
	delta = (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 
@@ -400,13 +410,13 @@ not_valid_below:;
 
		if (flags & DC_EXEC) {
 
			SetBridgeMiddle(tile, direction);
 
			MarkTileDirtyByTile(tile);
 
		}
 
	}
 

	
 
	if (flags & DC_EXEC && railtype != INVALID_RAILTYPE) {
 
	if (flags & DC_EXEC && transport_type == TRANSPORT_RAIL) {
 
		Track track = AxisToTrack(direction);
 
		AddSideToSignalBuffer(tile_start, INVALID_DIAGDIR, _current_player);
 
		YapfNotifyTrackLayoutChange(tile_start, track);
 
	}
 

	
 
	/* for human player that builds the bridge he gets a selection to choose from bridges (DC_QUERY_COST)
0 comments (0 inline, 0 general)