This is the code for the @while command. Here are a couple example uses to show it's functionality. @while[/instant] = @while v(run)=@tr me/TRG_LOOP @while not(strmatch(%va,*cow*))={@va me=[u(random_animal)]; th %va} @va me=a b c d e f g h i j k l m n o p q r s t u v w x y z @while/instant %va=th [pemit(%#,first(%va))] [set(%!,va:[rest(%va)])] With no switches it will execute if is true, and continue executing once a second until is false, or they run out of pennies. With the /instant flag it will execute immediately as long as is true, or until your run out of pennies. Before you gak and yell security risk it's no worse than setting a recursive softcode command on yourself. I can think of a lot of good uses when you need to break up large chunks of softcode like a skill sheet or a massive bb listing, etc. - grapenut Here's the code: From SWITCHES: INSTANT From externs.h: extern void do_while(dbref player, char *raw, char *condition, char *action, dbref cause, int instant); From game.c: void do_while(dbref player, char *raw, char *condition, char *action, dbref cause, int instant) { const char *ap; char cond[BUFFER_LEN]; char *cp; ap = condition; cp = cond; process_expression(cond, &cp, &ap, player, player, player, PE_DEFAULT, PT_DEFAULT, NULL); *cp = '\0'; if (parse_boolean(cond)) { parse_que(player, action, cause); wait_que(player, !instant, raw, cause, NOTHING, NULL, 0); } } From command.c: {"@WHILE", "INSTANT", cmd_while, CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_NOPARSE, 0, 0}, From cmds.c: COMMAND(cmd_while) { int instant = 0; if (SW_ISSET(sw, SWITCH_INSTANT)) instant = 1; do_while(player, raw, arg_left, arg_right, cause, instant); }