/*
* - - ----==== 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"