Keep launcher alive through Skate startup; trim per-frame client work

Launcher
- "Close the launcher when Skate starts" now hides the launcher and exits
  when Skate.exe does, instead of exiting as the splash opens. Outside a
  Steam library, Skate's protection closed the game (TerminateProcess 0x32)
  when the launcher exited during startup; players confirmed turning the
  setting off avoided it.
- STATUS tile warns when Steam isn't open or signed in that PLAY starts
  offline as Unknown Player (hidden when Offline mode is chosen or while
  launching).
- Setting description updated to match.
Startup interventions (20260929)
- exit_return 0x87755f2 -> 0x87fe7fb: the last LEA RSP,[RSP]; JMP stub
  before the PUSHFQ / LOCK CMPXCHG routine, as 0x87367cf was in 20260908,
  and the return address player logs show. Only enforced once a frame site
  is armed; this build's protector has no equivalent rep stosb frame clear.
Client frame cost (profiled 2026-10-02)
- Transform interpolate is inline plain arithmetic (~1% of an MP frame).
- Script gameplay-setting and native-setting gets are served from small
  per-thread caches keyed on asset/key address, name prefix and a new
  profile::Store::changes() counter, instead of a store lookup each call.
- Hot-path reads in client tick, native settings and population controls
  use memory::peek instead of ReadProcessMemory.
- Script error logging probes each argument pointer once.
This commit is contained in:
AyeZeeBB committed 2026-10-02 18:56:57 -05:00
1 parent ca1d82f636
commit b7932535e5
17 files changed
+177 -60

No files matched your search

-18
View File
@@ -965,24 +965,6 @@ std::uint64_t map_hash(std::string_view value) noexcept {
}
return result;
}
Transform interpolate(const Transform &a, const Transform &b, float t) {
Transform out;
t = std::clamp(t, 0.0f, 1.0f);
for (unsigned i = 0; i < 3; ++i) {
out.position[i] = std::lerp(a.position[i], b.position[i], t);
out.scale[i] = std::lerp(a.scale[i], b.scale[i], t);
}
float dot{}, norm{};
for (unsigned i = 0; i < 4; ++i)
dot += a.rotation[i] * b.rotation[i];
for (unsigned i = 0; i < 4; ++i) {
out.rotation[i] = std::lerp(a.rotation[i], dot < 0 ? -b.rotation[i] : b.rotation[i], t);
norm += out.rotation[i] * out.rotation[i];
}
for (float &v : out.rotation)
v /= std::sqrt(norm);
return out;
}
std::array<float, 16> to_matrix(const Transform &t) {
const auto q = interpolate(t, t, 0).rotation;
const float x = q[0], y = q[1], z = q[2], w = q[3];