MCPcopy Create free account
hub / github.com/OpenTTD/OpenTTD / GetRailFoundation

Function GetRailFoundation

src/rail_cmd.cpp:309–377  ·  view source on GitHub ↗

* 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. */

Source from the content-addressed store, hash-verified

307 * @return Needed foundation or FOUNDATION_INVALID if track/slope combination is not allowed.
308 */
309Foundation 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;

Callers 10

CheckRailSlopeFunction · 0.85
FloodHalftileFunction · 0.85
DrawTrackBitsOverlayFunction · 0.85
DrawTrackBitsFunction · 0.85
GetSlopePixelZ_TrackFunction · 0.85
GetFoundation_TrackFunction · 0.85
TileLoop_TrackFunction · 0.85
TestAutoslopeOnRailTileFunction · 0.85
TerraformTile_TrackFunction · 0.85
DrawRailCatenaryRailwayFunction · 0.85

Calls 11

IsSteepSlopeFunction · 0.85
GetHighestSlopeCornerFunction · 0.85
CornerToTrackBitsFunction · 0.85
HalftileFoundationFunction · 0.85
TracksOverlapFunction · 0.85
OppositeCornerFunction · 0.85
SlopeWithOneCornerRaisedFunction · 0.85
SpecialRailFoundationFunction · 0.85

Tested by 1

TestAutoslopeOnRailTileFunction · 0.68