Heres a WHILE loop "patch-by-hand" for DG scripts. It'll need a little changing to compile with your mud, and it works correctly on my MUD. Your filenames will also differ - I did my port of DG scripts before the patches came out. The way they work in scripts: wait <statement> ... end "break" can be used to drop out of not only the current "if" but the PREVIOUS "block" (if/while) too, since that is what it should do, NOT exit the script entirely (which is what "halt" is for), or drop back a single level (which is pretty useless) If more than 30 loops occur, it will automatically cause a WAIT for 1 second, which WILL pause the MUD. If more than 100 loops occur since the script has started executing /from the beginning/ (if it WAITs it will still remember how many loops), it will mudlog-warn the MUD. Note that I use George's mudlogf/log patches, among many others (so many his name is on the login screen, along with the DG people :-). You will need to modify the code if you dont have said patches (but only in a minor way). Hopefully everything here is whats needed... looks like it to me. - Chris Jacobson PS. No credit needed, just dont go telling your builders you wrote it yerself :-P ------------------------- *-> in scripts.h: * add the macro: #define GET_TRIG_LOOPS(t) ((t)->loops) * in trig_data, add: int loops; * in cmdlist_element, add: struct cmdlist_element *original; *-> scriptengine.c *> find_end: replace: if (!strn_cmp("if ", p, 3)) with: if (!strn_cmp("if ", p, 3) || !strn_cmp("while ", p, 6)) *> find_else_end: replace: if (!strn_cmp("if ", p, 3)) with: if (!strn_cmp("if ", p, 3) || !strn_cmp("while ", p, 6)) *> script_driver: * in the beginning, add these variables: struct cmdlist_element *temp; UInt32 loops = 0; * replace: if (mode == TRIG_NEW) GET_TRIG_DEPTH(trig) = 1; * with: if (mode == TRIG_NEW) { GET_TRIG_LOOPS(trig) = 0; GET_TRIG_DEPTH(trig) = 1; } * replace "} else if (!strn_cmp("end", p, 3)) { ... }" with: } else if (!strn_cmp("while ", p, 6)) { temp = find_end(cl); if (process_if(p + 6, go, sc, trig, type)) { GET_TRIG_DEPTH(trig)++; temp->original = cl; } else { cl = temp; } } else if (!strn_cmp("end", p, 3)) { GET_TRIG_DEPTH(trig)--; if (cl->original && process_if(cl->original->cmd + 6, go, sc, trig, type)) { cl = cl->original; GET_TRIG_DEPTH(trig)++; loops++; GET_TRIG_LOOPS(trig)++; if (loops == 30) { process_wait(go, trig, type, "wait 1", cl); depth--; release_buffer(cmd); return ret_val; } if (GET_TRIG_LOOPS(trig) == 100) { mudlogf(NRM, LVL_BUILDER, TRUE, "SCRIPTERR: Trigger VNum %d has looped 100 times!!!", GET_TRIG_VNUM(trig)); } } } else if (!strn_cmp("break", p, 5)) { GET_TRIG_DEPTH(trig) -= 2; temp = find_end(cl); if (temp->next) { cl = temp; temp = find_end(cl); if (temp->next) cl = temp; } } else { +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST