31 struct MouseLogicalMapping
49 [[
nodiscard]] std::optional<MouseLogicalMapping>
60 const auto windowX =
static_cast<double>(
x);
61 const auto windowY =
static_cast<double>(
y);
71 (trade.playerSelectVisible || trade.cashDialogVisible || trade.contractDialogVisible);
74 {
static_cast<double>(viewport.left),
static_cast<double>(viewport.top),
75 static_cast<double>(viewport.right - viewport.left),
76 static_cast<double>(viewport.bottom - viewport.top)},
tradeModal))
77 return MouseLogicalMapping{*overlay,
uiTransform.scale};
79 const auto worldTransform =
83 {
static_cast<double>(viewport.left),
84 static_cast<double>(viewport.top),
85 static_cast<double>(viewport.right - viewport.left),
86 static_cast<double>(viewport.bottom - viewport.top)});
88 if (contains(pixels, windowX, windowY))
89 if (
const auto point =
91 worldTransform, windowX, windowY))
92 return MouseLogicalMapping{*point, worldTransform.scale};
99 return MouseLogicalMapping{*point,
uiTransform.scale};
110 std::cerr <<
"SDL_GetBasePath failed for AI profiles.\n";
120 std::cerr <<
"AI profile initialization failed: "
121 <<
loaded.error().detail <<
'\n';
143 if (!point.has_value())
159 static_cast<std::int32_t
>(point->point.x),
160 static_cast<std::int32_t
>(point->point.y)};
171 if (point->scale > 0.0)
174 std::lround(
static_cast<double>(deltaX) / point->scale));
176 std::lround(
static_cast<double>(deltaY) / point->scale));
246 const auto usage = []
248 std::cerr <<
"Usage: MonopolyModern "
249 "[--windowed | --fullscreen | --exclusive-fullscreen] "
250 "[--resolution WIDTHxHEIGHT] "
251 "[--present-mode vsync|mailbox|immediate] "
252 "[--modern-board=retail|paris|usa|procedural] [--modern-buildings=retail|house] "
253 "[--modern-environment=retail|paris|procedural] "
254 "[--edition=usa|europe] [--language=en-us|en-uk|fr] "
255 "[--data-root <absolute folder>] "
256 "[--data-overrides <absolute manifest.tsv>] "
257 "[--check-resources] [--voice-host IPv4:port | "
258 "--voice-connect IPv4:port | --network-host IPv4:port | "
259 "--network-connect IPv4:port]\n"
260 "Network menu without arguments hosts on 0.0.0.0:28799.\n";
262 if (
networkArguments.size() != 2 || (mode !=
"--voice-host" && mode !=
"--voice-connect" &&
263 mode !=
"--network-host" && mode !=
"--network-connect"))
286 networkHost = mode ==
"--voice-host" || mode ==
"--network-host";
296 std::cerr <<
"Invalid --data-root: " << selected.error() <<
'\n';
306 std::cerr <<
"Invalid --data-overrides: "
307 << selected.error() <<
'\n';
320 std::cerr <<
"SDL_Init failed: " <<
SDL_GetError() <<
'\n';
327 std::cerr <<
"SDL audio unavailable at startup: "
348 std::cerr <<
"SDL_CreateWindow failed: " <<
SDL_GetError() <<
'\n';
357 std::cerr <<
"Window presentation setup failed: "
364 std::cout <<
"Presentation: "
405 std::cerr <<
"Game network startup failed: " <<
transport.error() <<
'\n';
418 std::cerr <<
"Voice network startup failed: " <<
transport.error() <<
'\n';
424 std::cerr <<
"Voice network owner could not be installed.\n";
530 std::cerr <<
"Fullscreen toggle failed: "
539 static_cast<std::int64_t
>(
552 static_cast<std::int64_t
>(
565 if (event.text.text !=
nullptr)
585 <<
"GPU frame submission failed: "
612 std::cerr <<
"Game startup failed.\n";
std::filesystem::path directory
std::atomic< bool > finished
int run(int argc, char **argv)
static std::array< std::int32_t, 2 > transformPoint(const sequence::Matrix2D &matrix, std::int32_t x, std::int32_t y) noexcept
std::expected< void, profile::Error > initializeMessageIngressProfiles(const std::filesystem::path &directory)
const State & stateReadOnly() noexcept
std::expected< ParsedModernSceneOptions, std::string > parseModernSceneArguments(std::span< const std::string_view > arguments)
engine::World3DRect worldViewport(Viewport3D viewport) noexcept
constexpr bool isBoardVisible(Screen2D screen) noexcept
const State & stateReadOnly()
void configureModernScene(data::ModernSceneOptions options) noexcept
bool runCyclicFunctions()
void stopVoiceChat() noexcept
bool initialize(SDL_Window *window, presentation::PresentMode presentMode)
void startOpeningMovies(bool startedByLobby)
SequencePlayback * sequencePlayback()
std::optional< LogicalPoint > windowToUIOverlay(const Transform &uiTransform, double windowX, double windowY) noexcept
Transform makeTransform(int targetWidth, int targetHeight) noexcept
PixelRect logicalToPixelRect(const Transform &transform, const LogicalRect &logicalRect) noexcept
std::optional< LogicalPoint > windowToLogical(const Transform &transform, double windowX, double windowY) noexcept
Transform makeWorld3DTransform(int targetWidth, int targetHeight) noexcept
std::expected< std::unique_ptr< Transport >, std::string > openTcpTransport(bool host, std::string_view address, std::uint16_t port, TcpSessionMode mode)
bool startNetwork(std::unique_ptr< Transport > transport)
void setNetworkStarter(std::function< bool()> starter)
void setLeftDown(bool down) noexcept
void updatePosition(int x, int y, bool inside) noexcept
const State & stateReadOnly() noexcept
void updateChatCursor(const chat::State &chat) noexcept
std::expected< Options, std::string > parseArguments(std::span< const std::string_view > arguments)
std::expected< void, std::string > configureWindow(SDL_Window *window, const Options &options)
std::string_view presentModeName(PresentMode mode) noexcept
std::string_view windowModeName(WindowMode mode) noexcept
std::pair< int, int > initialWindowSize(const Options &options) noexcept
SDL_WindowFlags windowFlags(const Options &options) noexcept
std::expected< void, std::string > toggleBorderlessFullscreen(SDL_Window *window, const Options &options)
std::expected< void, std::string > selectResourceContext(data::ResourceContext context)
ResourceSetupResult prepareResources(bool interactive)
std::expected< ResourceArguments, std::string > parseResourceArguments(std::span< const std::string_view > arguments)
std::expected< void, std::string > selectDataOverrideManifest(std::string_view utf8Path)
std::expected< void, std::string > selectResourceRoot(std::string_view utf8Root)
bool send(const Message &message)
constexpr std::int64_t MouseModifierControl
const tradeui::State & tradeStateReadOnly() noexcept