Body step 2.1: climbing, mantling, crawling, legs, playground, 144 Hz

- Step rule + lower-body collider: no walking onto tables, steps <= 0.35 m
- Structural hand strength: two-hand mantle/pull-up works, one hand can't
- Arms aim from the physical shoulder horizontally, keep True Body pose vertically
- Crawl pose, crawl carry, 35 deg slope limit, ground feed-forward ignores
  play-space corrections (fixes a runaway feedback loop)
- Grab static world (climbing), procedural visual legs
- Playground sandbox; menu strength slider, spectator (old drag) and turn toggles
- Physics 144 Hz with interpolation; legacy chase-body spikes pin 90 Hz
- RagdollSpike: 27 phases incl. mantle, pull-up, crawl, ledge drop, ramps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
FoxyzandClaude Opus 5.5 committed 2026-10-02 07:56:08 +03:00
1 parent d83273dd2f
commit 2aff2b61da
26 files changed
+1243 -70

No files matched your search

+58
View File
@@ -18,6 +18,9 @@ public partial class MainMenu : PanelContainer
public event Action PingRequested;
public event Action CloseRequested;
public event Action Clicked;
public event Action<bool> SpectatorToggled;
public event Action<bool> SmoothTurnToggled;
public event Action<float> StrengthChanged;
public TabContainer Tabs { get; private set; }
public Button ReturnToSpawnButton { get; private set; }
@@ -27,6 +30,9 @@ public partial class MainMenu : PanelContainer
public Button CloseButton { get; private set; }
public Button HeaderCloseButton { get; private set; }
public HSlider ClickVolumeSlider { get; private set; }
public HSlider StrengthSlider { get; private set; }
public Button SpectatorButton { get; private set; }
public Button TurnModeButton { get; private set; }
public ScrollContainer LogScroll { get; private set; }
private Label _fpsLabel;
@@ -116,6 +122,39 @@ public partial class MainMenu : PanelContainer
_calibrationStatus.AddThemeColorOverride("font_color", new Color(0.6f, 0.6f, 0.65f));
calibRow.AddChild(_calibrationStatus);
player.AddChild(calibRow);
// Nimso's single strength value: every muscle and the hand guides scale with it.
HBoxContainer strengthRow = new();
strengthRow.AddThemeConstantOverride("separation", 20);
Label strengthLabel = new() { Text = "Strength 1.00×", VerticalAlignment = VerticalAlignment.Center, CustomMinimumSize = new Vector2(220, 0) };
strengthRow.AddChild(strengthLabel);
StrengthSlider = new HSlider
{
MinValue = 0.25,
MaxValue = 3,
Step = 0.05,
Value = 1,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ShrinkCenter,
CustomMinimumSize = new Vector2(0, 48),
FocusMode = FocusModeEnum.None,
};
StrengthSlider.ValueChanged += v =>
{
strengthLabel.Text = $"Strength {v:0.00}×";
StrengthChanged?.Invoke((float)v);
};
strengthRow.AddChild(StrengthSlider);
player.AddChild(strengthRow);
HBoxContainer modeRow = new();
modeRow.AddThemeConstantOverride("separation", 16);
TurnModeButton = MakeToggle("Turning: snap", "Turning: smooth", on => SmoothTurnToggled?.Invoke(on));
modeRow.AddChild(TurnModeButton);
// Spectator: no body; fly around by grabbing the air (the old drag movement).
SpectatorButton = MakeToggle("Spectator: off", "Spectator: on (grab-fly)", on => SpectatorToggled?.Invoke(on));
modeRow.AddChild(SpectatorButton);
player.AddChild(modeRow);
Tabs.AddChild(player);
// World
@@ -180,6 +219,25 @@ public partial class MainMenu : PanelContainer
return page;
}
private Button MakeToggle(string offText, string onText, Action<bool> changed)
{
Button button = new()
{
Text = offText,
ToggleMode = true,
CustomMinimumSize = new Vector2(0, ButtonHeight),
SizeFlagsHorizontal = SizeFlags.ExpandFill,
FocusMode = FocusModeEnum.None,
};
button.Toggled += on =>
{
button.Text = on ? onText : offText;
Clicked?.Invoke();
Callable.From(() => changed(on)).CallDeferred();
};
return button;
}
private Button MakeButton(string text, Action action)
{
Button button = new()