Skip to main content

siglus_scene_vm/runtime/forms/
input.rs

1use anyhow::Result;
2
3use crate::runtime::{CommandContext, Value};
4
5use super::key;
6
7fn current_chain(ctx: &CommandContext) -> Option<&[i32]> {
8    let vm_call = ctx.vm_call.as_ref()?;
9    Some(vm_call.element.as_slice())
10}
11
12pub fn dispatch(ctx: &mut CommandContext, form_id: u32, _args: &[Value]) -> Result<bool> {
13    let Some(chain) = current_chain(ctx) else {
14        return Ok(false);
15    };
16    if chain.len() < 2 || chain[0] != form_id as i32 {
17        return Ok(false);
18    }
19
20    let op = chain[1] as i64;
21    match op {
22        o if o == ctx.ids.input_op_clear as i64 => {
23            ctx.script_input.clear_all();
24            Ok(true)
25        }
26        o if o == ctx.ids.input_op_next as i64 => {
27            ctx.script_input.next_frame();
28            Ok(true)
29        }
30        o if o == ctx.ids.input_op_decide as i64 => {
31            if chain.len() == 2 {
32                ctx.push(Value::Element(chain.to_vec()));
33            } else {
34                let subop = chain[2] as i64;
35                let v = key::query(ctx, ctx.ids.exkey_decide as i64, subop);
36                ctx.push(Value::Int(v));
37            }
38            Ok(true)
39        }
40        o if o == ctx.ids.input_op_cancel as i64 => {
41            if chain.len() == 2 {
42                ctx.push(Value::Element(chain.to_vec()));
43            } else {
44                let subop = chain[2] as i64;
45                let v = key::query(ctx, ctx.ids.exkey_cancel as i64, subop);
46                ctx.push(Value::Int(v));
47            }
48            Ok(true)
49        }
50        _ => Ok(false),
51    }
52}