17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 00:29:19 +02:00
jerrrrycho 6263fe539b Fix/sonar maintainability rebased (#209)
* refactor(sonar): use override instead of redundant virtual (cpp:S3471)

* refactor(sonar): remove empty statements, one declaration per statement (cpp:S1116, cpp:S1659)

* refactor(sonar): drop redundant lambda return types (cpp:S3574)

* refactor(sonar): prefer using over typedef (cpp:S5416)

* refactor(sonar): use =default for trivial special members (cpp:S3490)

* refactor(sonar): use nullptr literal (cpp:S4962)

* refactor(sonar): remove redundant access specifiers (cpp:S3539)

* refactor(sonar): remove redundant casts (cpp:S1905)

* refactor(sonar): use std::scoped_lock instead of std::lock_guard (cpp:S5997)

* refactor(sonar): construct elements in place with emplace_back (cpp:S6003)

* refactor(sonar): make narrowing conversions explicit (cpp:S5276)

* refactor(sonar): mark unused parameters (cpp:S1172)

Unused names are commented out; parameters used only on some platforms
are marked [[maybe_unused]].

* refactor(sonar): declare non-mutating member functions const (cpp:S5817)

Virtual functions are left untouched so overrides keep matching.

* refactor(sonar): merge collapsible nested if statements (cpp:S1066)

Comments that preceded the inner if are kept above the merged statement.

* refactor(sonar): scope single-use variables in if init-statements (cpp:S6004)

* fix(sonar): give polymorphic base classes virtual destructors (cpp:S1235)

* refactor(sonar): use try_emplace for map insertion (cpp:S6030)

* refactor(sonar): use auto where the type is spelled out on the right (cpp:S5827)

* refactor(sonar): remove redundant parentheses (cpp:S1110)

* refactor(sonar): document intentionally empty functions (cpp:S1186)

* refactor(sonar): remove dead stores (cpp:S1854)

Side effects (e.g. LISTLINE++) are kept.

* refactor(sonar): remove unused variables, captures and private fields (cpp:S1481, cpp:S1068)

* refactor(sonar): use structured bindings for pair access (cpp:S6005)

* refactor(sonar): use range-based loops and ranges algorithms (cpp:S5566)

* refactor(sonar): split chained assignments (cpp:S1121)

* refactor(sonar): add default cases to switch statements (cpp:S3562)

* refactor(sonar): use std::size for array lengths (cpp:S7127)

* refactor(sonar): use std::ranges algorithms and std::erase(_if) (cpp:S6197)

* refactor(sonar): access static members through the class (cpp:S2209)

* refactor(sonar): add braces around nested if-else (cpp:S5261)

* refactor(sonar): avoid side effects inside typeid operands (cpp:S5279)

* refactor(sonar): drop top-level const from by-value return types (cpp:S5951)

* refactor(sonar): declare variables separately from their type definitions (cpp:S3646)

* refactor(sonar): declare loop counters in the for statement (cpp:S5955)

* refactor(sonar): rely on class template argument deduction (cpp:S6012)

* refactor(sonar): inherit base constructors instead of forwarding them (cpp:S5952)

* refactor(sonar): rename locals that shadow outer declarations (cpp:S1117)

Only local variables and definition parameters are renamed; shadowing
struct fields and enumerators in headers are left for a separate change.

* refactor(sonar): reduce enum qualification with using enum (cpp:S6177)

Applied only where no unqualified name in the block could be captured by
the introduced enumerators.

* refactor(sonar): mark converting constructors explicit (cpp:S1709)

sound_source and the gl::object conversion operators stay implicit; they
are relied upon by copy-list-initialisation and GL calls.

* refactor(sonar): initialise members in initialiser lists or declarations (cpp:S3230)

* refactor(sonar): make read-only local references and pointers const (cpp:S5350)

* refactor(sonar): take read-only pointer and reference parameters as const (cpp:S995)

TTrain command handlers keep their signature, it is fixed by the handler table.

* refactor(sonar): pass expensive-to-copy parameters by const reference (cpp:S1238)

Signatures declared in files touched by PR 206 (Driver.h, EU07.cpp) and
virtual overrides are left unchanged.

* refactor(sonar): use transparent comparators for string-keyed maps (cpp:S6045)

std::unordered_map instances and map types exposed in headers used by
other modules are left as they are.

* fix(sonar): do not use UI text as a printf format string (cpp:S5281)

Text lines containing '%' would otherwise be interpreted as format
specifiers by ImGui::TextColored.

* refactor(sonar): use std::bind_front for callbacks (cpp:S5995)

* refactor(sonar): drop const_cast on string literals passed to the Python C API (cpp:S859)

* refactor(sonar): take read-only string parameters as std::string_view (cpp:S6009)

The Windows messaging helpers keep std::string, they need c_str().

* refactor(sonar): make read-only global tables const (cpp:S5421)

Mutable global state (flags, timers, singletons) is left as is.

* refactor(sonar): replace single-case switch statements with if (cpp:S1301)

* refactor(sonar): format UUIDs and log timestamps with std::format (cpp:S6494, cpp:S5945)

* refactor(sonar): use std::array for local fixed-size arrays (cpp:S5945)

Arrays that are class members or part of headers are left unchanged.

* fix(sonar): test the bearing damage bit, not bit 0 (cpp:S872)

'DamageFlag & dtrain_bearing > 0' parsed as 'DamageFlag & (dtrain_bearing > 0)',
i.e. DamageFlag & 1, so bearing friction reacted to the wrong damage flag.

* refactor(sonar): assorted small fixes

- empty() instead of size() comparisons (cpp:S1155)
- member initialisers in declaration order (cpp:S3229)
- no redundant c_str() when a std::string is accepted (cpp:S7121)
- contains() on associative containers (cpp:S6171)
- const reference instead of a copying range-for (cpp:S6032)
- starts_with() for prefix checks (cpp:S6178)
- no std::move on temporaries (cpp:S5274)
- has_value() on std::optional (cpp:S7172)
- bool literals for bool members (cpp:S5820)
- inline only on the definition (cpp:S3548)
- explicit base access specifier (cpp:S5965)
- explicit element access instead of dereferencing an array (cpp:S7116)
- rely on the C++20 rewritten operator!= (cpp:S6186)

* refactor(sonar): more small fixes

- std::format instead of iostream manipulators in to_string/to_hex_str (cpp:S6495);
  output verified identical, negative hex values keep the unsigned form
- remove an empty compound statement (cpp:S108)
- drop an always-false unsigned < 0 branch (cpp:S1768)
- explicit lambda capture (cpp:S3608)
- std::make_unique (cpp:S5950)

* chore: strip stray carriage returns left in TTrain constructor comments

* fix: keep quantize() in its own value type

The S5276 change cast the result of the generic quantize<Type_>() to
unsigned int, which truncated float/double callers (shadow angle slider,
editor rotation snapping, AI speed control steps) and broke negative values.

* fix(sonar): use integer loop counters in segment sampling (cpp:S2193)

* refactor(sonar): clean up issues reported on PR 209

- remove locals left unused after the dead-store cleanup (cpp:S1481, cpp:S1854)
- unnamed unused parameter (cpp:S1172)
- single-use declarations moved into if init-statements (cpp:S6004)
- auto for casted initialisers (cpp:S5827)
- const references and pointers where nothing is modified (cpp:S5350)
- rename structured bindings shadowed by inner declarations (cpp:S1117)
2026-10-11 13:22:33 +02:00
2021-01-21 15:51:03 +01:00
2025-03-09 15:36:11 +01:00
2026-10-09 18:40:31 +02:00
2017-10-28 19:21:37 +02:00
2025-11-16 19:00:38 +01:00
2025-09-19 17:53:46 +02:00
2015-04-03 21:58:35 +08:00
2026-04-01 20:10:33 +02:00
2026-08-19 14:50:28 +02:00
2026-05-11 18:21:12 +02:00
2025-09-09 16:46:12 +02:00
2026-02-25 08:30:20 +01:00
2025-03-09 15:36:11 +01:00
2021-02-13 18:32:19 +01:00
2019-07-09 22:09:37 +02:00

Repo banner

MaSzyna - Railway vehicle simulator

Website · Report an issue · Community Discord · MaSzyna on Steam · MaSzyna on Epic Games Store

Discord Github Actions Quality gate Sonar cloud violations License: MPL 2.0 Last commit Open issues Pull requests GitHub stars GitHub forks C++ Windows Linux OpenGL

MaSzyna executable source code is licensed under the MPL 2.0 and comes with a large pack of free assets under a custom license.

Table of Contents

Getting Started

MaSzyna compiles and runs natively on Linux and Windows. Other platforms are not tested.

Heads-up
Our dev team is small; we keep improving the build process, but issues may still occur. If you get stuck, please ask on the official Discord server.

Prerequisites

For runtime requirements see Minimum Requirements.

1) Software (oldest tested in parentheses)

  • CMake (3.0)

  • make

  • A C++ compiler with C++20 support:

    • Windows: Visual Studio 2022

    • Linux: GCC (12.3.1)

