Exemple #1
0
 internal OrtsWeatherChange(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("ortsovercast", () =>
         {
             stf.MustMatchBlockStart();
             Overcast = stf.ReadFloat(STFReader.Units.None, -1);
             OvercastTransitionTime = stf.ReadInt(-1);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("ortsfog", () =>
         {
             stf.MustMatchBlockStart();
             Fog = stf.ReadFloat(STFReader.Units.None, -1);
             FogTransitionTime = stf.ReadInt(-1);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("ortsprecipitationintensity", () =>
         {
             stf.MustMatchBlockStart();
             PrecipitationIntensity = stf.ReadFloat(STFReader.Units.None, -1);
             PrecipitationIntensityTransitionTime = stf.ReadInt(-1);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("ortsprecipitationliquidity", () =>
         {
             stf.MustMatchBlockStart();
             PrecipitationLiquidity = stf.ReadFloat(STFReader.Units.None, -1);
             PrecipitationLiquidityTransitionTime = stf.ReadInt(-1);
             stf.MustMatchBlockEnd();
         })
     });
 }
Exemple #2
0
 private void ParseActivityHeader(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("routeid", () => { Header.RouteID = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("name", () => { Header.Name = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("description", () => { Header.Description = stf.ReadStringBlock(string.Empty); }),
         new STFReader.TokenProcessor("briefing", () => { Header.Briefing = stf.ReadStringBlock(string.Empty); }),
         new STFReader.TokenProcessor("completeactivity", () => { Header.CompleteActivity = (stf.ReadIntBlock(1) == 1); }),
         new STFReader.TokenProcessor("type", () => { Header.Type = stf.ReadIntBlock(0); }),
         new STFReader.TokenProcessor("mode", () => { Header.Mode = (ActivityMode)stf.ReadIntBlock((int)Header.Mode); }),
         new STFReader.TokenProcessor("starttime", () => {
             stf.MustMatchBlockStart();
             Header.StartTime = new TimeSpan(stf.ReadInt(null), stf.ReadInt(null), stf.ReadInt(null));
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("season", () => { Header.Season = (SeasonType)stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("weather", () => { Header.Weather = (WeatherType)stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("pathid", () => { Header.PathID = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("startingspeed", () => { Header.StartingSpeed = stf.ReadFloatBlock(STFReader.Units.Speed, Header.StartingSpeed); }),
         new STFReader.TokenProcessor("duration", () => {
             stf.MustMatchBlockStart();
             Header.Duration = new TimeSpan(stf.ReadInt(null), stf.ReadInt(null), 0);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("difficulty", () => { Header.Difficulty = (Difficulty)stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("animals", () => { Header.Animals = stf.ReadIntBlock(Header.Animals); }),
         new STFReader.TokenProcessor("workers", () => { Header.Workers = stf.ReadIntBlock(Header.Workers); }),
         new STFReader.TokenProcessor("fuelwater", () => { Header.FuelWater = stf.ReadIntBlock(Header.FuelWater); }),
         new STFReader.TokenProcessor("fuelcoal", () => { Header.FuelCoal = stf.ReadIntBlock(Header.FuelCoal); }),
         new STFReader.TokenProcessor("fueldiesel", () => { Header.FuelDiesel = stf.ReadIntBlock(Header.FuelDiesel); }),
     });
 }
Exemple #3
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();
         }),
     });
 public FreightAnimationDiscrete(STFReader stf)
 {
     stf.MustMatch("(");
     stf.ParseBlock(new STFReader.TokenProcessor[]
     {
         new STFReader.TokenProcessor("subtype", () =>
         {
             var typeString = stf.ReadStringBlock(null);
             switch (typeString)
             {
             default:
                 SubType = FreightAnimationDiscrete.Type.DEFAULT;
                 break;
             }
         }),
         new STFReader.TokenProcessor("shape", () => { ShapeFileName = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("offset", () => {
             stf.MustMatchBlockStart();
             XOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
             YOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
             ZOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("loadweight", () => { LoadWeight = stf.ReadFloatBlock(STFReader.Units.Mass, 0); }),
         new STFReader.TokenProcessor("loadedatstart", () => { LoadedAtStart = stf.ReadBoolBlock(true); }),
     });
 }
Exemple #5
0
 public Duration(STFReader stf)
 {
     stf.MustMatchBlockStart();
     hour   = stf.ReadInt(null);
     minute = stf.ReadInt(null);
     stf.MustMatchBlockEnd();
 }
Exemple #6
0
 internal override void Update(STFReader stf)
 {
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("eventtypelocation", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); }),
         new STFReader.TokenProcessor("id", () => { ID = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("ortstriggeringtrain", () => { ParseTrain(stf); }),
         new STFReader.TokenProcessor("activation_level", () => { ActivationLevel = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("outcomes", () =>
         {
             if (Outcomes == null)
             {
                 Outcomes = new Outcomes(stf);
             }
             else
             {
                 Outcomes.Update(stf);
             }
         }),
         new STFReader.TokenProcessor("name", () => { Name = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("texttodisplayoncompletioniftriggered", () => { TextToDisplayOnCompletionIfTriggered = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("texttodisplayoncompletionifnottriggered", () => { TextToDisplayOnCompletionIfNotTriggered = stf.ReadStringBlock(null); }),
         new STFReader.TokenProcessor("triggeronstop", () => { TriggerOnStop = stf.ReadBoolBlock(true); }),
         new STFReader.TokenProcessor("location", () => {
             stf.MustMatchBlockStart();
             location = new WorldLocation(stf.ReadInt(null), stf.ReadInt(null),
                                          stf.ReadFloat(STFReader.Units.None, null), 0f, stf.ReadFloat(STFReader.Units.None, null));
             RadiusM = stf.ReadFloat(STFReader.Units.Distance, null);
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("ortscontinue", () => { OrtsContinue = stf.ReadIntBlock(0); }),
         new STFReader.TokenProcessor("ortsactsoundfile", () => OrtsActivitySoundProcessor(stf)),
         new STFReader.TokenProcessor("ortsweatherchange", () => { WeatherChange = new OrtsWeatherChange(stf); }),
     });
 }
Exemple #7
0
 internal PlatformData(STFReader stf)
 {
     stf.MustMatchBlockStart();
     ID             = stf.ReadInt(null);
     PassengerCount = stf.ReadInt(null);
     stf.MustMatchBlockEnd();
 }
Exemple #8
0
 internal MaxVelocity(STFReader stf)
 {
     stf.MustMatchBlockStart();
     A = stf.ReadFloat(STFReader.Units.Speed, null);
     B = stf.ReadFloat(STFReader.Units.Speed, null);
     stf.MustMatchBlockEnd();
 }
Exemple #9
0
 public StartTime(STFReader stf)
 {
     stf.MustMatchBlockStart();
     Hour   = stf.ReadInt(null);
     Minute = stf.ReadInt(null);
     Second = stf.ReadInt(null);
     stf.MustMatchBlockEnd();
 }
Exemple #10
0
 internal RestrictedSpeedZone(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("startposition", () => {
             stf.MustMatchBlockStart();
             startPosition = new WorldLocation(stf.ReadInt(null), stf.ReadInt(null),
                                               stf.ReadFloat(STFReader.Units.None, null), 0f, stf.ReadFloat(STFReader.Units.None, null));
             stf.MustMatchBlockEnd();
         }),
         new STFReader.TokenProcessor("endposition", () => {
             stf.MustMatchBlockStart();
             endPosition = new WorldLocation(stf.ReadInt(null), stf.ReadInt(null),
                                             stf.ReadFloat(STFReader.Units.None, null), 0f, stf.ReadFloat(STFReader.Units.None, null));
             stf.MustMatchBlockEnd();
         })
     });
 }
Exemple #11
0
 internal ActivityObject(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("objecttype", () => { stf.MustMatchBlockStart(); stf.MustMatch("WagonsList"); stf.MustMatchBlockEnd(); }),
         new STFReader.TokenProcessor("train_config", () => { TrainSet = new TrainSet(stf); }),
         new STFReader.TokenProcessor("direction", () => { Direction = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("id", () => { ID = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("tile", () => {
             stf.MustMatchBlockStart();
             location = new WorldLocation(stf.ReadInt(null), stf.ReadInt(null),
                                          stf.ReadFloat(STFReader.Units.None, null), 0f, stf.ReadFloat(STFReader.Units.None, null));
             stf.MustMatchBlockEnd();
         }),
     });
 }
Exemple #12
0
        private protected void OrtsActivitySoundProcessor(STFReader stf)
        {
            stf.MustMatchBlockStart();
            string soundFile = stf.ReadString();

            SoundFile = 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();
        }
Exemple #13
0
        private void TryModify(int category, STFReader stf)
        {
            ActivityEvent origEvent;
            bool          wrongEventID = false;
            int           modifiedID   = -1;

            try
            {
                stf.MustMatchBlockStart();
                stf.MustMatch("id");
                stf.MustMatchBlockStart();
                modifiedID = stf.ReadInt(null);
                stf.MustMatchBlockEnd();
                origEvent = Find(x => x.ID == modifiedID);
                if (origEvent == null)
                {
                    wrongEventID = true;
                    Trace.TraceWarning("Skipped event {0} not present in base activity file", modifiedID);
                    stf.SkipRestOfBlock();
                }
                else
                {
                    wrongEventID = !TestMatch(category, origEvent);
                    if (!wrongEventID)
                    {
                        origEvent.Update(stf);
                    }
                    else
                    {
                        Trace.TraceWarning("Skipped event {0} of event category not matching with base activity file", modifiedID);
                        stf.SkipRestOfBlock();
                    }
                }
            }
            catch (Exception error)
            {
                Trace.WriteLine(new FileLoadException("Error in additional activity file", error));
            }
        }
Exemple #14
0
 internal void Update(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("activitysuccess", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); ActivitySuccess = true; }),
         new STFReader.TokenProcessor("activityfail", () => { ActivityFail = stf.ReadStringBlock(""); }),
         new STFReader.TokenProcessor("activateevent", () => { ActivateList.Add(stf.ReadIntBlock(null)); }),
         new STFReader.TokenProcessor("restoreactlevel", () => { RestoreActivityLevels.Add(stf.ReadIntBlock(null)); }),
         new STFReader.TokenProcessor("decactlevel", () => { DecrementActivityLevels.Add(stf.ReadIntBlock(null)); }),
         new STFReader.TokenProcessor("incactlevel", () => { IncrementActivityLevels.Add(stf.ReadIntBlock(null)); }),
         new STFReader.TokenProcessor("displaymessage", () => {
             DisplayMessage = stf.ReadStringBlock("");
         }),
         new STFReader.TokenProcessor("ortsrestartwaitingtrain", () => { RestartWaitingTrain = new RestartWaitingTrain(stf); }),
         new STFReader.TokenProcessor("ortsweatherchange", () => { WeatherChange = new OrtsWeatherChange(stf); }),
         new STFReader.TokenProcessor("ortsactivitysound", () => { ActivitySound = new ActivitySound(stf); }),
     });
 }
Exemple #15
0
 internal override void Update(STFReader stf)
 {
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("eventtypeallstops", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.AllStops; }),
         new STFReader.TokenProcessor("eventtypeassembletrain", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.AssembleTrain; }),
         new STFReader.TokenProcessor("eventtypeassembletrainatlocation", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.AssembleTrainAtLocation; }),
         new STFReader.TokenProcessor("eventtypedropoffwagonsatlocation", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.DropOffWagonsAtLocation; }),
         new STFReader.TokenProcessor("eventtypepickuppassengers", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.PickUpPassengers; }),
         new STFReader.TokenProcessor("eventtypepickupwagons", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.PickUpWagons; }),
         new STFReader.TokenProcessor("eventtypereachspeed", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Type = EventType.ReachSpeed; }),
         new STFReader.TokenProcessor("id", () => { ID = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("activation_level", () => { ActivationLevel = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("outcomes", () =>
         {
             if (Outcomes == null)
             {
                 Outcomes = new Outcomes(stf);
             }
             else
             {
                 Outcomes.Update(stf);
             }
         }),
         new STFReader.TokenProcessor("texttodisplayoncompletioniftriggered", () => { TextToDisplayOnCompletionIfTriggered = stf.ReadStringBlock(""); }),
         new STFReader.TokenProcessor("texttodisplayoncompletionifnotriggered", () => { TextToDisplayOnCompletionIfNotTriggered = stf.ReadStringBlock(""); }),
         new STFReader.TokenProcessor("name", () => { Name = stf.ReadStringBlock(""); }),
         new STFReader.TokenProcessor("wagon_list", () => { WorkOrderWagons = new WorkOrderWagons(stf); }),
         new STFReader.TokenProcessor("sidingitem", () => { SidingId = (uint)stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("speed", () => { SpeedMpS = stf.ReadFloatBlock(STFReader.Units.Speed, null); }),
         new STFReader.TokenProcessor("reversable_event", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Reversible = true; }),
         // Also support the correct spelling !
         new STFReader.TokenProcessor("reversible_event", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Reversible = true; }),
         new STFReader.TokenProcessor("ortscontinue", () => { OrtsContinue = stf.ReadIntBlock(0); }),
         new STFReader.TokenProcessor("ortsactsoundfile", () => OrtsActivitySoundProcessor(stf)),
     });
 }
Exemple #16
0
 public Wagon(STFReader stf)
 {
     stf.MustMatchBlockStart();
     stf.ParseBlock(new STFReader.TokenProcessor[] {
         new STFReader.TokenProcessor("uid", () => { UiD = stf.ReadIntBlock(null); }),
         new STFReader.TokenProcessor("flip", () => { stf.MustMatchBlockStart(); stf.MustMatchBlockEnd(); Flip = true; }),
         new STFReader.TokenProcessor("enginedata", () => { stf.MustMatchBlockStart(); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatchBlockEnd(); IsEngine = true; }),
         new STFReader.TokenProcessor("wagondata", () => { stf.MustMatchBlockStart(); Name = stf.ReadString(); Folder = stf.ReadString(); stf.MustMatchBlockEnd(); }),
     });
 }
        public float FullStaticCentreOfGravityM_Y     = -9999; // get centre of gravity after adjusted for freight animation

        public FreightAnimationStatic(STFReader stf)
        {
            stf.MustMatch("(");
            stf.ParseBlock(new STFReader.TokenProcessor[] {
                new STFReader.TokenProcessor("subtype", () =>
                {
                    var typeString = stf.ReadStringBlock(null);
                    switch (typeString)
                    {
                    default:
                        SubType = FreightAnimationStatic.Type.DEFAULT;
                        break;
                    }
                }),
                new STFReader.TokenProcessor("shape", () => { ShapeFileName = stf.ReadStringBlock(null); }),
                new STFReader.TokenProcessor("freightweight", () => { FreightWeight = stf.ReadFloatBlock(STFReader.Units.Mass, 0); }),
                new STFReader.TokenProcessor("offset", () => {
                    stf.MustMatchBlockStart();
                    XOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
                    YOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
                    ZOffset = stf.ReadFloat(STFReader.Units.Distance, 0);
                    stf.MustMatchBlockEnd();
                }),
                new STFReader.TokenProcessor("flip", () => { Flipped = stf.ReadBoolBlock(true); }),
                new STFReader.TokenProcessor("visibility", () => {
                    for (int index = 0; index < 3; index++)
                    {
                        Visibility[index] = false;
                    }
                    foreach (var visibilityPlace in stf.ReadStringBlock("").ToLower().Replace(" ", "").Split(','))
                    {
                        switch (visibilityPlace)
                        {
                        case "outside":
                            Visibility[(int)VisibleFrom.Outside] = true;
                            break;

                        case "cab2d":
                            Visibility[(int)VisibleFrom.Cab2D] = true;
                            break;

                        case "cab3d":
                            Visibility[(int)VisibleFrom.Cab3D] = true;
                            break;

                        default:
                            break;
                        }
                    }
                }),
                // additions to manage consequences of variable weight on friction and brake forces
                new STFReader.TokenProcessor("fullortsdavis_a", () => { FullStaticORTSDavis_A = stf.ReadFloatBlock(STFReader.Units.Force, -1); }),
                new STFReader.TokenProcessor("fullortsdavis_b", () => { FullStaticORTSDavis_B = stf.ReadFloatBlock(STFReader.Units.Resistance, -1); }),
                new STFReader.TokenProcessor("fullortsdavis_c", () => { FullStaticORTSDavis_C = stf.ReadFloatBlock(STFReader.Units.ResistanceDavisC, -1); }),
                new STFReader.TokenProcessor("fullortswagonfrontalarea", () => { FullStaticORTSWagonFrontalAreaM2 = stf.ReadFloatBlock(STFReader.Units.AreaDefaultFT2, -1); }),
                new STFReader.TokenProcessor("fullortsdavisdragconstant", () => { FullStaticORTSDavisDragConstant = stf.ReadFloatBlock(STFReader.Units.Any, -1); }),
                new STFReader.TokenProcessor("fullmaxbrakeforce", () => { FullStaticMaxBrakeForceN = stf.ReadFloatBlock(STFReader.Units.Force, -1); }),
                new STFReader.TokenProcessor("fullmaxhandbrakeforce", () => { FullStaticMaxHandbrakeForceN = stf.ReadFloatBlock(STFReader.Units.Force, -1); }),
                new STFReader.TokenProcessor("fullcentreofgravity_y", () => { FullStaticCentreOfGravityM_Y = stf.ReadFloatBlock(STFReader.Units.Distance, -1); })
            });
        }