musicmud-2.1.6/data/
musicmud-2.1.6/data/help/
musicmud-2.1.6/data/policy/
musicmud-2.1.6/data/wild/
musicmud-2.1.6/data/world/
musicmud-2.1.6/doc/
musicmud-2.1.6/src/ident/
musicmud-2.1.6/src/lua/
musicmud-2.1.6/src/lua/include/
musicmud-2.1.6/src/lua/src/lib/
musicmud-2.1.6/src/lua/src/lua/
musicmud-2.1.6/src/lua/src/luac/
/* 
 * MusicMUD Daemon, version 0.5.9
 * Copyright (C) 1998 Abigail Brady
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 * 
 */
#include <stdio.h>

#ifndef MODULE
#error "You must define MODULE before including verbmodule.h"
#endif

#ifdef VERBS_H
World<Verb> *native_verbs;
#endif

#ifdef STATE_H
World<State> *native_states;
#endif

#ifdef VERB_H
Verb *get_verb(const char *);
#endif

#ifdef VERBS_H

void verb_add(const char *id, int minlen, int minlev, verbhandler_t fn, PFlag pflag, VFlag vflags=VFL_NONE) {
  if (Verb *o = verbs->get(id)) {
    log(PFL_SEEINFO, 0, "verbs", "verb conflict : %s.%s with %s.%s", 
	MODULE, id, o->get("module"), o->id);
    return;
  }
    
  string name(id, minlen);
  
  if (Verb *v=get_verb(name.c_str())) {
    log(PFL_SEEINFO, 0, "verbs", "verb conflict : [%s.%s] [%s.%s]",
	MODULE, id, v->get("module"), v->id);
  }

  Verb *me = new NativeVerb(id, minlen, minlev, fn, pflag, vflags);

  verbs->add (me);
  native_verbs->add (me);

  me->set("module", MODULE);
}

void verb_add(const char *id, int minlen, int minlev, playerverb_t fn, PFlag pflag, VFlag vflags=VFL_NONE) {
  if (Verb *o = verbs->get(id)) {
    log(PFL_SEEINFO, 0, "verbs", "verb conflict : %s.%s with %s.%s", 
	MODULE, id, o->get("module"), o->id);
    return;
  }
    
  string name(id, minlen);
  
  if (Verb *v=get_verb(name.c_str())) {
    log(PFL_SEEINFO, 0, "verbs", "verb conflict : [%s.%s] [%s.%s]",
	MODULE, id, v->get("module"), v->id);
  }

  Verb *me = new PlayerVerb(id, minlen, minlev, fn, pflag, vflags);

  verbs->add (me);
  native_verbs->add (me);

  me->set("module", MODULE);
}


void alias_add(const char *verbname, int minlen, const char *toname) 
{
  Verb *to=verbs->get(toname);
  if (!to) {
    log(PFL_SEEINFO, 0, "verbs", "alias for %s points to non-existant %s", 
	verbname, toname);
    return;
  }
  AliasVerb *a = new AliasVerb(verbname, to);
  verbs -> add (*a);
  native_verbs->add (*a);
  a->minlen = minlen;
  a->set("module", MODULE);
}

#endif

#ifdef STATE_H
void state_add(const char *name, const char *prompt, state_t d, bool what) {
  State *me = new State(name, prompt, d, what);
  states -> add( *me );
  native_states -> add ( *me );
}
#endif

extern "C" void remove_verbs() {
#ifdef CLEANUP
   CLEANUP
#endif
#ifdef VERBS_H
  for (int l=0;l<native_verbs->getsize();l++) {
    Verb *o = native_verbs->get(l);
    verbs-> remove( *o );
    delete o;
  }
#endif
#ifdef STATE_H
  for (int l=0;l<native_states->getsize();l++) {
    State *o = native_states->get(l);
    states-> remove( *o );
    delete o;
  }
#endif
}

#define ADD_VERB(str, minlen, func, minlev, args...) verb_add(str, minlen, minlev, func, ## args);

#define AUTO_VERB(str, minlen, minlev, args...) verb_add(#str, minlen, minlev, verb##_##str, ## args)

#define ADD_STATE(id, prompt, fn, echo) state_add(id, prompt, fn, echo)

#define ADD_ALIAS(alias, len, real) alias_add(#alias, len, #real)

void startup();

extern "C" void register_verbs() {
#ifdef VERBS_H
        native_verbs = new World<Verb>();
#endif
#ifdef STATE_H
	native_states = new World<State>();
#endif

	startup();
}