Esempio n. 1
0
int Clone_Room(ITEM *i, ITEM *j)
{
	ROOM *r,*s;
	if(MakeRoom(i)==-1)
		return(-1);
	r=(ROOM *)FindSub(i,KEY_ROOM);
	s=(ROOM *)FindSub(j,KEY_ROOM);
	if((!r)||(!s))
		Error("CloneRoom: Not Room!");
	FreeText(r->rm_Short);
	FreeText(r->rm_Long);
	r->rm_Flags=s->rm_Flags;
	r->rm_Short=AllocText(TextOf(s->rm_Short));
	r->rm_Long=AllocText(TextOf(s->rm_Long));
	return(0);
}
Esempio n. 2
0
int Clone_Player(ITEM *i, ITEM *j)
{
	PLAYER *r,*s;
	if(MakePlayer(i)==-1)
		return(-1);
	r=(PLAYER *)FindSub(i,KEY_PLAYER);
	s=(PLAYER *)FindSub(j,KEY_PLAYER);
	if((!r)||(!s))
		Error("ClonePlayer: Not Player!");
	r->pl_Flags=s->pl_Flags;
	r->pl_UserKey=-1;	/* Never DUP user handles! */
	r->pl_Size=s->pl_Size;
	r->pl_Weight=s->pl_Weight;
	r->pl_Level=s->pl_Level;
	r->pl_Score=s->pl_Score;
	r->pl_Strength=s->pl_Strength;
	return(0);
}
Esempio n. 3
0
int Clone_GenExit(ITEM *i, ITEM *j)
{
	short ct=0;
	GENEXIT *r,*s;
	if(MakeGenExit(i)==-1)
		return(-1);
	r=(GENEXIT *)FindSub(i,KEY_GENEXIT);
	s=(GENEXIT *)FindSub(j,KEY_GENEXIT);
	if((!r)||(!s))
		Error("CloneGenExit: Not GenExit!");
	while(ct<12)
	{
		r->ge_Dest[ct]=s->ge_Dest[ct];
		if(r->ge_Dest[ct])
			LockItem(r->ge_Dest[ct]);
		ct++;
	}
	return(0);
}
	void RuntimeEnvironment::RegisterNativeFunction(const rstring &name, int argumentCount, NativeFunction nf)
	{
		if (FindSub(name) != -1)
			return;

		int idx = AddSub(name);

		Sub *sub = GetSub(idx);
		sub->SetArgumentsCount(argumentCount);
		sub->SetNativeFunction(nf);
	}
	int RuntimeEnvironment::AddSub(const rstring &name)
	{
		int idx = FindSub(name);

		if (idx != -1)
			return idx;

		Sub *sub = new Sub(name);
		_subs.push_back(sub);

		return _subs.size()-1;
	}
Esempio n. 6
0
int Clone_Object(ITEM *i, ITEM *j)
{
	short x=0;
	OBJECT *r,*s;
	if(MakeObject(i)==-1)
		return(-1);
	r=(OBJECT *)FindSub(i,KEY_OBJECT);
	s=(OBJECT *)FindSub(j,KEY_OBJECT);
	if((!r)||(!s))
		Error("CloneObject: Not Object!");
	FreeText(r->ob_Text[0]);
	FreeText(r->ob_Text[1]);
	FreeText(r->ob_Text[2]);
	FreeText(r->ob_Text[3]);
	r->ob_Flags=s->ob_Flags;
	r->ob_Size=s->ob_Size;
	r->ob_Weight=s->ob_Weight;
	while(x<4)
	{
		r->ob_Text[x]=AllocText(TextOf(s->ob_Text[x]));
		x++;
	}
	return(0);
}
Esempio n. 7
0
int Duped(ITEM *x)
{
	if(FindSub(x,KEY_DUPED))
		return(1);
	return(0);
}
Esempio n. 8
0
ITEM *Clone_Item(ITEM *i, short f)	/* 1=true dup 0=normal dup */
{
	DUP *d;
	ITEM *n=CreateItem(NameOf(i),i->it_Adjective,i->it_Noun);
	SUB *s;
	n->it_ActorTable=i->it_ActorTable;
	n->it_ActionTable=i->it_ActionTable;
	n->it_State=i->it_State;
	n->it_Class=i->it_Class;
	n->it_Perception=i->it_Perception;
	n->it_SubjectTable=NULL;
	n->it_ObjectTable=NULL;
	n->it_DaemonTable=NULL;
	/* Cheat: We want the clone to behave as the original, but that
	   would mean copying the tables which is slow and uses lots of
	   memory. We use the new subclassing feature to cheat and make
	   the original superclass of the clones. */
	LockItem(i);
	n->it_Superclass=i;

	if(IsRoom(i))
		Clone_Room(n,i);
	if(IsPlayer(i))
		Clone_Player(n,i);
	if(IsObject(i))
		Clone_Object(n,i);
	if(FindSub(i,KEY_GENEXIT))
		Clone_GenExit(n,i);
	s=i->it_Properties;
	while(s)
	{
		switch(s->pr_Key)
		{
		case KEY_MSGEXIT:Clone_MsgExit(n,(MSGEXIT *)s);
				 break;
		case KEY_CONTAINER:
				Clone_Container(n,(CONTAINER *)s);
				break;
		case KEY_CHAIN:
				Clone_Chain(n,(CHAIN *)s);
				break;
		case KEY_USERFLAG:
		case KEY_USERFLAG2:
				Clone_UserFlag(n,(USERFLAG *)s);
				break;
		case KEY_INHERIT:
				Clone_Inherit(n,(INHERIT *)s);
				break;
		case KEY_USERTEXT:
				Clone_UserText(i,n);
				break;
		case KEY_INOUTHERE:
				SetInMsg(n,TextOf(((INOUTHERE *)s)->io_InMsg));
				SetOutMsg(n,TextOf(((INOUTHERE *)s)->io_OutMsg));
				SetHereMsg(n,TextOf(((INOUTHERE *)s)->io_HereMsg));
				break;
		case KEY_CONDEXIT:
				MakeCondExit(n,((CONDEXIT *)s)->ce_Dest,
					((CONDEXIT *)s)->ce_Table,
					((CONDEXIT *)s)->ce_ExitNumber);
				break;
		}
		s=s->pr_Next;
	}
	if(!f)
	{
		d=(DUP *)AllocSub(n,KEY_DUPED,sizeof(DUP));
		d->du_Master=i;
		LockItem(i);
	}
	return(n);
}