Note: MinGW is currently not supported.

2) Libraries (oldest tested in parentheses)

3) Graphics API

  • OpenGL 3.0 or newer
  • DirectX 12 via NVRHI (optional, Windows only, for Better Renderer)

CMake flags

Flag Meaning
-DCMAKE_BUILD_TYPE=Debug Debug build
-DCMAKE_BUILD_TYPE=Release Release build
-DCMAKE_BUILD_TYPE=RelWithDebInfo Release build with debug symbols
-DWITH_BETTER_RENDERER=ON/OFF Enable/disable NVRHI-based renderer
-DPython3_ROOT_DIR=<path> Root of the Python 3.14 install on Windows (python.exe, Lib, DLLs) for embed/copy steps; on Linux, optional if CMake picks the wrong interpreter

Linux note: WITH_BETTER_RENDERER uses DirectX 12 through NVRHI and is not supported on Linux.

Windows

Install Python 3.14 x64 from python.org and include the optional Python native development feature (headers and .lib for embedding). Pass -DPython3_ROOT_DIR="C:\Path\To\Python314" on the cmake line when you want the layout under that directory used for embedding and for copying Lib / DLLs next to the executable.

AppVeyor CI builds with the worker image’s preinstalled Python at C:/Python314-x64 (see appveyor.yml: -DPython3_ROOT_DIR=...).

