private TrackGenerator.TrackPlacementState CreateTunnel() { TrackGenerator.TrackSlope trackSlope1 = TrackGenerator.TrackSlope.Straight; int num = 10; TrackGenerator.TrackPlacementState trackPlacementState1 = TrackGenerator.TrackPlacementState.Invalid; int x = (int)this._history[this._length - 1].X; int y = (int)this._history[this._length - 1].Y; for (TrackGenerator.TrackSlope trackSlope2 = TrackGenerator.TrackSlope.Up; trackSlope2 <= TrackGenerator.TrackSlope.Down; ++trackSlope2) { TrackGenerator.TrackPlacementState trackPlacementState2 = TrackGenerator.TrackPlacementState.Invalid; for (int index = 1; index < num; ++index) { trackPlacementState2 = TrackGenerator.CalculateStateForLocation(x + index * this._xDirection, y + index * (int)trackSlope2); switch (trackPlacementState2) { case TrackGenerator.TrackPlacementState.Obstructed: continue; case TrackGenerator.TrackPlacementState.Invalid: goto label_6; default: trackSlope1 = trackSlope2; num = index; trackPlacementState1 = trackPlacementState2; goto label_6; } } label_6: if (trackPlacementState1 != TrackGenerator.TrackPlacementState.Available && trackPlacementState2 == TrackGenerator.TrackPlacementState.Obstructed && (trackPlacementState1 != TrackGenerator.TrackPlacementState.Obstructed || trackSlope1 != TrackGenerator.TrackSlope.Straight)) { trackSlope1 = trackSlope2; num = 10; trackPlacementState1 = trackPlacementState2; } } if (this._length == 0 || !TrackGenerator.CanSlopesTouch(this._history[this._length - 1].Slope, trackSlope1)) { this.RewriteSlopeDirection(this._length - 1, TrackGenerator.TrackSlope.Straight); } this._history[this._length - 1].Mode = TrackGenerator.TrackMode.Tunnel; for (int index = 1; index < num; ++index) { this.AppendToHistory(trackSlope1, TrackGenerator.TrackMode.Tunnel); } return(trackPlacementState1); }
private TrackGenerator.TrackPlacementState TryRewriteHistoryToAvoidTiles() { int index1 = this._length - 1; int length = Math.Min(this._length, this._rewriteHistory.Length); for (int index2 = 0; index2 < length; ++index2) { this._rewriteHistory[index2] = this._history[index1 - index2]; } for (; index1 >= this._length - length; --index1) { if (this._history[index1].Slope == TrackGenerator.TrackSlope.Down) { TrackGenerator.TrackPlacementState segmentPlacementState = this.GetHistorySegmentPlacementState(index1, this._length - index1); if (segmentPlacementState == TrackGenerator.TrackPlacementState.Available) { return(segmentPlacementState); } this.RewriteSlopeDirection(index1, TrackGenerator.TrackSlope.Straight); } } if (this.GetHistorySegmentPlacementState(index1 + 1, this._length - (index1 + 1)) == TrackGenerator.TrackPlacementState.Available) { return(TrackGenerator.TrackPlacementState.Available); } int index3; for (index3 = this._length - 1; index3 >= this._length - length + 1; --index3) { if (this._history[index3].Slope == TrackGenerator.TrackSlope.Straight) { TrackGenerator.TrackPlacementState segmentPlacementState = this.GetHistorySegmentPlacementState(this._length - length, length); if (segmentPlacementState == TrackGenerator.TrackPlacementState.Available) { return(segmentPlacementState); } this.RewriteSlopeDirection(index3, TrackGenerator.TrackSlope.Up); } } for (int index2 = 0; index2 < length; ++index2) { this._history[this._length - 1 - index2] = this._rewriteHistory[index2]; } this.RewriteSlopeDirection(this._length - 1, TrackGenerator.TrackSlope.Straight); return(this.GetHistorySegmentPlacementState(index3 + 1, this._length - (index3 + 1))); }
private bool FindPath(int minLength, int maxLength) { int length = this._length; while (this._length < this._history.Length - 100) { this.AppendToHistory(this._history[this._length - 1].Slope == TrackGenerator.TrackSlope.Up ? TrackGenerator.TrackSlope.Straight : TrackGenerator.TrackSlope.Down, TrackGenerator.TrackMode.Normal); TrackGenerator.TrackPlacementState avoidTiles = this.TryRewriteHistoryToAvoidTiles(); if (avoidTiles != TrackGenerator.TrackPlacementState.Invalid) { length = this._length; TrackGenerator.TrackPlacementState trackPlacementState = avoidTiles; while (trackPlacementState != TrackGenerator.TrackPlacementState.Available) { trackPlacementState = this.CreateTunnel(); if (trackPlacementState != TrackGenerator.TrackPlacementState.Invalid) { length = this._length; } else { break; } } if (this._length >= maxLength) { break; } } else { break; } } this._length = Math.Min(maxLength, length); if (this._length < minLength) { return(false); } this.SmoothTrack(); return(this.GetHistorySegmentPlacementState(0, this._length) != TrackGenerator.TrackPlacementState.Invalid); }
private TrackGenerator.TrackPlacementState GetHistorySegmentPlacementState( int startIndex, int length) { TrackGenerator.TrackPlacementState trackPlacementState = TrackGenerator.TrackPlacementState.Available; for (int index = startIndex; index < startIndex + length; ++index) { TrackGenerator.TrackPlacementState stateForLocation = TrackGenerator.CalculateStateForLocation((int)this._history[index].X, (int)this._history[index].Y); switch (stateForLocation) { case TrackGenerator.TrackPlacementState.Obstructed: if (this._history[index].Mode != TrackGenerator.TrackMode.Tunnel) { trackPlacementState = stateForLocation; break; } break; case TrackGenerator.TrackPlacementState.Invalid: return(stateForLocation); } } return(trackPlacementState); }