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