src/rail_cmd.cpp
branchcustombridgeheads
changeset 5650 aefc131bf5ce
parent 5649 55c8267c933f
child 5651 335d9bd345b0
--- a/src/rail_cmd.cpp	Thu Jan 11 13:41:16 2007 +0000
+++ b/src/rail_cmd.cpp	Mon Jan 15 20:14:06 2007 +0000
@@ -114,13 +114,13 @@
 	TRACK_BIT_X,
 
 	TRACK_BIT_LEFT,
-	0,
+	TRACK_BIT_NONE,
 	TRACK_BIT_Y,
 	TRACK_BIT_LOWER,
 
 	TRACK_BIT_LOWER,
 	TRACK_BIT_Y,
-	0,
+	TRACK_BIT_NONE,
 	TRACK_BIT_LEFT,
 
 	TRACK_BIT_X,
@@ -130,7 +130,7 @@
 
 // allowed rail for an evenly raised platform
 {
-	0,
+	TRACK_BIT_NONE,
 	TRACK_BIT_LEFT,
 	TRACK_BIT_LOWER,
 	TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_LEFT,
@@ -237,7 +237,7 @@
 	int32 cost = 0;
 	int32 ret;
 
-	if (!ValParamRailtype(p1) || !ValParamTrackOrientation(p2)) return CMD_ERROR;
+	if (!ValParamRailtype(p1) || !ValParamTrackOrientation((Track)p2)) return CMD_ERROR;
 	railtype = (RailType)p1;
 	track = (Track)p2;
 
@@ -252,7 +252,7 @@
 			if (!HASBIT(BRIDGE_HORZ_RAMP, tileh)) return CMD_ERROR;
 
 			/* In which case we can assume the tile to be flat */
-			tileh = 0;
+			tileh = SLOPE_FLAT;
 			/* FALL THROUGH */
 		case MP_RAILWAY:
 			if (!CheckTrackCombination(tile, trackbit, flags) ||
@@ -311,7 +311,7 @@
 			/* FALLTHROUGH */
 
 		default:
-			ret = CheckRailSlope(tileh, trackbit, 0, tile);
+			ret = CheckRailSlope(tileh, trackbit, TRACK_BIT_NONE, tile);
 			if (CmdFailed(ret)) return ret;
 			cost += ret;
 
@@ -344,7 +344,7 @@
 	int32 cost = _price.remove_rail;
 	bool crossing = false;
 
-	if (!ValParamTrackOrientation(p2)) return CMD_ERROR;
+	if (!ValParamTrackOrientation((Track)p2)) return CMD_ERROR;
 	trackbit = TrackToTrackBits(track);
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@@ -460,7 +460,7 @@
 	int ey = TileY(end);
 	int dx, dy, trdx, trdy;
 
-	if (!ValParamTrackOrientation(*trackdir)) return CMD_ERROR;
+	if (!ValParamTrackOrientation(TrackdirToTrack(*trackdir))) return CMD_ERROR;
 
 	// calculate delta x,y from start to end tile
 	dx = ex - x;
@@ -483,7 +483,7 @@
 		(trdy >= 0 && dy < 0)
 	) {
 		if (!HASBIT(*trackdir, 3)) { // first direction is invalid, try the other
-			SETBIT(*trackdir, 3); // reverse the direction
+			*trackdir = SetBitT(*trackdir, 3); // reverse the direction
 			trdx = -trdx;
 			trdy = -trdy;
 		} else { // other direction is invalid too, invalid drag
@@ -546,7 +546,7 @@
 		tile += ToTileIndexDiff(_trackdelta[trackdir]);
 
 		// toggle railbit for the non-diagonal tracks
-		if (!IsDiagonalTrackdir(trackdir)) trackdir ^= 1;
+		if (!IsDiagonalTrackdir(trackdir)) trackdir = ToggleBitT(trackdir, 0);
 	}
 
 	return (total_cost == 0) ? CMD_ERROR : total_cost;
@@ -619,14 +619,15 @@
 	if (d == NULL) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		MakeRailDepot(tile, _current_player, p2, p1);
+		DiagDirection dir = (DiagDirection)p2;
+		MakeRailDepot(tile, _current_player, dir, (RailType)p1);
 		MarkTileDirtyByTile(tile);
 
 		d->xy = tile;
 		d->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
-		UpdateSignalsOnSegment(tile, p2);
-		YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(p2)));
+		UpdateSignalsOnSegment(tile, dir);
+		YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir)));
 	}
 
 	return cost + _price.build_train_depot;
