Divine Blood
You are not logged in.


Source Code: http://www.divineblood.org/snippets/regtrigger.c

Last Modified: Fri Jan 30, 2004 10:35am
Download without markup
Download as zipfile


/*
  Palrich
  red@icuii.com
  Head Imp, Divine Blood (http://www.divineblood.org/)

  I wrote it to work with stock code+OLC1.81.  I'm not sure how it'll do with
  other OLC's. Basically it uses the phrase of a mobprog as a regular expression,
  checks it against speech text, and stores the first 3 matches in $a, $b, and
  $c.

  Example:
  Add the prog with trigger REGEX and phrase "my name is (\w+)"
  Then the body of the prog is,
    say Why hello there, $a.
  When the player says "My name is bob.", the mob says "Why hello there, bob"
  Pretty simple and all.
  If you use something like this a lot, you should store the compiled regexprec
  rather than building and freeing it every time, because this is hugely
  inefficient.
*/

// At the top of mob_prog.c
#include <regex.h> // ... then in the global scope
char match[3][MAX_INPUT_LENGTH]; // Inside expand_arg
case 'a': i = match[0]; break; case 'b': i = match[1]; break; case 'c': i = match[2]; break; //somewhere toward the bottom of mob_prog.c
void mp_regex_trigger(char *argument, CHAR_DATA *mob, CHAR_DATA *ch) { regex_t exprec; int nmemb = 3, i; regmatch_t memb[nmemb]; MPROG_LIST *prg; for (prg = mob->pIndexData->mprogs; prg != NULL; prg = prg->next) if ( prg->trig_type == TRIG_REGEX) { regcomp(&exprec, prg->trig_phrase, REG_EXTENDED|REG_ICASE); if (!regexec(&exprec, argument, nmemb, memb, 0)) { for (i = 0; i < nmemb && memb[i+1].rm_so > -1; i++) { memcpy(match[i], argument+memb[i+1].rm_so, memb[i+1].rm_eo-memb[i+1].rm_so); match[i][memb[i+1].rm_eo-memb[i+1].rm_so] = '\0'; } program_flow(prg->vnum, prg->code, mob, ch, arg1, arg2); } regfree(&exprec); return; } } // merc.h, with the other TRIG_*s..use whatever flag is free.
#define TRIG_REGEX (Q) // merc.h, with the other mp trigger function definitions
void mp_regex_trigger(char *argument, CHAR_DATA *mob, CHAR_DATA *ch); // tables.c, in mprog_flags
{ "regex", TRIG_REGEX, TRUE }, //mob_cmds.c, inside mprog_type_to_name
case TRIG_REGEX: return "REGEX"; //act_comm.c, under the check for TRIG_SPEECH
if (IS_NPC(mob) && HAS_TRIGGER( mob, TRIG_REGEX)) mp_regex_trigger(argument,mob,ch);
© 2005 Divine Blood Staff -- Web page by Palrich (palrichatgmail.com)