Add command for slow spacing of commands.
This commit is contained in:
		
							parent
							
								
									6dd6cd1f71
								
							
						
					
					
						commit
						44a9b89844
					
				@ -18,6 +18,7 @@
 | 
				
			|||||||
  "panel_merge": "Use #panel_merge followed by the frame path to merge panels. For example, #panel_merge {} will merge the current panel with the top-level split.",
 | 
					  "panel_merge": "Use #panel_merge followed by the frame path to merge panels. For example, #panel_merge {} will merge the current panel with the top-level split.",
 | 
				
			||||||
  "send_multiple_commands": "To send several commands in quick succession, separate them with a semicolon. For example, use 'n;e' to go north and then east.",
 | 
					  "send_multiple_commands": "To send several commands in quick succession, separate them with a semicolon. For example, use 'n;e' to go north and then east.",
 | 
				
			||||||
  "tick": "Use #tick to set a recurring command to run at a specified time interval (in seconds).\r\nFor example, #tick 60 {#echo Cockadoodledoo!} will repeat every 60 seconds.\r\nOptionally give it a name with a third argument.\r\nUse #tick by itself to list active ticks.\r\nSee also: #untick",
 | 
					  "tick": "Use #tick to set a recurring command to run at a specified time interval (in seconds).\r\nFor example, #tick 60 {#echo Cockadoodledoo!} will repeat every 60 seconds.\r\nOptionally give it a name with a third argument.\r\nUse #tick by itself to list active ticks.\r\nSee also: #untick",
 | 
				
			||||||
 | 
					  "slow": "To send commands at a controlled rate, try #slow {command;command;command} 0.5, where 0.5 is replaced with the time between commands in seconds"
 | 
				
			||||||
  "unact": "Use #unact followed by the trigger pattern to delete a trigger. Example: #unact {^The (.*) attacks you.}.",
 | 
					  "unact": "Use #unact followed by the trigger pattern to delete a trigger. Example: #unact {^The (.*) attacks you.}.",
 | 
				
			||||||
  "unalias": "Use #unalias followed by the alias pattern to delete it. For example, #unalias {^hi}.",
 | 
					  "unalias": "Use #unalias followed by the alias pattern to delete it. For example, #unalias {^hi}.",
 | 
				
			||||||
  "undelay": "Use #undelay followed by the delay name to cancel it. Example: #undelay ding to cancel a delay named 'ding'.",
 | 
					  "undelay": "Use #undelay followed by the delay name to cancel it. Example: #undelay ding to cancel a delay named 'ding'.",
 | 
				
			||||||
 | 
				
			|||||||
