* Checks if a track combination is valid on a specific slope and returns the needed foundation. * * @param tileh Tile slope. * @param bits Trackbits. * @return Needed foundation or FOUNDATION_INVALID if track/slope combination is not allowed. */
| 307 | * @return Needed foundation or FOUNDATION_INVALID if track/slope combination is not allowed. |
| 308 | */ |
| 309 | Foundation GetRailFoundation(Slope tileh, TrackBits bits) |
| 310 | { |
| 311 | if (bits == TRACK_BIT_NONE) return FOUNDATION_NONE; |
| 312 | |
| 313 | if (IsSteepSlope(tileh)) { |
| 314 | /* Test for inclined foundations */ |
| 315 | if (bits == TRACK_BIT_X) return FOUNDATION_INCLINED_X; |
| 316 | if (bits == TRACK_BIT_Y) return FOUNDATION_INCLINED_Y; |
| 317 | |
| 318 | /* Get higher track */ |
| 319 | Corner highest_corner = GetHighestSlopeCorner(tileh); |
| 320 | TrackBits higher_track = CornerToTrackBits(highest_corner); |
| 321 | |
| 322 | /* Only higher track? */ |
| 323 | if (bits == higher_track) return HalftileFoundation(highest_corner); |
| 324 | |
| 325 | /* Overlap with higher track? */ |
| 326 | if (TracksOverlap(bits | higher_track)) return FOUNDATION_INVALID; |
| 327 | |
| 328 | /* either lower track or both higher and lower track */ |
| 329 | return ((bits & higher_track) != 0 ? FOUNDATION_STEEP_BOTH : FOUNDATION_STEEP_LOWER); |
| 330 | } else { |
| 331 | if ((~_valid_tracks_without_foundation[tileh] & bits) == 0) return FOUNDATION_NONE; |
| 332 | |
| 333 | bool valid_on_leveled = ((~_valid_tracks_on_leveled_foundation[tileh] & bits) == 0); |
| 334 | |
| 335 | Corner track_corner; |
| 336 | switch (bits) { |
| 337 | case TRACK_BIT_LEFT: track_corner = CORNER_W; break; |
| 338 | case TRACK_BIT_LOWER: track_corner = CORNER_S; break; |
| 339 | case TRACK_BIT_RIGHT: track_corner = CORNER_E; break; |
| 340 | case TRACK_BIT_UPPER: track_corner = CORNER_N; break; |
| 341 | |
| 342 | case TRACK_BIT_HORZ: |
| 343 | if (tileh == SLOPE_N) return HalftileFoundation(CORNER_N); |
| 344 | if (tileh == SLOPE_S) return HalftileFoundation(CORNER_S); |
| 345 | return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID); |
| 346 | |
| 347 | case TRACK_BIT_VERT: |
| 348 | if (tileh == SLOPE_W) return HalftileFoundation(CORNER_W); |
| 349 | if (tileh == SLOPE_E) return HalftileFoundation(CORNER_E); |
| 350 | return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID); |
| 351 | |
| 352 | case TRACK_BIT_X: |
| 353 | if (IsSlopeWithOneCornerRaised(tileh)) return FOUNDATION_INCLINED_X; |
| 354 | return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID); |
| 355 | |
| 356 | case TRACK_BIT_Y: |
| 357 | if (IsSlopeWithOneCornerRaised(tileh)) return FOUNDATION_INCLINED_Y; |
| 358 | return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID); |
| 359 | |
| 360 | default: |
| 361 | return (valid_on_leveled ? FOUNDATION_LEVELED : FOUNDATION_INVALID); |
| 362 | } |
| 363 | /* Single diagonal track */ |
| 364 | |
| 365 | /* Track must be at least valid on leveled foundation */ |
| 366 | if (!valid_on_leveled) return FOUNDATION_INVALID; |