mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-10 16:03:16 +01:00
fix(track): a tributary loads as a river of its first path keeping the second, a track of an unknown type is left out, where both made the simulator fall over as it loaded
On master neither got a segment: update_location() dereferenced the missing one of a track of an unknown type, and a tributary went to Switch(0), which logged "Cannot switch normal track", with no segment under it either. A tributary is now a river of its first path. Its second path is kept in m_paths, isn't drawn nor run on, and is written back with the type "tributary". A track of an unknown type is logged and left out by the loader; as it is no node, its text stays in the file when the editor saves the scenery.
This commit is contained in:
@@ -543,6 +543,12 @@ state_serializer::deserialize_node( cParser &Input, scene::scratch_data &Scratch
|
||||
else if( nodedata.type == "track" ) {
|
||||
|
||||
auto *path { deserialize_path( Input, Scratchpad, nodedata ) };
|
||||
if( path->eType == tt_Unknown ) {
|
||||
// with no path made it can't be joined nor drawn, and nothing could run on it
|
||||
ErrorLog( "Bad scenario: track \"" + path->name() + "\" of an unknown type defined in file \"" + Input.Name() + "\" (line " + std::to_string( inputline ) + ") left out" );
|
||||
delete path;
|
||||
return;
|
||||
}
|
||||
// duplicates of named tracks are currently experimentally allowed
|
||||
if( false == simulation::Paths.insert( path ) ) {
|
||||
ErrorLog( "Bad scenario: duplicate track name \"" + path->name() + "\" defined in file \"" + Input.Name() + "\" (line " + std::to_string( inputline ) + ")" );
|
||||
|
||||
@@ -427,11 +427,15 @@ void TTrack::Load(cParser *parser, glm::dvec3 const &pOrigin)
|
||||
}
|
||||
else if (str == "tributary")
|
||||
{
|
||||
eType = tt_Tributary;
|
||||
// dopływ: no path of it was ever made, the simulator falling over it as it loaded. a river of its first path now, the
|
||||
// second one kept and written back
|
||||
ErrorLog("Bad track: tributary \"" + m_name + "\" in file \"" + parser->Name() + "\" (line " + std::to_string(parser->Line()) + ") is drawn and run on as a river of its first path");
|
||||
eType = tt_Normal;
|
||||
iCategoryFlag = 4;
|
||||
m_tributary = true;
|
||||
}
|
||||
else
|
||||
eType = tt_Unknown;
|
||||
eType = tt_Unknown; // left out by the loader
|
||||
if (Global.iWriteLogEnabled & 4)
|
||||
WriteLog(str);
|
||||
parser->getTokens(4);
|
||||
@@ -517,6 +521,11 @@ void TTrack::Load(cParser *parser, glm::dvec3 const &pOrigin)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( m_tributary ) {
|
||||
// the second path of a tributary, kept to be written back
|
||||
m_paths.emplace_back();
|
||||
m_paths.back().deserialize( *parser, pOrigin );
|
||||
}
|
||||
|
||||
init_segments( true );
|
||||
|
||||
@@ -681,6 +690,10 @@ void TTrack::Load(cParser *parser, glm::dvec3 const &pOrigin)
|
||||
m_name = m_name.substr(0, i - 1); // usunięcie z nazwy
|
||||
}
|
||||
|
||||
if( CurrentSegment() == nullptr ) {
|
||||
// of an unknown type, no path of it is made
|
||||
return;
|
||||
}
|
||||
update_location();
|
||||
// sleeper transforms are baked later in create_geometry(), once the owning cell has
|
||||
// assigned this track its m_origin (otherwise the local-space matrices would be relative
|
||||
@@ -2314,6 +2327,7 @@ TTrack::export_as_text_( std::ostream &Output ) const {
|
||||
// type
|
||||
Output << (
|
||||
eType == tt_Normal ? (
|
||||
m_tributary ? "tributary" :
|
||||
iCategoryFlag == 1 ? "normal" :
|
||||
iCategoryFlag == 2 ? "road" :
|
||||
iCategoryFlag == 4 ? "river" :
|
||||
|
||||
@@ -187,6 +187,7 @@ public:
|
||||
|
||||
std::vector<segment_data> m_paths; // source data for owned paths
|
||||
bool m_editorremoved { false };
|
||||
bool m_tributary { false }; // loaded as a tributary: a river of its first path, the second one kept to be written back
|
||||
scene::basic_node *m_road { nullptr }; // road or road junction which generated this path. such path is one-way, and isn't saved nor edited on its own
|
||||
std::array<float, 3> m_routeweights { 0.f, 0.f, 0.f }; // odds of each route through a crossroads being picked by a driver, by the number of the route. all zero: even odds
|
||||
int iterate_stamp = 0;
|
||||
|
||||
Reference in New Issue
Block a user