/* * CthulhuMud */ /* * MUD Chat * Copyright (c)1996 by Chris Busch */ #define USE_EX_SEARCH #define UNIX #ifdef UNIX void randomize(); int random(int); #endif struct reply { int wate; char *sent; }; class akey { protected: char *logic; int numreplys,totalwates; reply *replys; public: akey(); int addlogic(char *); char *getlogic() {return logic;} int addreply(int,char *); reply& getreply(int num) {return replys[num];} char* getrndreply(); ~akey(); }; struct akeynode { akey key; akeynode *next; }; class allkeys { protected: akeynode *first,*current,*top; int numkeys; public: enum {contnotset=-1}; int contdbase; //signifies which datbase to use if this one fell thru allkeys() { current=first=top=NULL; numkeys=0; contdbase=contnotset;} akeynode* curr() {return current;} akeynode* addkey(); akeynode* reset(); akeynode* advance(); ~allkeys(); }; //enum bool {false,true}; #define BOOL int class eliza { public: enum {maxdbases=100,maxnames=200,defaultdbase=0}; enum { repsize=150}; //reply size struct nametype { char* name; int dbase; char* set(char* n,int d) { name=strdup(n); dbase=d; return name; } nametype() { name=NULL; dbase=0; } ~nametype() { if(name) free(name); } }; static char* trim(char str[]); protected: int numdbases,numnames; allkeys thekeys[maxdbases]; nametype thenames[maxnames]; int doop(char op,int a,int b); int lowcase(char ch); int strpos(char *s,char *sub); int match(char s[],char m[],int& in,int&); bool addname(char*,int); //add one name and number bool addbunch(char*, int); //add more then one name to some number void sortnames(); int getname(char*); //only tries once to find a name int getanyname(char*); //more exhaustive search to find name public: void reducespaces(char *); void eliza::addrest(char* replied, char* talker, char* rep, char* target,char* rest); public: bool loaddata(char*,char recurflag=0); char* processdbase(char* talker,char* message,char* target,int dbase); char* process(char* talker,char* message,char* target) { #ifdef USE_EX_SEARCH return processdbase(talker,message,target,getanyname(talker)); #else return processdbase(talker,message,target,getname(talker)); #endif } eliza() { numdbases=0; numnames=0; addname("default",0); } };