/
2.0.4beta/doc/
2.0.4beta/gnu/
2.0.4beta/sha/
/* teeny.h */

#include "config.h"

/*
 *		       This file is part of TeenyMUD II.
 *		 Copyright(C) 1993, 1994, 1995 by Jason Downs.
 *                           All rights reserved.
 * 
 * TeenyMUD II 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.
 *
 * TeenyMUD II 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 (see the file 'COPYING'); if not, write to
 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA.
 *
 */

#ifndef __TEENY_H

/* element code numbers. */

#define FLAGS           0
#define QUOTA           1
#define LOC             2

/* HOME and DROPTO are the same */
#define HOME            3
#define DROPTO          3

#define OWNER           4
#define CONTENTS        5
#define EXITS           6

/* ROOMS and PENNIES are the same */
#define ROOMS		7
#define PENNIES		7

#define NEXT            8
#define TIMESTAMP       9
#define CREATESTAMP	10
#define USES		11
#define PARENT		12
#define CHARGES		13
#define SEMAPHORES	14
#define COST		15
#define QUEUE		16

/* integer arrays. */

#define DESTS		25

/* strings. */

#define NAME		50

/* names of special attributes */
/* these reflect the tables in globals.c */

#define LTABLE_TOTAL	6

typedef struct lockslist {
  char *name;
  short matlen;
} LockList;

extern LockList Ltable[];

#define LOCK            (Ltable[0].name)
#define ENLOCK          (Ltable[1].name)
#define PGLOCK          (Ltable[2].name)
#define TELINLOCK       (Ltable[3].name)
#define TELOUTLOCK      (Ltable[4].name)
#define ULOCK           (Ltable[5].name)

#define ATABLE_TOTAL	48

typedef struct strings {
  char *name;
  char *calias;
  short flags;
  bool command;
} StringList;

extern StringList Atable[];

#define DESC		(Atable[0].name)
#define IDESC		(Atable[1].name)
#define ODESC		(Atable[2].name)
#define ADESC		(Atable[3].name)
#define SUC		(Atable[4].name)
#define OSUC		(Atable[5].name)
#define ASUC		(Atable[6].name)
#define FAIL		(Atable[7].name)
#define OFAIL		(Atable[8].name)
#define AFAIL		(Atable[9].name)
#define DROP		(Atable[10].name)
#define ODROP		(Atable[11].name)
#define ADROP		(Atable[12].name)
#define ENTER		(Atable[13].name)
#define OENTER		(Atable[14].name)
#define OXENTER		(Atable[15].name)
#define AENTER		(Atable[16].name)
#define LEAVE		(Atable[17].name)
#define OLEAVE		(Atable[18].name)
#define OXLEAVE		(Atable[19].name)
#define ALEAVE		(Atable[20].name)
#define KILL		(Atable[21].name)
#define OKILL		(Atable[22].name)
#define AKILL		(Atable[23].name)
#define OTELEPORT	(Atable[24].name)
#define OXTELEPORT	(Atable[25].name)
#define ATELEPORT	(Atable[26].name)
#define SEX		(Atable[27].name)
#define ENFAIL		(Atable[28].name)
#define OENFAIL		(Atable[29].name)
#define AENFAIL		(Atable[30].name)
#define SITE		(Atable[31].name)
#define PASSWORD	(Atable[32].name)
#define APREFIX		(Atable[33].name)
#define AFILTER		(Atable[34].name)
#define USE		(Atable[35].name)
#define OUSE		(Atable[36].name)
#define AUSE		(Atable[37].name)
#define RUNOUT		(Atable[38].name)
#define PAY		(Atable[39].name)
#define OPAY		(Atable[40].name)
#define APAY		(Atable[41].name)
#define STARTUP		(Atable[42].name)
#define STTY		(Atable[43].name)
#define KILLFAIL	(Atable[44].name)
#define OKILLFAIL	(Atable[45].name)
#define AKILLFAIL	(Atable[46].name)
#define ALIAS		(Atable[47].name)

#define SITE_FLGS	(Atable[31].flags)
#define PASSWORD_FLGS	(Atable[32].flags)
#define STTY_FLGS	(Atable[43].flags)
#define ALIAS_FLGS	(Atable[47].flags)

/* Object flags are 64bits long, broken into two 32bit words. */
#ifndef FLAGS_LEN
#define FLAGS_LEN	2	/* number of words */
#endif
#ifndef FLAGS_MAX
#define FLAGS_MAX	64	/* Maximum number of flags. */
#endif

/* Object type is in the first word. */
#define TYPE_MASK       0x00000007
#define TYPE_TOTAL	4

