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
163// Recovered from the newer SiglusEngine handler.
164// 98(value): set joypad-mode override; 99(): reset it to -1; 100(): return raw
165// override.  The older 1.1.137.0 source predates these registrations.
166const SET_JOYPAD_MODE_OVERRIDE: i32 =
167    crate::runtime::constants::elm_value::SCRIPT_SET_JOYPAD_MODE_OVERRIDE;
168const RESET_JOYPAD_MODE_OVERRIDE: i32 =
169    crate::runtime::constants::elm_value::SCRIPT_RESET_JOYPAD_MODE_OVERRIDE;
170const GET_JOYPAD_MODE_OVERRIDE: i32 =
171    crate::runtime::constants::elm_value::SCRIPT_GET_JOYPAD_MODE_OVERRIDE;
172
173struct Call<'a> {
174    op: i32,
175    params: &'a [Value],
176}
177
178fn parse_call<'a>(ctx: &CommandContext, form_id: u32, args: &'a [Value]) -> Option<Call<'a>> {
179    let (chain_pos, chain) = prop_access::parse_element_chain_ctx(ctx, form_id, args)?;
180    if chain.len() < 2 {
181        return None;
182    }
183    let params = prop_access::script_args(args, chain_pos);
184    Some(Call {
185        op: chain[1],
186        params,
187    })
188}
189
190fn p_i64(params: &[Value], idx: usize) -> i64 {
191    params.get(idx).and_then(|v| v.as_i64()).unwrap_or(0)
192}
193
194fn p_bool(params: &[Value], idx: usize) -> bool {
195    p_i64(params, idx) != 0
196}
197
198fn p_str(params: &[Value], idx: usize) -> String {
199    params
200        .get(idx)
201        .and_then(|v| v.as_str())
202        .unwrap_or("")
203        .to_string()
204}
205
206/// Dispatch the SCRIPT child of EXCALL.
207///
208/// Siglus 1.1.137 routes EXCALL.SCRIPT to a distinct handler rather than to
209/// the normal SCRIPT handler: only the font overrides live in C_elm_excall.
210/// Newer 1.1.141.2 scene bytecode also reaches the recovered joypad override
211/// commands through EXCALL.SCRIPT while preparing configured system scenes.
212pub fn dispatch_excall(ctx: &mut CommandContext, op: i32, params: &[Value]) -> Result<bool> {
213    match op {
214        SET_FONT_NAME => ctx.excall_state.font_name = p_str(params, 0),
215        SET_FONT_NAME_DEFAULT => ctx.excall_state.font_name.clear(),
216        GET_FONT_NAME => {
217            ctx.push(Value::Str(ctx.excall_state.font_name.clone()));
218            return Ok(true);
219        }
220        SET_FONT_BOLD => ctx.excall_state.font_bold = p_i64(params, 0),
221        SET_FONT_BOLD_DEFAULT => ctx.excall_state.font_bold = -1,
222        GET_FONT_BOLD => {
223            ctx.push(Value::Int(ctx.excall_state.font_bold));
224            return Ok(true);
225        }
226        SET_FONT_SHADOW => ctx.excall_state.font_shadow = p_i64(params, 0),
227        SET_FONT_SHADOW_DEFAULT => ctx.excall_state.font_shadow = -1,
228        GET_FONT_SHADOW => {
229            ctx.push(Value::Int(ctx.excall_state.font_shadow));
230            return Ok(true);
231        }
232        SET_JOYPAD_MODE_OVERRIDE => {
233            ctx.excall_state.joypad_mode_override = p_i64(params, 0);
234        }
235        RESET_JOYPAD_MODE_OVERRIDE => {
236            ctx.excall_state.joypad_mode_override = -1;
237        }
238        GET_JOYPAD_MODE_OVERRIDE => {
239            ctx.push(Value::Int(ctx.excall_state.joypad_mode_override));
240            return Ok(true);
241        }
242        _ => return Ok(false),
243    }
244
245    ctx.push(Value::Int(0));
246    Ok(true)
247}
248
249pub fn dispatch(ctx: &mut CommandContext, form_id: u32, args: &[Value]) -> Result<bool> {
250    let Some(call) = parse_call(ctx, form_id, args) else {
251        return Ok(false);
252    };
253    let op = call.op;
254    let params = call.params;
255
256    if op == SET_JOYPAD_MODE_OVERRIDE {
257        ctx.globals.script.joypad_mode_override = p_i64(params, 0);
258        ctx.push(Value::Int(0));
259        return Ok(true);
260    }
261
262    if op == RESET_JOYPAD_MODE_OVERRIDE {
263        ctx.globals.script.joypad_mode_override = -1;
264        ctx.push(Value::Int(0));
265        return Ok(true);
266    }
267
268    if op == GET_JOYPAD_MODE_OVERRIDE {
269        ctx.push(Value::Int(ctx.globals.script.joypad_mode_override));
270        return Ok(true);
271    }
272
273    if op == CHECK_SKIP {
274        // cmd_script.cpp delegates directly to tnm_is_skipping(). Do not fold
275        // auto mode/message-nowait/local skip_trigger into this predicate.
276        let v = ctx.runtime_is_skipping();
277        if env_is_set!("SG_DEBUG")
278            && ctx.current_scene_name.as_deref() == Some("sys10_cf01")
279            && matches!(ctx.current_line_no, 700..=730 | 870..=895)
280        {
281            let scene_no = ctx
282                .current_scene_no
283                .map(|n| n.to_string())
284                .unwrap_or_else(|| "-".to_string());
285            eprintln!(
286                "[SG_DEBUG][CF_CONDITION_TRACE] scene=sys10_cf01 scene_no={} line={} kind=SCRIPT_CHECK_SKIP result={}",
287                scene_no,
288                ctx.current_line_no,
289                if v { 1 } else { 0 }
290            );
291        }
292        ctx.push(Value::Int(if v { 1 } else { 0 }));
293        return Ok(true);
294    }
295
296    let st = &mut ctx.globals.script;
297
298    match op {
299        SET_AUTO_SAVEPOINT_OFF => st.dont_set_save_point = true,
300        SET_AUTO_SAVEPOINT_ON => st.dont_set_save_point = false,
301        SET_SKIP_DISABLE => st.skip_disable = true,
302        SET_SKIP_ENABLE => st.skip_disable = false,
303        SET_SKIP_DISABLE_FLAG => st.skip_disable = p_bool(params, 0),
304        GET_SKIP_DISABLE_FLAG => {
305            let v = if st.skip_disable { 1 } else { 0 };
306            ctx.push(Value::Int(v));
307            return Ok(true);
308        }
309        SET_CTRL_SKIP_DISABLE => st.ctrl_disable = true,
310        SET_CTRL_SKIP_ENABLE => st.ctrl_disable = false,
311        SET_CTRL_SKIP_DISABLE_FLAG => st.ctrl_disable = p_bool(params, 0),
312        GET_CTRL_SKIP_DISABLE_FLAG => {
313            let v = if st.ctrl_disable { 1 } else { 0 };
314            ctx.push(Value::Int(v));
315            return Ok(true);
316        }
317        SET_STOP_SKIP_BY_KEY_DISABLE => st.not_stop_skip_by_click = true,
318        SET_STOP_SKIP_BY_KEY_ENABLE => st.not_stop_skip_by_click = false,
319        SET_END_MSG_BY_KEY_DISABLE => st.not_skip_msg_by_click = true,
320        SET_END_MSG_BY_KEY_ENABLE => st.not_skip_msg_by_click = false,
321        SET_SKIP_UNREAD_MESSAGE_FLAG => st.skip_unread_message = p_bool(params, 0),
322        GET_SKIP_UNREAD_MESSAGE_FLAG => {
323            let v = if st.skip_unread_message { 1 } else { 0 };
324            ctx.push(Value::Int(v));
325            return Ok(true);
326        }
327        START_AUTO_MODE => st.auto_mode_flag = true,
328        END_AUTO_MODE => st.auto_mode_flag = false,
329        SET_AUTO_MODE_MOJI_WAIT => st.auto_mode_moji_wait = p_i64(params, 0),
330        SET_AUTO_MODE_MOJI_WAIT_DEFAULT => st.auto_mode_moji_wait = -1,
331        GET_AUTO_MODE_MOJI_WAIT => {
332            let v = st.auto_mode_moji_wait;
333            ctx.push(Value::Int(v));
334            return Ok(true);
335        }
336        SET_AUTO_MODE_MIN_WAIT => st.auto_mode_min_wait = p_i64(params, 0),
337        SET_AUTO_MODE_MIN_WAIT_DEFAULT => st.auto_mode_min_wait = -1,
338        GET_AUTO_MODE_MIN_WAIT => {
339            let v = st.auto_mode_min_wait;
340            ctx.push(Value::Int(v));
341            return Ok(true);
342        }
343        SET_AUTO_MODE_MOJI_CNT => st.auto_mode_moji_cnt = p_i64(params, 0),
344        SET_MOUSE_CURSOR_HIDE_ONOFF => st.mouse_cursor_hide_onoff = p_i64(params, 0),
345        SET_MOUSE_CURSOR_HIDE_ONOFF_DEFAULT => st.mouse_cursor_hide_onoff = -1,
346        GET_MOUSE_CURSOR_HIDE_ONOFF => {
347            let v = st.mouse_cursor_hide_onoff;
348            ctx.push(Value::Int(v));
349            return Ok(true);
350        }
351        SET_MOUSE_CURSOR_HIDE_TIME => st.mouse_cursor_hide_time = p_i64(params, 0),
352        SET_MOUSE_CURSOR_HIDE_TIME_DEFAULT => st.mouse_cursor_hide_time = -1,
353        GET_MOUSE_CURSOR_HIDE_TIME => {
354            let v = st.mouse_cursor_hide_time;
355            ctx.push(Value::Int(v));
356            return Ok(true);
357        }
358        SET_MESSAGE_SPEED => st.msg_speed = p_i64(params, 0),
359        SET_MESSAGE_SPEED_DEFAULT => st.msg_speed = -1,
360        GET_MESSAGE_SPEED => {
361            let v = st.msg_speed;
362            ctx.push(Value::Int(v));
363            return Ok(true);
364        }
365        SET_MESSAGE_NOWAIT_FLAG => st.msg_nowait = p_bool(params, 0),
366        GET_MESSAGE_NOWAIT_FLAG => {
367            let v = if st.msg_nowait { 1 } else { 0 };
368            ctx.push(Value::Int(v));
369            return Ok(true);
370        }
371        SET_MSG_ASYNC_MODE_ON => {
372            st.async_msg_mode = true;
373            st.async_msg_mode_once = false;
374        }
375        SET_MSG_ASYNC_MODE_ON_ONCE => {
376            st.async_msg_mode = true;
377            st.async_msg_mode_once = true;
378        }
379        SET_MSG_ASYNC_MODE_OFF => {
380            st.async_msg_mode = false;
381            st.async_msg_mode_once = false;
382        }
383        SET_HIDE_MWND_DISABLE => st.hide_mwnd_disable = true,
384        SET_HIDE_MWND_ENABLE => st.hide_mwnd_disable = false,
385        SET_MSG_BACK_DISABLE => st.msg_back_disable = true,
386        SET_MSG_BACK_ENABLE => st.msg_back_disable = false,
387        SET_MSG_BACK_OFF => st.msg_back_off = true,
388        SET_MSG_BACK_ON => st.msg_back_off = false,
389        SET_MSG_BACK_DISP_OFF => st.msg_back_disp_off = true,
390        SET_MSG_BACK_DISP_ON => st.msg_back_disp_off = false,
391        SET_MOUSE_DISP_OFF => st.cursor_disp_off = true,
392        SET_MOUSE_DISP_ON => st.cursor_disp_off = false,
393        SET_MOUSE_MOVE_BY_KEY_DISABLE => st.cursor_move_by_key_disable = true,
394        SET_MOUSE_MOVE_BY_KEY_ENABLE => st.cursor_move_by_key_disable = false,
395        SET_KEY_DISABLE => {
396            let vk = p_i64(params, 0);
397            if (0..=255).contains(&vk) {
398                st.key_disable.insert(vk as u8);
399            }
400        }
401        SET_KEY_ENABLE => {
402            let vk = p_i64(params, 0);
403            if (0..=255).contains(&vk) {
404                st.key_disable.remove(&(vk as u8));
405            }
406        }
407        SET_MWND_ANIME_OFF_FLAG => st.mwnd_anime_off_flag = p_bool(params, 0),
408        GET_MWND_ANIME_OFF_FLAG => {
409            let v = if st.mwnd_anime_off_flag { 1 } else { 0 };
410            ctx.push(Value::Int(v));
411            return Ok(true);
412        }
413        SET_MWND_ANIME_ON_FLAG => st.mwnd_anime_on_flag = p_bool(params, 0),
414        GET_MWND_ANIME_ON_FLAG => {
415            let v = if st.mwnd_anime_on_flag { 1 } else { 0 };
416            ctx.push(Value::Int(v));
417            return Ok(true);
418        }
419        SET_MWND_DISP_OFF_FLAG => st.mwnd_disp_off_flag = p_bool(params, 0),
420        GET_MWND_DISP_OFF_FLAG => {
421            let v = if st.mwnd_disp_off_flag { 1 } else { 0 };
422            ctx.push(Value::Int(v));
423            return Ok(true);
424        }
425        SET_KOE_DONT_STOP_ON_FLAG => st.koe_dont_stop_on_flag = p_bool(params, 0),
426        GET_KOE_DONT_STOP_ON_FLAG => {
427            let v = if st.koe_dont_stop_on_flag { 1 } else { 0 };
428            ctx.push(Value::Int(v));
429            return Ok(true);
430        }
431        SET_KOE_DONT_STOP_OFF_FLAG => st.koe_dont_stop_off_flag = p_bool(params, 0),
432        GET_KOE_DONT_STOP_OFF_FLAG => {
433            let v = if st.koe_dont_stop_off_flag { 1 } else { 0 };
434            ctx.push(Value::Int(v));
435            return Ok(true);
436        }
437        SET_SHORTCUT_ENABLE => st.shortcut_disable = false,
438        SET_SHORTCUT_DISABLE => st.shortcut_disable = true,
439        SET_QUAKE_STOP_FLAG => st.quake_stop_flag = p_bool(params, 0),
440        GET_QUAKE_STOP_FLAG => {
441            let v = if st.quake_stop_flag { 1 } else { 0 };
442            ctx.push(Value::Int(v));
443            return Ok(true);
444        }
445        SET_EMOTE_MOUTH_STOP_FLAG => st.emote_mouth_stop_flag = p_bool(params, 0),
446        GET_EMOTE_MOUTH_STOP_FLAG => {
447            let v = if st.emote_mouth_stop_flag { 1 } else { 0 };
448            ctx.push(Value::Int(v));
449            return Ok(true);
450        }
451        START_BGMFADE => st.bgmfade_flag = true,
452        END_BGMFADE => st.bgmfade_flag = false,
453        SET_VSYNC_WAIT_OFF_FLAG => st.wait_display_vsync_off_flag = p_bool(params, 0),
454        GET_VSYNC_WAIT_OFF_FLAG => {
455            let v = if st.wait_display_vsync_off_flag { 1 } else { 0 };
456            ctx.push(Value::Int(v));
457            return Ok(true);
458        }
459        SET_SKIP_TRIGGER => st.skip_trigger = true,
460        IGNORE_R_ON => st.ignore_r_flag = true,
461        IGNORE_R_OFF => st.ignore_r_flag = false,
462        SET_CURSOR_NO => st.cursor_no = p_i64(params, 0),
463        GET_CURSOR_NO => {
464            let v = st.cursor_no;
465            ctx.push(Value::Int(v));
466            return Ok(true);
467        }
468        SET_TIME_STOP_FLAG => st.time_stop_flag = p_bool(params, 0),
469        GET_TIME_STOP_FLAG => {
470            let v = if st.time_stop_flag { 1 } else { 0 };
471            ctx.push(Value::Int(v));
472            return Ok(true);
473        }
474        SET_COUNTER_TIME_STOP_FLAG => st.counter_time_stop_flag = p_bool(params, 0),
475        GET_COUNTER_TIME_STOP_FLAG => {
476            let v = if st.counter_time_stop_flag { 1 } else { 0 };
477            ctx.push(Value::Int(v));
478            return Ok(true);
479        }
480        SET_FRAME_ACTION_TIME_STOP_FLAG => st.frame_action_time_stop_flag = p_bool(params, 0),
481        GET_FRAME_ACTION_TIME_STOP_FLAG => {
482            let v = if st.frame_action_time_stop_flag { 1 } else { 0 };
483            ctx.push(Value::Int(v));
484            return Ok(true);
485        }
486        SET_STAGE_TIME_STOP_FLAG => st.stage_time_stop_flag = p_bool(params, 0),
487        GET_STAGE_TIME_STOP_FLAG => {
488            let v = if st.stage_time_stop_flag { 1 } else { 0 };
489            ctx.push(Value::Int(v));
490            return Ok(true);
491        }
492        SET_FONT_NAME => st.font_name = p_str(params, 0),
493        SET_FONT_NAME_DEFAULT => st.font_name.clear(),
494        GET_FONT_NAME => {
495            let v = st.font_name.clone();
496            ctx.push(Value::Str(v));
497            return Ok(true);
498        }
499        SET_FONT_BOLD => st.font_bold = p_i64(params, 0),
500        SET_FONT_BOLD_DEFAULT => st.font_bold = -1,
501        GET_FONT_BOLD => {
502            let v = st.font_bold;
503            ctx.push(Value::Int(v));
504            return Ok(true);
505        }
506        SET_FONT_SHADOW => st.font_shadow = p_i64(params, 0),
507        SET_FONT_SHADOW_DEFAULT => st.font_shadow = -1,
508        GET_FONT_SHADOW => {
509            let v = st.font_shadow;
510            ctx.push(Value::Int(v));
511            return Ok(true);
512        }
513        _ => {
514            return Ok(false);
515        }
516    }
517
518    ctx.push(Value::Int(0));
519    Ok(true)
520}