Example #1
0
        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);
        }
Example #2
0
        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)));
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }