/* command.h - declarations used by the command processor */

#include "copyright.h"

#ifndef __COMMAND_H
#define __COMMAND_H

#include "db.h"

#ifdef notdef

/* These defs cause conflicting type errors.  Argh! */

/* Declaration for old-style command handlers */

#define OLD_UNP(name) \
	extern void name(dbref player, const char *unp);
#define OLD_0(name) \
	extern void name(dbref player);
#define OLD_1(name) \
	extern void name(dbref player, const char *arg);
#define OLD_2(name) \
	extern void name(dbref player, const char *arg1, const char *arg2);
#define OLD_ONE_PLUS_ARGV(name) \
	extern void name(dbref player, const char *arg1, const char *argv[]);
#define OLD_TWO_PLUS_CAUSE(name) \
	extern void name(dbref player, const char *arg1, const char *argv[], dbref cause);
#define OLD_TWO_ARGS_PLUS_CAUSE(name) \
	extern void name(dbref player, const char *arg1, const char *arg2, dbref cause);

/* Declarations for new-style command handlers */

#define CMD_NO_ARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra);
#define CMD_ONE_ARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg);
#define CMD_ONE_ARG_CMDARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg,
		 char *cargs[], int ncargs);
#define CMD_TWO_ARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg1, char *arg2);
#define CMD_TWO_ARG_CMDARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg1, char *arg2,
		 char *cargs[], int ncargs);
#define CMD_TWO_ARG_ARGV(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg1, \
		 char *argv[], int nargs);
#define CMD_TWO_ARG_ARGV_CMDARG(name) \
	extern void name \
		(dbref player, dbref cause, int extra, char *arg1, \
		 char *argv[], int nargs, char *cargv[], int ncargs);

#else
#define OLD_UNP(name) extern void name();
#define OLD_0(name) extern void name();
#define OLD_1(name) extern void name();
#define OLD_2(name) extern void name();
#define OLD_ONE_PLUS_ARGV(name) extern void name();
#define OLD_TWO_PLUS_CAUSE(name) extern void name();
#define OLD_TWO_ARGS_PLUS_CAUSE(name) extern void name();
#define CMD_NO_ARG(name) extern void name();
#define CMD_ONE_ARG(name) extern void name();
#define CMD_ONE_ARG_CMDARG(name) extern void name();
#define CMD_TWO_ARG(name) extern void name();
#define CMD_TWO_ARG_CMDARG(name) extern void name();
#define CMD_TWO_ARG_ARGV(name) extern void name();
#define CMD_TWO_ARG_ARGV_CMDARG(name) extern void name();
#endif

/* Command function handlers */
CMD_ONE_ARG_CMDARG(do_apply_marked);	/* Apply command to marked objects */
CMD_TWO_ARG(do_admin);			/* Change config parameters */
CMD_TWO_ARG(do_alias);			/* Change the alias of something */
CMD_TWO_ARG(do_attribute);		/* Manage user-named attributes */
CMD_ONE_ARG(do_boot);			/* Force-disconnect a player */
CMD_TWO_ARG(do_cat);			/* Send a file to a player */
CMD_TWO_ARG(do_chown);			/* Change object or attribute owner */
CMD_TWO_ARG(do_chownall);		/* Give away all of someone's objs */
CMD_TWO_ARG(do_clone);			/* Create a copy of an object */
CMD_NO_ARG(do_comment);			/* Ignore argument and do nothing */
CMD_TWO_ARG(do_create);			/* Create a new object */
CMD_ONE_ARG(do_cut);			/* Truncate contents or exits list */
CMD_NO_ARG(do_dbck);			/* Consistency check */
CMD_ONE_ARG(do_decomp);			/* Reproduce commands to recrete obj */
CMD_ONE_ARG(do_destroy);		/* Destroy an object */
CMD_TWO_ARG_ARGV(do_dig);		/* Dig a new room */
CMD_ONE_ARG(do_doing);			/* Set doing string in WHO report */
CMD_TWO_ARG_CMDARG(do_dolist);		/* Iterate command on list members */
CMD_ONE_ARG(do_drop);			/* Drop an object */
CMD_NO_ARG(do_dump);			/* Dump the database */
CMD_TWO_ARG_ARGV(do_edit);		/* Edit one or more attributes */
CMD_ONE_ARG(do_enter);			/* Enter an object */
CMD_ONE_ARG(do_entrances);		/* List exits and links to loc */
CMD_ONE_ARG(do_examine);		/* Examine an object */
CMD_ONE_ARG(do_find);			/* Search for name in database */
CMD_TWO_ARG(do_fixdb);			/* Database repair functions */
CMD_TWO_ARG_CMDARG(do_force);		/* Force someone to do something */
CMD_ONE_ARG_CMDARG(do_force_prefixed);	/* #<num> <cmd> variant of FORCE */
CMD_ONE_ARG(do_get);			/* Get an object */
CMD_TWO_ARG(do_give);			/* Give something away */
CMD_ONE_ARG(do_global);			/* Enable/disable global flags */
CMD_ONE_ARG(do_halt);			/* Remove commands from the queue */
CMD_ONE_ARG(do_help);			/* Print info from help files */
CMD_NO_ARG(do_inventory);		/* Print what I am carrying */
CMD_TWO_ARG(do_kill);			/* Kill something */
CMD_ONE_ARG(do_last);			/* Get recent login info */
CMD_NO_ARG(do_leave);			/* Leave the current object */
CMD_TWO_ARG(do_link);			/* Set home, dropto, or dest */
CMD_ONE_ARG(do_list);			/* List contents of internal tables */
CMD_ONE_ARG(do_list_file);		/* List contents of message files */
CMD_TWO_ARG(do_lock);			/* Set a lock on an object */
CMD_ONE_ARG(do_look);			/* Look here or at something */
CMD_NO_ARG(do_markall);			/* Mark or unmark all objects */
CMD_ONE_ARG(do_motd);			/* Set/list MOTD messages */
CMD_ONE_ARG(do_move);			/* Move about using exits */
CMD_TWO_ARG_ARGV(do_mvattr);		/* Move attributes on object */
CMD_TWO_ARG(do_name);			/* Change the name of something */
CMD_ONE_ARG(do_newpassword);		/* Change passwords */
CMD_TWO_ARG(do_notify);			/* Notify or drain semaphore */
CMD_TWO_ARG_ARGV(do_open);		/* Open an exit */
CMD_TWO_ARG(do_page);			/* Send message to faraway player */
CMD_TWO_ARG(do_parent);			/* Set parent field */
CMD_TWO_ARG(do_password);		/* Change my password */
CMD_TWO_ARG(do_pcreate);		/* Create new characters */
CMD_TWO_ARG(do_pemit);			/* Messages to specific player */
CMD_ONE_ARG(do_poor);			/* Reduce wealth of all players */
CMD_ONE_ARG(do_ps);			/* List contents of queue */
CMD_ONE_ARG(do_queue);			/* Force queue processing */
CMD_TWO_ARG(do_quota);			/* Set or display quotas */
CMD_NO_ARG(do_readcache);		/* Reread text file cache */
CMD_ONE_ARG(do_rob);			/* Steal from someone */
CMD_NO_ARG(do_rwho);			/* Open or close conn to rem RWHO */
CMD_ONE_ARG(do_say);			/* Messages to all */
CMD_NO_ARG(do_score);			/* Display my wealth */
CMD_ONE_ARG(do_search);			/* Search for objs matching criteria */
CMD_TWO_ARG(do_set);			/* Set flags or attributes */
CMD_TWO_ARG(do_setattr);		/* Set object attribute */
CMD_TWO_ARG(do_setvattr);		/* Set variable attribute */
CMD_ONE_ARG(do_shutdown);		/* Stop the game */
CMD_ONE_ARG(do_stats);			/* Display object type breakdown */
CMD_NO_ARG(do_sweep);			/* Check for listeners */
CMD_TWO_ARG_ARGV_CMDARG(do_switch);	/* Execute cmd based on match */
CMD_TWO_ARG(do_teleport);		/* Teleport elsewhere */
CMD_ONE_ARG(do_timewarp);		/* Warp various timers */
CMD_TWO_ARG(do_toad);			/* Turn a tinyjerk into a tinytoad */
CMD_TWO_ARG_ARGV(do_trigger);		/* Trigger an attribute */
CMD_ONE_ARG(do_unlock);			/* Remove a lock from an object */
CMD_ONE_ARG(do_unlink);			/* Unlink exit or remove dropto */
CMD_ONE_ARG(do_use);			/* Use object */
CMD_NO_ARG(do_version);			/* List MUSH version number */
CMD_TWO_ARG_ARGV(do_verb);		/* Execute a user-created verb */
CMD_TWO_ARG_CMDARG(do_wait);		/* Perform command after a wait */
CMD_ONE_ARG(do_whereis);		/* Tell where player is located */

