rail_cmd.c
changeset 1534 304124d6b5e3
parent 1518 9a876c45238b
child 1535 84d53678f31f
equal deleted inserted replaced
1533:613a5f81ad79 1534:304124d6b5e3
    39 	RAIL_DEPOT_UNUSED_BITS = 0x3C,
    39 	RAIL_DEPOT_UNUSED_BITS = 0x3C,
    40 
    40 
    41 	RAIL_TYPE_WAYPOINT = 0xC4,
    41 	RAIL_TYPE_WAYPOINT = 0xC4,
    42 	RAIL_WAYPOINT_TRACK_MASK = 1,
    42 	RAIL_WAYPOINT_TRACK_MASK = 1,
    43 	RAIL_WAYPOINT_UNUSED_BITS = 0x3E,
    43 	RAIL_WAYPOINT_UNUSED_BITS = 0x3E,
       
    44 
       
    45 	RAIL_SUBTYPE_MASK     = 0x3C,
       
    46 	RAIL_SUBTYPE_DEPOT    = 0x00,
       
    47 	RAIL_SUBTYPE_WAYPOINT = 0x04
    44 };
    48 };
    45 
    49 
    46 #define IS_RAIL_DEPOT(x) (((x) & (RAIL_TYPE_DEPOT|RAIL_DEPOT_UNUSED_BITS)) == RAIL_TYPE_DEPOT)
    50 #define IS_RAIL_DEPOT(x) (((x) & (RAIL_TYPE_DEPOT|RAIL_DEPOT_UNUSED_BITS)) == RAIL_TYPE_DEPOT)
    47 #define IS_RAIL_WAYPOINT(x) (((x) & (RAIL_TYPE_WAYPOINT|RAIL_WAYPOINT_UNUSED_BITS)) == RAIL_TYPE_WAYPOINT)
    51 #define IS_RAIL_WAYPOINT(x) (((x) & (RAIL_TYPE_WAYPOINT|RAIL_WAYPOINT_UNUSED_BITS)) == RAIL_TYPE_WAYPOINT)
    48 
    52 
  1212 	}
  1216 	}
  1213 
  1217 
  1214 	return _price.remove_train_depot;
  1218 	return _price.remove_train_depot;
  1215 }
  1219 }
  1216 
  1220 
  1217 static int32 ClearTile_Track(uint tile, byte flags) {
  1221 static int32 ClearTile_Track(TileIndex tile, byte flags)
  1218 	int32 cost,ret;
  1222 {
  1219 	int i;
  1223 	int32 cost;
       
  1224 	int32 ret;
  1220 	byte m5;
  1225 	byte m5;
  1221 
  1226 
  1222 	m5 = _map5[tile];
  1227 	m5 = _map5[tile];
  1223 
  1228 
  1224 	if (flags & DC_AUTO) {
  1229 	if (flags & DC_AUTO) {
  1231 		return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
  1236 		return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
  1232 	}
  1237 	}
  1233 
  1238 
  1234 	cost = 0;
  1239 	cost = 0;
  1235 
  1240 
  1236 
  1241 	switch (m5 & RAIL_TYPE_MASK) {
  1237 	if ( (m5 & RAIL_TYPE_MASK) == RAIL_TYPE_NORMAL) {
  1242 		case RAIL_TYPE_SIGNALS:
  1238 regular_track:;
  1243 			if (_map3_lo[tile] & _signals_table_both[0]) {
  1239 		for(i=0; m5; i++, m5>>=1) {
  1244 				ret = DoCommandByTile(tile, 0, 0, flags, CMD_REMOVE_SIGNALS);
  1240 			if (m5 & 1) {
  1245 				if (ret == CMD_ERROR) return CMD_ERROR;
  1241 				ret = DoCommandByTile(tile, 0, i, flags, CMD_REMOVE_SINGLE_RAIL);
       
  1242 				if (ret == CMD_ERROR)
       
  1243 					return CMD_ERROR;
       
  1244 				cost += ret;
  1246 				cost += ret;
  1245 			}
  1247 			}
  1246 		}
  1248 			if (_map3_lo[tile] & _signals_table_both[3]) {
  1247 		return cost;
  1249 				ret = DoCommandByTile(tile, 3, 0, flags, CMD_REMOVE_SIGNALS);
  1248 
  1250 				if (ret == CMD_ERROR) return CMD_ERROR;
  1249 	} else if ((m5 & RAIL_TYPE_MASK)==RAIL_TYPE_SIGNALS) {
  1251 				cost += ret;
  1250 		cost = 0;
  1252 			}
  1251 		if (_map3_lo[tile] & (_signals_table[0] | _signals_table[0 + 8])) { // check for signals in the first track
  1253 
  1252 			ret = DoCommandByTile(tile, 0, 0, flags, CMD_REMOVE_SIGNALS);
  1254 			m5 &= RAIL_BIT_MASK;
  1253 			if (ret == CMD_ERROR)
  1255 			/* FALLTHROUGH */
  1254 				return CMD_ERROR;
  1256 
  1255 			cost += ret;
  1257 		case RAIL_TYPE_NORMAL: {
  1256 		};
  1258 			uint i;
  1257 		if (_map3_lo[tile] & (_signals_table[3] | _signals_table[3 + 8])) { // check for signals in the other track
  1259 
  1258 			ret = DoCommandByTile(tile, 3, 0, flags, CMD_REMOVE_SIGNALS);
  1260 			for (i = 0; m5 != 0; i++, m5 >>= 1) {
  1259 			if (ret == CMD_ERROR)
  1261 				if (m5 & 1) {
  1260 				return CMD_ERROR;
  1262 					if (flags & DC_EXEC) {
  1261 			cost += ret;
  1263 						ret = DoCommandByTile(tile, 0, i, flags, CMD_REMOVE_SINGLE_RAIL);
  1262 		};
  1264 						if (ret == CMD_ERROR) return CMD_ERROR;
  1263 
  1265 					} else {
  1264 		m5 &= RAIL_BIT_MASK;
  1266 						ret = _price.remove_rail;
  1265 		if (flags & DC_EXEC)
  1267 					}
  1266 			goto regular_track;
  1268 					cost += ret;
  1267 		return cost + _price.remove_rail;
  1269 				}
  1268 	} else if ( (m5 & (RAIL_TYPE_MASK|RAIL_DEPOT_UNUSED_BITS)) == RAIL_TYPE_DEPOT) {
  1270 			}
  1269 		return RemoveTrainDepot(tile, flags);
  1271 			return cost;
  1270 	} else if ( (m5 & (RAIL_TYPE_MASK|RAIL_WAYPOINT_UNUSED_BITS)) == RAIL_TYPE_WAYPOINT) {
  1272 		}
  1271 		return RemoveTrainWaypoint(tile, flags, false);
  1273 
  1272 	} else
  1274 		case RAIL_TYPE_DEPOT:
  1273 		return CMD_ERROR;
  1275 			switch (m5 & RAIL_SUBTYPE_MASK) {
       
  1276 				case RAIL_SUBTYPE_DEPOT:
       
  1277 					return RemoveTrainDepot(tile, flags);
       
  1278 
       
  1279 				case RAIL_SUBTYPE_WAYPOINT:
       
  1280 					return RemoveTrainWaypoint(tile, flags, false);
       
  1281 
       
  1282 				default:
       
  1283 					return CMD_ERROR;
       
  1284 			}
       
  1285 
       
  1286 		default:
       
  1287 			return CMD_ERROR;
       
  1288 	}
  1274 }
  1289 }
  1275 
  1290 
  1276 
  1291 
  1277 
  1292 
  1278 typedef struct DrawTrackSeqStruct {
  1293 typedef struct DrawTrackSeqStruct {