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 |
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 { |