/*
 *		    -  - ----==== Y A M A ====---- -  -
 *			
 *			     (c) Alan Cox 1990
 *
 *	This program (YAMA) is made publicly available. Both sources
 *	and object code. The only prohibition on this software is its use
 *	for commercial purposes or the use of games developed on the system
 *	for commercial purposes of any kind.
 *
 *	YAMA is supplied without any warranty implicit or otherwise, and is
 *	used entirely at the operators risk. The author accepts no liability
 *	for anything that occurs directly, indirectly or otherwise as a result
 *	of the use, and or possesion of this software.
 */

/*
 *	Configuration Options
 */
 

/*
 *	Unsupported
#define LOW_MEMORY		/* Build a system with room longtexts on disk 
*/
/*#define DAFT_CPP*/		/* Thick CPP or CC that cant handle the
				   exotic inline macros - setting this
				   avoids them but loses range checking */
#define MAXU	32		/* Max users at a time - dont put this over
				   max file descriptors - 6 */
#define MAXLOOP	16		/* Maximum number of loops at once */
#define MAXRECURSE 64		/* Max table recursion */

/*
 *	Define PYR to get a client interface to RMOL chat
 *	Define TELNET to get a Telnet server
 *	or none of the above to generate a SYSV shared memory server
 */
#define UNIX
/*#define PYR */
/*#define TELNET*/
#ifdef PYR
#define NET
#endif
#ifdef TELNET
#define NET
#endif

typedef long tag;

#define ISOBJ(x)	(x)
#define ISNUM(x)	(x)
#define ISMSG(x)	(x)	/* For future expansion/checking */

#define IFMSG(x)	(1)
#define IFNUM(x)	(1)
#define IFOBJ(x)	(1)	/* You guessed it */

#define OBJ(x)		(x)
#define MSG(x)		(x)
#define NUM(x)		(x)
#define FLAG(x)		(x)	/* And again... */

typedef tag ** TABLE;
typedef tag *  LINE;
typedef tag	ITEM;

/*
 *	System default RVC queries
 */
 
#define RVC_EXIT	(-3)
#define RVC_WEIGHT	(-4)
#define RVC_SIZE	(-5)
#define RVC_LEVEL	(-6)
#define RVC_SCORE	(-7)
#define RVC_STRENGTH	(-8)
#define RVC_SNOOP	(-9)
#define RVC_VIS		(-10)
#define RVC_LDESC	(-11)
#define RVC_NAME	(-12)
#define RVC_ODESC	(-13)


struct ItemHeader
{
	char *ih_Name;
	short ih_Adj;
	short ih_Noun;
	TABLE ih_Control;
	short ih_Child,ih_Next;
};

	
struct Object
{
	struct ItemHeader o_header;
#define ob_Name o_header.ih_Name
#define ob_Adj o_header.ih_Adj
#define ob_Noun o_header.ih_Noun
#define ob_Table o_header.ih_Control
#define ob_Child o_header.ih_Child
#define ob_Next o_header.ih_Next
	tag ob_Data[16];
	char **ob_Desc;
};

struct  Room
{
	struct ItemHeader r_header;
#define rm_Name r_header.ih_Name
#define rm_Adj r_header.ih_Adj
#define rm_Noun r_header.ih_Noun
#define rm_Table r_header.ih_Control
	tag rm_Data[16];
#ifdef LOW_MEMORY
	unsigned long rm_Long;
#else
	char *rm_Long;
#endif
};

struct Player
{
	struct ItemHeader p_header;
#define pl_Name p_header.ih_Name
#define pl_Adj _header.ih_Adj
#define pl_Noun p_header.ih_Noun
#define pl_Table p_header.ih_Control
	tag pl_Data[32];
	char *pl_IOH[3];
	long pl_PwKey;
};

struct StackFrame
{
	struct StackFrame *Previous;
	int LoopInfo[MAXLOOP];
	int ForLoop[MAXLOOP];
	int ForLoc[MAXLOOP];
	int ForVar[MAXLOOP];
	int ForType[MAXLOOP];
	int UserLoop[MAXLOOP];
	int UserVar[MAXLOOP];
};


/*
 *	The macros now all call functions in macro.c mainly due to the size
 *	they were becoming
 */

#define ISITEM(x)	(mac_IsItem(x))
#define VALID(x)	(mac_Valid(x))

#define OBJECT(x)	(mac_Object(x))
#define PLAYER(x)	(mac_Player(x))
#define ROOM(x)		(mac_Room(x))

#ifdef OVERR
#define RDESC(x)	(TQuery(x,ROOM(x)->rm_Long,RVC_LDESC))
#else
#define RDESC(x)(ROOM(x)->rm_Long)
#endif
#define FLAGS(x)	((OBJECT(x)->ob_Data[0]))
#define LOC(x)		((OBJECT(x)->ob_Data[1]))
#ifdef OVERR
#define NAME(x)		(TQuery(x,OBJECT(x)->ob_Name,RVC_NAME))
#else
#define NAME(x)		(OBJECT(x)->ob_Name)
#endif

#define KEY(x)		((OBJECT(x)->ob_SysKey))

#ifdef OVERR
#define EXIT(x,y)	(NQuery2(x,ROOM(x)->rm_Data[(y)+2],RVC_EXIT,y))
#else
#define EXIT(x,y)	(ROOM(x)->rm_Data[(y)+2])
#endif
#define SETEXIT(x,y,z)	(ROOM(x)->rm_Data[(y)+2]=z)
#define RUSER(x,y)	(ROOM(x)->rm_Data[(y)+14])
#define DROPTO(x)	(ROOM(x)->rm_Data[14])	/* OBSOLETE */