typedef struct cmdentry CMDENT;
struct cmdentry {
	char	*cmdname;
	NAMETAB	*switches;
	int	perms;
	int	extra;
	int	callseq;
	void	(*handler)();
};

/* Command handler call conventions */

#define CS_NO_ARGS	0x0000	/* No arguments */
#define CS_ONE_ARG	0x0001	/* One argument */
#define CS_TWO_ARG	0x0002	/* Two arguments */
#define CS_NARG_MASK	0x0003	/* Argument count mask */
#define CS_ARGV		0x0004	/* ARG2 is in ARGV form */
#define CS_INTERP	0x0010	/* Interpret ARG2 if 2 args, ARG1 if 1 */
#define CS_NOINTERP	0x0020	/* Never interp ARG2 if 2 or ARG1 if 1 */
#define CS_CAUSE	0x0040	/* Pass cause to old command handler */
#define CS_UNPARSE	0x0080	/* Pass unparsed cmd to old-style handler */
#define CS_CMDARG	0x0100	/* Pass in given command args */	
#define CS_STRIP	0x0200	/* Strip braces even when not interpreting */

/* Command permission flags */

#define CA_PUBLIC	0x00000000	/* No access restrictions */
#define CA_GOD		0x00000001	/* GOD only... */
#define CA_WIZARD	0x00000002	/* Wizards only */
#define CA_BUILDER	0x00000004	/* Builders only */
#define CA_IMMORTAL	0x00000008	/* Immortals only */
#define CA_ROBOT	0x00000010	/* Robots only */

#define CA_NO_HAVEN	0x00001000	/* Not by HAVEN players */
#define CA_NO_ROBOT	0x00002000	/* Not by ROBOT players */
#define CA_NO_GAGGED	0x00004000	/* Not by GAGGED players */
#define CA_NO_SLAVE	0x00008000	/* Not by SLAVE players */
#define CA_NO_SUSPECT	0x00010000	/* Not by SUSPECT players */
#define CA_NO_GUEST	0x00020000	/* Not by GUEST players */

#define CA_GBL_BUILD	0x01000000	/* Requires the global BUILDING flag */
#define CA_GBL_INTERP	0x02000000	/* Requires the global INTERP flag */
#define CA_DISABLED	0x04000000	/* Command completely disabled */

#define CA_LOCATION	0x10000000	/* Invoker must have location */
#define CA_CONTENTS	0x20000000	/* Invoker must have contents */
#define CA_PLAYER	0x40000000	/* Invoker must be a player */
#define CF_DARK		0x80000000	/* Command doesn't show up in list */

extern int check_access (dbref player, int mask);
extern void process_command(dbref player, dbref cause, int interactive,
	char *command, char *args[], int nargs);

#endif