@@ -712,7 +713,7 @@
 					// cycle between normal -> pre -> exit -> combo -> ...
 					SignalType type = GetSignalType(tile);
 
-					SetSignalType(tile, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : type + 1);
+					SetSignalType(tile, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
 				} else {
 					CycleSignalSide(tile, track);
 				}
@@ -750,7 +751,7 @@
 	TileIndex end_tile;
 
 	int mode = p2 & 0x1;
-	Track track = GB(p2, 4, 3);
+	Track track = (Track)GB(p2, 4, 3);
 	Trackdir trackdir = TrackToTrackdir(track);
 	byte semaphores = (HASBIT(p2, 3) ? 8 : 0);
 	byte signal_density = (p2 >> 24);
@@ -809,7 +810,7 @@
 		signal_ctr++;
 
 		// toggle railbit for the non-diagonal tracks (|, -- tracks)
-		if (!IsDiagonalTrackdir(trackdir)) trackdir ^= 1;
+		if (!IsDiagonalTrackdir(trackdir)) trackdir = ToggleBitT(trackdir, 0);
 	}
 
 	return error ? CMD_ERROR : total_cost;
@@ -889,13 +890,14 @@
 
 	// change type.
 	if (exec) {
-		TrackBits tracks;
 		SetRailType(tile, totype);
 		MarkTileDirtyByTile(tile);
 
 		// notify YAPF about the track layout change
-		for (tracks = GetTrackBits(tile); tracks != TRACK_BIT_NONE; tracks = KILL_FIRST_BIT(tracks))
-			YapfNotifyTrackLayoutChange(tile, FIND_FIRST_BIT(tracks));
+		TrackBits tracks = GetTrackBits(tile);
+		while (tracks != TRACK_BIT_NONE) {
+			YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(tracks));
+		}
 
 		if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
 			Vehicle *v;
@@ -964,7 +966,7 @@
 				default: continue;
 			}
 
-			ret = proc(tile, p2, false);
+			ret = proc(tile, (RailType)p2, false);
 			if (CmdFailed(ret)) continue;
 			cost += ret;
 
@@ -974,7 +976,7 @@
 					_additional_cash_required = ret;
 					return cost - ret;
 				}
-				proc(tile, p2, true);
+				proc(tile, (RailType)p2, true);
 			}
 		}
 	}
