Files
ReSkate/Launcher/launch.h
T
AyeZeeBB b67fe93e55 Crashes: guards for 2.1.1's top crash sites, launcher checks, stuck-load reports, quieter logs
From 2.1.1's Sentry reports (60,000 in three days, 2026-10-21):
- Textures: a stale render texture handle takes the game's default texture instead of reading
  through null (Skate.exe+0x3e897fb, a third of all reports, every one with TheVlixOne-Nike_Pack 2.3.x).
- Physics: the wake pass's bitset is made as long as the world's owner list once indices pass
  20000, after long multiplayer sessions (+0x3d99e2f, +0x3d9ee43, +0x3d9ee47).
- Music: more than 1024 candidates are picked by ReSkate; the game's shuffle wrote past its stack table.
- Streaming: a staged read's piece that reaches past its 64 KB buffer is left unfilled (VCRUNTIME memcpy).
- Multiplayer: a remote skater or board whose parent bus link is damaged is left alive instead of
  destroyed (+0x2b94cd0).
- Mesh pool: on an integrated GPU its budget is capped by the RAM and page file free; the Memory
  line says what the PC has left.
Launcher:
- A folder with non-ASCII letters is a hard stop (the boot crash +0x18df4cf came after "Start anyway").
- The game's data files are checked against the supported build's sizes (from Steam's manifest);
  missing, cut-short or online-only files send the player to verifying.
- One game per folder: the launcher will not merge or start while one runs there, and ReSkate.dll
  holds the folder's mutex.
- Advice on the ready screen for PCs short of RAM and page file; reports carry pc.ram_gb and
  pc.commit_free_gb.
Stuck loads:
- A load in one stage for two minutes sends a stuck-load report (every thread's stack and the log,
  error.type stall, load.stage, load.seconds) while the game goes on (crash protocol 6).
- A load the player closes sends its timing with the stage it was in.
Logs: the PanelTrace diagnostics and the neighborhood unlock override's observation lines are gone.
2026-10-21 18:10:58 -05:00

65 lines
3.4 KiB
C++

#pragma once
#include "Engine/Core/Platform/launcher_support.h"
#include "updater.h"
#include <filesystem>
#include <functional>
#include <string>
#include <vector>
namespace dingosdk::launcher_app {
struct Session {
std::filesystem::path self;
launcher::SiblingPaths paths;
};
// Resolves ReSkateLauncher.exe and its sibling game files and opens ReSkate.log.
Session open_session(const std::string& log_level);
// Skate.exe and steam_api64.dll are present and exactly the supported build.
bool game_files_supported(const launcher::SiblingPaths& paths);
// The build number the installed game's data says it is (Data\layout.toc), or empty when
// there is none or it cannot be read.
std::string game_data_build(const launcher::SiblingPaths& paths);
// Whether the game's data is missing or of another build than the supported one, whatever
// Skate.exe is: Steam updated the game under it, a copy of an updated game was put here, or a
// download stopped part-way. Such a game has to be verified against the supported build, file
// by file, not only topped up. Also true when a file of the supported build's data is missing,
// of another size, or kept online only by a cloud folder (game_data_damage). False when the
// data's build cannot be told and every file is there.
bool game_data_mismatched(const launcher::SiblingPaths& paths);
// Advice for a PC whose RAM and page file are too small for the game with mods; empty when they
// are enough.
std::string memory_advice();
// What is wrong with the game's data files against the supported build's list, for the log; empty
// when every file is there, of its size, and on this PC.
std::string game_data_damage(const launcher::SiblingPaths& paths);
// The config's depot/manifest ships the build this launcher was compiled for.
bool config_matches_build(const launcher_update::Config& config);
void relaunch(const std::filesystem::path& self, const std::vector<std::wstring>& arguments);
// Under Wine/Proton with MangoHud on, restarts the launcher with MangoHud off for
// its own window and returns true. The game it starts still gets MangoHud.
bool relaunch_without_mangohud(const std::filesystem::path& self, const std::vector<std::wstring>& arguments);
// Steam's client process is running and signed in to an account (or, started by the native
// Steam client through a compatibility tool, it has a signed-in account). When it is not,
// start_game runs the game in offline mode.
bool steam_signed_in();
// Running under Wine (Proton, or a Wine-based tool on macOS).
bool under_wine();
// Why steam_signed_in() is false, for ReSkate.log; empty when it is true.
std::wstring steam_offline_reason();
// Display name of the signed-in Steam account (UTF-8), or empty when Steam is
// not running, signed out, or the name cannot be read.
std::string steam_persona_name();
// The signed-in account's profile picture in Steam's avatar cache, or empty
// when Steam is not running, signed out, or has not cached it.
std::filesystem::path steam_avatar_path();
// Validates, starts, injects and resumes Skate; returns its process id.
// `created` receives the id as soon as the process exists (ReSkate's startup
// splash can open before this returns). Throws a user-facing message.
DWORD start_game(const Session& session, const launcher::LaunchOptions& options,
const std::function<void(DWORD)>& created = {});
} // namespace dingosdk::launcher_app