#define TYP_PLAYER      0
#define TYP_THING       1
#define TYP_ROOM        2
#define TYP_EXIT        3

#define TYP_BAD		6

/* Type specific flags are in the first word */

#define ABODE		0x00000010	/* everything, 'cept exits */
#define OBVIOUS		0x00000010	/* for exits */
#define ENTER_OK	0x00000020	/* everything, 'cept exits */
#define EXTERNAL	0x00000020	/* for exits */
#define ROBOT		0x00000040	/* for players */
#define ACTION		0x00000040	/* for exits */
#define GUEST		0x00000080	/* for players */
#define CHOWN_OK	0x00000080	/* everything, 'cept players */
#define RETENTIVE	0x00000100	/* for players */
#define DESTROY_OK	0x00000100	/* everything, 'cept players */
#define PUPPET		0x00000200	/* for things */
#define REVERSED_WHO	0x00000200	/* for players */
#define TRANSPARENT	0x00000200	/* for exits */
#define BUILDER		0x00000400	/* for players */
#define BUILDING_OK	0x00000400	/* for things and rooms */
#define AUDIBLE		0x00000800	/* everything, cept rooms */
#define OPAQUE		0x00000800	/* for players and things */
#define LIGHT		0x00001000	/* everything, cept rooms */
#define ELOQUENT	0x00002000	/* for players and things */

/* Non-type specific flags are in the second word */

#define GOD		0x00000001
#define WIZARD          0x00000002
#define LINK_OK         0x00000004
#define DARK            0x00000008
#define HAVEN           0x00000010
#define JUMP_OK         0x00000020
#define STICKY		0x00000040
#define PARENT_OK	0x00000080
#define VISUAL		0x00000100
#define NOSPOOF		0x00000200
#define HIDDEN		0x00000400
#define HALT		0x00000800
#define HAS_STARTUP	0x00001000
#define LISTENER	0x00002000
#define PICKY		0x00004000
#define FILE_OK		0x00008000
#define QUIET		0x00010000
#define NOCHECK		0x00020000
#define INHERIT		0x00040000
#define CONTROL_OK	0x00080000

/* Internal, database related, flags are in the second word. */
#define ALIVE		0x10000000
#define IN_MEMORY       0x20000000
#define DIRTY		0x40000000
#define MARKED		0x80000000

/* A mask for the internal use flags */

#define INTERNAL_FLAGS  0xF0000000

/* attribute flags */
#define A_PRIVATE       0x00000100
#define A_VISIBLE       0x00000200
#define A_PICKY		0x00000400
#define A_IMMUTABLE	0x00000800
#define A_INTERNAL      0x00001000

#define A_FLAGS_MAX	32

#define DEFATTR_FLGS	0
#define DEFLOCK_FLGS	0

/* boolexp locks */
struct boolexp {
  short type;

  struct boolexp *sub1;
  struct boolexp *sub2;	

  union {
    int thing;			/* for object locks */
    int flags[FLAGS_LEN];	/* for flag locks */
    char *atr[2];		/* for attribute locks */
  } dat;
};

/* boolexp types */
#define BOOLEXP_AND	0
#define BOOLEXP_OR	1
#define BOOLEXP_NOT	2
#define BOOLEXP_CONST	3
#define BOOLEXP_FLAG	4
#define BOOLEXP_ATTR	5
#define BOOLEXP_END	9

/* matching flags */
#define MAT_THINGS		0x0001
#define MAT_PLAYERS		0x0002
#define MAT_EXITS		0x0004
#define MAT_ANYTHING		0x0007
#define MAT_EXTERNAL		0x0100	/* for exits */
#define MAT_INTERNAL		0x0200	/* for exits */
#define MAT_LOCKS		0x0400	/* check locks */

/* Notify exception flags */
#define NOT_NOSPOOF	0x01
#define NOT_NOPUPPET	0x02
#define NOT_NOAUDIBLE	0x04
#define NOT_DARKOK	0x08
#define NOT_QUIET	0x10

/* Resolver flags */
#define RSLV_NOISY	0x01
#define RSLV_EXITS	0x02
#define RSLV_SPLATOK	0x04
#define RSLV_HOME	0x08
#define RSLV_ATOK	0x10
#define RSLV_ALLOK	0x20
#define RSLV_RECURSE	0x40

/* exec flags */
#define EXEC_PRIM	0x01

