Skip to main content

siglus_scene_vm/runtime/forms/
script.rs

1use anyhow::Result;
2
3use crate::runtime::{CommandContext, Value};
4
5use super::prop_access;
6
7const SET_AUTO_SAVEPOINT_OFF: i32 =
8    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_SAVEPOINT_OFF;
9const SET_AUTO_SAVEPOINT_ON: i32 =
10    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_SAVEPOINT_ON;
11const SET_SKIP_DISABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_SKIP_DISABLE;
12const SET_SKIP_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_SKIP_ENABLE;
13const SET_SKIP_DISABLE_FLAG: i32 =
14    crate::runtime::constants::elm_value::SCRIPT_SET_SKIP_DISABLE_FLAG;
15const GET_SKIP_DISABLE_FLAG: i32 =
16    crate::runtime::constants::elm_value::SCRIPT_GET_SKIP_DISABLE_FLAG;
17const SET_CTRL_SKIP_DISABLE: i32 =
18    crate::runtime::constants::elm_value::SCRIPT_SET_CTRL_SKIP_DISABLE;
19const SET_CTRL_SKIP_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_CTRL_SKIP_ENABLE;
20const SET_CTRL_SKIP_DISABLE_FLAG: i32 =
21    crate::runtime::constants::elm_value::SCRIPT_SET_CTRL_SKIP_DISABLE_FLAG;
22const GET_CTRL_SKIP_DISABLE_FLAG: i32 =
23    crate::runtime::constants::elm_value::SCRIPT_GET_CTRL_SKIP_DISABLE_FLAG;
24const CHECK_SKIP: i32 = crate::runtime::constants::elm_value::SCRIPT_CHECK_SKIP;
25const SET_STOP_SKIP_BY_KEY_DISABLE: i32 =
26    crate::runtime::constants::elm_value::SCRIPT_SET_STOP_SKIP_BY_KEY_DISABLE;
27const SET_STOP_SKIP_BY_KEY_ENABLE: i32 =
28    crate::runtime::constants::elm_value::SCRIPT_SET_STOP_SKIP_BY_KEY_ENABLE;
29const SET_END_MSG_BY_KEY_DISABLE: i32 =
30    crate::runtime::constants::elm_value::SCRIPT_SET_END_MSG_BY_KEY_DISABLE;
31const SET_END_MSG_BY_KEY_ENABLE: i32 =
32    crate::runtime::constants::elm_value::SCRIPT_SET_END_MSG_BY_KEY_ENABLE;
33const SET_SKIP_UNREAD_MESSAGE_FLAG: i32 =
34    crate::runtime::constants::elm_value::SCRIPT_SET_SKIP_UNREAD_MESSAGE_FLAG;
35const GET_SKIP_UNREAD_MESSAGE_FLAG: i32 =
36    crate::runtime::constants::elm_value::SCRIPT_GET_SKIP_UNREAD_MESSAGE_FLAG;
37const START_AUTO_MODE: i32 = crate::runtime::constants::elm_value::SCRIPT_START_AUTO_MODE;
38const END_AUTO_MODE: i32 = crate::runtime::constants::elm_value::SCRIPT_END_AUTO_MODE;
39const SET_AUTO_MODE_MOJI_WAIT: i32 =
40    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_MODE_MOJI_WAIT;
41const SET_AUTO_MODE_MOJI_WAIT_DEFAULT: i32 =
42    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_MODE_MOJI_WAIT_DEFAULT;
43const GET_AUTO_MODE_MOJI_WAIT: i32 =
44    crate::runtime::constants::elm_value::SCRIPT_GET_AUTO_MODE_MOJI_WAIT;
45const SET_AUTO_MODE_MIN_WAIT: i32 =
46    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_MODE_MIN_WAIT;
47const SET_AUTO_MODE_MIN_WAIT_DEFAULT: i32 =
48    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_MODE_MIN_WAIT_DEFAULT;
49const GET_AUTO_MODE_MIN_WAIT: i32 =
50    crate::runtime::constants::elm_value::SCRIPT_GET_AUTO_MODE_MIN_WAIT;
51const SET_AUTO_MODE_MOJI_CNT: i32 =
52    crate::runtime::constants::elm_value::SCRIPT_SET_AUTO_MODE_MOJI_CNT;
53const SET_MOUSE_CURSOR_HIDE_ONOFF: i32 =
54    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_CURSOR_HIDE_ONOFF;
55const SET_MOUSE_CURSOR_HIDE_ONOFF_DEFAULT: i32 =
56    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_CURSOR_HIDE_ONOFF_DEFAULT;
57const GET_MOUSE_CURSOR_HIDE_ONOFF: i32 =
58    crate::runtime::constants::elm_value::SCRIPT_GET_MOUSE_CURSOR_HIDE_ONOFF;
59const SET_MOUSE_CURSOR_HIDE_TIME: i32 =
60    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_CURSOR_HIDE_TIME;
61const SET_MOUSE_CURSOR_HIDE_TIME_DEFAULT: i32 =
62    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_CURSOR_HIDE_TIME_DEFAULT;
63const GET_MOUSE_CURSOR_HIDE_TIME: i32 =
64    crate::runtime::constants::elm_value::SCRIPT_GET_MOUSE_CURSOR_HIDE_TIME;
65const SET_MESSAGE_SPEED: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MESSAGE_SPEED;
66const SET_MESSAGE_SPEED_DEFAULT: i32 =
67    crate::runtime::constants::elm_value::SCRIPT_SET_MESSAGE_SPEED_DEFAULT;
68const GET_MESSAGE_SPEED: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_MESSAGE_SPEED;
69const SET_MESSAGE_NOWAIT_FLAG: i32 =
70    crate::runtime::constants::elm_value::SCRIPT_SET_MESSAGE_NOWAIT_FLAG;
71const GET_MESSAGE_NOWAIT_FLAG: i32 =
72    crate::runtime::constants::elm_value::SCRIPT_GET_MESSAGE_NOWAIT_FLAG;
73const SET_MSG_ASYNC_MODE_ON: i32 =
74    crate::runtime::constants::elm_value::SCRIPT_SET_MSG_ASYNC_MODE_ON;
75const SET_MSG_ASYNC_MODE_ON_ONCE: i32 =
76    crate::runtime::constants::elm_value::SCRIPT_SET_MSG_ASYNC_MODE_ON_ONCE;
77const SET_MSG_ASYNC_MODE_OFF: i32 =
78    crate::runtime::constants::elm_value::SCRIPT_SET_MSG_ASYNC_MODE_OFF;
79const SET_HIDE_MWND_DISABLE: i32 =
80    crate::runtime::constants::elm_value::SCRIPT_SET_HIDE_MWND_DISABLE;
81const SET_HIDE_MWND_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_HIDE_MWND_ENABLE;
82const SET_MSG_BACK_DISABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_DISABLE;
83const SET_MSG_BACK_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_ENABLE;
84const SET_MSG_BACK_OFF: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_OFF;
85const SET_MSG_BACK_ON: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_ON;
86const SET_MSG_BACK_DISP_OFF: i32 =
87    crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_DISP_OFF;
88const SET_MSG_BACK_DISP_ON: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MSG_BACK_DISP_ON;
89const SET_MOUSE_DISP_OFF: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_DISP_OFF;
90const SET_MOUSE_DISP_ON: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_DISP_ON;
91const SET_MOUSE_MOVE_BY_KEY_DISABLE: i32 =
92    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_MOVE_BY_KEY_DISABLE;
93const SET_MOUSE_MOVE_BY_KEY_ENABLE: i32 =
94    crate::runtime::constants::elm_value::SCRIPT_SET_MOUSE_MOVE_BY_KEY_ENABLE;
95const SET_KEY_DISABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_KEY_DISABLE;
96const SET_KEY_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_KEY_ENABLE;
97const SET_MWND_ANIME_OFF_FLAG: i32 =
98    crate::runtime::constants::elm_value::SCRIPT_SET_MWND_ANIME_OFF_FLAG;
99const GET_MWND_ANIME_OFF_FLAG: i32 =
100    crate::runtime::constants::elm_value::SCRIPT_GET_MWND_ANIME_OFF_FLAG;
101const SET_MWND_ANIME_ON_FLAG: i32 =
102    crate::runtime::constants::elm_value::SCRIPT_SET_MWND_ANIME_ON_FLAG;
103const GET_MWND_ANIME_ON_FLAG: i32 =
104    crate::runtime::constants::elm_value::SCRIPT_GET_MWND_ANIME_ON_FLAG;
105const SET_MWND_DISP_OFF_FLAG: i32 =
106    crate::runtime::constants::elm_value::SCRIPT_SET_MWND_DISP_OFF_FLAG;
107const GET_MWND_DISP_OFF_FLAG: i32 =
108    crate::runtime::constants::elm_value::SCRIPT_GET_MWND_DISP_OFF_FLAG;
109const SET_KOE_DONT_STOP_ON_FLAG: i32 =
110    crate::runtime::constants::elm_value::SCRIPT_SET_KOE_DONT_STOP_ON_FLAG;
111const GET_KOE_DONT_STOP_ON_FLAG: i32 =
112    crate::runtime::constants::elm_value::SCRIPT_GET_KOE_DONT_STOP_ON_FLAG;
113const SET_KOE_DONT_STOP_OFF_FLAG: i32 =
114    crate::runtime::constants::elm_value::SCRIPT_SET_KOE_DONT_STOP_OFF_FLAG;
115const GET_KOE_DONT_STOP_OFF_FLAG: i32 =
116    crate::runtime::constants::elm_value::SCRIPT_GET_KOE_DONT_STOP_OFF_FLAG;
117const SET_SHORTCUT_ENABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_SHORTCUT_ENABLE;
118const SET_SHORTCUT_DISABLE: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_SHORTCUT_DISABLE;
119const SET_QUAKE_STOP_FLAG: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_QUAKE_STOP_FLAG;
120const GET_QUAKE_STOP_FLAG: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_QUAKE_STOP_FLAG;
121const SET_EMOTE_MOUTH_STOP_FLAG: i32 =
122    crate::runtime::constants::elm_value::SCRIPT_SET_EMOTE_MOUTH_STOP_FLAG;
123const GET_EMOTE_MOUTH_STOP_FLAG: i32 =
124    crate::runtime::constants::elm_value::SCRIPT_GET_EMOTE_MOUTH_STOP_FLAG;
125const START_BGMFADE: i32 = crate::runtime::constants::elm_value::SCRIPT_START_BGMFADE;
126const END_BGMFADE: i32 = crate::runtime::constants::elm_value::SCRIPT_END_BGMFADE;
127const SET_VSYNC_WAIT_OFF_FLAG: i32 =
128    crate::runtime::constants::elm_value::SCRIPT_SET_VSYNC_WAIT_OFF_FLAG;
129const GET_VSYNC_WAIT_OFF_FLAG: i32 =
130    crate::runtime::constants::elm_value::SCRIPT_GET_VSYNC_WAIT_OFF_FLAG;
131const SET_SKIP_TRIGGER: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_SKIP_TRIGGER;
132const IGNORE_R_ON: i32 = crate::runtime::constants::elm_value::SCRIPT_IGNORE_R_ON;
133const IGNORE_R_OFF: i32 = crate::runtime::constants::elm_value::SCRIPT_IGNORE_R_OFF;
134const SET_CURSOR_NO: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_CURSOR_NO;
135const GET_CURSOR_NO: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_CURSOR_NO;
136const SET_TIME_STOP_FLAG: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_TIME_STOP_FLAG;
137const GET_TIME_STOP_FLAG: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_TIME_STOP_FLAG;
138const SET_COUNTER_TIME_STOP_FLAG: i32 =
139    crate::runtime::constants::elm_value::SCRIPT_SET_COUNTER_TIME_STOP_FLAG;
140const GET_COUNTER_TIME_STOP_FLAG: i32 =
141    crate::runtime::constants::elm_value::SCRIPT_GET_COUNTER_TIME_STOP_FLAG;
142const SET_FRAME_ACTION_TIME_STOP_FLAG: i32 =
143    crate::runtime::constants::elm_value::SCRIPT_SET_FRAME_ACTION_TIME_STOP_FLAG;
144const GET_FRAME_ACTION_TIME_STOP_FLAG: i32 =
145    crate::runtime::constants::elm_value::SCRIPT_GET_FRAME_ACTION_TIME_STOP_FLAG;
146const SET_STAGE_TIME_STOP_FLAG: i32 =
147    crate::runtime::constants::elm_value::SCRIPT_SET_STAGE_TIME_STOP_FLAG;
148const GET_STAGE_TIME_STOP_FLAG: i32 =
149    crate::runtime::constants::elm_value::SCRIPT_GET_STAGE_TIME_STOP_FLAG;
150const SET_FONT_NAME: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_FONT_NAME;
151const SET_FONT_NAME_DEFAULT: i32 =
152    crate::runtime::constants::elm_value::SCRIPT_SET_FONT_NAME_DEFAULT;
153const GET_FONT_NAME: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_FONT_NAME;
154const SET_FONT_BOLD: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_FONT_BOLD;
155const SET_FONT_BOLD_DEFAULT: i32 =
156    crate::runtime::constants::elm_value::SCRIPT_SET_FONT_BOLD_DEFAULT;
157const GET_FONT_BOLD: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_FONT_BOLD;
158const SET_FONT_SHADOW: i32 = crate::runtime::constants::elm_value::SCRIPT_SET_FONT_SHADOW;
159const SET_FONT_SHADOW_DEFAULT: i32 =
160    crate::runtime::constants::elm_value::SCRIPT_SET_FONT_SHADOW_DEFAULT;
161const GET_FONT_SHADOW: i32 = crate::runtime::constants::elm_value::SCRIPT_GET_FONT_SHADOW;
162
163struct Call<'a> {
164    op: i32,
165    params: &'a [Value],
166}
167
168fn parse_call<'a>(ctx: &CommandContext, form_id: u32, args: &'a [Value]) -> Option<Call<'a>> {
169    let (chain_pos, chain) = prop_access::parse_element_chain_ctx(ctx, form_id, args)?;
170    if chain.len() < 2 {
171        return None;
172    }
173    let params = prop_access::script_args(args, chain_pos);
174    Some(Call {
175        op: chain[1],
176        params,
177    })
178}
179
180fn p_i64(params: &[Value], idx: usize) -> i64 {
181    params.get(idx).and_then(|v| v.as_i64()).unwrap_or(0)
182}
183
184fn p_bool(params: &[Value], idx: usize) -> bool {
185    p_i64(params, idx) != 0
186}
187
188fn p_str(params: &[Value], idx: usize) -> String {
189    params
190        .get(idx)
191        .and_then(|v| v.as_str())
192        .unwrap_or("")
193        .to_string()
194}
195
196pub fn dispatch(ctx: &mut CommandContext, form_id: u32, args: &[Value]) -> Result<bool> {
197    let Some(call) = parse_call(ctx, form_id, args) else {
198        return Ok(false);
199    };
200    let op = call.op;
201    let params = call.params;
202    let st = &mut ctx.globals.script;
203
204    match op {
205        SET_AUTO_SAVEPOINT_OFF => st.dont_set_save_point = true,
206        SET_AUTO_SAVEPOINT_ON => st.dont_set_save_point = false,
207        SET_SKIP_DISABLE => st.skip_disable = true,
208        SET_SKIP_ENABLE => st.skip_disable = false,
209        SET_SKIP_DISABLE_FLAG => st.skip_disable = p_bool(params, 0),
210        GET_SKIP_DISABLE_FLAG => {
211            let v = if st.skip_disable { 1 } else { 0 };
212            ctx.push(Value::Int(v));
213            return Ok(true);
214        }
215        SET_CTRL_SKIP_DISABLE => st.ctrl_disable = true,
216        SET_CTRL_SKIP_ENABLE => st.ctrl_disable = false,
217        SET_CTRL_SKIP_DISABLE_FLAG => st.ctrl_disable = p_bool(params, 0),
218        GET_CTRL_SKIP_DISABLE_FLAG => {
219            let v = if st.ctrl_disable { 1 } else { 0 };
220            ctx.push(Value::Int(v));
221            return Ok(true);
222        }
223        CHECK_SKIP => {
224            let v = !st.skip_disable && (st.skip_trigger || st.auto_mode_flag || st.msg_nowait);
225            if std::env::var_os("SG_DEBUG").is_some()
226                && ctx.current_scene_name.as_deref() == Some("sys10_cf01")
227                && matches!(ctx.current_line_no, 700..=730 | 870..=895)
228            {
229                let scene_no = ctx
230                    .current_scene_no
231                    .map(|n| n.to_string())
232                    .unwrap_or_else(|| "-".to_string());
233                eprintln!(
234                    "[SG_DEBUG][CF_CONDITION_TRACE] scene=sys10_cf01 scene_no={} line={} kind=SCRIPT_CHECK_SKIP result={} skip_disable={} skip_trigger={} auto_mode_flag={} msg_nowait={}",
235                    scene_no,
236                    ctx.current_line_no,
237                    if v { 1 } else { 0 },
238                    st.skip_disable,
239                    st.skip_trigger,
240                    st.auto_mode_flag,
241                    st.msg_nowait
242                );
243            }
244            ctx.push(Value::Int(if v { 1 } else { 0 }));
245            return Ok(true);
246        }
247        SET_STOP_SKIP_BY_KEY_DISABLE => st.not_stop_skip_by_click = true,
248        SET_STOP_SKIP_BY_KEY_ENABLE => st.not_stop_skip_by_click = false,
249        SET_END_MSG_BY_KEY_DISABLE => st.not_skip_msg_by_click = true,
250        SET_END_MSG_BY_KEY_ENABLE => st.not_skip_msg_by_click = false,
251        SET_SKIP_UNREAD_MESSAGE_FLAG => st.skip_unread_message = p_bool(params, 0),
252        GET_SKIP_UNREAD_MESSAGE_FLAG => {
253            let v = if st.skip_unread_message { 1 } else { 0 };
254            ctx.push(Value::Int(v));
255            return Ok(true);
256        }
257        START_AUTO_MODE => st.auto_mode_flag = true,
258        END_AUTO_MODE => st.auto_mode_flag = false,
259        SET_AUTO_MODE_MOJI_WAIT => st.auto_mode_moji_wait = p_i64(params, 0),
260        SET_AUTO_MODE_MOJI_WAIT_DEFAULT => st.auto_mode_moji_wait = -1,
261        GET_AUTO_MODE_MOJI_WAIT => {
262            let v = st.auto_mode_moji_wait;
263            ctx.push(Value::Int(v));
264            return Ok(true);
265        }
266        SET_AUTO_MODE_MIN_WAIT => st.auto_mode_min_wait = p_i64(params, 0),
267        SET_AUTO_MODE_MIN_WAIT_DEFAULT => st.auto_mode_min_wait = -1,
268        GET_AUTO_MODE_MIN_WAIT => {
269            let v = st.auto_mode_min_wait;
270            ctx.push(Value::Int(v));
271            return Ok(true);
272        }
273        SET_AUTO_MODE_MOJI_CNT => st.auto_mode_moji_cnt = p_i64(params, 0),
274        SET_MOUSE_CURSOR_HIDE_ONOFF => st.mouse_cursor_hide_onoff = p_i64(params, 0),
275        SET_MOUSE_CURSOR_HIDE_ONOFF_DEFAULT => st.mouse_cursor_hide_onoff = -1,
276        GET_MOUSE_CURSOR_HIDE_ONOFF => {
277            let v = st.mouse_cursor_hide_onoff;
278            ctx.push(Value::Int(v));
279            return Ok(true);
280        }
281        SET_MOUSE_CURSOR_HIDE_TIME => st.mouse_cursor_hide_time = p_i64(params, 0),
282        SET_MOUSE_CURSOR_HIDE_TIME_DEFAULT => st.mouse_cursor_hide_time = -1,
283        GET_MOUSE_CURSOR_HIDE_TIME => {
284            let v = st.mouse_cursor_hide_time;
285            ctx.push(Value::Int(v));
286            return Ok(true);
287        }
288        SET_MESSAGE_SPEED => st.msg_speed = p_i64(params, 0),
289        SET_MESSAGE_SPEED_DEFAULT => st.msg_speed = -1,
290        GET_MESSAGE_SPEED => {
291            let v = st.msg_speed;
292            ctx.push(Value::Int(v));
293            return Ok(true);
294        }
295        SET_MESSAGE_NOWAIT_FLAG => st.msg_nowait = p_bool(params, 0),
296        GET_MESSAGE_NOWAIT_FLAG => {
297            let v = if st.msg_nowait { 1 } else { 0 };
298            ctx.push(Value::Int(v));
299            return Ok(true);
300        }
301        SET_MSG_ASYNC_MODE_ON => {
302            st.async_msg_mode = true;
303            st.async_msg_mode_once = false;
304        }
305        SET_MSG_ASYNC_MODE_ON_ONCE => {
306            st.async_msg_mode = true;
307            st.async_msg_mode_once = true;
308        }
309        SET_MSG_ASYNC_MODE_OFF => {
310            st.async_msg_mode = false;
311            st.async_msg_mode_once = false;
312        }
313        SET_HIDE_MWND_DISABLE => st.hide_mwnd_disable = true,
314        SET_HIDE_MWND_ENABLE => st.hide_mwnd_disable = false,
315        SET_MSG_BACK_DISABLE => st.msg_back_disable = true,
316        SET_MSG_BACK_ENABLE => st.msg_back_disable = false,
317        SET_MSG_BACK_OFF => st.msg_back_off = true,
318        SET_MSG_BACK_ON => st.msg_back_off = false,
319        SET_MSG_BACK_DISP_OFF => st.msg_back_disp_off = true,
320        SET_MSG_BACK_DISP_ON => st.msg_back_disp_off = false,
321        SET_MOUSE_DISP_OFF => st.cursor_disp_off = true,
322        SET_MOUSE_DISP_ON => st.cursor_disp_off = false,
323        SET_MOUSE_MOVE_BY_KEY_DISABLE => st.cursor_move_by_key_disable = true,
324        SET_MOUSE_MOVE_BY_KEY_ENABLE => st.cursor_move_by_key_disable = false,
325        SET_KEY_DISABLE => {
326            let vk = p_i64(params, 0);
327            if (0..=255).contains(&vk) {
328                st.key_disable.insert(vk as u8);
329            }
330        }
331        SET_KEY_ENABLE => {
332            let vk = p_i64(params, 0);
333            if (0..=255).contains(&vk) {
334                st.key_disable.remove(&(vk as u8));
335            }
336        }
337        SET_MWND_ANIME_OFF_FLAG => st.mwnd_anime_off_flag = p_bool(params, 0),
338        GET_MWND_ANIME_OFF_FLAG => {
339            let v = if st.mwnd_anime_off_flag { 1 } else { 0 };
340            ctx.push(Value::Int(v));
341            return Ok(true);
342        }
343        SET_MWND_ANIME_ON_FLAG => st.mwnd_anime_on_flag = p_bool(params, 0),
344        GET_MWND_ANIME_ON_FLAG => {
345            let v = if st.mwnd_anime_on_flag { 1 } else { 0 };
346            ctx.push(Value::Int(v));
347            return Ok(true);
348        }
349        SET_MWND_DISP_OFF_FLAG => st.mwnd_disp_off_flag = p_bool(params, 0),
350        GET_MWND_DISP_OFF_FLAG => {
351            let v = if st.mwnd_disp_off_flag { 1 } else { 0 };
352            ctx.push(Value::Int(v));
353            return Ok(true);
354        }
355        SET_KOE_DONT_STOP_ON_FLAG => st.koe_dont_stop_on_flag = p_bool(params, 0),
356        GET_KOE_DONT_STOP_ON_FLAG => {
357            let v = if st.koe_dont_stop_on_flag { 1 } else { 0 };
358            ctx.push(Value::Int(v));
359            return Ok(true);
360        }
361        SET_KOE_DONT_STOP_OFF_FLAG => st.koe_dont_stop_off_flag = p_bool(params, 0),
362        GET_KOE_DONT_STOP_OFF_FLAG => {
363            let v = if st.koe_dont_stop_off_flag { 1 } else { 0 };
364            ctx.push(Value::Int(v));
365            return Ok(true);
366        }
367        SET_SHORTCUT_ENABLE => st.shortcut_disable = false,
368        SET_SHORTCUT_DISABLE => st.shortcut_disable = true,
369        SET_QUAKE_STOP_FLAG => st.quake_stop_flag = p_bool(params, 0),
370        GET_QUAKE_STOP_FLAG => {
371            let v = if st.quake_stop_flag { 1 } else { 0 };
372            ctx.push(Value::Int(v));
373            return Ok(true);
374        }
375        SET_EMOTE_MOUTH_STOP_FLAG => st.emote_mouth_stop_flag = p_bool(params, 0),
376        GET_EMOTE_MOUTH_STOP_FLAG => {
377            let v = if st.emote_mouth_stop_flag { 1 } else { 0 };
378            ctx.push(Value::Int(v));
379            return Ok(true);
380        }
381        START_BGMFADE => st.bgmfade_flag = true,
382        END_BGMFADE => st.bgmfade_flag = false,
383        SET_VSYNC_WAIT_OFF_FLAG => st.wait_display_vsync_off_flag = p_bool(params, 0),
384        GET_VSYNC_WAIT_OFF_FLAG => {
385            let v = if st.wait_display_vsync_off_flag { 1 } else { 0 };
386            ctx.push(Value::Int(v));
387            return Ok(true);
388        }
389        SET_SKIP_TRIGGER => st.skip_trigger = true,
390        IGNORE_R_ON => st.ignore_r_flag = true,
391        IGNORE_R_OFF => st.ignore_r_flag = false,
392        SET_CURSOR_NO => st.cursor_no = p_i64(params, 0),
393        GET_CURSOR_NO => {
394            let v = st.cursor_no;
395            ctx.push(Value::Int(v));
396            return Ok(true);
397        }
398        SET_TIME_STOP_FLAG => st.time_stop_flag = p_bool(params, 0),
399        GET_TIME_STOP_FLAG => {
400            let v = if st.time_stop_flag { 1 } else { 0 };
401            ctx.push(Value::Int(v));
402            return Ok(true);
403        }
404        SET_COUNTER_TIME_STOP_FLAG => st.counter_time_stop_flag = p_bool(params, 0),
405        GET_COUNTER_TIME_STOP_FLAG => {
406            let v = if st.counter_time_stop_flag { 1 } else { 0 };
407            ctx.push(Value::Int(v));
408            return Ok(true);
409        }
410        SET_FRAME_ACTION_TIME_STOP_FLAG => st.frame_action_time_stop_flag = p_bool(params, 0),
411        GET_FRAME_ACTION_TIME_STOP_FLAG => {
412            let v = if st.frame_action_time_stop_flag { 1 } else { 0 };
413            ctx.push(Value::Int(v));
414            return Ok(true);
415        }
416        SET_STAGE_TIME_STOP_FLAG => st.stage_time_stop_flag = p_bool(params, 0),
417        GET_STAGE_TIME_STOP_FLAG => {
418            let v = if st.stage_time_stop_flag { 1 } else { 0 };
419            ctx.push(Value::Int(v));
420            return Ok(true);
421        }
422        SET_FONT_NAME => st.font_name = p_str(params, 0),
423        SET_FONT_NAME_DEFAULT => st.font_name.clear(),
424        GET_FONT_NAME => {
425            let v = st.font_name.clone();
426            ctx.push(Value::Str(v));
427            return Ok(true);
428        }
429        SET_FONT_BOLD => st.font_bold = p_i64(params, 0),
430        SET_FONT_BOLD_DEFAULT => st.font_bold = -1,
431        GET_FONT_BOLD => {
432            let v = st.font_bold;
433            ctx.push(Value::Int(v));
434            return Ok(true);
435        }
436        SET_FONT_SHADOW => st.font_shadow = p_i64(params, 0),
437        SET_FONT_SHADOW_DEFAULT => st.font_shadow = -1,
438        GET_FONT_SHADOW => {
439            let v = st.font_shadow;
440            ctx.push(Value::Int(v));
441            return Ok(true);
442        }
443        _ => {
444            return Ok(false);
445        }
446    }
447
448    ctx.push(Value::Int(0));
449    Ok(true)
450}