#define STATE(x)	((OBJECT(x)->ob_Data[2]&0x0F))
#define MAXSTATE(x)	(((OBJECT(x)->ob_Data[2]&0xF0))>>4)
#ifndef OVERR
#define WEIGHT(x)	(OBJECT(x)->ob_Data[3])
#else
#define WEIGHT(x)	(NQuery(x,OBJECT(x)->ob_Data[3],RVC_WEIGHT))
#endif
#define SETWEIGHT(x,y)	OBJECT(x)->ob_Data[3]=(y);
#ifdef OVERR
#define SIZE(x)		(NQuery(x,OBJECT(x)->ob_Data[4],RVC_SIZE))
#else
#define SIZE(x)		(OBJECT(x)->ob_Data[4])
#endif

#define SETSIZE(x,y)	OBJECT(x)->ob_Data[4]=(y);
#define CLASS(x)	(OBJECT(x)->ob_Data[5])
#define OUSER(x,y)	(OBJECT(x)->ob_Data[y+6])

#ifdef OVERR
#define LEVEL(x)	(NQuery(x,PLAYER(x)->pl_Data[2],RVC_LEVEL))
#define SCORE(x)	(NQuery(x,PLAYER(x)->pl_Data[3],RVC_SCORE))
#define STRENGTH(x)	(NQuery(x,PLAYER(x)->pl_Data[4],RVC_STRENGTH))
#define SNOOP(x)	(NQuery(x,PLAYER(x)->pl_Data[5],RVC_SNOOP))
#define VIS(x)		(NQuery(x,PLAYER(x)->pl_Data[6],RVC_VIS))
#else
#define LEVEL(x)	(PLAYER(x)->pl_Data[2])
#define SCORE(x)	(PLAYER(x)->pl_Data[3])
#define STRENGTH(x)	(PLAYER(x)->pl_Data[4])
#define SNOOP(x)	(PLAYER(x)->pl_Data[5])
#define VIS(x)		(PLAYER(x)->pl_Data[6])
#endif
#define SETLEVEL(x,y)	PLAYER(x)->pl_Data[2]=(y);
#define SETSCORE(x,y)	PLAYER(x)->pl_Data[3]=(y);
#define SETSTRENGTH(x,y)PLAYER(x)->pl_Data[4]=(y);
#define SETSNOOP(x,y)	PLAYER(x)->pl_Data[5]=(y);
#define SETVIS(x,y)	PLAYER(x)->pl_Data[6]=(y);
#define PUSER(x,y)	(PLAYER(x)->pl_Data[y+7])

#define ADJ(x)		(OBJECT(x)->ob_Adj)
#define NOUN(x)		(OBJECT(x)->ob_Noun)

#define FL_TABITEM	0	/* Not yet implemented - true virtual item */
#define FL_PLAYER	1
#define FL_ROOM		2
#define FL_OBJECT	3
#define FL_TYPEMASK	3

#define TYPE(ct)	(FLAGS(ct)&FL_TYPEMASK)
#define PFL_BRIEF	4
#define PFL_MALE	8
#define PFL_BLIND	16
#define PFL_DEAF	32
#define PFL_ASLEEP	64
#define PFL_SEEDARK	128

#define OFL_FLANNEL	4
#define OFL_LIT0	8
#define OFL_LITALL	16
#define OFL_WORN	32

#define RFL_FALL	4
#define RFL_DARK	8
#define RFL_SMALL	16
#define RFL_DEATH	32

#ifdef OVERR
#define ODESC(x,y)	(TQuery2(x,OBJECT(x)->ob_Desc[y],RVC_ODESC,y))
#else
#define ODESC(x,y)	(OBJECT(x)->ob_Desc[y])
#endif

#define CANSEE(a,b)	(((LEVEL(a)>=VIS(b))||(a==b))&&(IsDarkFor(a)==0))
#define GCANSEE(a,b)	(TYPE(b)!=FL_PLAYER||((LEVEL(a)>=VIS(b))||(a==b)))



struct Word
{
	char *wd_Text;
	tag   wd_Code;
	short wd_Type;
	long  wd_Use;
	struct Word *wd_Next;
};

struct User
{
	short us_Uid;
	short us_Handle;
	short us_State;
	short us_Flag;
};

typedef struct User USER;

extern USER UserArray[MAXU];

struct Packet
{
	short pk_Code;
	short pk_Handle;
	short pk_Data;
	char  pk_Text[256];
};

typedef struct Packet PACKET;

#define PK_DISC	0
#define PK_CONN 1
#define PK_TXLN 2
#define PK_ECHO	3
#define PK_DISA 4
#define PK_SRVD 5
#define PK_PRMP 6
#define PK_ENAB 7
#define PK_NECH 8
#define PK_IDSC 9
#define PK_EDSC 10
#define PK_UPDT 11
#define PK_SNPT 12
#define PK_SNPE 13
#define PK_SNPS 14

#define US_IDLE	0
#define US_CMD	1
#define US_GNAM	2
#define US_GEPW	3
#define US_SEPW	4
#define US_VEPW	5
#define US_GSEX	6
#define US_CPWC	7
#define US_CPWN	8
#define US_CPWV 9

#define EXTENDED_KERNEL

#include "prototyp.h"