/* Misc. defines */
#ifndef TRUE
#define TRUE		(1)
#endif
#ifndef FALSE
#define FALSE  		(0)
#endif
#define BUFFSIZ		512
#define MEDBUFFSIZ	4096
#define LARGEBUFFSIZ	16384
#define STAMP_LOGIN	0
#define STAMP_CREATED	1
#define STAMP_USED	2
#define STAMP_MODIFIED	2
#define LOCK_REGISTER	1
#define LOCK_DISCONNECT	2
#define LOCK_ALLOWCRE	3
#define LOCK_ALLOWCON	4

/* Logging. */
#define LOG_STATUS	0
#define LOG_GRIPE	1
#define LOG_COMMAND	2
#define LOG_ERROR	3

/* Macros for checking flags */

#define isGOD(_x)	((_x == mudconf.player_god) \
			 || Flags(_x,mudconf.god_flags,"isGOD"))
#define isWIZARD(_x)	((_x == mudconf.player_god) \
			 || Flags(_x,mudconf.god_flags,"isWIZARD") \
			 || Flags(_x,mudconf.wizard_flags,"isWIZARD") \
			 || inherit_wizard(_x))
#define isROBOT(_x)	((Typeof(_x) == TYP_PLAYER) \
			 && Flags(_x,mudconf.robot_flags,"isROBOT"))
#define isSTICKY(_x)	(Flag2(_x,STICKY,"isSTICKY"))
#define isLINK_OK(_x)	(Flag2(_x,LINK_OK,"isLINK_OK"))
#define isDARK(_x)	(Flag2(_x,DARK,"isDARK"))
#define isHAVEN(_x)	(Flag2(_x,HAVEN,"isHAVEN"))
#define isJUMP_OK(_x)	(Flag2(_x,JUMP_OK,"isJUMP_OK"))
#define isABODE(_x)	((Typeof(_x) != TYP_EXIT) && Flag1(_x,ABODE,"isABODE"))
#define isOBVIOUS(_x)	((Typeof(_x) == TYP_EXIT) \
			 && Flag1(_x,OBVIOUS,"isOBVIOUS"))
/* XXX */
#define isBUILDER(_x)	((Typeof(getowner(_x)) == TYP_PLAYER) \
			 && Flag1(getowner(_x),BUILDER,"isBUILDER"))
#define isBUILDING_OK(_x)	((Typeof(_x) != TYP_PLAYER) \
			 && Flag1(_x,BUILDING_OK,"isBUILDING_OK"))
#define isENTER_OK(_x)	((Typeof(_x) != TYP_EXIT) \
			 && Flag1(_x,ENTER_OK,"isENTER_OK"))
#define isEXTERNAL(_x)	((Typeof(_x) == TYP_EXIT) \
			 && Flag1(_x,EXTERNAL,"isEXTERNAL"))
#define isACTION(_x)	((Typeof(_x) == TYP_EXIT) \
			 && Flag1(_x,ACTION,"isACTION"))
#define isGUEST(_x)	(Flags(_x,mudconf.guest_flags,"isGUEST"))
#define isLISTENER(_x)	(Flag2(_x,LISTENER,"isLISTENER"))
#define isDESTROY_OK(_x)	((Typeof(_x) != TYP_PLAYER) \
			 && Flag1(_x,DESTROY_OK,"isDESTROY_OK"))
#define isCHOWN_OK(_x)	((Typeof(_x) != TYP_PLAYER) \
			 && Flag1(_x,CHOWN_OK,"isCHOWN_OK"))
#define isPUPPET(_x)	((Typeof(_x) == TYP_THING) \
			 && Flag1(_x,PUPPET,"isPUPPET"))
#define isREVERSED_WHO(_x)	((Typeof(_x) == TYP_PLAYER) \
			 && Flag1(_x,REVERSED_WHO,"isREVERSED_WHO"))
#define isPARENT_OK(_x)	(Flag2(_x,PARENT_OK,"isPARENT_OK"))
#define isVISUAL(_x)	(Flag2(_x,VISUAL,"isVISUAL"))
#define isAUDIBLE(_x)	((Typeof(_x) != TYP_ROOM) \
			 && Flag1(_x,AUDIBLE,"isAUDIBLE"))
#define isOPAQUE(_x)	(((Typeof(_x) == TYP_THING) \
			  || (Typeof(_x) == TYP_PLAYER)) \
			 && Flag1(_x,OPAQUE,"isOPAQUE"))
#define isLIGHT(_x)	((Typeof(_x) != TYP_ROOM) \
			 && Flag1(_x,LIGHT,"isLIGHT"))
#define isELOQUENT(_x)	(((Typeof(_x) == TYP_PLAYER) \
			  || (Typeof(_x) == TYP_THING)) \
			 && Flag1(_x,ELOQUENT,"isELOQUENT"))
