Example #1
0
 /// <summary>
 /// Default constructor used during file parsing.
 /// </summary>
 /// <param name="stf">The STFreader containing the file stream</param>
 public TrackDB(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("tracknodes", () => {
             stf.MustMatchBlockStart();
             int numberOfTrackNodes = stf.ReadInt(null);
             TrackNodes             = new TrackNode[numberOfTrackNodes + 1];
             int idx = 1;
             stf.ParseBlock(new STFReader.TokenProcessor[] {
                 new STFReader.TokenProcessor("tracknode", () => {
                     TrackNodes[idx] = TrackNode.ReadTrackNode(stf, idx, numberOfTrackNodes);
                     if (TrackNodes[idx] is TrackJunctionNode junctionNode)
                     {
                         string key = $"{junctionNode.UiD.WorldId}-{junctionNode.UiD.Location.TileX}-{junctionNode.UiD.Location.TileZ}";
                         if (!junctionNodes.ContainsKey(key))
                         {
                             junctionNodes.Add(key, junctionNode);
                         }
                         // only need any (first) junction node with that key here to relate back to ShapeIndex
                     }
                     ++idx;
                 }),
             });
         }),
Example #2
0
 internal ActivitySound(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("ortsactsoundfile", () =>
         {
             stf.MustMatchBlockStart();
             string soundFile = stf.ReadString();
             SoundFile        = Path.Combine(FolderStructure.RouteFromActivity(stf.FileName).SoundFile(soundFile));
             if (!EnumExtension.GetValue(stf.ReadString(), out OrtsActivitySoundFileType soundFileType))
             {
                 stf.StepBackOneItem();
                 STFException.TraceInformation(stf, "Skipped unknown activity sound file type " + stf.ReadString());
                 SoundFileType = OrtsActivitySoundFileType.None;
             }
             else
             {
                 SoundFileType = soundFileType;
             }
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("ortssoundlocation", () => {
             stf.MustMatchBlockStart();
             location = new WorldLocation(stf.ReadInt(null), stf.ReadInt(null),
                                          stf.ReadFloat(STFReader.Units.None, null), stf.ReadFloat(STFReader.Units.None, null), stf.ReadFloat(STFReader.Units.None, null));
             stf.MustMatchBlockEnd();
         }),
     });
Example #3
0
        public ORActivity(STFReader stf)
        {
            stf.MustMatchBlockStart();
            stf.ParseBlock(new STFReader.TokenProcessor[] {
                // General TAB
                new STFReader.TokenProcessor("ortsgraduatedbrakerelease", () => { Options.GraduatedBrakeRelease = stf.ReadIntBlock(Options.GraduatedBrakeRelease); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsviewdispatchwindow", () => { Options.ViewDispatcherWindow = stf.ReadIntBlock(Options.ViewDispatcherWindow); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsretainersonallcars", () => { Options.RetainersOnAllCars = stf.ReadIntBlock(Options.RetainersOnAllCars); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortssoundspeedcontrol", () => { Options.SoundSpeedControl = stf.ReadIntBlock(Options.SoundSpeedControl); IsActivityOverride = true; }),

                // Video TAB
                new STFReader.TokenProcessor("ortsfastfullscreenalttab", () => { Options.FastFullScreenAltTab = stf.ReadIntBlock(Options.FastFullScreenAltTab); IsActivityOverride = true; }),

                // Simulation TAB
                new STFReader.TokenProcessor("ortsforcedredatstationstops", () => { Options.ForcedRedAtStationStops = stf.ReadIntBlock(Options.ForcedRedAtStationStops); IsActivityOverride = true; }),

                new STFReader.TokenProcessor("ortsuseadvancedadhesion", () => { Options.UseAdvancedAdhesion = stf.ReadIntBlock(Options.UseAdvancedAdhesion); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsbreakcouplers", () => { Options.BreakCouplers = stf.ReadIntBlock(Options.BreakCouplers); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortscurveresistancedependent", () => { Options.CurveResistanceDependent = stf.ReadIntBlock(Options.CurveResistanceDependent); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortscurvespeeddependent", () => { Options.CurveSpeedDependent = stf.ReadIntBlock(Options.CurveSpeedDependent); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortstunnelresistancedependent", () => { Options.TunnelResistanceDependent = stf.ReadIntBlock(Options.TunnelResistanceDependent); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortswindresistancedependent", () => { Options.WindResistanceDependent = stf.ReadIntBlock(Options.WindResistanceDependent); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortshotstart", () => { Options.HotStart = stf.ReadIntBlock(Options.HotStart); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortssimplecontrolphysics", () => { Options.SimpleControlPhysics = stf.ReadIntBlock(Options.SimpleControlPhysics); IsActivityOverride = true; }),

                // Data Logger TAB
                new STFReader.TokenProcessor("ortsverboseconfigurationmessages", () => { Options.VerboseConfigurationMessages = stf.ReadIntBlock(Options.VerboseConfigurationMessages); IsActivityOverride = true; }),

                // Experimental TAB
                new STFReader.TokenProcessor("ortslocationlinkedpassingpaths", () => { Options.UseLocationPassingPaths = stf.ReadIntBlock(Options.UseLocationPassingPaths); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsadhesionfactorcorrection", () => { Options.AdhesionFactor = stf.ReadIntBlock(Options.AdhesionFactor); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsadhesionfactorchange", () => { Options.AdhesionFactorChange = stf.ReadIntBlock(Options.AdhesionFactorChange); IsActivityOverride = true; }),

                new STFReader.TokenProcessor("ortsadhesionproportionaltoweather", () => { Options.AdhesionProportionalToWeather = stf.ReadIntBlock(Options.AdhesionProportionalToWeather); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsactivityrandomization", () => { Options.ActivityRandomization = stf.ReadIntBlock(Options.ActivityRandomization); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortsactivityweatherrandomization", () => { Options.ActivityWeatherRandomization = stf.ReadIntBlock(Options.ActivityWeatherRandomization); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortssuperelevationlevel", () => { Options.SuperElevationLevel = stf.ReadIntBlock(Options.SuperElevationLevel); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortssuperelevationminimumlength", () => { Options.SuperElevationMinimumLength = stf.ReadIntBlock(Options.SuperElevationMinimumLength); IsActivityOverride = true; }),
                new STFReader.TokenProcessor("ortssuperelevationgauge", () => { Options.SuperElevationGauge = stf.ReadIntBlock(Options.SuperElevationGauge); IsActivityOverride = true; }),

                new STFReader.TokenProcessor("events", () =>
                {
                    Events.UpdateORActivtyData(stf);
                }),
                new STFReader.TokenProcessor("ortsaihornatcrossings", () => { AIBlowsHornAtLevelCrossings = stf.ReadIntBlock(Convert.ToInt32(AIBlowsHornAtLevelCrossings)) > 0; }),
                new STFReader.TokenProcessor("ortsaicrossinghornpattern", () => { if (EnumExtension.GetValue(stf.ReadStringBlock(""), out LevelCrossingHornPattern value))
                                                                                  {
                                                                                      AILevelCrossingHornPattern = value;
                                                                                  }
                                             })
            });
Example #4
0
            // SigSubJnLinkIf is not supported

            /// <summary>
            /// Default constructor used during file parsing.
            /// </summary>
            /// <param name="stf">The STFreader containing the file stream</param>
            public SignalSubObject(STFReader stf)
            {
                SignalSubType = SignalSubType.None;
                stf.MustMatchBlockStart();
                Index       = stf.ReadInt(null);
                MatrixName  = stf.ReadString().ToUpper();
                Description = stf.ReadString();
                stf.ParseBlock(new STFReader.TokenProcessor[] {
                    new STFReader.TokenProcessor("sigsubtype", () => {
                        if (EnumExtension.GetValue(stf.ReadStringBlock(null), out SignalSubType subType))
                        {
                            SignalSubType = subType;
                        }
                    }),
                    new STFReader.TokenProcessor("sigsubstype", () => { SignalSubSignalType = stf.ReadStringBlock(null).ToLowerInvariant(); }),
                    new STFReader.TokenProcessor("signalflags", () => {
                        stf.MustMatchBlockStart();
                        while (!stf.EndOfBlock())
                        {
                            switch (stf.ReadString().ToLower())
                            {
                            case "optional":
                                Optional = true;
                                break;

                            case "default":
                                Default = true; break;

                            case "back_facing":
                                BackFacing = true;
                                break;

                            case "jn_link":
                                JunctionLink = true;
                                break;

                            default:
                                stf.StepBackOneItem();
                                STFException.TraceInformation(stf, "Skipped unknown SignalSubObj flag " + stf.ReadString());
                                break;
                            }
                        }
                    }),
                });
Example #5
0
 private void ParseActivityDetails(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("player_service_definition", () => { PlayerServices = new PlayerServices(stf); }),
         new STFReader.TokenProcessor("nextserviceuid", () => { NextServiceUiD = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("nextactivityobjectuid", () => { NextActivityObjectUiD = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("events", () => { Events = new ActivityEvents(stf); }),
         new STFReader.TokenProcessor("traffic_definition", () => { Traffic = new Traffic(stf); }),
         new STFReader.TokenProcessor("activityobjects", () => { ActivityObjects = new ActivityObjects(stf); }),
         new STFReader.TokenProcessor("platformnumpassengerswaiting", () => { PlatformWaitingPassengers = new PlatformPassengersWaiting(stf); }), // 35 files. To test, use EUROPE1\ACTIVITIES\aftstorm.act
         new STFReader.TokenProcessor("activityfailedsignals", () => { FailedSignals = new FailedSignals(stf); }),
         new STFReader.TokenProcessor("activityrestrictedspeedzones", () => { ActivityRestrictedSpeedZones = new RestrictedSpeedZones(stf); }),   // 27 files. To test, use EUROPE1\ACTIVITIES\lclsrvce.act
         new STFReader.TokenProcessor("ortsaihornatcrossings", () => { AIBlowsHornAtLevelCrossings = stf.ReadIntBlock(Convert.ToInt32(AIBlowsHornAtLevelCrossings)) > 0; }),
         new STFReader.TokenProcessor("ortsaicrossinghornpattern", () => { if (EnumExtension.GetValue(stf.ReadStringBlock(""), out LevelCrossingHornPattern value))
                                                                           {
                                                                               AILevelCrossingHornPattern = value;
                                                                           }
                                      })
     });
Example #6
0
        private static void ReadOrtsSignalFunctionTypes(STFReader stf)
        {
            stf.MustMatchBlockStart();
            int count      = stf.ReadInt(null);
            int tokensRead = 0;

            stf.ParseBlock(new STFReader.TokenProcessor[] {
                new STFReader.TokenProcessor("ortssignalfunctiontype", () => {
                    stf.MustMatchBlockStart();
                    if (tokensRead >= count)
                    {
                        STFException.TraceWarning(stf, "Skipped extra ORTSFunctionType");
                    }
                    else
                    {
                        string functionType = stf.ReadString();
                        // check agains default types
                        if (EnumExtension.GetValue(functionType, out SignalFunction result))
                        {
                            STFException.TraceWarning(stf, "Invalid definition of ORTSFunctionType, type is equal to MSTS defined type : " + functionType);
                        }
                        else if (functionType.StartsWith("OR_", StringComparison.OrdinalIgnoreCase) || functionType.StartsWith("ORTS", StringComparison.OrdinalIgnoreCase))
                        {
                            STFException.TraceWarning(stf, "Invalid definition of ORTSFunctionType, using reserved type name : " + functionType);
                        }
                        else
                        {
                            if (OrSignalTypes.Instance.FunctionTypes.Contains(functionType, StringComparer.OrdinalIgnoreCase))
                            {
                                STFException.TraceWarning(stf, "Skipped duplicate ORTSSignalFunction definition : " + functionType);
                            }
                            else
                            {
                                OrSignalTypes.Instance.FunctionTypes.Add(functionType);
                                tokensRead++;
                            }
                        }
                    }
                    stf.SkipRestOfBlock();
                }),
            });
Example #7
0
        public CabViewGaugeControl(STFReader stf, string basePath)
        {
            stf.MustMatchBlockStart();
            stf.ParseBlock(new STFReader.TokenProcessor[] {
                new STFReader.TokenProcessor("type", () => { ParseType(stf); }),
                new STFReader.TokenProcessor("position", () => { ParsePosition(stf); }),
                new STFReader.TokenProcessor("scalerange", () => { ParseScaleRange(stf); }),
                new STFReader.TokenProcessor("graphic", () => { ParseGraphic(stf, basePath); }),
                new STFReader.TokenProcessor("style", () => { ParseStyle(stf); }),
                new STFReader.TokenProcessor("units", () => { ParseUnits(stf); }),

                new STFReader.TokenProcessor("zeropos", () => { ZeroPos = stf.ReadIntBlock(null); }),
                new STFReader.TokenProcessor("orientation", () => { Orientation = stf.ReadIntBlock(null); }),
                new STFReader.TokenProcessor("dirincrease", () => { Direction = stf.ReadIntBlock(null); }),
                new STFReader.TokenProcessor("area", () => {
                    stf.MustMatchBlockStart();
                    area = new Rectangle(stf.ReadInt(null), stf.ReadInt(null), stf.ReadInt(null), stf.ReadInt(null));
                    stf.SkipRestOfBlock();
                }),
                new STFReader.TokenProcessor("positivecolour", () => {
                    stf.MustMatchBlockStart();
                    (PositiveColors, PositiveTrigger) = ParseControlColors(stf);
                }),
                new STFReader.TokenProcessor("negativecolour", () => {
                    stf.MustMatchBlockStart();
                    (NegativeColors, NegativeTrigger) = ParseControlColors(stf);
                }),
                new STFReader.TokenProcessor("decreasecolour", () => {
                    stf.MustMatchBlockStart();
                    stf.ReadInt(0);
                    if (!stf.EndOfBlock())
                    {
                        stf.ParseBlock(new STFReader.TokenProcessor[] {
                            new STFReader.TokenProcessor("controlcolour", () => { DecreaseColor = ParseControlColor(stf); })
                        });
                    }
                })
            });