siglus_scene_vm/runtime/forms/
steam.rs1use 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}