Advanced gravity: Animation timing defaults to 1, tooltips in paragraphs

Players found the flat ground stutter goes away with Animation timing at 1, so
that is the default now: moving Gravity off 1 gives normal-gravity timing at
once, and the Advanced gravity fold is there to change it. Saved under a new
key (gravity_animation_timing), since 0.8.5 saved its default 0. The gravity
tooltips break into paragraphs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
andrewnakasandClaude Opus 5.5 committed 2026-10-21 16:52:37 -06:00
1 parent 4f8810f749
commit 382dd4b010
3 files changed
+26 -20

No files matched your search

+5 -4
View File
@@ -192,7 +192,7 @@ struct State {
// Advanced gravity: the gravity the game plans landings with (own off: the same as gravity), and how far the air
// animations keep the timing they have at the game's gravity (0 the game's, 1 all the way).
bool gravity_landing_own{};
float gravity_landing{1}, gravity_timing{};
float gravity_landing{1}, gravity_timing{1};
float grind_side{1}; // the sideways part of a pop out of a grind or slide
float grind_push{}; // Skate 3's pop: this many m/s sideways at full stick, the way the stick points (0: none)
// Skate 3's turn on a grind: the left stick alone turns the board, up to this many degrees either way (0: off, the
@@ -428,7 +428,8 @@ void load_store() {
s.gravity = std::clamp(o.value("gravity", 1.0f), gravity_low, gravity_high);
s.gravity_landing_own = o.value("gravity_landing_own", false);
s.gravity_landing = std::clamp(o.value("gravity_landing", 1.0f), gravity_low, gravity_high);
s.gravity_timing = std::clamp(o.value("gravity_timing", 0.0f), 0.0f, 1.0f);
// (0.8.5 saved its default 0 as "gravity_timing"; the default is 1 since 0.8.6, under a new key.)
s.gravity_timing = std::clamp(o.value("gravity_animation_timing", 1.0f), 0.0f, 1.0f);
s.grind_side = std::clamp(o.value("grind_side", 1.0f), 0.0f, 1.0e6f);
s.grind_push = std::clamp(o.value("grind_push", 0.0f), -1.0e6f, 1.0e6f);
// (grind_lean, grind_turn and grind_tip were levers of earlier builds that did nothing: read past.)
@@ -532,7 +533,7 @@ void save_store() {
options["gravity"] = s.gravity;
options["gravity_landing_own"] = s.gravity_landing_own;
options["gravity_landing"] = s.gravity_landing;
options["gravity_timing"] = s.gravity_timing;
options["gravity_animation_timing"] = s.gravity_timing;
options["grind_side"] = s.grind_side;
options["grind_push"] = s.grind_push;
options["grind_range"] = s.grind_range;
@@ -1203,7 +1204,7 @@ const std::vector<Setup> &setups() {
toggle("trick.underflip_split", topic_pop, &s.underflip_split);
toggle("trick.gravity_landing_own", topic_pop, &s.gravity_landing_own);
real("trick.gravity_landing", topic_pop, &s.gravity_landing, 1.0f, gravity_low, gravity_high);
real("trick.gravity_timing", topic_pop, &s.gravity_timing, 0.0f, 0.0f, 1.0f);
real("trick.gravity_timing", topic_pop, &s.gravity_timing, 1.0f, 0.0f, 1.0f);
for (std::size_t i = 0; i < flip_tricks.size(); ++i) {
real("trick." + std::string(flip_tricks[i].key), topic_pop, &s.flip_trick[i], 1.0f, flip_low, flip_high);
all->back().title = std::string(flip_tricks[i].label) + (i >= first_underflip_slot ? ": underflip speed" : ": flip speed");
+1 -1
View File
@@ -124,7 +124,7 @@ struct View {
bool gravity_live{true}; // false: this game build's gravity is not where the trainer knows it
bool gravity_landing_own{}; // landings are planned with gravity_landing, not with gravity
float gravity_landing{1}; // x the game's own gravity, for the game's landing plans
float gravity_timing{}; // 0: the game's animation timing in the air; 1: the timing at the game's own gravity
float gravity_timing{1}; // 0: the game's animation timing in the air; 1 (default): the timing at the game's own gravity
float grind_side{1}; // the sideways part of a pop out of a grind
float grind_push{}; // Skate 3's pop: m/s sideways at full stick (0: none)
float grind_range{}; // Skate 3's turn: the left stick turns the board on a grind up to this many degrees (0: off)
+20 -15
View File
@@ -62,7 +62,7 @@ struct Page {
std::uint64_t share_serial{}; // the last `preset export` put on the clipboard
bool share_seen{};
bool show_page{}, show_cheats{};
float gravity_edit{1}, gravity_landing_edit{1}, gravity_timing_edit{};
float gravity_edit{1}, gravity_landing_edit{1}, gravity_timing_edit{1};
bool gravity_editing{}, gravity_landing_editing{}, gravity_timing_editing{};
// QUICK SETTINGS: what is changed (kind 0 a section's line, 1 a dial, 2 one of the trainer's settings, 3 a value).
struct QuickItem {
@@ -1249,21 +1249,24 @@ void trick_heights(SkateMenu &menu, const CallbacksV3 &callbacks, Page &p, const
return true;
};
const bool gravity_shown = slider("Gravity", "gravity", view.gravity, p.gravity_edit, p.gravity_editing,
"Gravity in the air, on the board and on foot. 1 is the game's own. At 0.5 the same pop goes twice as high and hangs twice as long; at 2 you "
"drop twice as fast. It acts in the air only: rolling down a hill, grinds and a bailed skater are the game's own. The game aims an air off a "
"ramp back at the ramp with its own gravity, so with another gravity a vert air can come down somewhere else. It takes hold at once.",
"Gravity in the air, on the board and on foot. 1 is the game's own.\n\n"
"At 0.5 the same pop goes twice as high and hangs twice as long; at 2 you drop twice as fast.\n\n"
"It acts in the air only: rolling down a hill, grinds and a bailed skater are the game's own. The game aims an air off a "
"ramp back at the ramp with its own gravity, so with another gravity a vert air can come down somewhere else.\n\n"
"It takes hold at once. Advanced gravity below times the tricks and landings for it.",
3.0f);
if (gravity_shown && view.gravity != 1.0f && !view.gravity_live)
ImGui::TextDisabled("On foot this game build keeps its own gravity: the setting acts on the board only.");
if (gravity_shown && ImGui::TreeNodeEx("Advanced gravity", ImGuiTreeNodeFlags_SpanAvailWidth |
(view.gravity_landing_own || view.gravity_timing > 0 ? ImGuiTreeNodeFlags_DefaultOpen : 0))) {
(view.gravity_landing_own || view.gravity_timing != 1.0f ? ImGuiTreeNodeFlags_DefaultOpen : 0))) {
// Animation timing: 0 .. 1, not a multiplier.
field(menu, view.gravity_timing > 0 ? "Animation timing *" : "Animation timing",
"How the skater's tricks and landings are timed in the air when Gravity is not 1. 0 is the game's own: it fits a trick into "
"the time to land, but cannot hurry a catch, so with more gravity a catch can still be playing when the wheels touch and "
"the landing stutters. 1 plays the skater's animations faster by just as much as the flight is shorter (slower when it is "
"longer), so tricks, catches and landings look as they do at the game's own gravity; flips turn faster with it. In "
"between, part of the way.");
field(menu, view.gravity_timing != 1.0f ? "Animation timing *" : "Animation timing",
"How the skater's tricks and landings are timed in the air when Gravity is not 1.\n\n"
"1 (the default): the skater's animations play faster by just as much as the flight is shorter (slower when it is "
"longer), so tricks, catches and landings look as they do at the game's own gravity. Flips turn faster with it.\n\n"
"0: the game's own timing. It fits a trick into the time to land but cannot hurry a catch, so with more gravity a "
"catch can still be playing when the wheels touch and the landing stutters.\n\n"
"In between: part of the way.");
ImGui::PushID("gravity_timing");
float timing = p.gravity_timing_editing ? p.gravity_timing_edit : view.gravity_timing;
const bool moved = console_style() ? slider_float("##timing", &timing, 0.0f, 1.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp)
@@ -1281,12 +1284,14 @@ void trick_heights(SkateMenu &menu, const CallbacksV3 &callbacks, Page &p, const
trainer_command(menu, callbacks, std::format("option gravity_landing_own {}", own ? 1 : 0));
if (ImGui::IsItemHovered())
wrapped_tooltip("%s", "The game plans every landing (where you come down, when, and the time its animations count down to) "
"with a gravity. Off: with Gravity, so the plan matches the flight. On: with Landing gravity below; a "
"plan with less gravity than the flight lands late (the board goes into the ground first), with more "
"it reaches for the ground early.");
"with a gravity.\n\n"
"Off: with Gravity, so the plan matches the flight.\n\n"
"On: with Landing gravity below. A plan with less gravity than the flight lands late (the board goes "
"into the ground first); with more it reaches for the ground early.");
if (own)
slider("Landing gravity", "gravity_landing", view.gravity_landing, p.gravity_landing_edit, p.gravity_landing_editing,
"The gravity the game plans landings with, as a multiple of its own. Set it to Gravity for landings that match the flight.",
"The gravity the game plans landings with, as a multiple of its own.\n\n"
"Set it to Gravity for landings that match the flight.",
3.0f, false, true);
ImGui::TreePop();
}