feat(video): 实现 FreeMode 状态随机游走

- 修改 select_next_state():FreeMode 无 next_state/next_states 时按权重随机选择 FreeMode 状态
- 新增 select_random_free_state() 方法实现权重随机算法
- InteractiveMode 保持原行为(停留当前状态)
- 新增单元测试验证随机游走和 InteractiveMode 行为
- 所有测试通过(24/24)

旧版行为回补完成。
This commit is contained in:
showen
2026-03-12 13:00:59 +08:00
parent 6ca5992b33
commit e45573f839
2 changed files with 62 additions and 2 deletions

View File

@@ -538,7 +538,7 @@ mod tests {
#[test]
fn interactive_mode_stays_in_same_state_when_no_next_state_configured() {
let mut machine = StateMachine::new(config_with_states([StateConfig {
let states = vec![StateConfig {
name: "interactive".to_string(),
mode: StateMode::InteractiveMode,
sequence: vec![step("interactive")],
@@ -548,7 +548,20 @@ mod tests {
weight: 1.0,
defer_triggers: false,
ignore_triggers: false,
}]));
}];
let states_map = states
.into_iter()
.map(|state| {
let name = state.name.clone();
(name, state)
})
.collect::<HashMap<_, _>>();
let mut machine = StateMachine::new(StateMachineConfig {
initial_state: "interactive".to_string(),
states: states_map,
});
machine.start().expect("state machine should start");
assert!(!machine