eu07 reads static terrain from files named by "terrain ... endterrain":
text (.txtf) or its binary version (.btf). The scenery check now tells a
terrain file of which neither is there (MissingTerrainFile).
Such a file also takes the place of the scenery's .sbt, so the terrain
includes after it are read after all and a missing one is told again. When
the .sbt was already used before the directive - a terrain include or
terrain geometry passed over, or FirstInit - the simulator passes the file
over instead, which is told too (TerrainFileBehindSbt). The parser takes
the lookup of files and whether there is an .sbt as one SceneryFileLookup.
eu07 now finds files whatever the case of their names on Linux too
(MaSzyna-EU07/maszyna#362), so the starter no longer folds an include or a
scenery's .sbt to lower case to judge whether the simulator opens it: it
looks them up through CaseInsensitivePaths. The IncludeLetterCase fault and
its texts go, being a false alarm now, and the parser takes a plain yes or
no for each include.
"Open texture folder" finds the folder under dynamic, or from the game
folder, through CaseInsensitivePaths, so on Linux it opens the folder
when textures.txt names it in other letter case.
The textures/logo folder and a trainset's or scenery's logo in it are
looked up through CaseInsensitivePaths, with extensions in any case, so
on Linux the chosen logo is shown instead of a random one or none. The
lookup takes the file system, so it is tested.
PhysicalFileSystem matches a search pattern case-insensitively, as on
Windows, so X.SCN, .BMP minis and .FIZ files of data made on Windows are
listed on Linux as well.
An include in a .fiz is looked up in the vehicle's folder through
CaseInsensitivePaths, so its physics are read on Linux when the include
names the file in other letter case. The missing-asset scan finds skins and
models the same way, with extensions in any case, instead of reporting
files that are there.
A //$f attachment is looked up from the game folder through the new
AttachmentLocator, so on Linux its button is enabled and opens the file
when the scenery names it in other letter case or with backslashes.
The i18n folder and its <scenery>_<language>.json tables are looked up
through CaseInsensitivePaths, so on Linux a scenery's texts are translated
when the table is named in other letter case than the scenery file.
The //$i image and a trainset's timetable are looked up through
CaseInsensitivePaths, so on Linux they show when the scenery names them in
other letter case than the disk has. A timetable written with backslashes
is found there too, and with it the train number of a Hasler tape.
The scenery repository's include lookup becomes CaseInsensitivePaths, which
takes any folder over IFileSystem and gives a name as it is on disk. Of
folders named alike in other case it now tries each, not only the first.
A name is joined to the folder as the simulator joins it, a leading slash
counting for nothing. IFileSystem tells whether the disk ignores case; there,
as on Windows, a name missed as written is not looked for any further, so
no folder is listed.
- The pressure of the driver's valve is named as what its gauge shows
(the equalizing reservoir, the FV4a's time reservoir), alike in both
languages.
- The traction's values are clipped to their columns, and the torque
converter's label is shorter: it ran into the oil pressure's.
- The doors in two columns, the radio's label shorter: the names were cut.
- The compressor and the motor fans go on and off by themselves: no
events for them.
- The summary of HeadCodes.Right back above it.
- The rest of the cab record is read when written: what drives the
vehicle, the doors' permits and departure signal, the brakes of the
whole train, a diesel's oil and temperatures, the cruise control and
the rest.
- Cab panel: the traction as fits what drives the vehicle (voltage and
current of an electric one; revolutions, oil pressure and temperatures
of a diesel; clutch or torque converter of a mechanical or hydraulic
one; nothing for a draisine), the equalizing reservoir, the main
reservoir pipe and the most braked cylinder of the train, the brakes'
setting and mode, a group of the doors, the pumps of a diesel where an
electric vehicle has its pantographs, the hand brake, the releaser, the
horn's tone, the radio's channel, the integrated handle of a unit.
- Events: every switch on and off, doors opened and closed, the departure
signal, the hand brake, the brakes' setting, the radio channel, the
cruise control's speed; moving with the doors open and an overheating
engine as faults.
- A vehicle with no lamps at an end (a draisine) is not judged on its
lights, and one which never had a voltage shows none.
- The hover label and the clock bubble keep to the left edge on a
narrow timeline instead of throwing in Render.
- A mark is told under the pointer only when it is drawn: within the
plot and the time shown.
- The device groups are clipped at their own width, not 4 px short.
- On a short window the cab card scrolls, so the list above it keeps
room for a few rows.
- Map legend: a title for each part, the texts in the text colour, the
speed bands said in full ("up to 5 km/h faster than the AI").
- Timeline: the key names every mark (station, W6, signal passed,
coupling, autopilot, command), the row of marks has its name, and the
mark under the pointer is told in a label. The key no longer sits on
the station plates.
- Cab panel: titled parts (controls, brakes, traction, lights, devices);
the AI's speed and the next limit no longer run into the controllers;
the lights of each end with the signal they show, and the one they are
to show when it differs; the devices in three groups (power, driving,
safety) instead of one long list.
- A light pattern asked for in a recording made before the lamps were
written is checked as the signal it shows, as before.
- Whether the couplings were written is told by the format (the
movement in the cab samples), not by there being any: a recording
where every train is a single vehicle has none, and the user going
over to another vehicle left the timetable shown.
- The 2 m a train may stand off the platform is at each end, not for
both together.
- The stations, the signals passed, the horn points, the couplings, the
consists and the timetable progress of the user's train are kept until
a read adds something; the views asked for them every frame, which on
a long session with many trains took the window down. A read that adds
nothing no longer counts as a change.
- The lights are checked against the lamps the vehicles at the ends have
(written by the simulator from now on), as its driver checks them: Pc 1
without the upper headlight, with the auxiliary lamps, Pc 5 with the
rear-end signals. Only while the user drives: the autopilot's lights
are its own.
- A train off the platform counts at both ends: its head past the stop
point as well as its tail before the platform's end.
- A recording without the couplings keeps the timetable for any vehicle
of the user.
- A signal passed at danger is ringed on the map only once it was.
- In the tapes window a black box opens on a click or Enter, not when
the arrow keys go over it.
- The viewer's screenshot of a window not laid out saves nothing and
still closes.
The simulator writes a black box of each run to physicslog/*.blackbox
(blackbox_doc.md in the maszyna repository). Three new projects read and
show it:
- Eu07.BlackBox: the reader of the records, the recording as a whole
(the user's vehicle and consist at a time, the timetable shown, the
progress along it with arrival and departure delays, whether the
train stood at the platform), the light patterns Pc 1, Pc 2, Pc 5 and
Tb 1 with the ones the run asks for, and a summary of the driving.
- Eu07.BlackBox.Views: the player window, with the scenery map (tracks,
signals, W4 stop points with their heading and W32, the train, the
cameras), the cab, the timeline of speed against the AI's reference,
the events, the timetable and the summary.
- Eu07.BlackBox.Viewer: the window on its own, with options for the
time, following the train and screenshots.
The tapes window of the starter lists the black boxes of each session
beside the Hasler tapes and opens them in the player.
Runs SonarScanner for .NET around a full build and the tests, with
OpenCover coverage from coverlet, on pushes to main and on pull requests
from branches of this repository. Fork and Dependabot pull requests are
skipped: the C# analysis runs inside the build, so the token and the
built code cannot be kept on separate machines as in maszyna.
The scanner is pinned in .config/dotnet-tools.json for Dependabot.
The watch of scenery files asked three times per file, whether it is there,
its time and its size, every two seconds for every source of every scenery.
One look gives all three.
They were kept by the trainset's text for the whole session, behind one lock,
and every reload added more. They are now kept as long as a trainset holds
that text.
Writing the settings put them right for the simulator, DLSS to TAA on OpenGL
and the like, in the object given. A preview of the changes or a look at the
levels goes through the same write and changed the held settings. A copy is
put right now.
A start notes down which vehicles the player drove in the run before, as the
log begins anew. With the tape window never opened nothing of a long run's log
had been read yet, and Start waited on the whole of it. It is now read off the
UI thread when the simulator exits and when the starter opens.
The tape window reads starter-launch.txt every two seconds. Written in place,
the file could be read half written, and a crash during the write lost the
launches noted before.
A uart or uarttune the settings no longer write was found missing twice, as a
key of set length and as one the file had, and showed twice among the changes.