This commit is contained in:
milek7
2019-07-09 22:09:37 +02:00
parent a0c44fbaa3
commit 8f7e06c25c
19 changed files with 227 additions and 1079 deletions

View File

@@ -1644,7 +1644,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
#ifdef _WIN32
CreateDirectory( "physicslog", NULL );
#elif __unix__
mkdir( "physicslog", 0644 );
mkdir( "physicslog", 0744 );
#endif
LogFile.open( std::string( "physicslog/" + VehicleName + ".dat" ),
std::ios::in | std::ios::out | std::ios::trunc );
@@ -1709,19 +1709,19 @@ std::string TController::OrderCurrent() const
{ // pobranie aktualnego rozkazu celem wyświetlenia
auto const order { OrderCurrentGet() };
if( order & Change_direction ) {
return STR(driver_scenario_changedirection);
return STR("Change direction");
}
switch( OrderList[ OrderPos ] ) {
case Wait_for_orders: { return STR(driver_scenario_waitfororders); }
case Prepare_engine: { return STR(driver_scenario_prepareengine); }
case Release_engine: { return STR(driver_scenario_releaseengine); }
case Change_direction: { return STR(driver_scenario_changedirection); }
case Connect: { return STR(driver_scenario_connect); }
case Wait_for_orders: { return STR("Wait for orders"); }
case Prepare_engine: { return STR("Start the engine"); }
case Release_engine: { return STR("Shut down the engine"); }
case Change_direction: { return STR("Change direction"); }
case Connect: { return STR("Couple to consist ahead"); }
case Disconnect: {
if( iVehicleCount < 0 ) {
// done with uncoupling, order should update shortly
return STR(driver_scenario_waitfororders);
return STR("Wait for orders");
}
// try to provide some task details
auto const count { iVehicleCount };
@@ -1729,26 +1729,24 @@ std::string TController::OrderCurrent() const
if( iVehicleCount > 1 ) {
std::snprintf(
orderbuffer.data(), orderbuffer.size(),
( iVehicleCount < 5 ?
STR_C(driver_scenario_fewvehicles) : // 2-4
STR_C(driver_scenario_somevehicles) ), // 5+
STR_C("the engine plus %d next vehicles"), // TODO: implement plural forms
count );
}
auto const countstring { (
count == 0 ? STR(driver_scenario_allvehicles) :
count == 1 ? STR(driver_scenario_onevehicle) :
count == 0 ? STR("the engine") :
count == 1 ? STR("the engine plus the next vehicle") :
orderbuffer.data() ) };
std::snprintf(
orderbuffer.data(), orderbuffer.size(),
STR_C(driver_scenario_disconnect),
STR_C("Uncouple %s"),
countstring.c_str() );
return orderbuffer.data();
}
case Shunt: { return STR(driver_scenario_shunt); }
case Loose_shunt: { return STR(driver_scenario_looseshunt); }
case Obey_train: { return STR(driver_scenario_obeytrain); }
case Bank: { return STR(driver_scenario_bank); }
case Shunt: { return STR("Shunt according to signals"); }
case Loose_shunt: { return STR("Loose shunt according to signals"); }
case Obey_train: { return STR("Drive according to signals and timetable"); }
case Bank: { return STR("Bank consist ahead"); }
default: { return{}; }
}
};

View File

