diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index ea0c9d52..d3e058d9 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -1056,7 +1056,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 @@ -1077,6 +1077,9 @@ class TMoverParameters float temperatura1{50.0}; float temperatura2{40.0}; float powerfactor{1.0}; // coefficient of heat generation for engines other than su45 + // engine overheat threshold + float engine_max_temp{-1}; // maximum acceptable engine temperature, triggers overheat lamp when exceeded + bool engine_is_hot{false}; // engine temperature crossed cooling threshold }; struct spring_brake diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 6b221d75..4a98bb60 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -8156,6 +8156,10 @@ 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 ) ) ); + // engine overheat check + dizel_heat.engine_is_hot = ( + ( dizel_heat.engine_max_temp > 0 ) + && ( dizel_heat.Ts > dizel_heat.engine_max_temp - ( dizel_heat.engine_is_hot ? 8 : 0 ) ) ); auto const PT = ( ( false == dizel_heat.water.is_cold ) @@ -8163,7 +8167,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 ) */; @@ -11236,6 +11241,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_max_temp, "EngineMaxTemperature", Input, "" ); extract_value( dizel_heat.fan_speed, "WaterCoolingFanSpeed", Input, "" ); // water heater extract_value( WaterHeater.config.temp_min, "HeaterMinTemperature", Input, "" ); 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; }; diff --git a/vehicle/Train.cpp b/vehicle/Train.cpp index e512f6b2..de2e8e5e 100644 --- a/vehicle/Train.cpp +++ b/vehicle/Train.cpp @@ -7926,6 +7926,11 @@ bool TTrain::Update( double const Deltatime ) btLampkaRearRightEndLight.Turn( ( mvOccupied->iLights[ end::rear ] & light::redmarker_right ) != 0 ); // others btLampkaMalfunction.Turn( mvControlled->dizel_heat.PA ); + // overheat indicator lamps + btLampkaOilOverheat.Turn( mvControlled->dizel_heat.oil.is_hot ); + btLampkaWaterOverheat.Turn( mvControlled->dizel_heat.water.is_hot ); + btLampkaWaterAuxOverheat.Turn( mvControlled->dizel_heat.water_aux.is_hot ); + btLampkaEngineOverheat.Turn( mvControlled->dizel_heat.engine_is_hot ); btLampkaMotorBlowers.Turn( ( mvControlled->MotorBlowers[ end::front ].is_active ) && ( mvControlled->MotorBlowers[ end::rear ].is_active ) ); btLampkaCoolingFans.Turn( mvControlled->RventRot > 1.0 ); btLampkaTempomat.Turn( mvOccupied->SpeedCtrlUnit.IsActive ); @@ -7966,6 +7971,11 @@ bool TTrain::Update( double const Deltatime ) btLampkaBrakeProfileR.Turn( false ); btLampkaSpringBrakeActive.Turn( false ); btLampkaSpringBrakeInactive.Turn( false ); + // overheat indicator lamps off + btLampkaOilOverheat.Turn( false ); + btLampkaWaterOverheat.Turn( false ); + btLampkaWaterAuxOverheat.Turn( false ); + btLampkaEngineOverheat.Turn( false ); btLampkaMaxSila.Turn( false ); btLampkaPrzekrMaxSila.Turn( false ); btLampkaRadio.Turn( false ); @@ -9756,6 +9766,11 @@ void TTrain::clear_cab_controls() btLampkaNadmWent.Clear(9); btLampkaWysRozr.Clear(((mvControlled->TrainType & dt_ET22) != 0) ? -1 : 10); // ET22 nie ma tej lampki btLampkaOgrzewanieSkladu.Clear(11); + // overheat indicator lamps + btLampkaOilOverheat.Clear(-1); + btLampkaWaterOverheat.Clear(-1); + btLampkaWaterAuxOverheat.Clear(-1); + btLampkaEngineOverheat.Clear(-1); btHaslerBrakes.Clear(12); // ciśnienie w cylindrach do odbijania na haslerze btHaslerCurrent.Clear(13); // prąd na silnikach do odbijania na haslerze // Numer 14 jest używany dla buczka SHP w update_sounds() @@ -10425,6 +10440,11 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co { "i-mainbreakerblinking:", btLampkaMainBreakerBlinkingIfReady }, { "i-vent_ovld:", btLampkaNadmWent }, { "i-comp_ovld:", btLampkaNadmSpr }, + // overheat indicator lamps + { "i-oil_overheat:", btLampkaOilOverheat }, + { "i-water_overheat:", btLampkaWaterOverheat }, + { "i-wateraux_overheat:", btLampkaWaterAuxOverheat }, + { "i-engine_overheat:", btLampkaEngineOverheat }, { "i-resistors:", btLampkaOpory }, { "i-no_resistors:", btLampkaBezoporowa }, { "i-no_resistors_b:", btLampkaBezoporowaB }, diff --git a/vehicle/Train.h b/vehicle/Train.h index 2831e825..96a41463 100644 --- a/vehicle/Train.h +++ b/vehicle/Train.h @@ -761,6 +761,11 @@ public: // reszta może by?publiczna TButton btLampkaBrakeProfileR; // rapid brake acting speed TButton btLampkaSpringBrakeActive; TButton btLampkaSpringBrakeInactive; + // overheat indicator lamps + TButton btLampkaOilOverheat; + TButton btLampkaWaterOverheat; + TButton btLampkaWaterAuxOverheat; + TButton btLampkaEngineOverheat; // KURS90 TButton btLampkaBoczniki; TButton btLampkaMaxSila;