@@ -1023,10 +1025,9 @@
 		case RAIL_TILE_SIGNALS:
 		case RAIL_TILE_NORMAL: {
 			TrackBits tracks = GetTrackBits(tile);
-			uint i;
-
-			for_each_bit (i, tracks) {
-				ret = DoCommand(tile, 0, i, flags, CMD_REMOVE_SINGLE_RAIL);
+			while (tracks != TRACK_BIT_NONE) {
+				Track track = RemoveFirstTrack(tracks);
+				ret = DoCommand(tile, 0, track, flags, CMD_REMOVE_SINGLE_RAIL);
 				if (CmdFailed(ret)) return CMD_ERROR;
 				cost += ret;
 			}
@@ -1049,7 +1050,7 @@
 
 static void DrawSingleSignal(TileIndex tile, byte condition, uint image, uint pos)
 {
-	bool side = _opt.road_side & _patches.signal_side;
+	bool side = (_opt.road_side != 0) && _patches.signal_side;
 	static const Point SignalPositions[2][12] = {
 		{      /* Signals on the left side */
 		/*  LEFT      LEFT      RIGHT     RIGHT     UPPER     UPPER */
@@ -1225,7 +1226,7 @@
 	(image++, true);
 
 	if (ti->tileh != SLOPE_FLAT) {
-		uint foundation = IsTileType(ti->tile, MP_RAILWAY_BRIDGE) ? ti->tileh : GetRailFoundation(ti->tileh, track);
+		uint foundation = IsTileType(ti->tile, MP_RAILWAY_BRIDGE) ? ti->tileh : (Slope)GetRailFoundation(ti->tileh, track);
 
 		if (foundation != 0) DrawFoundation(ti, foundation);
 
@@ -1441,28 +1442,28 @@
 	int presignal_exits_free;
 
 	// these are used to keep track of the signals that change.
-	byte bit[NUM_SSD_ENTRY];
+	TrackdirByte bit[NUM_SSD_ENTRY];
 	TileIndex tile[NUM_SSD_ENTRY];
 
 	// these are used to keep track of the stack that modifies presignals recursively
 	TileIndex next_tile[NUM_SSD_STACK];
-	byte next_dir[NUM_SSD_STACK];
+	DiagDirectionByte next_dir[NUM_SSD_STACK];
 
 } SetSignalsData;
 
-static bool SetSignalsEnumProc(TileIndex tile, void* data, int track, uint length, byte* state)
+static bool SetSignalsEnumProc(TileIndex tile, void* data, Trackdir trackdir, uint length, byte* state)
 {
-	SetSignalsData* ssd = data;
+	SetSignalsData* ssd = (SetSignalsData*)data;
 
 	if (!(IsTileType(tile, MP_RAILWAY) || IsTileType(tile, MP_RAILWAY_BRIDGE))) return false;
 
 	// the tile has signals?
-	if (HasSignalOnTrack(tile, TrackdirToTrack(track))) {
-		if (HasSignalOnTrackdir(tile, ReverseTrackdir(track))) {
+	if (HasSignalOnTrack(tile, TrackdirToTrack(trackdir))) {
+		if (HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir))) {
 			// yes, add the signal to the list of signals
 			if (ssd->cur != NUM_SSD_ENTRY) {
 				ssd->tile[ssd->cur] = tile; // remember the tile index
-				ssd->bit[ssd->cur] = track; // and the controlling bit number
+				ssd->bit[ssd->cur] = trackdir; // and the controlling bit number
 				ssd->cur++;
 			}
 
@@ -1470,10 +1471,10 @@
 			ssd->has_presignal |= IsPresignalEntry(tile);
 		}
 
-		if (HasSignalOnTrackdir(tile, track) && IsPresignalExit(tile)) {
+		if (HasSignalOnTrackdir(tile, trackdir) && IsPresignalExit(tile)) {
 			// this is an exit signal that points out from the segment
 			ssd->presignal_exits++;
-			if (GetSignalStateByTrackdir(tile, track) != SIGNAL_STATE_RED)
+			if (GetSignalStateByTrackdir(tile, trackdir) != SIGNAL_STATE_RED)
 				ssd->presignal_exits_free++;
 		}
 
@@ -1493,7 +1494,7 @@
 
 static void *SignalVehicleCheckProc(Vehicle *v, void *data)
 {
-	const SignalVehicleCheckStruct* dest = data;
+	const SignalVehicleCheckStruct* dest = (SignalVehicleCheckStruct*)data;
 
 	if (v->type != VEH_Train) return NULL;
 
@@ -1552,7 +1553,7 @@
 
 static void SetSignalsAfterProc(TrackPathFinder *tpf)
 {
-	SetSignalsData *ssd = tpf->userdata;
+	SetSignalsData *ssd = (SetSignalsData*)tpf->userdata;
 	const TrackPathFinderLink* link;
 	uint offs;
 	uint i;
@@ -1588,9 +1589,9 @@
 	}
 }
 
-static const byte _dir_from_track[14] = {
-	0,1,0,1,2,1, 0,0,
-	2,3,3,2,3,0,
+static const DiagDirection _dir_from_track[14] = {
+	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE,
+	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
 };
 
 
@@ -1947,7 +1948,7 @@
 
 static const byte _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 };
 static const byte _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 };
-static const byte _deltacoord_leaveoffset[8] = {
+static const signed char _deltacoord_leaveoffset[8] = {
 	-1,  0,  1,  0, /* x */
 	 0,  1,  0, -1  /* y */
 };
@@ -1983,7 +1984,7 @@
 	} else if (_fractcoords_enter[dir] == fract_coord) {
 		if (DiagDirToDir(ReverseDiagDir(dir)) == v->direction) {
 			/* enter the depot */
-			v->u.rail.track = 0x80,
+			v->u.rail.track = TRACK_BIT_SPECIAL,
 			v->vehstatus |= VS_HIDDEN; /* hide it */
 			v->direction = ReverseDir(v->direction);
 			if (v->next == NULL) VehicleEnterDepot(v);
@@ -1997,7 +1998,7 @@
 			/* leave the depot? */
 			if ((v = v->next) != NULL) {
 				v->vehstatus &= ~VS_HIDDEN;
-				v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? 1 : 2);
+				v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
 			}
 		}
 	}
@@ -2006,7 +2007,7 @@
 }
 
 
-const TileTypeProcs _tile_type_rail_procs = {
+extern const TileTypeProcs _tile_type_rail_procs = {
 	DrawTile_Track,           /* draw_tile_proc */
 	GetSlopeZ_Track,          /* get_slope_z_proc */
 	ClearTile_Track,          /* clear_tile_proc */