#define isTRANSPARENT(_x)	((Typeof(_x) == TYP_EXIT) \
				 && Flag1(_x,TRANSPARENT,"isTRANSPARENT"))
#define isNOSPOOF(_x)	(Flag2(_x,NOSPOOF,"isNOSPOOF"))
#define isHIDDEN(_x)	(Flag2(_x,HIDDEN,"isHIDDEN"))
#define isHALT(_x)	(Flag2(_x,HALT,"isHALT"))
#define isHAS_STARTUP(_x)	(Flag2(_x,HAS_STARTUP,"isHAS_STARTUP"))
#define isRETENTIVE(_x)	((Typeof(_x) == TYP_PLAYER) \
			 && Flag1(_x,RETENTIVE,"isRETENTIVE"))
#define isPICKY(_x)	(Flag2(_x,PICKY,"isPICKY"))
#define isFILE_OK(_x)	(Flag2(_x,FILE_OK,"isFILE_OK"))
#define isQUIET(_x)	(Flag2(_x,QUIET,"isQUIET"))
#define isNOCHECK(_x)	(Flag2(_x,NOCHECK,"isNOCHECK"))
#define isINHERIT(_x)	(Flag2(_x,INHERIT,"isINHERIT"))
#define isCONTROL_OK(_x)	(Flag2(_x,CONTROL_OK,"isCONTROL_OK"))

#define isALIVE(_x)	(Flag2(_x,ALIVE,"isALIVE"))
#define isMARKED(_x)	(Flag2(_x,MARKED,"isMARKED"))

#define isPLAYER(_x)	(Typeof(_x) == TYP_PLAYER)
#define isROOM(_x)	(Typeof(_x) == TYP_ROOM)
#define isEXIT(_x)	(Typeof(_x) == TYP_EXIT)
#define isTHING(_x)	(Typeof(_x) == TYP_THING)

#define isGARBAGE(_x)	((_x >= 0) && (_x < mudstat.total_objects) \
			 && !exists_object(_x))

/* flag set macros */
#define setHALT(_x)	(setFlag(_x,HALT,1,"setHALT"))
#define setHAS_STARTUP(_x)	(setFlag(_x,HAS_STARTUP,1,"setHAS_STARTUP"))
#define unsetHAS_STARTUP(_x)	\
			(unsetFlag(_x,HAS_STARTUP,1,"unsetHAS_STARTUP"))

/* more macros */

#define has_contents(_x)	(Typeof(_x) != TYP_EXIT)
#define has_exits(_x)	(Typeof(_x) != TYP_EXIT)
#define has_rooms(_x)	(Typeof(_x) == TYP_ROOM)
#define has_home(_x)	((Typeof(_x) != TYP_EXIT) \
			 && (Typeof(_x) != TYP_ROOM))
#define has_dests(_x)	(Typeof(_x) == TYP_EXIT)
#define has_dropto(_x)	(Typeof(_x) == TYP_ROOM)
#define has_quota(_x)	(Typeof(_x) == TYP_PLAYER)
#define has_pennies(_x)	(Typeof(_x) == TYP_PLAYER)

#define cost_of(_x)	(isROOM(_x) ? mudconf.room_cost : \
			 (isEXIT(_x) ? mudconf.exit_cost : \
				(isTHING(_x) ? mudconf.thing_cost : 0)))

#define is_list(_x)	((_x == CONTENTS) || (_x == EXITS) || (_x == ROOMS))

#define notify_oall(_p,_c,_s,_st,_f)	notify_except2(_p,_c,_s,_st,_p,-1,_f)
#define notify_all(_p,_c,_s,_st,_f)	notify_except2(_p,_c,_s,_st,-1,-1,_f)
#define notify_except(_p,_c,_s,_st,_e,_f) \
			notify_except2(_p,_c,_s,_st,_e,-1,_f)
#define notify_contents(_l,_c,_s,_st,_f) \
			notify_contents_except(_l,_c,_s,_st,-1,_f)

#define remove_newline(_zz)	{register int _yy = strlen(_zz)-1; \
				 if(_zz[_yy] == '\n') _zz[_yy] = '\0';}

#define can_see_attr(_p,_c,_o,_f)	((isVISUAL(_o) || (_f & A_VISIBLE) || \
				  	 controls(_p, _c, _o)) && \
				 	(!(_f & A_INTERNAL) || isGOD(_p)))
#define can_set_attr(_p,_c,_o,_f)	(controls(_p, _c, _o) \
					 && (!(_f & A_INTERNAL) \
					     || isGOD(_p)) \
					 && (!(_f & A_IMMUTABLE) \
					     || isWIZARD(_p)))

#define __TEENY_H
#endif				/* __TEENY_H */