Skip to main content

siglus_scene_vm/runtime/forms/
steam.rs

1use anyhow::Result;
2
3use crate::runtime::forms::prop_access;
4use crate::runtime::{CommandContext, Value};
5
6pub fn dispatch(ctx: &mut CommandContext, form_id: u32, args: &[Value]) -> Result<bool> {
7    let parsed = prop_access::parse_element_chain_ctx(ctx, form_id, args);
8    let (chain_pos, chain) = match parsed {
9        Some((pos, ch)) if ch.len() >= 2 => (Some(pos), Some(ch)),
10        _ => (None, None),
11    };
12
13    if let Some(chain) = chain {
14        let op = chain[1];
15        let params = if let Some(pos) = chain_pos {
16            prop_access::script_args(args, pos)
17        } else {
18            &[]
19        };
20        let p_str = |i: usize| -> &str { params.get(i).and_then(|v| v.as_str()).unwrap_or("") };
21
22        if ctx.ids.steam_set_achievement != 0 && op == ctx.ids.steam_set_achievement {
23            let name = p_str(0);
24            if !name.is_empty() {
25                ctx.globals
26                    .str_props
27                    .entry(form_id)
28                    .or_default()
29                    .insert(op, name.to_string());
30                ctx.globals
31                    .int_props
32                    .entry(form_id)
33                    .or_default()
34                    .insert(op, 1);
35            }
36            ctx.push(Value::Int(0));
37            return Ok(true);
38        }
39
40        if ctx.ids.steam_reset_all_status != 0 && op == ctx.ids.steam_reset_all_status {
41            ctx.globals.int_props.remove(&form_id);
42            ctx.globals.str_props.remove(&form_id);
43            ctx.push(Value::Int(0));
44            return Ok(true);
45        }
46
47        prop_access::store_or_push_prop(ctx, form_id, op, chain_pos.unwrap(), args);
48        return Ok(true);
49    }
50
51    prop_access::dispatch_stateful_form(ctx, form_id, args);
52    Ok(true)
53}