#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "struct.h"
#include "ctype.h"
/**/
extern char **Messages;
void C_Done()
{
;
}
void C_Ok()
{
UPrintf("Ok\n");
}
void C_Msg()
{
PMsg(Arg());
}
int Q_Get()
{
tag i=Arg();
if(CanPut(i,Me())==0)
{
UPrintf("You can't carry that.\n");
return(0);
}
MoveItem(i,Me());
DoesT(Me(),"takes",17,i);
return(1);
}
void C_Drop()
{
tag i=Arg();
MoveItem(i,LOC(Me()));
DoesT(Me(),"drops",17,i);
}
void C_Place()
{
tag i=Arg();
tag j=Arg();
MoveItem(i,j);
}
void C_Call()
{
ExecTable(NUM(Arg()));
}
void C_Ld()
{
int a=Arg();
SysFlags[FLAG(a)]=Arg();
}
int Q_NumOf()
{
int v;
int a=MSG(Arg());
int r;
r=sscanf(Messages[a],"%d",&v);
if(r==0)
{
Arg();
return(r);
}
SysFlags[FLAG(Arg())]=v;
return(1);
}
void C_LdF()
{
int a=Arg();
SysFlags[FLAG(a)]=SysFlags[FLAG(Arg())];
}
void C_Print()
{
UPrintf("%d",NUM(Arg()));
}
/*
* FixMe: enforce 0-127 ranging
*/
void C_LdO()
{
tag a=Arg();
tag b=Arg();
SysFlags[FLAG(a)]=OBJECT(b)->ob_Data[NUM(Arg())];
}
void C_LdR()
{
tag a=Arg();
tag b=Arg();
SysFlags[FLAG(a)]=ROOM(b)->rm_Data[NUM(Arg())];
}
void C_LdP()
{
tag a=Arg();
tag b=Arg();
SysFlags[FLAG(a)]=PLAYER(b)->pl_Data[NUM(Arg())];
}
void C_SetO()
{
tag a=Arg();
tag b=Arg();
OBJECT(a)->ob_Data[NUM(b)]=Arg();
}
void C_SetP()
{
tag a=Arg();
tag b=Arg();
PLAYER(a)->pl_Data[NUM(b)]=Arg();
}
void C_SetR()
{
tag a=Arg();
tag b=Arg();
ROOM(a)->rm_Data[NUM(b)]=Arg();
}
void C_Mul()
{
tag a=Arg();
tag t=SysFlags[FLAG(a)]*NUM(Arg());
/* if(!IFNUM(t))
{
log_error("[DATABASE ERROR]: MUL overflow.\n",NULL);
panic();
}*/
SysFlags[FLAG(a)]=ISNUM(t);
}
void C_Div()
{
tag a=FLAG(Arg());
tag b=NUM(Arg());
if(b==0)
{
log_error("[DATABASE ERROR]: Division by Zero\n",NULL);
panic();
}
SysFlags[a]=ISNUM(SysFlags[a]/b);
}
void C_Add()
{
tag a=FLAG(Arg());
tag t;
/* NUM(SysFlags[a]); */
t=SysFlags[a]+NUM(Arg());
/* if(!IFNUM(t))
{
log_error("[DATABASE ERROR]: Add - range error\n",NULL);
panic();
}*/
SysFlags[a]=ISNUM(t);
}
void C_Sub()
{
tag a=FLAG(Arg());
tag t=SysFlags[a]-NUM(Arg());
/* if(!IFNUM(t))
{
log_error("[DATABASE ERROR]: Sub - range error\n",NULL);
panic();
}*/
SysFlags[a]=ISNUM(t);
}
void C_Set()
{
tag a=FLAG(Arg());
tag b=NUM(Arg());
if((b<0||b>28)&&(b!=31))
{
log_error("[DATABASE ERROR]: Set - bad bit\n",NULL);
panic();
}
SysFlags[a]|=(1<<b);
}
void C_Res()
{
tag a=FLAG(Arg());
tag b=NUM(Arg());
if((b<0||b>28)&&(b!=31))
{
log_error("[DATABASE ERROR]: Set - bad bit\n",NULL);
panic();
}
SysFlags[a]&=~(1<<b);
}
void C_Inc()
{
tag a=Arg();
if(STATE(a)<MAXSTATE(a))
SetState(a,STATE(a)+1);
}
void C_Dec()
{
tag a=Arg();
if(STATE(a))
SetState(a,STATE(a)-1);
}
void C_SetState()
{
tag a=Arg();
tag b=NUM(Arg());
SetState(a,b);
}
void C_DoAct()
{
tag a=Arg();
tag b=Arg();
tag c=Arg();
Does(a,b,c,ISOBJ(-1));
}
void C_DoTo()
{
tag a=Arg();
tag b=Arg();
tag c=Arg();
tag d=Arg();
Does(a,b,c,d);
}
void C_Score()
{
UPrintf("Your score is %d\n",SCORE(Me()));
}
void C_Look()
{
int ct;
if(FLAGS(Me())&PFL_BLIND)
return;
MarkClean(Me());
if((Me()<ISOBJ(MAXU))&&(Me()>ISOBJ(0)))
WriteToHandle(UserArray[OBJ(Me())].us_Handle,PK_IDSC,"");
if(LOC(Me())==ISOBJ(-1))
{
UPrintf("You are no more.\n");
goto l2;
}
if(TYPE(LOC(Me()))!=FL_ROOM)
{
UPrintf("You are in %s.\n",NAME(LOC(Me())));
goto l1;
}
if(Q_Dark())
{
UPrintf("It is dark.\n");
if((Me()<ISOBJ(MAXU))&&(Me()>ISOBJ(0)))
WriteToHandle(UserArray[OBJ(Me())].us_Handle,PK_EDSC,"");
return;
}
ndchk: UPrintf("%s\n",ROOM(LOC(Me()))->rm_Name);
if(FLAGS(Me())&PFL_BRIEF)
goto brief;
UPrintf("%s\n",ROOM(LOC(Me()))->rm_Long);
ExecTable(2);
ct=OBJECT(LOC(Me()))->ob_Child; /* DO HERE - Tab 2 might move things !! */
while(ct != -1)
{
if(ISITEM(ct)&&TYPE(ct)==FL_OBJECT&&
(FLAGS(ct)&OFL_FLANNEL))
{
if(strlen(ODESC(ct,STATE(ct))))
UPrintf("%s\n",ODESC(ct,STATE(ct)));
}
ct=OBJECT(ct)->ob_Next;
}
l1:;
brief: ct=OBJECT(LOC(Me()))->ob_Child;
while(ct != -1)
{
if(ISITEM(ct)&&(TYPE(ct)==FL_PLAYER)&&(CANSEE(Me(),ct))&&
(ct!=Me()))
{
UPrintf("%s %s",MakeCName(ct),PLAYER(ct)->pl_IOH[0]);
ChkCarried(ct);
}
ct=OBJECT(ct)->ob_Next;
}
DoLobjl(LOC(Me()));
ExecTable(3);
l2: if((Me()<ISOBJ(MAXU))&&(Me()>ISOBJ(-1)))
WriteToHandle(UserArray[Me()].us_Handle,PK_EDSC,"");
}
void ChkCarried(x)
tag x;
{
int ct=OBJECT(x)->ob_Child;
while(ct != -1)
{
if(ISITEM(ct))
{
UPrintf(" carrying ");
Lobs(x);
UPrintf("\n");
return;
}
ct=OBJECT(ct)->ob_Next;
}
UPrintf(".\n");
}
void C_DoLobj()
{
DoLobjl(Arg());
}
void DoLobjl(x)
tag x;
{
tag ct=OBJECT(x)->ob_Child;
while(ct != -1)
{
if(ISITEM(ct)&&(TYPE(ct)==FL_OBJECT)&&
((FLAGS(ct)&OFL_FLANNEL)==0))
{
UPrintf("%s\n",ODESC(ct,STATE(ct)));
}
ct=OBJECT(ct)->ob_Next;
}
}
void C_Lobjs()
{
tag a=Arg();
Lobs(a);
}
void Lobs(a)
tag a;
{
tag ct=OBJECT(a)->ob_Child;
tag hfn1= ISOBJ(-1);
int h1=0;
while(ct != -1)
{
if(ISITEM(ct))
{
if(hfn1!=-1)
{
h1=1;
UPrintf("%s, ",NAME(hfn1));
}
hfn1=ct;
}
ct=OBJECT(ct)->ob_Next;
}
if(hfn1!=ISOBJ(-1))
{
if(h1)
UPrintf("and %s.",NAME(hfn1));
else
UPrintf("%s.",NAME(hfn1));
}
else
UPrintf("nothing.");
}
void C_PName()
{
tag a=Arg();
UPrintf("%s",NAME(a));
}
void C_PDesc()
{
tag a=Arg();
tag b=NUM(Arg());
if(TYPE(a)!=FL_OBJECT)
{
log_error("[DATABASE ERROR]: PDesc - needs object.\n",NULL);
panic();
}
UPrintf("%s",ODESC(a,b));
}
void C_PLong()
{
tag a=Arg();
if(TYPE(a)!=FL_ROOM)
{
log_error("[DATABASE ERROR]: PLong - needs room.\n",NULL);
panic();
}
UPrintf("%s\n",ROOM(a)->rm_Long);
}
void C_JP()
{
NextLineMove(NUM(Arg()));
}
void C_CR()
{
UPrintf("\n");
}
void C_MsgCR()
{
C_Msg();
C_CR();
}
Q_Z()
{
return(SysFlags[FLAG(Arg())]==0);
}
Q_Eq()
{
tag a=FLAG(Arg());
return(SysFlags[a]==Arg());
}
Q_Gt()
{
tag a=FLAG(Arg());
return(SysFlags[a]>Arg());
}
Q_Lt()
{
tag a=FLAG(Arg());
return(SysFlags[a]<Arg());
}
Q_At()
{
return(LOC(Me())==Arg());
}
Q_Is()
{
tag a=Arg();
return(TYPE(a)==NUM(Arg()));
}
Q_Bit()
{
tag a=FLAG(Arg());
return(SysFlags[a]&(1<<NUM(Arg())));
}
Q_IsAt()
{
tag a=Arg();
return(LOC(a)==Arg());
}
Q_Here()
{
tag a=Arg();
return(LOC(Me())==LOC(a));
}
Q_Pres()
{
tag x=Arg();
tag a=LOC(x);
return((a==Me())||(a==LOC(Me())));
}
Q_Dark()
{
if((FLAGS(LOC(Me()))&RFL_DARK)==0)
return(0);
return(IsDark(LOC(Me()),Me()));
}
Q_State()
{
tag a=Arg();
return(STATE(a)==NUM(Arg()));
}
Q_Chance()
{
return((rand()%10000)<(NUM(Arg())));
}
Q_OBit()
{
tag n=Arg();
if(FLAGS(n)&(1<<NUM(Arg())))
return(1);
return(0);
}
Q_PBit()
{
tag n=Arg();
if(FLAGS(n)&(1<<NUM(Arg())))
return(1);
return(0);
}
Q_RBit()
{
tag n=Arg();
if(FLAGS(n)&(1<<NUM(Arg())))
return(1);
return(0);
}
Q_CanSee()
{
tag a=Arg();
tag b=Arg();
if(TYPE(b)==FL_PLAYER)
{
if(!CANSEE(a,b))
return(0);
}
if(LOC(a)==LOC(b)&&IsDark(LOC(a),a))
{
return(0);
}
return(1);
}
Q_Level()
{
if(LEVEL(Me())>=NUM(Arg()))
return(1);
return(0);
}
Q_Arch()
{
extern char *ArchName[];
int ct=0;
int a=Arg();
while(ct<16)
{
if(ArchName[ct]==NULL)
break;
if(strcmp(NAME(a),ArchName[ct])==0)
return(1);
ct++;
}
return(0);
}
Q_Called()
{
tag a=Arg();
tag b=MSG(Arg());
return(strcmp(NAME(a),Messages[b])==0);
}
Q_Weighs()
{
return(Weight(Me())>=NUM(Arg()));
}
Q_CanPut()
{
tag a=Arg();
return(CanPut(a,Arg()));
}
Q_Got()
{
tag a=Arg();
return(LOC(a)==Me());
}
void C_Exit()
{
extern USER UserArray[];
OBJ(Me());
if(Me()<ISOBJ(MAXU)&&Me()>=ISOBJ(0))
WriteToHandle(UserArray[Me()].us_Handle,PK_DISC,"forum");
Exit_Player(SysFlags[0]);
}
void C_Save()
{
OBJ(Me());
UPrintf("Saving %s.\n",NAME(Me()));
SaveUser(Me(),NAME(Me()));
UPrintf("Ok.\n");
}
Q_Neil()
{
static tag pa,pb;
tag a=Arg();
tag b=OBJ(Arg());
if(b==-1)
{
b=OBJECT(a)->ob_Child;
if(b==-1)
{
Arg();
return(0);
}
pa=a;
pb=OBJECT(b)->ob_Next; /* Cache one */
SysFlags[FLAG(Arg())]=b;
return(1);
}
if(LOC(b)!=a)
{
if(pa==a)
{
b=pb;
goto resync;
}
Arg();
return(0);
}
b=OBJECT(b)->ob_Next;
resync: if(b==-1)
{
Arg();
return(0);
}
pa=a;
pb=OBJECT(b)->ob_Next; /* Cache one ahead */
SysFlags[FLAG(Arg())]=b;
return(1);
}
void C_GetWords()
{
tag a=Arg();
SysFlags[FLAG(Arg())]=ADJ(a);
SysFlags[FLAG(Arg())]=NOUN(a);
}
void C_Parse()
{
char a[256];
strncpy(a,Messages[MSG(Arg())],255);
a[255]=0;
if(Parser(a))
{
WhatThings();
ExecTable(0);
}
}
void C_TabTo()
{
/*OBJ(SysFlags[0]);*/
Set_Tab(SysFlags[0],NUM(Arg()));
}
void C_Prompt()
{
if(Me()>=ISOBJ(0)&&Me()<ISOBJ(MAXU))
WriteToHandle(UserArray[Me()].us_Handle,PK_PRMP,Messages[Arg()]);
}
void C_AutoVerb()
{
UPrintf("Not currently implemented!\n");
}
void C_Append()
{
tag fv=MSG(Arg());
tag m=MSG(Arg());
FILE *f=fopen(Messages[fv],"a");
if(f)
{
fprintf(f,"%s\n",Messages[m]);
fclose(f);
}
else
{
UPrintf("Can't access file!\n");
}
}
Q_Type()
{
#ifndef UNIX
/* Kludge to translate filenames to a TOS-like form */
extern char *f_tos();
FILE *f=fopen(f_tos(Messages[MSG(Arg())]),"r");
#else
FILE *f=fopen(Messages[MSG(Arg())],"r");
#endif
char buf[128];
if(f)
{
while(fgets(buf,127,f))
UPrintf("%s",buf);
fclose(f);
return(1);
}
return(0);
}
Q_NextMatch()
{
tag a=Arg();
tag b=Arg();
tag c=Arg();
tag d=Arg();
tag e=FLAG(Arg());
SysFlags[e]=NextIn(a,b,c,d);
if(SysFlags[e]==-1)
return(0);
return(1);
}
Q_NextGMatch()
{
tag a=Arg();
int b=NUM(Arg());
int c=NUM(Arg());
int e=FLAG(Arg());
SysFlags[e]=NextAny(a,b,c);
if(SysFlags[e]==-1)
return(0);
return(1);
}
void C_Random()
{
long t;
int a=FLAG(Arg());
time(&t);
SysFlags[a]=(rand()^t)%10000;
}
void C_PwChange()
{
int a=VAL(Me());
int h;
OBJ(Me()); /* do type check anyway */
if(a<0||a>=MAXU)
{
log_error("[DATABASE ERROR]: PWChange not valid for non user.\n",NULL);
panic();
}
h=UserArray[a].us_Handle;
WriteToHandle(h,PK_PRMP,"Current Password: ");
WriteToHandle(h,PK_NECH,NULL);
UserArray[a].us_State=US_CPWC;
}
void C_PwForce()
{
char *u=Messages[MSG(Arg())];
char *pw=Messages[MSG(Arg())];
ForcePassword(u);
}
void C_MkPlayer()
{
int m=MSG(Arg());
int a=FLAG(Arg());
tag b;
SysFlags[a]=(b=AddPlayer());
OBJECT(b)->ob_Child= -1;
OBJECT(b)->ob_Next= -1;
AddName(Messages[m],b,1);
}
void C_MkRoom()
{
int m=MSG(Arg());
int a=FLAG(Arg());
tag b;
SysFlags[a]=(b=AddRoom());
OBJECT(b)->ob_Child= -1;
OBJECT(b)->ob_Next= -1;
AddName(Messages[m],b,1);
}
void C_MkObject()
{
int m=MSG(Arg());
int a=FLAG(Arg());
tag b;
SysFlags[a]=(b=AddObject());
OBJECT(b)->ob_Child= -1;
OBJECT(b)->ob_Next= -1;
AddName(Messages[m],b,1);
}
void C_PCName()
{
char *c;
char x;
int a=Arg();
/* OBJ(a); */
c=NAME(a);
x= *c;
if(islower(x))
*c=toupper(x);
UPrintf("%s",NAME(a));
*c=x;
}
void C_MFormat()
{
/*
* Be careful with this routine.. make sure panics occur before
* result is malloc'd or you will get a memory leak..
*/
int s=MSG(Arg());
int t=Arg();
int sm[2];
char *result;
tag si[3];
int l=0;
char *sp=Messages[s];
/* MSG(t); */
sm[0]=Arg();
sm[1]=Arg();
si[0]=Arg();
si[1]=Arg();
si[2]=Arg();
/* MSG(sm[0]);
MSG(sm[1]);
OBJ(si[0]);
OBJ(si[1]);
OBJ(si[2]);*/
while(*sp)
{
if(*sp=='%')
{
sp++;
switch(*sp)
{
case '%':l++;break;
case 'N':switch(*++sp)
{
case '0':l+=strlen(NAME(si[0]));break;
case '1':l+=strlen(NAME(si[1]));break;
case '2':l+=strlen(NAME(si[2]));break;
default:FormErr(t);return;
}
break;
case 'n':switch(*++sp)
{
case '0':l+=strlen(NAME(si[0]));break;
case '1':l+=strlen(NAME(si[1]));break;
case '2':l+=strlen(NAME(si[2]));break;
default:FormErr(t);return;
}
break;
case 'd':switch(*++sp)
{
case '0':l+=strlen(ODESC(si[0],STATE(si[0])));break;
case '1':l+=strlen(ODESC(si[1],STATE(si[1])));break;
case '2':l+=strlen(ODESC(si[2],STATE(si[2])));break;
default:FormErr(t);return;
}
break;
case 'h':switch(*++sp)
{
case '0':l+=strlen(PLAYER(si[0])->pl_IOH[0]);break;
case '1':l+=strlen(PLAYER(si[1])->pl_IOH[0]);break;
case '2':l+=strlen(PLAYER(si[2])->pl_IOH[0]);break;
default:FormErr(t);return;
}
break;
case 'l':switch(*++sp)
{
case '0':l+=strlen(PLAYER(si[0])->pl_IOH[1]);break;
case '1':l+=strlen(PLAYER(si[1])->pl_IOH[1]);break;
case '2':l+=strlen(PLAYER(si[2])->pl_IOH[1]);break;
default:FormErr(t);return;
}
break;
case 'a':switch(*++sp)
{
case '0':l+=strlen(PLAYER(si[0])->pl_IOH[2]);break;
case '1':l+=strlen(PLAYER(si[1])->pl_IOH[2]);break;
case '2':l+=strlen(PLAYER(si[2])->pl_IOH[2]);break;
default:FormErr(t);return;
}
break;
case 'm':switch(*++sp)
{
case '0':l+=strlen(Messages[sm[0]]);break;
case '1':l+=strlen(Messages[sm[1]]);break;
default:FormErr(t);return;
}
break;
case 'r':switch(*++sp)
{
case '0':l+=strlen(RDESC(si[0]));break;
case '1':l+=strlen(RDESC(si[1]));break;
case '2':l+=strlen(RDESC(si[2]));break;
default:FormErr(t);return;
}
break;
case 'T':switch(*++sp)
{
case '0':l+=strlen(TrueName(si[0]));break;
case '1':l+=strlen(TrueName(si[1]));break;
case '2':l+=strlen(TrueName(si[2]));break;
default:FormErr(t);return;
}
}
}
else
l++;
sp++;
}
result=(char *)emalloc(l+1);
*result=0;
sp=Messages[s];
while(*sp)
{
if(*sp=='%')
{
sp++;
switch(*sp)
{
case '%':strcat(result,"%");break;
case 'N':switch(*++sp)
{
case '0':strcat(result,MakeCName(si[0]));break;
case '1':strcat(result,MakeCName(si[1]));break;
case '2':strcat(result,MakeCName(si[2]));break;
default:FormErr(t);return;
}
break;
case 'n':switch(*++sp)
{
case '0':strcat(result,NAME(si[0]));break;
case '1':strcat(result,NAME(si[1]));break;
case '2':strcat(result,NAME(si[2]));break;
default:FormErr(t);return;
}
break;
case 'd':switch(*++sp)
{
case '0':strcat(result,ODESC(si[0],STATE(si[0])));break;
case '1':strcat(result,ODESC(si[1],STATE(si[1])));break;
case '2':strcat(result,ODESC(si[2],STATE(si[2])));break;
default:FormErr(t);return;
}
break;
case 'h':switch(*++sp)
{
case '0':strcat(result,PLAYER(si[0])->pl_IOH[0]);break;
case '1':strcat(result,PLAYER(si[1])->pl_IOH[0]);break;
case '2':strcat(result,PLAYER(si[2])->pl_IOH[0]);break;
default:FormErr(t);return;
}
break;
case 'l':switch(*++sp)
{
case '0':strcat(result,PLAYER(si[0])->pl_IOH[1]);break;
case '1':strcat(result,PLAYER(si[1])->pl_IOH[1]);break;
case '2':strcat(result,PLAYER(si[2])->pl_IOH[1]);break;
default:FormErr(t);return;
}
break;
case 'a':switch(*++sp)
{
case '0':strcat(result,PLAYER(si[0])->pl_IOH[2]);break;
case '1':strcat(result,PLAYER(si[1])->pl_IOH[2]);break;
case '2':strcat(result,PLAYER(si[2])->pl_IOH[2]);break;
default:FormErr(t);return;
}
break;
case 'm':switch(*++sp)
{
case '0':strcat(result,Messages[sm[0]]);break;
case '1':strcat(result,Messages[sm[1]]);break;
default:FormErr(t);return;
}
break;
case 'r':switch(*++sp)
{
case '0':strcat(result,RDESC(si[0]));break;
case '1':strcat(result,RDESC(si[1]));break;
case '2':strcat(result,RDESC(si[2]));break;
default:FormErr(t);return;
}
break;
case 'T':switch(*++sp)
{
case '0':strcat(result,TrueName(si[0]));break;
case '1':strcat(result,TrueName(si[1]));break;
case '2':strcat(result,TrueName(si[2]));break;
default:FormErr(t);return;
}
}
}
else
{
char x[2];
x[0]= *sp;
x[1]=0;
strcat(result,x);
}
sp++;
}
free(Messages[MSG(t)]);
Messages[MSG(t)]=result;
}
void FormErr(t)
tag t;
{
/* MSG(t); */
free(Messages[t]);
Messages[t]=estralloc("Formatting Error");
printf("[DATABASE WARNING]: Formatting Error\n");
}
Q_Next()
{
tag a=Arg()+1;
int b=Arg();
tag c=FLAG(Arg());
while(a<ISOBJ(NObs()))
{
if(ISITEM(a)&&(TYPE(a)==b))
{
SysFlags[c]=a;
return(1);
}
a++;
}
return(0);
}
void C_Trash()
{
extern struct Word *FindName();
tag t=Arg();
struct Word *w=FindName(OBJECT(t)->ob_Name,1);
Tree_Unlink(t);
TrashItem(t);
if(w)
DelName(w);
}
void C_SetDesc()
{
tag n=Arg();
int v=Arg();
int m=Arg();
if(TYPE(n)!=FL_OBJECT)
{
log_error("[DATABASE ERROR]: SetDesc only valid on objects.\n",NULL);
panic();
}
SetDesc(n,v,Messages[m]);
}
void C_SetMaxState()
{
tag n=Arg();
int m=NUM(Arg());
if(TYPE(n)!=FL_OBJECT)
{
log_error("[DATABASE ERROR]: SetMaxState only valid on objects.\n",NULL);
panic();
}
SetMaxState(n,m);
}
void C_SetLong()
{
tag n=Arg();
int m=MSG(Arg());
if(TYPE(n)!=FL_ROOM)
{
log_error("[DATABASE ERROR]: SetLong only valid on rooms.\n",NULL);
panic();
}
SetLong(n,Messages[m]);
}
void C_SetIOH()
{
tag n=Arg();
int o=NUM(Arg());
int m=MSG(Arg());
if(TYPE(n)!=FL_PLAYER)
{
log_error("[DATABASE ERROR]: SetIOH - not valid on non player.\n",NULL);
panic();
}
if(o<0||o>2)
{
log_error("[DATABASE ERROR]: SetIOH - invalid option.\n",NULL);
panic();
}
SetIOH(n,o,Messages[m]);
}
void C_SetName()
{
tag n=Arg();
int m=MSG(Arg());
SetName(n,Messages[m]);
}
void C_SetVocab()
{
tag i=Arg();
int a=NUM(Arg());
int n=NUM(Arg());
ADJ(i)=a;
NOUN(i)=n;
}
void C_Length()
{
int a=MSG(Arg());
SysFlags[FLAG(Arg())]=strlen(Messages[a]);
}
void C_AddWord()
{
char *wn=Messages[MSG(Arg())];
int wt=NUM(Arg());
int wv=NUM(Arg());
AddWord(wn,wv,wt);
}
void C_FindWord()
{
char *wn=Messages[MSG(Arg())];
int wt=NUM(Arg());
SysFlags[FLAG(Arg())]=FindCWord(wn,wt);
}
void C_DelWord()
{
extern struct Word *FindWord();
struct Word *w;
char *wn=Messages[MSG(Arg())];
int wt=NUM(Arg());
w=FindWord(wn,wt);
if(w)
DelWord(w);
}
void C_Tod()
{
extern struct tm *localtime();
struct tm *tl;
long tv;
time(&tv);
tl=localtime(&tv);
if(tl==NULL)
{
log_error("[INTERNAL]: Get local time failed.\n",NULL);
panic();
}
SysFlags[FLAG(Arg())]=tl->tm_sec;
SysFlags[FLAG(Arg())]=tl->tm_min;
SysFlags[FLAG(Arg())]=tl->tm_hour;
SysFlags[FLAG(Arg())]=tl->tm_mday;
SysFlags[FLAG(Arg())]=tl->tm_mon;
SysFlags[FLAG(Arg())]=tl->tm_year;
SysFlags[FLAG(Arg())]=tl->tm_wday;
}
void C_Fload()
{
tag ct,l;
FILE *f=fopen(Messages[MSG(Arg())],"r");
if(f==NULL)
{
log_error("[DATABASE ERROR]: Can't open for FLOAD.\n",NULL);
panic();
}
ct=FLAG(Arg());
l=FLAG(Arg());
while(ct<l)
{
int v;
fscanf(f,"%ld",&v);
SysFlags[ct++]=v;
}
fclose(f);
}
void C_FSave()
{
tag ct,l;
FILE *f=fopen(Messages[MSG(Arg())],"w");
if(f==NULL)
{
log_error("[DATABASE ERROR]: Can't open for FSVAE\n",NULL);
panic();
}
ct=FLAG(Arg());
l=FLAG(Arg());
while(ct<l)
{
fscanf(f,"%ld",SysFlags[ct++]);
}
fclose(f);
}
int SeekFor=0;
int SeekIdent=0;
struct StackFrame *SysStack=NULL;
void C_Do()
{
int a=Arg();
if(a<0||a>=MAXLOOP)
{
log_error("[DATABASE ERROR]: Do called with out of range loop number.\n",NULL);
panic();
}
SysStack->LoopInfo[a]=GetCLine()+1;
}
extern int FindFor(tag,tag,int);
static int FindFor(st,l,t)
tag st,l;
int t;
{
if(st==-1)
st=OBJECT(l)->ob_Child;
else
st=OBJECT(st)->ob_Next;
while(st!= -1)
{
if(ISITEM(st)&&LOC(st)==l)
{
if(!t||t==TYPE(st))
return(st);
}
st++;
}
return(-1);
}
extern tag FindUser(tag);
static tag FindUser(x)
tag x;
{
x++;
while(x<ISOBJ(MAXU))
{
if(LOC(x)!=ISOBJ(-1)&&LOC(x)!=-1)
return(x);
x++;
}
return(ISOBJ(-1));
}
void C_For()
{
int a=Arg();
int f=FLAG(Arg());
int l=Arg();
int t=NUM(Arg());
/*OBJ(l);*/
if(a<0||a>=MAXLOOP)
{
printf("[DATABASE ERROR]: For called with out of range loop number.\n");
panic();
}
SysStack->ForLoop[a]=GetCLine()+1;
SysStack->ForLoc[a]=l;
SysStack->ForVar[a]=f;
SysStack->ForType[a]=t;
SysFlags[SysStack->ForVar[a]]=FindFor(ISOBJ(0)-1,l,t);
if(SysFlags[SysStack->ForVar[a]]==-1)
{
SeekFor=1;
SeekIdent=a;
}
}
void C_EndFor()
{
int a=Arg();
if(a<0||a>=MAXLOOP)
{
log_error("[DATABASE ERROR]: EndFor called with out of range loop number.\n",NULL);
panic();
}
SysFlags[SysStack->ForVar[a]]=FindFor(
SysFlags[SysStack->ForVar[a]],SysStack->ForLoc[a],
SysStack->ForType[a]);
if(SysFlags[SysStack->ForVar[a]]!=-1)
SetCLine(SysStack->ForLoop[a]);
}
void C_ForUser()
{
int a=NUM(Arg());
int f=FLAG(Arg());
if(a<0||a>=MAXLOOP)
{
log_error("[DATABASE ERROR]: ForUser called with out of range loop number.\n",NULL);
panic();
}
SysStack->UserLoop[a]=GetCLine()+1;
SysStack->UserVar[a]=f;
SysFlags[SysStack->UserVar[a]]=FindUser(ISOBJ(0)-1);
if(SysFlags[SysStack->UserVar[a]]==ISOBJ(-1))
{
SeekIdent=a;
SeekFor=2;
}
/* printf("FORUSER: Loop %d, SeekFor=%d, UVar= %d(%d).\n",
a,SeekFor,SysFlags[UserVar[a]],UserVar[a]);*/
}
void C_EndUser()
{
int a=NUM(Arg());
if(a<0||a>=MAXLOOP)
{
printf("[DATABASE ERROR]: EndUser called with out of range loop number.\n");
panic();
}
/* printf("ENDUSER: Loop %d, SeekFor=%d, UVar= %d(%d).\n",
a,SeekFor,SysFlags[UserVar[a]],UserVar[a]);*/
if(SysFlags[SysStack->UserVar[a]]==ISOBJ(-1))
return;
SysFlags[SysStack->UserVar[a]]=FindUser(SysFlags[SysStack->UserVar[a]]);
if(SysFlags[SysStack->UserVar[a]]!=ISOBJ(-1))
SetCLine(SysStack->UserLoop[a]);
/* printf("ENDUSER/2 Loop %d, SeekFor=%d, UVar= %d(%d).\n",
a,SeekFor,SysFlags[UserVar[a]],UserVar[a]);*/
}
void C_Loop()
{
int a=NUM(Arg());
if(a<0||a>=MAXLOOP)
{
log_error("[DATABASE ERROR]: Do called with out of range loop number.\n",NULL);
panic();
}
SetCLine(SysStack->LoopInfo[a]);
}
Q_DelFile()
{
int n=MSG(Arg());
if(unlink(Messages[n])==-1)
return(0);
return(1);
}
Q_FindStr()
{
char *str=Messages[Arg()];
char *srch=Messages[Arg()];
int ct=Arg();
int f=FLAG(Arg());
int sl=strlen(str);
while(ct<sl)
{
if(index(srch,str[ct]))
{
SysFlags[f]=ct;
return(1);
}
ct++;
}
SysFlags[f]= -1;
return(0);
}
Q_SkipStr()
{
char *str=Messages[MSG(Arg())];
char *srch=Messages[MSG(Arg())];
int ct=Arg();
int f=FLAG(Arg());
int sl=strlen(str);
while(ct<sl)
{
if(!index(srch,str[ct]))
{
SysFlags[f]=ct;
return(1);
}
ct++;
}
SysFlags[f]= ISNUM(-1);
return(0);
}
Q_LoadU()
{
tag a=Arg();
char *name=Messages[MSG(Arg())];
if(TYPE(a)!=FL_PLAYER)
{
log_error("[DATABASE ERROR]: LoadU called with non player.\n",NULL);
panic();
}
return(LoadUser(a,name));
}
Q_SaveU()
{
tag a=Arg();
char *name=Messages[MSG(Arg())];
if(TYPE(a)!=FL_PLAYER)
{
log_error("[DATABASE ERROR]: SaveU called with non player.\n",NULL);
panic();
}
SaveUser(a,name);
return(1);
}
Q_SubStr()
{
char *s1=Messages[MSG(Arg())];
char *s2=Messages[MSG(Arg())];
while(*s1)
{
if(strncmp(s1,s2,strlen(s2))==0)
return(1);
s1++;
}
return(0);
}
void C_Extract()
{
char *from=Messages[MSG(Arg())];
int to=MSG(Arg());
int start=Arg();
int end=Arg();
free(Messages[to]);
if((start>=strlen(from))||(start>end))
{
Messages[to]=estralloc("");
return;
}
if(end>strlen(from))
end=strlen(from);
Messages[to]=(char *)emalloc(end-start+1);
strncpy(Messages[to],from+start,end-start);
Messages[to][end-start]=0;
}
void C_NumText()
{
int a=Arg();
char x[8];
sprintf(x,"%d",a);
a=MSG(Arg());
free(Messages[a]);
Messages[a]=estralloc(x);
}
void C_WText()
{
int a=Arg();
int b=Arg();
tag c=MSG(Arg());
struct Word *w;
free(Messages[c]);
w=(struct Word *)FindNumWord(a,b);
if(w)
Messages[c]=estralloc(w->wd_Text);
else
Messages[c]=estralloc("$ANY");
}
void C_FTrueName()
{
extern struct Word *FindName();
char *a=Messages[MSG(Arg())];
int t=Arg();
struct Word *w=FindName(a,t);
SysFlags[FLAG(Arg())]=w?w->wd_Code:-1;
}
void C_NewMsg()
{
char *a=Messages[MSG(Arg())];
char *b=Messages[MSG(Arg())];
tag f=Next_Msg();
Messages[f]=estralloc(a);
AddName(b,f,2);
SysFlags[FLAG(Arg())]=ISMSG(f);
}
/*
* FIX THIS MSG NUMBERS NOT REUSED - WASTES 4 BYTES A TIME!!
*/
void C_DelMsg()
{
int a=MSG(Arg());
/* struct Word *w=MsgName(a);
if(w)
DelName(w);
free(Messages[a]);
Messages[a]=estralloc(""); */
}
FILE *Work_File=NULL;
Q_FOpen()
{
char *x=Messages[MSG(Arg())];
char *y=Messages[MSG(Arg())];
if(Work_File)
fclose(Work_File);
Work_File=fopen(x,y);
if(Work_File==NULL)
return(0);
return(1);
}
void C_FClose()
{
if(Work_File)
fclose(Work_File);
}
Q_Fmove()
{
char *f=Messages[MSG(Arg())];
char *t=Messages[MSG(Arg())];
if(rename(f,t)==0)
return(1);
return(0);
}
Q_FRead()
{
char bf[256];
int a=MSG(Arg());
if(Work_File==NULL)
return(0);
if(fgets(bf,255,Work_File)==NULL)
return(0);
free(Messages[a]);
Messages[a]=estralloc(bf);
return(1);
}
Q_FWrite()
{
char *a=Messages[MSG(Arg())];
if(Work_File==NULL)
return(0);
if(fwrite(a,strlen(a),1,Work_File)!=1)
return(0);
return(1);
}
void C_Consult()
{
tag i;
int v,n1,n2;
/* UNIMPLEMENTED
DoConsult(i,v,n1,n2);*/
log_error("CONSULT is unimplemented.\n",NULL);
}
void C_AttachTable()
{
extern TABLE *Table;
tag i=Arg();
int t=Arg();
OBJECT(i)->ob_Table=Table[t];
}
#ifndef UNIX
/* Translate filenames to TOS(and DOS). This translates spaces to underscores
* and stuffs any extra characters after the period so that as many
* characters as possible of the original name are used .
*/
char *f_tos(fname)
char *fname;
{
static char tempname[512]; /* Hopefully enough ! */
extern char *strrchr();
register char *temptr=tempname,*temptr2=strrchr(fname,'/');
if(temptr2)temptr2+=9;
else temptr2=&fname[8];
while(*temptr=*fname++)
{
if(*temptr==' ')*temptr='_'; temptr++;
if(fname==temptr2)*temptr++='.';
}
return(tempname);
}
#endif