# Clone repository with submodules
git clone --recursive https://github.com/MaSzyna-EU07/maszyna.git

cd maszyna

# Init vcpkg
call setup.bat

# Create directory for CMake build files
mkdir build
cd build

# Generate CMake project (replace %CONFIG% with Debug/Release/RelWithDebInfo)
cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=%CONFIG%

# Build (replace %CONFIG% accordingly)
cmake --build . --config %CONFIG% --parallel

Linux

# Install dependencies (Fedora/RHEL family)
sudo dnf install -y \
  @development-tools \
  cmake \
  mesa-libGL-devel \
  glew-devel \
  glfw-devel \
  python3.14-devel \
  libpng-devel \
  openal-soft-devel \
  luajit-devel \
  libserialport-devel \
  libsndfile-devel \
  gcc \
  g++ \
  wayland-devel \
  wayland-protocols-devel \
  libxkbcommon-devel

# Clone repository with submodules
git clone --recursive https://github.com/MaSzyna-EU07/maszyna.git

cd maszyna

# Create directory for CMake build files
mkdir build
cd build

# Generate Makefiles (NVRHI is not supported on Linux)
cmake .. -DWITH_BETTER_RENDERER=OFF

# Compile using all cores
make -j"$(nproc)"

Tip (Ubuntu/Debian): Package names differ; install equivalent build-essential, libgl1-mesa-dev, libglew-dev, libglfw3-dev, python3.14-dev, libpng-dev, libopenal-dev, libluajit-5.1-dev, libserialport-dev, libsndfile1-dev, and Wayland/X11 dev packages as needed.

Installing

There is no make install yet. Copy the built executable to your MaSzyna installation manually.

  • Output directory: ./bin

  • File name format: eu07_YYYY-MM-DD_<commit>[_d]

    • YYYY-MM-DD – build date

    • <commit> – short commit hash

    • _d – present in Debug builds

If you already have the MaSzyna assets, copy the executable to the install dir. Assets can be downloaded from eu07.pl.

Rainsted on Linux

If Rainsted (a third‑party starter) fails to detect the executable under Linux, you can create a small wrapper script named eu07.exe:

#!/bin/sh
./eu07 "$1" "$2" "$3" "$4" "$5"

If detection still fails, padding the file (with comments) up to ~1 MB may help.

Known Issues

  • GLFW linking – On some systems you must provide the GLFW library path explicitly with -DGLFW3_LIBRARIES.

  • X11/Wayland linking order – Linking order of X11 and related libs can matter.

  • NVRHI on Linux – The NVRHI/"Better Renderer" path targets DirectX 12 and is currently unsupported on Linux.

Support

Minimum requirements

  • OS: Windows 10 64-bit
  • Processor: 2 core at least 2 GHz (e.g. Intel Core i3-2100 / AMD Athlon II X2)
  • RAM: 6 GB RAM
  • Graphics Card: supporting OpenGL 3.3 with at least 1GB VRAM
  • 150 GB of free disk space
  • Sound card supporting OpenAL with stereo
  • Optional COM ports for custom control panel setups.

License

Languages
C++ 63.5%
C 34%
HLSL 1.4%
GLSL 0.6%
CMake 0.3%
Other 0.2%