fix(runtime): align portal and movement presentation
Port retail portal viewport projection and reveal behavior, preserve outbound combat style, drive remote and local grounded movement from authored CSequence root frames, and reuse the local prepared pose so animation hooks advance once. User-verified portal, observer movement, combat stance, and short-tap locomotion gates. Release build passed with 5,767 tests and five intentional skips. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
e95f55f25b
commit
124e046976
30 changed files with 1362 additions and 348 deletions
|
|
@ -215,7 +215,12 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
probe,
|
||||
bindings.Probe.ScriptPath,
|
||||
bindings.Probe.DumpOnStart,
|
||||
bindings.Probe.Log);
|
||||
bindings.Probe.Log,
|
||||
text => ChatCommandRouter.Submit(
|
||||
text,
|
||||
bindings.Chat.ViewModel,
|
||||
bindings.Chat.CommandBus(),
|
||||
ChatChannelKind.Say));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ public sealed class RetailUiAutomationScriptRunner
|
|||
{
|
||||
private readonly RetailUiAutomationProbe _probe;
|
||||
private readonly Action<string> _log;
|
||||
private readonly Action<string>? _submitCommand;
|
||||
private readonly List<ScriptCommand> _commands = new();
|
||||
private readonly bool _dumpOnStart;
|
||||
private readonly string? _loadError;
|
||||
|
|
@ -30,10 +31,12 @@ public sealed class RetailUiAutomationScriptRunner
|
|||
RetailUiAutomationProbe probe,
|
||||
string? scriptPath,
|
||||
bool dumpOnStart,
|
||||
Action<string>? log = null)
|
||||
Action<string>? log = null,
|
||||
Action<string>? submitCommand = null)
|
||||
{
|
||||
_probe = probe ?? throw new ArgumentNullException(nameof(probe));
|
||||
_log = log ?? (_ => { });
|
||||
_submitCommand = submitCommand;
|
||||
_dumpOnStart = dumpOnStart;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(scriptPath))
|
||||
|
|
@ -125,6 +128,7 @@ public sealed class RetailUiAutomationScriptRunner
|
|||
"wait" => DoWait(command),
|
||||
"sleep" => DoSleep(command),
|
||||
"assert" => DoAssert(command),
|
||||
"command" => DoCommand(command),
|
||||
_ => Stop(command, $"unknown command '{p[0]}'"),
|
||||
};
|
||||
}
|
||||
|
|
@ -264,6 +268,18 @@ public sealed class RetailUiAutomationScriptRunner
|
|||
return result.Success || Stop(command, result.Message);
|
||||
}
|
||||
|
||||
private bool DoCommand(ScriptCommand command)
|
||||
{
|
||||
string text = command.Text[command.Parts[0].Length..].Trim();
|
||||
if (text.Length == 0)
|
||||
return Stop(command, "usage: command <chat-or-client-command>");
|
||||
if (_submitCommand is null)
|
||||
return Stop(command, "command submission is unavailable");
|
||||
|
||||
_submitCommand(text);
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool WaitOrTimeout(ScriptCommand command, int timeoutMs, string label)
|
||||
{
|
||||
if (_elapsedMs - _commandStartMs <= timeoutMs) return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue