From 754fc50ca824d19073edc58be14844f2dc010a39 Mon Sep 17 00:00:00 2001 From: xingzihai Date: Wed, 1 Apr 2026 23:28:28 +0000 Subject: [PATCH 1/5] feat: add EngineMaxTemperature support for diesel locomotive overheat detection Add engine temperature monitoring to diesel locomotive heat management system: - Add engine field to heat_data struct (fluid_circuit_t type) - Add EngineMaxTemperature config extraction in .fiz files - Add engine overheat detection logic (is_hot check) - Include engine.is_hot in PT status check Implements issue #77: Oil, water and engine overheat lamps for diesel locomotives --- McZapkie/MOVER.h | 2 +- McZapkie/Mover.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index c9c3bb04..09febbec 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1045,7 +1045,7 @@ class TMoverParameters bool is_warm{false}; // fluid is too hot bool is_hot{false}; // fluid temperature crossed cooling threshold bool is_flowing{false}; // fluid is being pushed through the circuit - } water, water_aux, oil; + } water, water_aux, oil, engine; // output, state of affected devices bool PA{false}; // malfunction flag float rpmw{0.0}; // current main circuit fan revolutions diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index ca62fb72..dcd1d71d 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8174,6 +8174,9 @@ void TMoverParameters::dizel_Heat( double const dt ) { dizel_heat.oil.is_hot = ( ( dizel_heat.oil.config.temp_max > 0 ) && ( dizel_heat.To > dizel_heat.oil.config.temp_max - ( dizel_heat.oil.is_hot ? 8 : 0 ) ) ); + dizel_heat.engine.is_hot = ( + ( dizel_heat.engine.config.temp_max > 0 ) + && ( dizel_heat.Ts > dizel_heat.engine.config.temp_max - ( dizel_heat.engine.is_hot ? 8 : 0 ) ) ); auto const PT = ( ( false == dizel_heat.water.is_cold ) @@ -8181,7 +8184,8 @@ void TMoverParameters::dizel_Heat( double const dt ) { && ( false == dizel_heat.water_aux.is_cold ) && ( false == dizel_heat.water_aux.is_hot ) && ( false == dizel_heat.oil.is_cold ) - && ( false == dizel_heat.oil.is_hot ) /* && ( false == awaria_termostatow ) */ ) /* || PTp */; + && ( false == dizel_heat.oil.is_hot ) + && ( false == dizel_heat.engine.is_hot ) /* && ( false == awaria_termostatow ) */ ) /* || PTp */; auto const PPT = ( false == PT ) /* && ( false == PPTp ) */; dizel_heat.PA = ( /* ( ( !zamkniecie or niedomkniecie ) and !WBD ) || */ PPT /* || nurnik || ( woda < 7 ) */ ) /* && ( !PAp ) */; @@ -11254,6 +11258,7 @@ void TMoverParameters::LoadFIZ_Engine( std::string const &Input ) { extract_value( dizel_heat.water_aux.config.shutters, "WaterAuxShutters", Input, "" ); extract_value( dizel_heat.oil.config.temp_min, "OilMinTemperature", Input, "" ); extract_value( dizel_heat.oil.config.temp_max, "OilMaxTemperature", Input, "" ); + extract_value( dizel_heat.engine.config.temp_max, "EngineMaxTemperature", Input, "" ); extract_value( dizel_heat.fan_speed, "WaterCoolingFanSpeed", Input, "" ); // water heater extract_value( WaterHeater.config.temp_min, "HeaterMinTemperature", Input, "" ); From 407b18768808b825896544f42d0fa4f7fb2ee125 Mon Sep 17 00:00:00 2001 From: jakubg1 <24206305+jakubg1@users.noreply.github.com> Date: Sat, 4 Apr 2026 00:13:26 +0200 Subject: [PATCH 2/5] Tweak the door closing and warning signal delays - The warning signal is no longer going to be played for an obnoxiously long amount of time by AI drivers when driving vehicles with a manual warning signal switch, most notably EN57. - A new `moveDepartureWarned` driving flag has been created to accomodate this behavior. - Added the action time counter and the missing driving flags to the Vehicle AI section. --- application/driveruipanels.cpp | 12 +++-- vehicle/Driver.cpp | 91 +++++++++++++++++----------------- vehicle/Driver.h | 3 +- 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/application/driveruipanels.cpp b/application/driveruipanels.cpp index 16465d50..05e20b84 100644 --- a/application/driveruipanels.cpp +++ b/application/driveruipanels.cpp @@ -1138,9 +1138,12 @@ debug_panel::update_section_ai( std::vector &Output ) { "Current order: [" + std::to_string( mechanik.OrderPos ) + "] " + mechanik.Order2Str( mechanik.OrderCurrentGet() ); - if( mechanik.fStopTime < 0.0 ) { - textline += "\n stop time: " + to_string( std::abs( mechanik.fStopTime ), 1 ); - } + if( mechanik.fStopTime < 0.0 ) { + textline += "\n stop time: " + to_string( std::abs( mechanik.fStopTime ), 1 ); + } + if( mechanik.fActionTime < 0.0 ) { + textline += "\n action time: " + to_string( std::abs( mechanik.fActionTime ), 1 ); + } Output.emplace_back( textline, Global.UITextColor ); @@ -1231,7 +1234,8 @@ debug_panel::update_section_ai( std::vector &Output ) { std::vector const drivingflagnames { "StopCloser", "StopPoint", "Active", "Press", "Connect", "Primary", "Late", "StopHere", "StartHorn", "StartHornNow", "StartHornDone", "Oerlikons", "IncSpeed", "TrackEnd", "SwitchFound", "GuardSignal", - "Visibility", "DoorOpened", "PushPull", "SignalFound", "StopPointFound" /*"SemaphorWasElapsed", "TrainInsideStation", "SpeedLimitFound"*/ }; + "Visibility", "DoorOpened", "PushPull", "SignalFound", "StopPointFound", "GuardOpenDoor", "DepartureWarned" + /*"SemaphorWasElapsed", "TrainInsideStation", "SpeedLimitFound"*/ }; textline = "Driving flags:"; for( int idx = 0, flagbit = 1; idx < drivingflagnames.size(); ++idx, flagbit <<= 1 ) { diff --git a/vehicle/Driver.cpp b/vehicle/Driver.cpp index 33a7a43d..9a1f5d84 100644 --- a/vehicle/Driver.cpp +++ b/vehicle/Driver.cpp @@ -4359,62 +4359,61 @@ void TController::Doors( bool const Open, int const Side ) { if( ( false == doors_permit_active() ) && ( false == doors_open() ) ) { iDrivigFlags &= ~moveDoorOpened; + iDrivigFlags &= ~moveDepartureWarned; return; } + if (mvOccupied->Doors.has_warning && !TestFlag(iDrivigFlags, moveDepartureWarned)) + { + if (!mvOccupied->DepartureSignal) + { + // Not warned yet, not warning yet - start the warning signal. + cue_action( driver_hint::departuresignalon ); // załącenie bzyczka + fActionTime = Random( -0.3, -0.8 ); // 0.3-0.8 second buzzer + return; + } + // Not warned yet, warning now - stop the warning signal and mark it as done. + cue_action( driver_hint::departuresignaloff ); + fActionTime = Random( 0.0, -0.2 ); // Wait just a bit more before departing + iDrivigFlags |= moveDepartureWarned; + return; + } + if( true == doors_open() ) { - if( ( true == mvOccupied->Doors.has_warning ) - && ( false == mvOccupied->DepartureSignal ) - && ( true == TestFlag( iDrivigFlags, moveDoorOpened ) ) ) { - cue_action( driver_hint::departuresignalon ); // załącenie bzyczka - fActionTime = -1.5 - 0.1 * Random( 10 ); // 1.5-2.5 second wait + // consist-wide remote signals to close doors + if( ( pVehicle->MoverParameters->Doors.close_control == control_t::conductor ) + || ( pVehicle->MoverParameters->Doors.close_control == control_t::driver ) + || ( pVehicle->MoverParameters->Doors.close_control == control_t::mixed ) ) { + cue_action( driver_hint::doorrightclose ); + cue_action( driver_hint::doorleftclose ); } } + if( true == doors_permit_active() ) { + cue_action( driver_hint::doorrightpermitoff ); + cue_action( driver_hint::doorleftpermitoff ); + } + // if applicable close manually-operated doors in vehicles which may ignore remote signals + { + const auto *vehicle = pVehicles[ end::front ]; // pojazd na czole składu + while( vehicle != nullptr ) { + // zamykanie drzwi w pojazdach - flaga zezwolenia była by lepsza + auto const ismanualdoor { + ( vehicle->MoverParameters->Doors.auto_velocity == -1.f ) + && ( ( vehicle->MoverParameters->Doors.close_control == control_t::passenger ) + || ( vehicle->MoverParameters->Doors.close_control == control_t::mixed ) ) }; - if( ( false == AIControllFlag ) || ( fActionTime > -0.5 ) ) { - // ai doesn't close the door until it's free to depart, but human driver has free reign to do stupid things - if( true == doors_open() ) { - // consist-wide remote signals to close doors - if( ( pVehicle->MoverParameters->Doors.close_control == control_t::conductor ) - || ( pVehicle->MoverParameters->Doors.close_control == control_t::driver ) - || ( pVehicle->MoverParameters->Doors.close_control == control_t::mixed ) ) { - cue_action( driver_hint::doorrightclose ); - cue_action( driver_hint::doorleftclose ); + if( ( true == ismanualdoor ) + && ( ( vehicle->LoadExchangeTime() == 0.f ) + || ( vehicle->MoverParameters->Vel > EU07_AI_MOVEMENT ) ) ) { + vehicle->MoverParameters->OperateDoors( side::right, false, range_t::local ); + vehicle->MoverParameters->OperateDoors( side::left, false, range_t::local ); } - } - if( true == doors_permit_active() ) { - cue_action( driver_hint::doorrightpermitoff ); - cue_action( driver_hint::doorleftpermitoff ); - } - // if applicable close manually-operated doors in vehicles which may ignore remote signals - { - auto *vehicle = pVehicles[ end::front ]; // pojazd na czole składu - while( vehicle != nullptr ) { - // zamykanie drzwi w pojazdach - flaga zezwolenia była by lepsza - auto const ismanualdoor { - ( vehicle->MoverParameters->Doors.auto_velocity == -1.f ) - && ( ( vehicle->MoverParameters->Doors.close_control == control_t::passenger ) - || ( vehicle->MoverParameters->Doors.close_control == control_t::mixed ) ) }; - - if( ( true == ismanualdoor ) - && ( ( vehicle->LoadExchangeTime() == 0.f ) - || ( vehicle->MoverParameters->Vel > EU07_AI_MOVEMENT ) ) ) { - vehicle->MoverParameters->OperateDoors( side::right, false, range_t::local ); - vehicle->MoverParameters->OperateDoors( side::left, false, range_t::local ); - } - vehicle = vehicle->Next(); // pojazd podłączony z tyłu (patrząc od czoła) - } - } - fActionTime = -2.0 - 0.1 * Random( 15 ); // 2.0-3.5 sec wait, +potentially 0.5 remaining - iDrivigFlags &= ~moveDoorOpened; // zostały zamknięte - nie wykonywać drugi raz - - if( ( true == mvOccupied->DepartureSignal ) - && ( Random( 100 ) < Random( 100 ) ) ) { - // potentially turn off the warning before actual departure - // TBD, TODO: dedicated buzzer duration counter? - cue_action( driver_hint::departuresignaloff ); + vehicle = vehicle->Next(); // pojazd podłączony z tyłu (patrząc od czoła) } } + fActionTime = Random( -1.0, -3.5 ); // 1.0-3.5 sec wait + iDrivigFlags &= ~moveDoorOpened; // zostały zamknięte - nie wykonywać drugi raz + iDrivigFlags &= ~moveDepartureWarned; } } diff --git a/vehicle/Driver.h b/vehicle/Driver.h index 554ffc87..e897ba91 100644 --- a/vehicle/Driver.h +++ b/vehicle/Driver.h @@ -75,7 +75,8 @@ enum TMovementStatus movePushPull = 0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku moveSignalFound = 0x80000, // na drodze skanowania został znaleziony semafor moveStopPointFound = 0x100000, // stop point detected ahead - moveGuardOpenDoor = 0x200000 // time for opening a door before departure + moveGuardOpenDoor = 0x200000, // time for opening a door before departure + moveDepartureWarned = 0x400000 // driver has already warned about the doors being closed (only for manual warning - i.e. EN57-ish) /* moveSemaphorWasElapsed = 0x100000, // minięty został semafor moveTrainInsideStation = 0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem From 0d010e8c6aaba82bc6c4c4897a96f9195b83c994 Mon Sep 17 00:00:00 2001 From: jakubg1 <24206305+jakubg1@users.noreply.github.com> Date: Sat, 4 Apr 2026 02:05:49 +0200 Subject: [PATCH 3/5] Simplify derailing logic, derail reason enum - The `TMoverParameters::derail()` function has been renamed to `::Derail()`, with a capital D. - All derail events now use that function. - Simplified and unified the logic behind different derail types. - The `dtrack_freerail` track type is now slightly increasing the chance of derailing on a tight curve, as it was the intention. - A new `DerailReason` enum has been created which holds all derail types. - The `DerailReason` field in the `TMoverParameters` class has been removed. - This was a transient field which is not necessary anymore. - The logging functionality as such has been moved from `DynObj.cpp` to `Mover.cpp`. --- McZapkie/MOVER.h | 16 ++++++++++--- McZapkie/Mover.cpp | 60 ++++++++++++++++------------------------------ vehicle/DynObj.cpp | 21 ---------------- 3 files changed, 34 insertions(+), 63 deletions(-) diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index c9c3bb04..ea0c9d52 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -122,7 +122,18 @@ static int const dtrain_loaddestroyed = 32;/*dla wagonow*/ static int const dtrain_axle = 64; static int const dtrain_out = 128; /*wykolejenie*/ static int const dtrain_pantograph = 256; /*polamanie pantografu*/ - /*wagi prawdopodobienstwa dla funkcji FuzzyLogic*/ + +/*przyczyny wykolejenia*/ +enum DerailReason { + NONE = 0, + END_OF_TRACK = 1, // Ra: powód wykolejenia: brak szyn + TOO_HIGH_SPEED = 2, // Ra: powód wykolejenia: przewrócony na łuku + GAUGE_MISMATCH = 3, // Ra: powód wykolejenia: za szeroki tor + WRONG_TRACK_TYPE = 4, // Ra: powód wykolejenia: nieodpowiednia trajektoria + COLLISION = 5, // powód wykolejenia: zderzenie z innym pojazdem +}; + +/*wagi prawdopodobienstwa dla funkcji FuzzyLogic*/ #define p_elengproblem (1e-02) #define p_elengdamage (1e-01) #define p_coupldmg (2e-03) @@ -1590,7 +1601,6 @@ class TMoverParameters int DamageFlag = 0; // kombinacja bitowa stalych dtrain_* } int EngDmgFlag = 0; // kombinacja bitowa stalych usterek} - int DerailReason = 0; // przyczyna wykolejenia // EndSignalsFlag: byte; {ABu 060205: zmiany - koncowki: 1/16 - swiatla prz/tyl, 2/31 - blachy prz/tyl} // HeadSignalsFlag: byte; {ABu 060205: zmiany - swiatla: 1/2/4 - przod, 16/32/63 - tyl} @@ -1832,7 +1842,7 @@ public: int DettachStatus(int ConnectNo); bool Dettach(int ConnectNo); void damage_coupler( int const End ); - void derail( int const Reason ); + void Derail(DerailReason Reason); bool DirectionForward(); bool DirectionBackward( void );/*! kierunek ruchu*/ bool EIMDirectionChangeAllow( void ) const; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index ca62fb72..6b221d75 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -1252,10 +1252,10 @@ void TMoverParameters::CollisionDetect(int const End, double const dt) } if( velocitydifference > safevelocitylimit * ( TotalMass / othervehicle->TotalMass ) ) { - derail( 5 ); + Derail(COLLISION); } if( velocitydifference > safevelocitylimit * ( othervehicle->TotalMass / TotalMass ) ) { - othervehicle->derail( 5 ); + othervehicle->Derail(COLLISION); } } } @@ -1318,24 +1318,31 @@ TMoverParameters::damage_coupler( int const End ) { WriteLog( "Bad driving: " + Name + " broke a coupler" ); } -void -TMoverParameters::derail( int const Reason ) { - +void TMoverParameters::Derail( DerailReason const Reason ) { if( SetFlag( DamageFlag, dtrain_out ) ) { - - DerailReason = Reason; // TODO: enum derail causes EventFlag = true; MainSwitch( false, range_t::local ); AccS *= 0.65; V *= 0.65; + RunningShape.R = 0; if( Vel < 5.0 ) { // HACK: prevent permanent axle spin in static vehicle after a collision nrot = 0.0; SlippingWheels = false; } - WriteLog( "Bad driving: " + Name + " derailed" ); + // Print a message in the log. + if (Reason == END_OF_TRACK) + ErrorLog("Bad driving: " + Name + " derailed due to end of track"); + else if (Reason == TOO_HIGH_SPEED) + ErrorLog("Bad driving: " + Name + " derailed due to too high speed"); + else if (Reason == GAUGE_MISMATCH) + ErrorLog("Bad dynamic: " + Name + " derailed due to track width"); // błąd w scenerii + else if (Reason == WRONG_TRACK_TYPE) + ErrorLog("Bad dynamic: " + Name + " derailed due to wrong track type"); // błąd w scenerii + else if (Reason == COLLISION) + WriteLog("Bad driving: " + Name + " derailed"); // This reason also generates its own message in `TMoverParameters::CollisionDetect()` } } @@ -1436,42 +1443,17 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap // wykolejanie na luku oraz z braku szyn if (TestFlag(CategoryFlag, 1)) { - if (FuzzyLogic((AccN / g) * (1.0 + 0.1 * (Track.DamageFlag && dtrack_freerail)), - TrackW / Dim.H, 1) || - TestFlag(Track.DamageFlag, dtrack_norail)) - if (SetFlag(DamageFlag, dtrain_out)) - { - EventFlag = true; - MainSwitch( false, range_t::local ); - RunningShape.R = 0; - if (TestFlag(Track.DamageFlag, dtrack_norail)) - DerailReason = 1; // Ra: powód wykolejenia: brak szyn - else - DerailReason = 2; // Ra: powód wykolejenia: przewrócony na łuku - } + if (TestFlag(Track.DamageFlag, dtrack_norail)) + Derail(END_OF_TRACK); + if (FuzzyLogic((AccN / g) * (1.0 + 0.1 * (Track.DamageFlag & dtrack_freerail)), TrackW / Dim.H, 1)) + Derail(TOO_HIGH_SPEED); // wykolejanie na poszerzeniu toru if (FuzzyLogic(abs(Track.Width - TrackW), TrackW / 10.0, 1)) - if (SetFlag(DamageFlag, dtrain_out)) - { - EventFlag = true; - MainSwitch( false, range_t::local ); - RunningShape.R = 0; - DerailReason = 3; // Ra: powód wykolejenia: za szeroki tor - } + Derail(GAUGE_MISMATCH); } // wykolejanie wkutek niezgodnosci kategorii toru i pojazdu if (!TestFlag(RunningTrack.CategoryFlag, CategoryFlag)) - if (SetFlag(DamageFlag, dtrain_out)) - { - EventFlag = true; - MainSwitch( false, range_t::local ); - DerailReason = 4; // Ra: powód wykolejenia: nieodpowiednia trajektoria - } - if( ( true == TestFlag( DamageFlag, dtrain_out ) ) - && ( Vel < 1.0 ) ) { - V = 0.0; - AccS = 0.0; - } + Derail(WRONG_TRACK_TYPE); // dL:=(V+AccS*dt/2)*dt; // przyrost dlugosci czyli przesuniecie diff --git a/vehicle/DynObj.cpp b/vehicle/DynObj.cpp index 0af7d324..8f4a3db5 100644 --- a/vehicle/DynObj.cpp +++ b/vehicle/DynObj.cpp @@ -4265,27 +4265,6 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->InactiveCabPantsCheck = false; } - - if (MoverParameters->DerailReason > 0) - { - switch (MoverParameters->DerailReason) - { - case 1: - ErrorLog("Bad driving: " + asName + " derailed due to end of track"); - break; - case 2: - ErrorLog("Bad driving: " + asName + " derailed due to too high speed"); - break; - case 3: - ErrorLog("Bad dynamic: " + asName + " derailed due to track width"); - break; // błąd w scenerii - case 4: - ErrorLog("Bad dynamic: " + asName + " derailed due to wrong track type"); - break; // błąd w scenerii - } - MoverParameters->DerailReason = 0; //żeby tylko raz - } - if( MoverParameters->LoadStatus ) { LoadUpdate(); // zmiana modelu ładunku } From 8a94bfbfa2f16020fb70863ab8d3ec809d0d6ad3 Mon Sep 17 00:00:00 2001 From: jakubg1 <24206305+jakubg1@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:08:11 +0200 Subject: [PATCH 4/5] Fix a segfault when closing on Wayland According to https://github.com/glfw/glfw/issues/2744, this will be fixed in GLFW 3.5. --- application/application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/application/application.cpp b/application/application.cpp index 95cc1d52..5355b795 100644 --- a/application/application.cpp +++ b/application/application.cpp @@ -678,6 +678,7 @@ void eu07_application::exit() glfwDestroyWindow(window); } m_taskqueue.exit(); + glfwPollEvents(); // TODO: This fixes a segfault on Wayland when closing. Remove after updating glfw to 3.5. glfwTerminate(); if (!Global.exec_on_exit.empty()) From bc8c604e251d9e3695bda36cb56a39d8814fb65a Mon Sep 17 00:00:00 2001 From: Hirek193 Date: Tue, 14 Apr 2026 20:39:43 +0200 Subject: [PATCH 5/5] Add scenery name for eligible trivia in scenery loading uilayer --- application/scenarioloaderuilayer.cpp | 11 +++++++++++ application/scenarioloaderuilayer.h | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/application/scenarioloaderuilayer.cpp b/application/scenarioloaderuilayer.cpp index 1beb5de8..7ec9b0aa 100644 --- a/application/scenarioloaderuilayer.cpp +++ b/application/scenarioloaderuilayer.cpp @@ -91,6 +91,8 @@ std::vector scenarioloader_ui::get_random_trivia() int i = RandomInt(0, static_cast(triviaData.size()) - 1); std::string triviaStr = triviaData[i]["text"]; std::string background = triviaData[i]["background"]; + if (triviaData[i].contains("scenery")) + sceneryName = triviaData[i]["scenery"]; // divide trivia into multiple lines - UTF-8 safe implementation // Different languages need different character limits due to character width differences @@ -275,6 +277,15 @@ void scenarioloader_ui::render_() draw_list->AddText(text_pos, IM_COL32_WHITE, line.c_str()); } } + + // Scenery name + // Draw only if defined + if (!sceneryName.empty()) + { + ImVec2 text_size = ImGui::CalcTextSize(sceneryName.c_str()); + ImVec2 text_pos = ImVec2(screen_size.x - 16 - text_size.x, 16); + draw_list->AddText(text_pos, IM_COL32_WHITE, sceneryName.c_str()); + } // Progress bar at the bottom of the screen const auto p1 = ImVec2(0, Global.window_size.y - 2); diff --git a/application/scenarioloaderuilayer.h b/application/scenarioloaderuilayer.h index 3be9cba1..72d7c3df 100644 --- a/application/scenarioloaderuilayer.h +++ b/application/scenarioloaderuilayer.h @@ -30,4 +30,9 @@ private: std::vector get_random_trivia(); void generate_gradient_tex(); void load_wheel_frames(); + + /// + /// Scenery name for eligable trivias + /// + std::string sceneryName; };