@ -234,6 +234,7 @@ pub fn install_lua_globals(
 | 
				
			|||||||
            register_command!(panel_merge);
 | 
					            register_command!(panel_merge);
 | 
				
			||||||
            register_command!(panel_swap);
 | 
					            register_command!(panel_swap);
 | 
				
			||||||
            register_command!(sendmud_raw);
 | 
					            register_command!(sendmud_raw);
 | 
				
			||||||
 | 
					            register_command!(slow);
 | 
				
			||||||
            register_stateless_command!(storage);
 | 
					            register_stateless_command!(storage);
 | 
				
			||||||
            register_command!(tick);
 | 
					            register_command!(tick);
 | 
				
			||||||
            register_command!(tsplit);
 | 
					            register_command!(tsplit);
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ use crate::{
 | 
				
			|||||||
    echo_to_term_frame,
 | 
					    echo_to_term_frame,
 | 
				
			||||||
    id_intern::intern_id,
 | 
					    id_intern::intern_id,
 | 
				
			||||||
    match_table::{create_match_table, match_table_add, match_table_remove},
 | 
					    match_table::{create_match_table, match_table_add, match_table_remove},
 | 
				
			||||||
 | 
					    parsing::parse_commands,
 | 
				
			||||||
    timer_host::TimerHostAccessContext,
 | 
					    timer_host::TimerHostAccessContext,
 | 
				
			||||||
    FrameId, FrameViewType, GlobalLayoutCell, GlobalLayoutState, GlobalMemoCell,
 | 
					    FrameId, FrameViewType, GlobalLayoutCell, GlobalLayoutState, GlobalMemoCell,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -875,6 +876,67 @@ pub(super) fn untick<'gc>(
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub(super) fn slow<'gc>(
 | 
				
			||||||
 | 
					    ctx: Context<'gc>,
 | 
				
			||||||
 | 
					    global_memo: &GlobalMemoCell,
 | 
				
			||||||
 | 
					    _global_layout: &UseStateSetter<GlobalLayoutCell>,
 | 
				
			||||||
 | 
					) -> Callback<'gc> {
 | 
				
			||||||
 | 
					    let global_memo = global_memo.clone();
 | 
				
			||||||
 | 
					    Callback::from_fn(&ctx, move |ctx, _ex, mut stack| {
 | 
				
			||||||
 | 
					        let cur_frame_id = try_unwrap_frame(
 | 
				
			||||||
 | 
					            ctx,
 | 
				
			||||||
 | 
					            &ctx.get_global::<Table>("info")?
 | 
				
			||||||
 | 
					                .get(ctx, ctx.intern_static(b"current_frame"))?,
 | 
				
			||||||
 | 
					        )?;
 | 
				
			||||||
 | 
					        let cmds = piccolo::String::from_value(
 | 
				
			||||||
 | 
					            ctx,
 | 
				
			||||||
 | 
					            stack
 | 
				
			||||||
 | 
					                .pop_front()
 | 
				
			||||||
 | 
					                .ok_or_else(|| anyhow::Error::msg("Missing commands to slowly queue"))?,
 | 
				
			||||||
 | 
					        )?
 | 
				
			||||||
 | 
					        .to_str()?;
 | 
				
			||||||
 | 
					        let delay: f64 = f64::from_value(
 | 
				
			||||||
 | 
					            ctx,
 | 
				
			||||||
 | 
					            stack
 | 
				
			||||||
 | 
					                .pop_front()
 | 
				
			||||||
 | 
					                .ok_or_else(|| anyhow::Error::msg("Missing slow delay time"))?,
 | 
				
			||||||
 | 
					        )?;
 | 
				
			||||||
 | 
					        if !stack.is_empty() {
 | 
				
			||||||
 | 
					            Err(anyhow::Error::msg(
 | 
				
			||||||
 | 
					                "Extra arguments to slow command. Try wrapping the action in {}",
 | 
				
			||||||
 | 
					            ))?;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let cmds = parse_commands(cmds).commands;
 | 
				
			||||||
 | 
					        let delay_fn: Function = ctx.get_global::<Table>("commands")?.get(ctx, "delay")?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let seq = async_sequence(&ctx, |locals, mut seq| {
 | 
				
			||||||
 | 
					            let global_memo = global_memo.clone();
 | 
				
			||||||
 | 
					            let delay_fn = locals.stash(&ctx, delay_fn);
 | 
				
			||||||
 | 
					            async move {
 | 
				
			||||||
 | 
					                for (idx, cmd) in cmds.iter().enumerate() {
 | 
				
			||||||
 | 
					                    if idx == 0 {
 | 
				
			||||||
 | 
					                        global_memo
 | 
				
			||||||
 | 
					                            .command_queue
 | 
				
			||||||
 | 
					                            .borrow_mut()
 | 
				
			||||||
 | 
					                            .push_front((cur_frame_id.clone(), cmd.clone()));
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        seq.try_enter(|ctx, _locals, _exec, mut stack| {
 | 
				
			||||||
 | 
					                            stack.consume::<()>(ctx)?;
 | 
				
			||||||
 | 
					                            stack.into_back(ctx, delay * (idx as f64));
 | 
				
			||||||
 | 
					                            stack.into_back(ctx, cmd.to_string());
 | 
				
			||||||
 | 
					                            Ok(())
 | 
				
			||||||
 | 
					                        })?;
 | 
				
			||||||
 | 
					                        seq.call(&delay_fn, 0).await?;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Ok(SequenceReturn::Return)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        Ok(piccolo::CallbackReturn::Sequence(seq))
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(super) fn editor<'gc>(
 | 
					pub(super) fn editor<'gc>(
 | 
				
			||||||
    ctx: Context<'gc>,
 | 
					    ctx: Context<'gc>,
 | 
				
			||||||
    global_memo: &GlobalMemoCell,
 | 
					    global_memo: &GlobalMemoCell,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user