@@ -180,7 +180,7 @@ opengl_texture::load() {
if( type == ".dds" ) { load_DDS(); }
else if( type == ".tga" ) { load_TGA(); }
else if( type == ".png" ) { load_PNG(); }
else if( type == ".bmp" ) { load_BMP(); }
else if( type == ".bmp" ) { load_STBI(); }
else if( type == ".jpg" ) { load_STBI(); }
else if( type == ".tex" ) { load_TEX(); }
else { goto fail; }
@@ -257,6 +257,7 @@ void opengl_texture::load_PNG()
void opengl_texture::load_STBI()
{
int x, y, n;
stbi_set_flip_vertically_on_load(1);
uint8_t *image = stbi_load((name + type).c_str(), &x, &y, &n, 4);
if (!image) {
@@ -304,64 +305,6 @@ opengl_texture::make_request() {
Application.request( { ToLower( components.front() ), dictionary, rt } );
}
void
opengl_texture::load_BMP() {
std::ifstream file( name + type, std::ios::binary ); file.unsetf( std::ios::skipws );
BITMAPFILEHEADER header;
file.read((char *) &header, sizeof( BITMAPFILEHEADER ) );
if( file.eof() ) {
data_state = resource_state::failed;
return;
}
// Read in bitmap information structure
BITMAPINFO info;
unsigned int infosize = header.bfOffBits - sizeof( BITMAPFILEHEADER );
if( infosize > sizeof( info ) ) {
WriteLog( "Warning - BMP header is larger than expected, possible format difference.", logtype::texture );
}
file.read((char *) &info, std::min( (size_t)infosize, sizeof( info ) ) );
data_width = info.bmiHeader.biWidth;
data_height = info.bmiHeader.biHeight;
if( info.bmiHeader.biCompression != BI_RGB ) {
ErrorLog( "Bad texture: compressed BMP textures aren't supported.", logtype::texture );
data_state = resource_state::failed;
return;
}
unsigned long datasize = info.bmiHeader.biSizeImage;
if( 0 == datasize ) {
// calculate missing info
datasize = ( data_width * info.bmiHeader.biBitCount + 7 ) / 8 * data_height;
}
data.resize( datasize );
file.read((char*) &data[0], datasize );
// we're storing texture data internally with bottom-left origin
// so BMP origin matches, no flipping needed
// fill remaining data info
if( info.bmiHeader.biBitCount == 32 ) {
data_format = GL_BGRA;
data_components = GL_RGBA;
}
else {
data_format = GL_BGR;
data_components = GL_RGB;
}
data_mapcount = 1;
data_state = resource_state::good;
return;
}
DDCOLORKEY opengl_texture::deserialize_ddck(std::istream &s)
{
DDCOLORKEY ddck;

View File

@@ -63,8 +63,7 @@ struct opengl_texture {
private:
// methods
void make_request();
void load_BMP();
void make_request();
void load_PNG();
void load_DDS();
void load_TEX();

View File

@@ -37,17 +37,17 @@ driver_ui::driver_ui() {
add_external_panel( &m_cameraviewpanel );
m_logpanel.is_open = false;
m_aidpanel.title = STR(driver_aid_header);
m_aidpanel.title = STR("Driving Aid");
m_scenariopanel.title = STR(driver_scenario_header);
m_scenariopanel.title = STR("Scenario");
m_scenariopanel.size_min = { 435, 85 };
m_scenariopanel.size_max = { Global.iWindowWidth * 0.95, Global.iWindowHeight * 0.95 };
m_timetablepanel.title = STR(driver_timetable_header);
m_timetablepanel.title = STR("%-*.*s Time: %d:%02d:%02d");
m_timetablepanel.size_min = { 435, 110 };
m_timetablepanel.size_max = { 435, Global.iWindowHeight * 0.95 };
m_transcriptspanel.title = STR(driver_transcripts_header);
m_transcriptspanel.title = STR("Transcripts");
m_transcriptspanel.size_min = { 435, 85 };
m_transcriptspanel.size_max = { Global.iWindowWidth * 0.95, Global.iWindowHeight * 0.95 };
}
@@ -55,10 +55,10 @@ driver_ui::driver_ui() {
void driver_ui::render_menu_contents() {
ui_layer::render_menu_contents();
if (ImGui::BeginMenu(STR_C(ui_mode_windows)))
if (ImGui::BeginMenu(STR_C("Mode windows")))
{
ImGui::MenuItem(m_aidpanel.title.c_str(), "F1", &m_aidpanel.is_open);
ImGui::MenuItem(STR_C(driver_timetable_name), "F2", &m_timetablepanel.is_open);
ImGui::MenuItem(STR_C("Timetable"), "F2", &m_timetablepanel.is_open);
ImGui::MenuItem(m_debugpanel.name().c_str(), "F12", &m_debugpanel.is_open);
ImGui::MenuItem(m_mappanel.name().c_str(), "Tab", &m_mappanel.is_open);
ImGui::MenuItem(m_vehiclelist.name().c_str(), nullptr, &m_vehiclelist.is_open);
@@ -228,18 +228,18 @@ driver_ui::set_cursor( bool const Visible ) {
void
driver_ui::render_() {
// pause/quit modal
auto const popupheader { STR_C(driver_pause_header) };
auto const popupheader { STR_C("Simulation Paused") };
if (m_paused && !m_pause_modal_opened)
{
m_pause_modal_opened = true;
ImGui::OpenPopup(popupheader);
}
if( ImGui::BeginPopupModal( popupheader, &m_pause_modal_opened, ImGuiWindowFlags_AlwaysAutoResize ) ) {
auto const popupwidth{ STR(driver_pause_header).size() * 7 };
if( ImGui::Button( STR_C(driver_pause_resume), ImVec2( popupwidth, 0 ) ) ) {
auto const popupwidth{ STR("Simulation Paused").size() * 7 };
if( ImGui::Button( STR_C("Resume"), ImVec2( popupwidth, 0 ) ) ) {
m_relay.post(user_command::pausetoggle, 0.0, 0.0, GLFW_PRESS, 0);
}
if( ImGui::Button( STR_C(driver_pause_quit), ImVec2( popupwidth, 0 ) ) ) {
if( ImGui::Button( STR_C("Quit"), ImVec2( popupwidth, 0 ) ) ) {
m_relay.post(user_command::quitsimulation, 0.0, 0.0, GLFW_PRESS, 0);
}
if (!m_paused)

View File

@@ -53,7 +53,7 @@ drivingaid_panel::update() {
if( std::abs( grade ) >= 0.25 ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_grade),
STR_C(" Grade: %.1f%%%%"),
grade );
gradetext = m_buffer.data();
}
@@ -64,7 +64,7 @@ drivingaid_panel::update() {
if( nextspeedlimit != speedlimit ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_nextlimit),
STR_C(", new limit: %d km/h in %.1f km"),
nextspeedlimit,
driver->ActualProximityDist * 0.001 );
nextspeedlimittext = m_buffer.data();
@@ -72,7 +72,7 @@ drivingaid_panel::update() {
// current speed and limit
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_speedlimit),
STR_C(" Speed: %d km/h (limit %d km/h%s)%s"),
static_cast<int>( std::floor( mover->Vel ) ),
speedlimit,
nextspeedlimittext.c_str(),
@@ -82,7 +82,7 @@ drivingaid_panel::update() {
// base data and optional bits put together
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_throttle),
STR_C("Throttle: %2d+%d %c%s"),
driver->Controlling()->MainCtrlPos,
driver->Controlling()->ScndCtrlPos,
( mover->ActiveDir > 0 ? 'D' : mover->ActiveDir < 0 ? 'R' : 'N' ),
@@ -96,14 +96,14 @@ drivingaid_panel::update() {
if( is_expanded ) {
std::snprintf (
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_pressures),
STR_C(" Pressure: %.2f kPa (train pipe: %.2f kPa)"),
mover->BrakePress * 100,
mover->PipePress * 100 );
expandedtext = m_buffer.data();
}
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_brakes),
STR_C("Brakes: %4.1f+%-2.0f%c%s"),
mover->fBrakeCtrlPos,
mover->LocalBrakePosA * LocalBrakePosNo,
( mover->SlippingWheels ? '!' : ' ' ),
@@ -119,7 +119,7 @@ drivingaid_panel::update() {
if( stoptime > 0 ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_loadinginprogress),
STR_C(" Loading/unloading in progress (%d s left)"),
stoptime );
expandedtext = m_buffer.data();
}
@@ -128,7 +128,7 @@ drivingaid_panel::update() {
if( trackblockdistance <= 75.0 ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_aid_vehicleahead),
STR_C(" Another vehicle ahead (distance: %.1f m)"),
trackblockdistance );
expandedtext = m_buffer.data();
}
@@ -136,11 +136,11 @@ drivingaid_panel::update() {
}
std::string textline =
( mover->SecuritySystem.is_vigilance_blinking() ?
STR(driver_aid_alerter) :
STR("!ALERTER! ") :
" " );
textline +=
( mover->SecuritySystem.is_cabsignal_blinking() ?
STR(driver_aid_shp) :
STR("!SHP!") :
" " );
text_lines.emplace_back( textline + " " + expandedtext, Global.UITextColor );
@@ -169,7 +169,7 @@ scenario_panel::update() {
if( owner == nullptr ) { return; }
std::string textline =
STR(driver_scenario_currenttask) + "\n "
STR("Current task:") + "\n "
+ owner->OrderCurrent();
text_lines.emplace_back( textline, Global.UITextColor );
@@ -205,7 +205,7 @@ scenario_panel::render() {
m_nearest->Mechanik :
m_nearest->ctOwner ) };
if( owner != nullptr ) {
auto const assignmentheader { STR(driver_scenario_assignment) };
auto const assignmentheader { STR("Assignment") };
if( ( false == owner->assignment().empty() )
&& ( true == ImGui::CollapsingHeader( assignmentheader.c_str() ) ) ) {
ImGui::TextWrapped( "%s", owner->assignment().c_str() );
@@ -236,9 +236,9 @@ timetable_panel::update() {
{ // current time
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_timetable_header),
STR_C("%-*.*s Time: %d:%02d:%02d"),
37, 37,
STR_C(driver_timetable_name),
STR_C("Timetable"),
time.wHour,
time.wMinute,
time.wSecond );
@@ -300,7 +300,7 @@ timetable_panel::update() {
}
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(driver_timetable_consistdata),
STR_C("Consist weight: %d t (specified) %d t (actual)\nConsist length: %d m"),
static_cast<int>( table->LocLoad ),
static_cast<int>( consistmass / 1000 ),
static_cast<int>( consistlength ) );
@@ -311,7 +311,7 @@ timetable_panel::update() {
if( 0 == table->StationCount ) {
// only bother if there's stations to list
text_lines.emplace_back( STR(driver_timetable_notimetable), Global.UITextColor );
text_lines.emplace_back( STR("(no timetable)"), Global.UITextColor );
}
else {
@@ -554,9 +554,9 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_nameloadstatuscouplers),
STR_C("Name: %s%s\nLoad: %.0f %s\nStatus: %s%s\nCouplers:\n front: %s\n rear: %s"),
mover.Name.c_str(),
std::string( isowned ? STR(debug_vehicle_owned) + vehicle.ctOwner->OwnerName() : "" ).c_str(),
std::string( isowned ? STR(", owned by: ") + vehicle.ctOwner->OwnerName() : "" ).c_str(),
mover.LoadAmount,
mover.LoadType.name.c_str(),
mover.EngineDescription( 0 ).c_str(),
@@ -569,7 +569,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_devicespower),
STR_C("Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f"),
// devices
( mover.Battery ? 'B' : '.' ),
( mover.Mains ? 'M' : '.' ),
@@ -585,8 +585,8 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
( mover.ConvOvldFlag ? '!' : '.' ),
( mover.CompressorFlag ? 'C' : ( false == mover.CompressorAllowLocal ? '-' : ( ( mover.CompressorAllow || mover.CompressorStart == start_t::automatic ) ? 'c' : '.' ) ) ),
( mover.CompressorGovernorLock ? '!' : '.' ),
std::string( isplayervehicle ? STR(debug_vehicle_radio) + ( mover.Radio ? std::to_string( m_input.train->RadioChannel() ) : "-" ) : "" ).c_str(),
std::string( isdieselenginepowered ? STR(debug_vehicle_oilpressure) + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(),
std::string( isplayervehicle ? STR(" radio: ") + ( mover.Radio ? std::to_string( m_input.train->RadioChannel() ) : "-" ) : "" ).c_str(),
std::string( isdieselenginepowered ? STR(" oil pressure: ") + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(),
// power transfers
mover.Couplers[ end::front ].power_high.voltage,
mover.Couplers[ end::front ].power_high.current,
@@ -600,11 +600,11 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_controllersenginerevolutions),
STR_C("Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f"),
// controllers
mover.MainCtrlPos,
mover.MainCtrlActualPos,
std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(debug_vehicle_shuntmode) : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(),
std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(" (shunt mode)") : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(),
// engine
mover.EnginePower,
std::abs( mover.TrainType == dt_EZT ? mover.ShowCurrent( 0 ) : mover.Im ),
@@ -622,7 +622,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
if( isdieselenginepowered ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_temperatures),
STR_C("\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f"),
mover.dizel_heat.Ts,
mover.dizel_heat.To,
mover.dizel_heat.temperatura1,
@@ -635,7 +635,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_brakespressures),
STR_C("Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f"),
// brakes
mover.fBrakeCtrlPos,
mover.LocalBrakePosA,
@@ -661,7 +661,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
if( mover.EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_pantograph),
STR_C(" pantograph: %.2f%cMT"),
mover.PantPress,
( mover.bPantKurek3 ? '-' : '|' ) );
textline += m_buffer.data();
@@ -677,7 +677,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::snprintf(
m_buffer.data(), m_buffer.size(),
STR_C(debug_vehicle_forcesaccelerationvelocityposition),
STR_C("Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]"),
// forces
mover.Ft * 0.001f * ( mover.ActiveCab ? mover.ActiveCab : vehicle.ctOwner ? vehicle.ctOwner->Controlling()->ActiveCab : 1 ) + 0.001f,
mover.Fb * 0.001f,
@@ -702,7 +702,7 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
std::string
debug_panel::update_vehicle_coupler( int const Side ) {
// NOTE: mover and vehicle are guaranteed to be valid by the caller
std::string couplerstatus { STR(debug_vehicle_none) };
std::string couplerstatus { STR("none") };
auto const *connected { m_input.vehicle->MoverParameters->Neighbours[ Side ].vehicle };

View File

@@ -74,7 +74,7 @@ const std::string *editor_ui::get_active_node_template() {
void editor_ui::render_menu_contents() {
ui_layer::render_menu_contents();
if (ImGui::BeginMenu(STR_C(ui_mode_windows)))
if (ImGui::BeginMenu(STR_C("Mode windows")))
{
ImGui::MenuItem(m_nodebankpanel.title.c_str(), nullptr, &m_nodebankpanel.is_open);
ImGui::EndMenu();

View File

@@ -83,7 +83,7 @@ scenarioloader_mode::enter() {
m_userinterface->set_background( "logo" );
Application.set_title( Global.AppName + " (" + Global.SceneryFile + ")" );
m_userinterface->set_progress();
m_userinterface->set_progress(STR(ui_loading_scenery));
m_userinterface->set_progress(STR("Loading scenery"));
GfxRenderer.Render();
}

View File

@@ -111,6 +111,7 @@ RECENT REVISION HISTORY:
#define STBI_INCLUDE_STB_IMAGE_H
#define STBI_ONLY_JPEG
#define STBI_ONLY_BMP
// DOCUMENTATION
//

View File

@@ -76,6 +76,7 @@
#include <bitset>
#include <chrono>
#include <optional>
#include <filesystem>
#include "glad/glad.h"

View File

@@ -16,563 +16,12 @@ http://mozilla.org/MPL/2.0/.
#include "Logs.h"
#include "Globals.h"
/*
// TODO: import localized strings from localization files
std::unordered_map<std::string, std::vector<std::string>> stringmap;
stringmap.insert(
{ "en",
{
"Driving Aid",
"Throttle: %2d+%d %c%s",
" Speed: %d km/h (limit %d km/h%s)%s",
", new limit: %d km/h in %.1f km",
" Grade: %.1f%%%%",
"Brakes: %4.1f+%-2.0f%c%s",
" Pressure: %.2f kPa (train pipe: %.2f kPa)",
"!ALERTER! ",
"!SHP!",
" Loading/unloading in progress (%d s left)",
" Another vehicle ahead (distance: %.1f m)",
"Scenario",
"Assignment",
"Current task:",
"Wait for orders",
"Start the engine",
"Shut down the engine",
"Change direction",
"Couple to consist ahead",
"Uncouple %s",
"the engine",
"the engine plus the next vehicle",
"the engine plus %d next vehicles",
"the engine plus %d next vehicles",
"Shunt according to signals",
"Loose shunt according to signals",
"Drive according to signals and timetable",
"Bank consist ahead",
"%-*.*s Time: %d:%02d:%02d", // HACK: some manual padding to account for longer 'time' equivalent in polish version
"Timetable",
"(no timetable)",
"Consist weight: %d t (specified) %d t (actual)\nConsist length: %d m",
"Transcripts",
"Simulation Paused",
"Resume",
"Quit",
"Name: %s%s\nLoad: %.0f %s\nStatus: %s%s\nCouplers:\n front: %s\n rear: %s",
", owned by: ",
"none",
"Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f",
" radio: ",
" oil pressure: ",
"Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f",
" (shunt mode)",
"\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f",
"Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f",
" pantograph: %.2f%cMT",
"Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]",
"expand",
"Loading",
"Loading scenery",
"Quit simulation?",
"Yes",
"No",
"General",
"Debug mode",
"Quit",
"Tools",
"Logging to log.txt",
"Screenshot",
"Windows",
"Log",
"Map",
"Mode windows",
"Time and environment",
"Time",
"Day in year",
"Visibility",
"Overcast and precipitation",
"Temperature",
"Apply",
"Straight |",
"Divert /",
"Open |",
"Close -",
"Insert obstacle:",
"Delete obstacle",
"Vehicle list",
"Vehicle parameters",
"Radiostop",
"Reset position",
"Stop and repair",
"Refill main tank",
"Rupture main pipe",
"Move +500m",
"Move -500m",
"Camera preview",
"master controller",
"master controller",
"second controller",
"shunt mode power",
"tempomat",
"reverser",
"train brake",
"independent brake",
"manual brake",
"emergency brake",
"brake acting speed",
"brake acting speed: cargo",
"brake acting speed: rapid",
"brake operation mode",
"motor overload relay threshold",
"water pump",
"water pump breaker",
"water heater",
"water heater breaker",
"water circuits link",
"fuel pump",
"oil pump",
"motor blowers A",
"motor blowers B",
"all motor blowers",
"cooling fans",
"line breaker",
"line breaker",
"alerter",
"independent brake releaser",
"sandbox",
"wheelspin brake",
"horn",
"low tone horn",
"high tone horn",
"whistle",
"motor overload relay reset",
"converter overload relay reset",
"motor connectors",
"left door (permit)",
"right door (permit)",
"door (permit)",
"left door",
"right door",
"left door (open)",
"right door (open)",
"left door (close)",
"right door (close)",
"all doors (open)",
"all doors (close)",
"doorstep",
"door control mode",
"departure signal",
"upper headlight",
"left headlight",
"right headlight",
"headlights dimmer",
"left marker light",
"right marker light",
"light pattern",
"rear upper headlight",
"rear left headlight",
"rear right headlight",
"rear left marker light",
"rear right marker light",
"compressor",
"local compressor",
"converter",
"local converter",
"converter",
"line breaker",
"radio",
"radio channel",
"radio channel",
"radio channel",
"radiostop test",
"radiostop",
"pantograph A",
"pantograph B",
"pantograph A",
"pantograph B",
"all pantographs",
"selected pantograph",
"selected pantograph",
"pantograph compressor",
"pantograph 3 way valve",
"heating",
"braking indicator",
"door locking",
"current indicator source",
"instrument light",
"dashboard light",
"timetable light",
"interior light",
"interior light dimmer",
"battery",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part",
"interactive part"
}
} );
stringmap.insert(
{ "pl",
{
u8"Pomocnik",
u8"Nastawnik: %2d+%d %c%s",
u8" Prędkość: %d km/h (limit %d km/h%s)%s",
u8", nowy limit: %d km/h za %.1f km",
u8" Nachylenie: %.1f%%%%",
u8"Hamulce: %4.1f+%-2.0f%c%s",
u8" Ciśnienie: %.2f kPa (przewód główny: %.2f kPa)",
u8"!CZUWAK! ",
u8"!SHP!",
u8" Wsiadanie/wysiadanie pasażerów (do zakończenia %d s)",
u8" Inny pojazd na drodze (odległość: %.1f m)",
u8"Scenariusz",
u8"Zlecenie",
u8"Bieżace zadanie:",
u8"Oczekiwać dalszych poleceń",
u8"Przygotować pojazd do jazdy",
u8"Wyłączyc pojazd",
u8"Zmienić kierunek jazdy",
u8"Sprząc się ze składem z przodu",
u8"Odpiąć %s",
u8"pojazd prowadzący",
u8"pojazd prowadzący plus kolejny",
u8"pojazd prowadzący plus %d kolejne",
u8"pojazd prowadzący plus %d kolejnych",
u8"Prowadzić manewry według sygnałów",
u8"Prowadzić manewry przetaczania odrzutem",
u8"Prowadzić skład według sygnałów i rozkładu",
u8"Popychać skład z przodu",
u8"%-*.*s Godzina: %d:%02d:%02d",
u8"Rozkład jazdy",
u8"(brak rozkładu)",
u8"Brutto: %d t (rozkładowe) %d t (rzeczywiste)\nDługość pociągu: %d m",
u8"Transkrypcje",
u8"Symulacja wstrzymana",
u8"Wznów",
u8"Zakończ",
u8"Nazwa: %s%s\nŁadunek: %.0f %s\nStatus: %s%s\nSprzęgi:\n przedni: %s\n tylny: %s",
u8", wlaściciel: ",
u8"wolny",
u8"Urządzenia: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPrzepływ prądu: %.0f@%.0f%s%s%s%.0f@%.0f",
u8" radio: ",
u8" cisń. oleju: ",
u8"Nastawniki:\n glówny: %d(%d), dodatkowy: %s\nMoc silnika: %.1f, prąd silnika: %.0f\nObroty:\n silnik: %.0f, motory: %.0f, went.silnika: %.0f, went.chłodnicy: %.0f+%.0f",
u8" (tryb manewrowy)",
u8"\nTemperatury:\n silnik: %.2f, olej: %.2f, woda: %.2f%c%.2f",
u8"Hamulce:\n zespolony: %.2f, pomocniczy: %.2f, tryb: %d, nastawa: %s, ładunek: %d\nCiśnienie w cylindrach:\n zespolony: %.2f, pomocniczy: %.2f, status: 0x%.2x\nCiśnienia w przewodach:\n główny: %.2f (kapturek: %.2f), zasilający: %.2f, kontrolny: %.2f\nCiśnienia w zbiornikach:\n pomocniczy: %.2f, główny: %.2f, sterujący: %.2f",
u8" pantograf: %.2f%cZG",
u8"Siły:\n napędna: %.1f, hamowania: %.1f, tarcie: %.2f%s\nPrzyśpieszenia:\n styczne: %.2f, normalne: %.2f (promień: %s)\nPrędkość: %.2f, pokonana odleglość: %.2f\nPozycja: [%.2f, %.2f, %.2f]",
u8"rozszerz",
u8"Ładowanie",
u8"Wczytywanie scenerii",
u8"Zakończyć symulację?",
u8"Tak",
u8"Nie",
u8"Ogólne",
u8"Tryb debug",
u8"Wyjdź",
u8"Narzędzia",
u8"Logowanie do log.txt",
u8"Zrzut ekranu",
u8"Okna",
u8"Log",
u8"Mapa",
u8"Okna trybu",
u8"Czas i środowisko",
u8"Czas",
u8"Dzień w roku",
u8"Widoczność",
u8"Zachmurzenie i opady",
u8"Temperatura",
u8"Zastosuj",
u8"Prosto |",
u8"W bok /",
u8"Otwórz |",
u8"Zamknij -",
u8"Wstaw przeszkodę:",
u8"Usuń przeszkodę",
u8"Lista pojazdów",
u8"Parametry pojazdu",
u8"Radiostop",
u8"Zresetuj pozycję",
u8"Zatrzymaj i napraw",
u8"Napełnij ZG",
u8"Zerwij PG",
u8"Przesuń +500m",
u8"Przesuń -500m",
u8"Podgląd kamery",
u8"nastawnik jazdy",
u8"nastawnik jazdy",
u8"nastawnik dodatkowy",
u8"sterowanie analogowe",
u8"tempomat",
u8"nastawnik kierunku",
u8"hamulec zespolony",
u8"hamulec pomocniczy",
u8"hamulec ręczny",
u8"hamulec bezpieczeństwa",
u8"nastawa hamulca",
u8"nastawa hamulca: towarowy",
u8"nastawa hamulca: pośpieszny",
u8"tryb pracy hamulca",
u8"zakres prądu rozruchu",
u8"pompa wody",
u8"wyłącznik samoczynny pompy wody",
u8"podgrzewacz wody",
u8"wyłącznik samoczynny podgrzewacza wody",
u8"zawór połaczenia obiegow wody",
u8"pompa paliwa",
u8"pompa oleju",
u8"wentylatory silników trakcyjnych A",
u8"wentylatory silników trakcyjnych B",
u8"wszystkie wentylatory silników trakcyjnych",
u8"wentylatory oporów rozruchowych",
u8"wyłącznik szybki",
u8"wyłącznik szybki",
u8"czuwak",
u8"odluźniacz",
u8"piasecznica",
u8"hamulec przeciwpoślizgowy",
u8"syrena",
u8"syrena (ton niski)",
u8"syrena (ton wysoki)",
u8"gwizdawka",
u8"przekaźnik nadmiarowy silników trakcyjnych",
u8"przekaźnik nadmiarowy przetwornicy",
u8"styczniki liniowe",
u8"drzwi lewe (zezwól)",
u8"drzwi prawe (zezwól)",
u8"drzwi (zezwól)",
u8"drzwi lewe",
u8"drzwi prawe",
u8"drzwi lewe (otwórz)",
u8"drzwi prawe (otwórz)",
u8"drzwi lewe (zamknij)",
u8"drzwi prawe (zamknij)",
u8"drzwi (otwórz)",
u8"drzwi (zamknij)",
u8"stopień drzwi",
u8"tryb sterowania drzwiami",
u8"sygnal odjazdu",
u8"reflektor gorny",
u8"reflektor lewy",
u8"reflektor prawy",
u8"przyciemnienie reflektórow",
u8"sygnal lewy",
u8"sygnal prawy",
u8"programator świateł",
u8"tylny reflektor górny",
u8"tylny reflektor lewy",
u8"tylny reflektor prawy",
u8"tylny sygnal lewy",
u8"tylny sygnal prawy",
u8"sprężarka",
u8"sprężarka lokalna",
u8"przetwornica",
u8"przetwornica lokalna",
u8"przetwornica",
u8"wyłącznik szybki",
u8"radio",
u8"kanał radia",
u8"kanał radia",
u8"kanał radia",
u8"test radiostopu",
u8"radiostop",
u8"pantograf A",
u8"pantograf B",
u8"pantograf A",
u8"pantograf B",
u8"wszystkie pantografy",
u8"wybrany pantograf",
u8"wybrany pantograf",
u8"sprężarka pantografow",
u8"kurek trójdrogowy pantografow",
u8"ogrzewanie pociągu",
u8"sygnalizacja hamowania",
u8"blokada drzwi",
u8"prądy drugiego członu",
u8"oświetlenie przyrządow",
u8"oświetlenie pulpitu",
u8"oświetlenie rozkładu jazdy",
u8"oświetlenie kabiny",
u8"przyciemnienie oświetlenia kabiny",
u8"bateria",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy",
u8"element ruchomy"
}
} );
auto lookup { stringmap.find( Global.asLang ) };
if( lookup == stringmap.end() ) {
lookup = stringmap.find( "en" );
}
locale::strings = lookup->second;
// prepare cab controls translation table
{
std::vector<std::string> cabcontrols = {
"mainctrl:",
"jointctrl:",
"scndctrl:",
"shuntmodepower:",
"tempomat_sw:",
"dirkey:",
"brakectrl:",
"localbrake:",
"manualbrake:",
"alarmchain:",
"brakeprofile_sw:",
"brakeprofileg_sw:",
"brakeprofiler_sw:",
"brakeopmode_sw",
"maxcurrent_sw:",
"waterpump_sw:",
"waterpumpbreaker_sw:",
"waterheater_sw:",
"waterheaterbreaker_sw:",
"watercircuitslink_sw:",
"fuelpump_sw:",
"oilpump_sw:",
"motorblowersfront_sw:",
"motorblowersrear_sw:",
"motorblowersalloff_sw:",
"coolingfans_sw:",
"main_off_bt:",
"main_on_bt:",
"security_reset_bt:",
"releaser_bt:",
"sand_bt:",
"antislip_bt:",
"horn_bt:",
"hornlow_bt:",
"hornhigh_bt:",
"whistle_bt:",
"fuse_bt:",
"converterfuse_bt:",
"stlinoff_bt:",
"doorleftpermit_sw:",
"doorrightpermit_sw:",
"doorpermitpreset_sw:",
"door_left_sw:",
"door_right_sw:",
"doorlefton_sw:",
"doorrighton_sw:",
"doorleftoff_sw:",
"doorrightoff_sw:",
"doorallon_sw:",
"dooralloff_sw:",
"doorstep_sw:",
"doormode_sw",
"departure_signal_bt:",
"upperlight_sw:",
"leftlight_sw:",
"rightlight_sw:",
"dimheadlights_sw:",
"leftend_sw:",
"rightend_sw:",
"lights_sw:",
"rearupperlight_sw:",
"rearleftlight_sw:",
"rearrightlight_sw:",
"rearleftend_sw:",
"rearrightend_sw:",
"compressor_sw:",
"compressorlocal_sw:",
"converter_sw:",
"converterlocal_sw:",
"converteroff_sw:",
"main_sw:",
"radio_sw:",
"radiochannel_sw:",
"radiochannelprev_sw:",
"radiochannelnext_sw:",
"radiotest_sw:",
"radiostop_sw:",
"pantfront_sw:",
"pantrear_sw:",
"pantfrontoff_sw:",
"pantrearoff_sw:",
"pantalloff_sw:",
"pantselected_sw:",
"pantselectedoff_sw:",
"pantcompressor_sw:",
"pantcompressorvalve_sw:",
"trainheating_sw:",
"signalling_sw:",
"door_signalling_sw:",
"nextcurrent_sw:",
"instrumentlight_sw:",
"dashboardlight_sw:",
"timetablelight_sw:",
"cablight_sw:",
"cablightdim_sw:",
"battery_sw:",
"universal0:",
"universal1:",
"universal2:",
"universal3:",
"universal4:",
"universal5:",
"universal6:",
"universal7:",
"universal8:",
"universal9:"
};
std::size_t stringidx { string::cab_mainctrl };
for( auto const &cabcontrol : cabcontrols ) {
m_cabcontrols.insert( { cabcontrol, strings[ stringidx++ ] } );
}
}
*/
void locale::init()
{
std::fstream stream("lang/" + Global.asLang + ".po", std::ios_base::in | std::ios_base::binary);
if (!stream.is_open()) {
WriteLog("translation: cannot open lang file: " + Global.asLang);
WriteLog("translation: cannot open lang file: lang/" + Global.asLang + ".po");
return;
}
@@ -651,6 +100,7 @@ bool locale::parse_translation(std::istream &stream)
}
else {
if (!msgid.empty() && !msgstr.empty()) {
// TODO: context support is incomplete
if (!msgctxt.empty())
lang_mapping.emplace(msgctxt + "\x1d" + msgid, msgstr);
else
@@ -719,112 +169,112 @@ std::string locale::label_cab_control(std::string const &Label)
if( Label.empty() ) { return ""; }
static std::unordered_map<std::string, std::string> cabcontrols_labels = {
{ "mainctrl:", "master controller" },
{ "jointctrl:", "master controller" },
{ "scndctrl:", "second controller" },
{ "shuntmodepower:", "shunt mode power" },
{ "tempomat_sw:", "tempomat" },
{ "dirkey:", "reverser" },
{ "brakectrl:", "train brake" },
{ "localbrake:", "independent brake" },
{ "manualbrake:", "manual brake" },
{ "alarmchain:", "emergency brake" },
{ "brakeprofile_sw:", "brake acting speed" },
{ "brakeprofileg_sw:", "brake acting speed: cargo" },
{ "brakeprofiler_sw:", "brake acting speed: rapid" },
{ "brakeopmode_sw", "brake operation mode" },
{ "maxcurrent_sw:", "motor overload relay threshold" },
{ "waterpump_sw:", "water pump" },
{ "waterpumpbreaker_sw:", "water pump breaker" },
{ "waterheater_sw:", "water heater" },
{ "waterheaterbreaker_sw:", "water heater breaker" },
{ "watercircuitslink_sw:", "water circuits link" },
{ "fuelpump_sw:", "fuel pump" },
{ "oilpump_sw:", "oil pump" },
{ "motorblowersfront_sw:", "motor blowers A" },
{ "motorblowersrear_sw:", "motor blowers B" },
{ "motorblowersalloff_sw:", "all motor blowers" },
{ "coolingfans_sw:", "cooling fans" },
{ "main_off_bt:", "line breaker" },
{ "main_on_bt:", "line breaker" },
{ "security_reset_bt:", "alerter" },
{ "releaser_bt:", "independent brake releaser" },
{ "sand_bt:", "sandbox" },
{ "antislip_bt:", "wheelspin brake" },
{ "horn_bt:", "horn" },
{ "hornlow_bt:", "low tone horn" },
{ "hornhigh_bt:", "high tone horn" },
{ "whistle_bt:", "whistle" },
{ "fuse_bt:", "motor overload relay reset" },
{ "converterfuse_bt:", "converter overload relay reset" },
{ "stlinoff_bt:", "motor connectors" },
{ "doorleftpermit_sw:", "left door (permit)" },
{ "doorrightpermit_sw:", "right door (permit)" },
{ "doorpermitpreset_sw:", "door (permit)" },
{ "door_left_sw:", "left door" },
{ "door_right_sw:", "right door" },
{ "doorlefton_sw:", "left door (open)" },
{ "doorrighton_sw:", "right door (open)" },
{ "doorleftoff_sw:", "left door (close)" },
{ "doorrightoff_sw:", "right door (close)" },
{ "doorallon_sw:", "all doors (open)" },
{ "dooralloff_sw:", "all doors (close)" },
{ "doorstep_sw:", "doorstep" },
{ "doormode_sw", "door control mode" },
{ "departure_signal_bt:", "departure signal" },
{ "upperlight_sw:", "upper headlight" },
{ "leftlight_sw:", "left headlight" },
{ "rightlight_sw:", "right headlight" },
{ "dimheadlights_sw:", "headlights dimmer" },
{ "leftend_sw:", "left marker light" },
{ "rightend_sw:", "right marker light" },
{ "lights_sw:", "light pattern" },
{ "rearupperlight_sw:", "rear upper headlight" },
{ "rearleftlight_sw:", "rear left headlight" },
{ "rearrightlight_sw:", "rear right headlight" },
{ "rearleftend_sw:", "rear left marker light" },
{ "rearrightend_sw:", "rear right marker light" },
{ "compressor_sw:", "compressor" },
{ "compressorlocal_sw:", "local compressor" },
{ "converter_sw:", "converter" },
{ "converterlocal_sw:", "local converter" },
{ "converteroff_sw:", "converter" },
{ "main_sw:", "line breaker" },
{ "radio_sw:", "radio" },
{ "radiochannel_sw:", "radio channel" },
{ "radiochannelprev_sw:", "radio channel" },
{ "radiochannelnext_sw:", "radio channel" },
{ "radiotest_sw:", "radiostop test" },
{ "radiostop_sw:", "radiostop" },
{ "pantfront_sw:", "pantograph A" },
{ "pantrear_sw:", "pantograph B" },
{ "pantfrontoff_sw:", "pantograph A" },
{ "pantrearoff_sw:", "pantograph B" },
{ "pantalloff_sw:", "all pantographs" },
{ "pantselected_sw:", "selected pantograph" },
{ "pantselectedoff_sw:", "selected pantograph" },
{ "pantcompressor_sw:", "pantograph compressor" },
{ "pantcompressorvalve_sw:", "pantograph 3 way valve" },
{ "trainheating_sw:", "heating" },
{ "signalling_sw:", "braking indicator" },
{ "door_signalling_sw:", "door locking" },
{ "nextcurrent_sw:", "current indicator source" },
{ "instrumentlight_sw:", "instrument light" },
{ "dashboardlight_sw:", "dashboard light" },
{ "timetablelight_sw:", "timetable light" },
{ "cablight_sw:", "interior light" },
{ "cablightdim_sw:", "interior light dimmer" },
{ "battery_sw:", "battery" },
{ "universal0:", "interactive part" },
{ "universal1:", "interactive part" },
{ "universal2:", "interactive part" },
{ "universal3:", "interactive part" },
{ "universal4:", "interactive part" },
{ "universal5:", "interactive part" },
{ "universal6:", "interactive part" },
{ "universal7:", "interactive part" },
{ "universal8:", "interactive part" },
{ "universal9:", "interactive part" }
{ "mainctrl:", STRN("master controller") },
{ "jointctrl:", STRN("master controller") },
{ "scndctrl:", STRN("second controller") },
{ "shuntmodepower:", STRN("shunt mode power") },
{ "tempomat_sw:", STRN("tempomat") },
{ "dirkey:", STRN("reverser") },
{ "brakectrl:", STRN("train brake") },
{ "localbrake:", STRN("independent brake") },
{ "manualbrake:", STRN("manual brake") },
{ "alarmchain:", STRN("emergency brake") },
{ "brakeprofile_sw:", STRN("brake acting speed") },
{ "brakeprofileg_sw:", STRN("brake acting speed: cargo") },
{ "brakeprofiler_sw:", STRN("brake acting speed: rapid") },
{ "brakeopmode_sw", STRN("brake operation mode") },
{ "maxcurrent_sw:", STRN("motor overload relay threshold") },
{ "waterpump_sw:", STRN("water pump") },
{ "waterpumpbreaker_sw:", STRN("water pump breaker") },
{ "waterheater_sw:", STRN("water heater") },
{ "waterheaterbreaker_sw:", STRN("water heater breaker") },
{ "watercircuitslink_sw:", STRN("water circuits link") },
{ "fuelpump_sw:", STRN("fuel pump") },
{ "oilpump_sw:", STRN("oil pump") },
{ "motorblowersfront_sw:", STRN("motor blowers A") },
{ "motorblowersrear_sw:", STRN("motor blowers B") },
{ "motorblowersalloff_sw:", STRN("all motor blowers") },
{ "coolingfans_sw:", STRN("cooling fans") },
{ "main_off_bt:", STRN("line breaker") },
{ "main_on_bt:", STRN("line breaker") },
{ "security_reset_bt:", STRN("alerter") },
{ "releaser_bt:", STRN("independent brake releaser") },
{ "sand_bt:", STRN("sandbox") },
{ "antislip_bt:", STRN("wheelspin brake") },
{ "horn_bt:", STRN("horn") },
{ "hornlow_bt:", STRN("low tone horn") },
{ "hornhigh_bt:", STRN("high tone horn") },
{ "whistle_bt:", STRN("whistle") },
{ "fuse_bt:", STRN("motor overload relay reset") },
{ "converterfuse_bt:", STRN("converter overload relay reset") },
{ "stlinoff_bt:", STRN("motor connectors") },
{ "doorleftpermit_sw:", STRN("left door (permit)") },
{ "doorrightpermit_sw:", STRN("right door (permit)") },
{ "doorpermitpreset_sw:", STRN("door (permit)") },
{ "door_left_sw:", STRN("left door") },
{ "door_right_sw:", STRN("right door") },
{ "doorlefton_sw:", STRN("left door (open)") },
{ "doorrighton_sw:", STRN("right door (open)") },
{ "doorleftoff_sw:", STRN("left door (close)") },
{ "doorrightoff_sw:", STRN("right door (close)") },
{ "doorallon_sw:", STRN("all doors (open)") },
{ "dooralloff_sw:", STRN("all doors (close)") },
{ "doorstep_sw:", STRN("doorstep") },
{ "doormode_sw", STRN("door control mode") },
{ "departure_signal_bt:", STRN("departure signal") },
{ "upperlight_sw:", STRN("upper headlight") },
{ "leftlight_sw:", STRN("left headlight") },
{ "rightlight_sw:", STRN("right headlight") },
{ "dimheadlights_sw:", STRN("headlights dimmer") },
{ "leftend_sw:", STRN("left marker light") },
{ "rightend_sw:", STRN("right marker light") },
{ "lights_sw:", STRN("light pattern") },
{ "rearupperlight_sw:", STRN("rear upper headlight") },
{ "rearleftlight_sw:", STRN("rear left headlight") },
{ "rearrightlight_sw:", STRN("rear right headlight") },
{ "rearleftend_sw:", STRN("rear left marker light") },
{ "rearrightend_sw:", STRN("rear right marker light") },
{ "compressor_sw:", STRN("compressor") },
{ "compressorlocal_sw:", STRN("local compressor") },
{ "converter_sw:", STRN("converter") },
{ "converterlocal_sw:", STRN("local converter") },
{ "converteroff_sw:", STRN("converter") },
{ "main_sw:", STRN("line breaker") },
{ "radio_sw:", STRN("radio") },
{ "radiochannel_sw:", STRN("radio channel") },
{ "radiochannelprev_sw:", STRN("radio channel") },
{ "radiochannelnext_sw:", STRN("radio channel") },
{ "radiotest_sw:", STRN("radiostop test") },
{ "radiostop_sw:", STRN("radiostop") },
{ "pantfront_sw:", STRN("pantograph A") },
{ "pantrear_sw:", STRN("pantograph B") },
{ "pantfrontoff_sw:", STRN("pantograph A") },
{ "pantrearoff_sw:", STRN("pantograph B") },
{ "pantalloff_sw:", STRN("all pantographs") },
{ "pantselected_sw:", STRN("selected pantograph") },
{ "pantselectedoff_sw:", STRN("selected pantograph") },
{ "pantcompressor_sw:", STRN("pantograph compressor") },
{ "pantcompressorvalve_sw:", STRN("pantograph 3 way valve") },
{ "trainheating_sw:", STRN("heating") },
{ "signalling_sw:", STRN("braking indicator") },
{ "door_signalling_sw:", STRN("door locking") },
{ "nextcurrent_sw:", STRN("current indicator source") },
{ "instrumentlight_sw:", STRN("instrument light") },
{ "dashboardlight_sw:", STRN("dashboard light") },
{ "timetablelight_sw:", STRN("timetable light") },
{ "cablight_sw:", STRN("interior light") },
{ "cablightdim_sw:", STRN("interior light dimmer") },
{ "battery_sw:", STRN("battery") },
{ "universal0:", STRN("interactive part") },
{ "universal1:", STRN("interactive part") },
{ "universal2:", STRN("interactive part") },
{ "universal3:", STRN("interactive part") },
{ "universal4:", STRN("interactive part") },
{ "universal5:", STRN("interactive part") },
{ "universal6:", STRN("interactive part") },
{ "universal7:", STRN("interactive part") },
{ "universal8:", STRN("interactive part") },
{ "universal9:", STRN("interactive part") }
};
auto const it = cabcontrols_labels.find( Label );

View File

@@ -12,218 +12,6 @@ http://mozilla.org/MPL/2.0/.
#include <string>
#include <unordered_map>
/*
driver_aid_header,
driver_aid_throttle,
driver_aid_speedlimit,
driver_aid_nextlimit,
driver_aid_grade,
driver_aid_brakes,
driver_aid_pressures,
driver_aid_alerter,
driver_aid_shp,
driver_aid_loadinginprogress,
driver_aid_vehicleahead,
driver_scenario_header,
driver_scenario_assignment,
driver_scenario_currenttask,
driver_scenario_waitfororders,
driver_scenario_prepareengine,
driver_scenario_releaseengine,
driver_scenario_changedirection,
driver_scenario_connect,
driver_scenario_disconnect,
driver_scenario_allvehicles,
driver_scenario_onevehicle,
driver_scenario_fewvehicles,
driver_scenario_somevehicles,
driver_scenario_shunt,
driver_scenario_looseshunt,
driver_scenario_obeytrain,
driver_scenario_bank,
driver_timetable_header,
driver_timetable_name,
driver_timetable_notimetable,
driver_timetable_consistdata,
driver_transcripts_header,
driver_pause_header,
driver_pause_resume,
driver_pause_quit,
debug_vehicle_nameloadstatuscouplers,
debug_vehicle_owned,
debug_vehicle_none,
debug_vehicle_devicespower,
debug_vehicle_radio,
debug_vehicle_oilpressure,
debug_vehicle_controllersenginerevolutions,
debug_vehicle_shuntmode,
debug_vehicle_temperatures,
debug_vehicle_brakespressures,
debug_vehicle_pantograph,
debug_vehicle_forcesaccelerationvelocityposition,
ui_expand,
ui_loading,
ui_loading_scenery,
ui_quit_simulation_q,
ui_yes,
ui_no,
ui_general,
ui_debug_mode,
ui_quit,
ui_tools,
ui_logging_to_log,
ui_screenshot,
ui_windows,
ui_log,
ui_map,
ui_mode_windows,
time_window,
time_time,
time_yearday,
time_visibility,
time_weather,
time_temperature,
time_apply,
map_straight,
map_divert,
map_open,
map_close,
map_obstacle_insert,
map_obstacle_remove,
vehiclelist_window,
vehicleparams_window,
vehicleparams_radiostop,
vehicleparams_resetposition,
vehicleparams_reset,
vehicleparams_resetpipe,
vehicleparams_rupturepipe,
vehicleparams_move500f,
vehicleparams_move500b,
cameraview_window,
cab_mainctrl,
cab_jointctrl,
cab_scndctrl,
cab_shuntmodepower,
cab_tempomat,
cab_dirkey,
cab_brakectrl,
cab_localbrake,
cab_manualbrake,
cab_alarmchain,
cab_brakeprofile_sw,
cab_brakeprofileg_sw,
cab_brakeprofiler_sw,
cab_brakeopmode_sw,
cab_maxcurrent_sw,
cab_waterpump_sw,
cab_waterpumpbreaker_sw,
cab_waterheater_sw,
cab_waterheaterbreaker_sw,
cab_watercircuitslink_sw,
cab_fuelpump_sw,
cab_oilpump_sw,
cab_motorblowersfront_sw,
cab_motorblowersrear_sw,
cab_motorblowersalloff_sw,
cab_coolingfans_sw,
cab_main_off_bt,
cab_main_on_bt,
cab_security_reset_bt,
cab_releaser_bt,
cab_sand_bt,
cab_antislip_bt,
cab_horn_bt,
cab_hornlow_bt,
cab_hornhigh_bt,
cab_whistle_bt,
cab_fuse_bt,
cab_converterfuse_bt,
cab_stlinoff_bt,
cab_doorleftpermit_sw,
cab_doorrightpermit_sw,
cab_doorpermitpreset_sw,
cab_door_left_sw,
cab_door_right_sw,
cab_doorlefton_sw,
cab_doorrighton_sw,
cab_doorleftoff_sw,
cab_doorrightoff_sw,
cab_doorallon_sw,
cab_dooralloff_sw,
cab_doorstep_sw,
cab_doormode_sw,
cab_departure_signal_bt,
cab_upperlight_sw,
cab_leftlight_sw,
cab_rightlight_sw,
cab_dimheadlights_sw,
cab_leftend_sw,
cab_rightend_sw,
cab_lights_sw,
cab_rearupperlight_sw,
cab_rearleftlight_sw,
cab_rearrightlight_sw,
cab_rearleftend_sw,
cab_rearrightend_sw,
cab_compressor_sw,
cab_compressorlocal_sw,
cab_converter_sw,
cab_converterlocal_sw,
cab_converteroff_sw,
cab_main_sw,
cab_radio_sw,
cab_radiochannel_sw,
cab_radiochannelprev_sw,
cab_radiochannelnext_sw,
cab_radiotest_sw,
cab_radiostop_sw,
cab_pantfront_sw,
cab_pantrear_sw,
cab_pantfrontoff_sw,
cab_pantrearoff_sw,
cab_pantalloff_sw,
cab_pantselected_sw,
cab_pantselectedoff_sw,
cab_pantcompressor_sw,
cab_pantcompressorvalve_sw,
cab_trainheating_sw,
cab_signalling_sw,
cab_door_signalling_sw,
cab_nextcurrent_sw,
cab_instrumentlight_sw,
cab_dashboardlight_sw,
cab_timetablelight_sw,
cab_cablight_sw,
cab_cablightdim_sw,
cab_battery_sw,
cab_universal0,
cab_universal1,
cab_universal2,
cab_universal3,
cab_universal4,
cab_universal5,
cab_universal6,
cab_universal7,
cab_universal8,
cab_universal9,
string_count
*/
class locale {
public:
void init();
@@ -242,7 +30,8 @@ private:
extern locale Translations;
#define STR(x) Translations.lookup_s(#x, true)
#define STR_C(x) Translations.lookup_c(#x, true)
#define STRC(x, c) Translations.lookup_s(c "\x1d" #x, true)
#define STRC_C(x, c) Translations.lookup_c(c "\x1d" #x, true)
#define STR(x) Translations.lookup_s(x, true)
#define STR_C(x) Translations.lookup_c(x, true)
#define STRN(x) x
//find . -name "*.cpp" | xargs xgettext --from-code="UTF-8" -k --keyword=STR --keyword=STR_C --keyword=STRN

View File

@@ -77,7 +77,7 @@ void ui_panel::register_popup(std::unique_ptr<ui::popup> &&popup)
void ui_expandable_panel::render_contents()
{
ImGui::Checkbox(STR_C(ui_expand), &is_expanded);
ImGui::Checkbox(STR_C("expand"), &is_expanded);
ui_panel::render_contents();
}
@@ -269,14 +269,14 @@ void ui_layer::render_quit_widget()
return;
ImGui::SetNextWindowSize(ImVec2(0, 0));
ImGui::Begin(STR_C(ui_quit), &m_quit_active, ImGuiWindowFlags_NoResize);
ImGui::TextUnformatted(STR_C(ui_quit_simulation_q));
if (ImGui::Button(STR_C(ui_yes))) {
ImGui::Begin(STR_C("Quit"), &m_quit_active, ImGuiWindowFlags_NoResize);
ImGui::TextUnformatted(STR_C("Quit simulation?"));
if (ImGui::Button(STR_C("Yes"))) {
command_relay relay;
relay.post(user_command::quitsimulation, 0.0, 0.0, GLFW_PRESS, 0);
}
ImGui::SameLine();
if (ImGui::Button(STR_C(ui_no)))
if (ImGui::Button(STR_C("No")))
m_quit_active = false;
ImGui::End();
}
@@ -334,7 +334,7 @@ void ui_layer::render_progress()
ImGui::SetNextWindowPos(ImVec2(50, 50));
ImGui::SetNextWindowSize(ImVec2(0, 0));
ImGui::Begin(STR_C(ui_loading), nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
ImGui::Begin(STR_C("Loading"), nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
if (!m_progresstext.empty())
ImGui::ProgressBar(m_progress, ImVec2(300, 0), m_progresstext.c_str());
else
@@ -366,32 +366,32 @@ void ui_layer::render_tooltip()
void ui_layer::render_menu_contents()
{
if (ImGui::BeginMenu(STR_C(ui_general)))
if (ImGui::BeginMenu(STR_C("General")))
{
ImGui::MenuItem(STR_C(ui_debug_mode), nullptr, &DebugModeFlag);
ImGui::MenuItem(STR_C(ui_quit), "F10", &m_quit_active);
ImGui::MenuItem(STR_C("Debug mode"), nullptr, &DebugModeFlag);
ImGui::MenuItem(STR_C("Quit"), "F10", &m_quit_active);
ImGui::EndMenu();
}
if (ImGui::BeginMenu(STR_C(ui_tools)))
if (ImGui::BeginMenu(STR_C("Tools")))
{
static bool log = Global.iWriteLogEnabled & 1;
ImGui::MenuItem(STR_C(ui_logging_to_log), nullptr, &log);
ImGui::MenuItem(STR_C("Logging to log.txt"), nullptr, &log);
if (log)
Global.iWriteLogEnabled |= 1;
else
Global.iWriteLogEnabled &= ~1;
if (ImGui::MenuItem(STR_C(ui_screenshot), "PrtScr"))
if (ImGui::MenuItem(STR_C("Screenshot"), "PrtScr"))
Application.queue_screenshot();
ImGui::EndMenu();
}
if (ImGui::BeginMenu(STR_C(ui_windows)))
if (ImGui::BeginMenu(STR_C("Windows")))
{
ImGui::MenuItem(STR_C(ui_log), "F9", &m_logpanel.is_open);
ImGui::MenuItem(STR_C("Log"), "F9", &m_logpanel.is_open);
if (DebugModeFlag) {
ImGui::MenuItem("ImGui Demo", nullptr, &m_imgui_demo);
ImGui::MenuItem("Headlight config", nullptr, &GfxRenderer.debug_ui_active);
ImGui::MenuItem(STR_C("ImGui Demo"), nullptr, &m_imgui_demo);
ImGui::MenuItem(STR_C("Headlight config"), nullptr, &GfxRenderer.debug_ui_active);
}
ImGui::EndMenu();
}

View File

@@ -4,7 +4,7 @@
#include "Logs.h"
ui::cameraview_panel::cameraview_panel()
: ui_panel(STR_C(cameraview_window), false)
: ui_panel(STR_C("Camera preview"), false)
{
size_min = { -2, -2 };
}
@@ -103,6 +103,7 @@ void ui::cameraview_panel::workthread_func()
if (buffer) {
int w, h;
stbi_set_flip_vertically_on_load(0);
uint8_t *image = stbi_load_from_memory(buffer, len, &w, &h, nullptr, 4);
if (!image)
ErrorLog(std::string(stbi_failure_reason()));

View File

@@ -8,7 +8,7 @@
#include "Driver.h"
#include "AnimModel.h"
ui::map_panel::map_panel() : ui_panel(STR_C(ui_map), false)
ui::map_panel::map_panel() : ui_panel(STR_C("Map"), false)
{
size_min = {200, 200};
size_max = {fb_size, fb_size};
@@ -445,13 +445,13 @@ void ui::launcher_window::render_content()
{
ImGui::TextUnformatted(m_switch->name.c_str());
const std::string &open_label = STR(
const std::string &open_label =
m_switch->type == map::launcher::track_switch
? locale::string::map_straight : locale::string::map_open);
? STR("Straight |") : STR("Open |");
const std::string &close_label = STR(
const std::string &close_label =
m_switch->type == map::launcher::track_switch
? locale::string::map_divert : locale::string::map_close);
? STR("Divert /") : STR("Close -");
if (ImGui::Button(open_label.c_str()))
{
@@ -495,7 +495,7 @@ void ui::obstacle_insert_window::render_content()
return;
}
ImGui::TextUnformatted(STR_C(map_obstacle_insert));
ImGui::TextUnformatted(STR_C("Insert obstacle:"));
for (auto const &entry : m_obstacles)
{
if (ImGui::Button(entry.first.c_str()))
@@ -526,7 +526,7 @@ ui::obstacle_remove_window::obstacle_remove_window(ui_panel &panel, std::shared_
void ui::obstacle_remove_window::render_content()
{
if (ImGui::Button(STR_C(map_obstacle_remove))) {
if (ImGui::Button(STR_C("Delete obstacle"))) {
m_relay.post(user_command::deletemodel, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(), &m_obstacle->model_name);
auto &entries = map::Objects.entries;

View File

@@ -3,13 +3,13 @@
#include "Timer.h"
perfgraph_panel::perfgraph_panel()
: ui_panel("Perf", false)
: ui_panel(STR("Performance"), false)
{
}
void perfgraph_panel::render_contents() {
if (ImGui::BeginCombo("Timer", timer_label[current_timer].c_str())) // The second parameter is the label previewed before opening the combo.
if (ImGui::BeginCombo(STR_C("Timer"), timer_label[current_timer].c_str())) // The second parameter is the label previewed before opening the combo.
{
for (size_t i = 0; i < (size_t)TIMER_MAX; i++)
{
@@ -57,6 +57,6 @@ void perfgraph_panel::render_contents() {
if (pos >= history.size())
pos = 0;
ImGui::SliderFloat("Range", &max, 0.1f, 250.0f);
ImGui::SliderFloat(STR_C("Range"), &max, 0.1f, 250.0f);
ImGui::PlotLines("##timer", &history[0], history.size(), pos, label.c_str(), 0.0f, max, ImVec2(500, 200));
}

View File

@@ -3,20 +3,20 @@
#include "simulationtime.h"
#include "Globals.h"
ui::time_panel::time_panel() : ui_panel(STR_C(time_window), false)
ui::time_panel::time_panel() : ui_panel(STR_C("Time and environment"), false)
{
size.x = 450;
}
void ui::time_panel::render_contents()
{
ImGui::SliderFloat(STR_C(time_time), &time, 0.0f, 24.0f, "%.1f");
ImGui::SliderInt(STR_C(time_yearday), &yearday, 1, 365);
ImGui::SliderFloat(STR_C(time_visibility), &fog, 50.0f, 3000.0f, "%.0f");
ImGui::SliderFloat(STR_C(time_weather), &overcast, 0.0f, 2.0f, "%.1f");
ImGui::SliderFloat(STR_C(time_temperature), &temperature, -20.0f, 40.0f, "%.0f");
ImGui::SliderFloat(STR_C("Time"), &time, 0.0f, 24.0f, "%.1f");
ImGui::SliderInt(STR_C("Day in year"), &yearday, 1, 365);
ImGui::SliderFloat(STR_C("Visibility"), &fog, 50.0f, 3000.0f, "%.0f");
ImGui::SliderFloat(STR_C("Overcast and precipitation"), &overcast, 0.0f, 2.0f, "%.1f");
ImGui::SliderFloat(STR_C("Temperature"), &temperature, -20.0f, 40.0f, "%.0f");
if (ImGui::Button(STR_C(time_apply)))
if (ImGui::Button(STR_C("Apply")))
{
m_relay.post(user_command::setdatetime, (double)yearday, time, 1, 0);
m_relay.post(user_command::setweather, fog, overcast, 1, 0);

View File

@@ -5,7 +5,7 @@
#include "widgets/vehicleparams.h"
ui::vehiclelist_panel::vehiclelist_panel(ui_layer &parent)
: ui_panel(STR_C(vehiclelist_window), false), m_parent(parent)
: ui_panel(STR_C("Vehicle list"), false), m_parent(parent)
{
}

View File

@@ -6,7 +6,7 @@
#include "Train.h"
ui::vehicleparams_panel::vehicleparams_panel(const std::string &vehicle)
: ui_panel(std::string(STR(vehicleparams_window)) + ": " + vehicle, false), m_vehicle_name(vehicle)
: ui_panel(std::string(STR("Vehicle parameters")) + ": " + vehicle, false), m_vehicle_name(vehicle)
{
}
@@ -53,7 +53,7 @@ void ui::vehicleparams_panel::render_contents()
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_devicespower),
STR_C("Devices: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%s%s\nPower transfers: %.0f@%.0f%s%s%s%.0f@%.0f"),
// devices
( mover.Battery ? 'B' : '.' ),
( mover.Mains ? 'M' : '.' ),
@@ -70,7 +70,7 @@ void ui::vehicleparams_panel::render_contents()
( mover.CompressorFlag ? 'C' : ( false == mover.CompressorAllowLocal ? '-' : ( ( mover.CompressorAllow || mover.CompressorStart == start_t::automatic ) ? 'c' : '.' ) ) ),
( mover.CompressorGovernorLock ? '!' : '.' ),
"",
std::string( isdieselenginepowered ? STR(debug_vehicle_oilpressure) + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(),
std::string( isdieselenginepowered ? STR(" oil pressure: ") + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(),
// power transfers
mover.Couplers[ end::front ].power_high.voltage,
mover.Couplers[ end::front ].power_high.current,
@@ -84,11 +84,11 @@ void ui::vehicleparams_panel::render_contents()
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_controllersenginerevolutions),
STR_C("Controllers:\n master: %d(%d), secondary: %s\nEngine output: %.1f, current: %.0f\nRevolutions:\n engine: %.0f, motors: %.0f\n engine fans: %.0f, motor fans: %.0f+%.0f, cooling fans: %.0f+%.0f"),
// controllers
mover.MainCtrlPos,
mover.MainCtrlActualPos,
std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(debug_vehicle_shuntmode) : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(),
std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + STR(" (shunt mode)") : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(),
// engine
mover.EnginePower,
std::abs( mover.TrainType == dt_EZT ? mover.ShowCurrent( 0 ) : mover.Im ),
@@ -106,7 +106,7 @@ void ui::vehicleparams_panel::render_contents()
if( isdieselenginepowered ) {
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_temperatures),
STR_C("\nTemperatures:\n engine: %.2f, oil: %.2f, water: %.2f%c%.2f"),
mover.dizel_heat.Ts,
mover.dizel_heat.To,
mover.dizel_heat.temperatura1,
@@ -132,7 +132,7 @@ void ui::vehicleparams_panel::render_contents()
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_brakespressures),
STR_C("Brakes:\n train: %.2f, independent: %.2f, mode: %d, delay: %s, load flag: %d\nBrake cylinder pressures:\n train: %.2f, independent: %.2f, status: 0x%.2x\nPipe pressures:\n brake: %.2f (hat: %.2f), main: %.2f, control: %.2f\nTank pressures:\n auxiliary: %.2f, main: %.2f, control: %.2f"),
// brakes
mover.fBrakeCtrlPos,
mover.LocalBrakePosA,
@@ -158,7 +158,7 @@ void ui::vehicleparams_panel::render_contents()
if( mover.EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_pantograph),
STR_C(" pantograph: %.2f%cMT"),
mover.PantPress,
( mover.bPantKurek3 ? '-' : '|' ) );
ImGui::TextUnformatted(buffer.data());
@@ -166,7 +166,7 @@ void ui::vehicleparams_panel::render_contents()
std::snprintf(
buffer.data(), buffer.size(),
STR_C(debug_vehicle_forcesaccelerationvelocityposition),
STR_C("Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]"),
// forces
mover.Ft * 0.001f * ( mover.ActiveCab ? mover.ActiveCab : vehicle.ctOwner ? vehicle.ctOwner->Controlling()->ActiveCab : 1 ) + 0.001f,
mover.Fb * 0.001f,
@@ -186,40 +186,40 @@ void ui::vehicleparams_panel::render_contents()
ImGui::TextUnformatted(buffer.data());
if (ImGui::Button(STR_C(vehicleparams_radiostop)))
if (ImGui::Button(STR_C("Radiostop")))
m_relay.post(user_command::radiostop, 0.0, 0.0, GLFW_PRESS, 0, vehicle_ptr->GetPosition());
ImGui::SameLine();
if (ImGui::Button(STR_C(vehicleparams_reset)))
if (ImGui::Button(STR_C("Stop and repair")))
m_relay.post(user_command::resetconsist, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
ImGui::SameLine();
if (ImGui::Button(STR_C(vehicleparams_resetposition))) {
if (ImGui::Button(STR_C("Reset position"))) {
std::string payload = vehicle_ptr->name() + '%' + vehicle_ptr->initial_track->name();
m_relay.post(user_command::consistteleport, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &payload);
m_relay.post(user_command::resetconsist, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
}
if (ImGui::Button(STR_C(vehicleparams_resetpipe)))
if (ImGui::Button(STR_C("Refill main tank")))
m_relay.post(user_command::fillcompressor, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
ImGui::SameLine();
if (ImGui::Button(STR_C(vehicleparams_rupturepipe)))
if (ImGui::Button(STR_C("Rupture main pipe")))
m_relay.post(user_command::pullalarmchain, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
ImGui::SameLine();
ImGui::Button(STR_C(cab_releaser_bt));
ImGui::Button(STR_C("independent brake releaser"));
if (ImGui::IsItemClicked())
m_relay.post(user_command::consistreleaser, 0.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
if (ImGui::IsItemDeactivated())
m_relay.post(user_command::consistreleaser, 0.0, 0.0, GLFW_RELEASE, 0, glm::vec3(0.0f), &vehicle_ptr->name());
if (vehicle_ptr->MoverParameters->V < 0.01) {
if (ImGui::Button(STR_C(vehicleparams_move500f)))
if (ImGui::Button(STR_C("Move +500m")))
m_relay.post(user_command::dynamicmove, 500.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
ImGui::SameLine();
if (ImGui::Button(STR_C(vehicleparams_move500b)))
if (ImGui::Button(STR_C("Move -500m")))
m_relay.post(user_command::dynamicmove, -500.0, 0.0, GLFW_PRESS, 0, glm::vec3(0.0f), &vehicle_ptr->name());
}
}

View File

@@ -38,40 +38,6 @@ typedef struct _SYSTEMTIME {
BI_CMYKRLE4 = 0x000D
} Compression;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} __attribute__((packed)) BITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} __attribute__((packed)) RGBQUAD;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} __attribute__((packed)) BITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} __attribute__((packed)) BITMAPINFO, *PBITMAPINFO;
#ifndef MAKEFOURCC
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \