/****************************************************************************\
 *									      *
 *			C R E A T O R    O F   L E G E N D S		      *
 *				(AberMud Version 5)			      *
 *									      *
 *  The Creator Of Legends System is (C) Copyright 1989 Alan Cox, All Rights  *
 *  Reserved.		  						      *
 *									      *
 \****************************************************************************/

#include "System.h"
#include "User.h"

extern USER UserList[];

Module "Room Commands";
Version "1.06";
Author "----*(A)";

/*
 *	1.00	AGC	Created This File
 *	1.01	AGC	Stopped SetLong free()ing extra memory by mistake
 *	1.02	AGC	Made Cmd_Look understand SetHere
 *	1.03	AGC	Made * strip out embedded controls
 *	1.04	AGC	5.07 version - with bitflag names
 *	1.05	AGC	Fixed so it uses right flag names
 *	1.06	AGC	Cmd_Look now does brief mode correctly for no title
 */


void Cmd_SetShort(i)
ITEM *i;
{
	ITEM *a;
	ROOM *r;
	if(!ArchWizard(i))
	{
		SendItem(i,"Sorry no name changing round here.\n");
		return;
	}
	a=FindSomething(i,O_PARENT(i));
	if(a==NULL)
	{
		SendItem(i,"I don't know what that is.\n");
		return;
	}
	r=RoomOf(a);
	if(r==NULL)
	{
		SendItem(i,"%s is not a room.\n",CNameOf(a));
		return;
	}
	SkipPrep();
	GetAll();
	if(!strlen(WordBuffer))
	{
		SendEdit(i,"SetShort #%d %s %s",ItemNumber(LevelOf(i),a),
			CNameOf(a),TextOf(r->rm_Short));
		return;
	}
	FreeText(r->rm_Short);
	r->rm_Short=AllocText(WordBuffer);
}

void Cmd_ShowRoom(i)
ITEM *i;
{
	int ct=0;
	ITEM *a;
	ROOM *r;
	if(!ArchWizard(i))
	{
		SendItem(i,"Try LOOK.\n");
		return;
	}
	a=FindSomething(i,O_PARENT(i));
	if(a==NULL)
	{
		SendItem(i,"I don't know what that is.\n");
		return;
	}
	r=RoomOf(a);
	if(r==NULL)
	{
		SendItem(i,"%s is not a room.\n",CNameOf(a));
		return;
	}
	SendItem(i,"Room Name : %s\n",CNameOf(a));
	SendItem(i,"Picture   : %d\n",(int)GETPICTURE(r->rm_Flags));
	SendItem(i,"Short Text: %s\n",TextOf(r->rm_Short));
	SendItem(i,"Long Text :\n%s\n",TextOf(r->rm_Long));
	while(ct<16)
	{
		if(r->rm_Flags&(1<<ct))
			SendItem(i,"%s ",RBitName(ct));
		else
			if(strcmp(RBitName(ct),"{unset}"))
				SendItem(i,"-%s ",RBitName(ct));
		ct++;
	}
	SendItem(i,"\n");
}

void Cmd_SetRFlag(i)
ITEM *i;
{
	int c;
	ITEM *a;
	ROOM *r;
	if(!ArchWizard(i))
	{
		SendItem(i,"No can do....\n");
		return;
	}
	a=FindSomething(i,O_PARENT(i));
	if(a==NULL)
	{
		SendItem(i,"I don't know what that is.\n");
		return;
	}
	r=RoomOf(a);
	if(r==NULL)
	{
		SendItem(i,"%s is not a room.\n",CNameOf(a));
		return;
	}
	SkipPrep();
	while(GetParsedWord())
	{
		if(!strlen(WordBuffer))
		{
			SendItem(i,"What flag though ?\n");
			return;
		}
		if(*WordBuffer=='-')
		{
			c=FindRBit(WordBuffer+1);
			if(c==-1)
			{
				SendItem(i,"Unknown flag %s.\n",WordBuffer+1);
				return;
			}
			r->rm_Flags&=~(1<<c);
		}
		else
		{
			c=FindRBit(WordBuffer);
			if(c==-1)
			{
				SendItem(i,"Unknown flag %s.\n",WordBuffer);
				return;
			}
			r->rm_Flags|=(1<<c);
		}

	}
}

void Cmd_SetLong(i)
ITEM *i;
{
	int siz;
	int bbp;
	int c;
	ITEM *a;
	ROOM *r;
	char *BigBuffer;
	FILE *f;
	if(!ArchWizard(i))
	{
		SendItem(i,"No!\n");
		return;
	}
	a=FindSomething(i,O_PARENT(i));
	if(a==NULL)
	{
		SendItem(i,"I don't know what that is.\n");
		return;
	}
	r=RoomOf(a);
	if(r==NULL)
	{
		SendItem(i,"%s is not a room.\n",CNameOf(a));
		return;
	}
	SkipPrep();
	GetAll();
	if(!strlen(WordBuffer))
	{
		SendEdit(i,"SetLong #%d %s %s",ItemNumber(LevelOf(i),a),
			CNameOf(a),TextOf(r->rm_Long));
		return;
	}
	if(*WordBuffer!='*')
	{
		BigBuffer=WordBuffer;
		goto l1;
	}
	f=fopen(WordBuffer+1,"r");
	if(f==NULL)
	{
		SendItem(i,"Sorry - can't open the file.\n");
		return;
	}
	BigBuffer=malloc(2048);
	if(BigBuffer==NULL)
	{
		SendItem(i,"Not enough memory.\n");
		return;
	}
	bbp=0;
	while((c=fgetc(f))!=EOF)
	{
		if(c=='\n') c=' ';
		if(c>31)	/* Strip controls */
			BigBuffer[bbp++]=c;
		if(bbp>2047)
		{
			fclose(f);
			free(BigBuffer);
			SendItem(i,"Entry too large.\n");
			return;
		}
	}
	BigBuffer[bbp]=0;
	siz=bbp;
	fclose(f);
	if(BigBuffer[siz-1]=='\n')
		BigBuffer[siz-1]=0;
	BigBuffer[siz]=0;	/* Convert data to C string */
l1:	FreeText(r->rm_Long);
	r->rm_Long=AllocText(BigBuffer);
	if(BigBuffer!=WordBuffer)
		free(BigBuffer);
}


void Cmd_Look(i)
ITEM *i;
{
	ROOM *r;
	OBJECT *o;
	ITEM *l;
	PLAYER *p;
	TABLE *t;
	t=FindTable(103);
	if(t)
	{
		if(ExecBackground(t,i)==-1)
			return;		/* NOTDONE stops describe */
	}
	if(O_PARENT(i)==NULL)
	{
		SetUserTitle(i,"The Void");
		SendItem(i,"You are floating in the void.\n");
		return;
	}
	if(PlayerOf(i)==NULL)
		return;	/* Only Players Can LOOK! */
	r=RoomOf(O_PARENT(i));
	o=ObjectOf(O_PARENT(i));
	p=PlayerOf(O_PARENT(i));
	if(r)
	{
		if(r->rm_Flags&RM_DEATH)
			goto l2;
	}
	if(CanSee(LevelOf(i),O_PARENT(i))==0)
	{
		SendItem(i,"\
You are lost in an incomprehensible haze of unidentifiable images.\n");
		SetUserTitle(i,"Lost");
		return;
	}
	if(IsBlind(i))
	{
		SendItem(i,"You can't see, you are blind.\n");
		SetUserTitle(i,"Blind");
		return;
	}
	if(IsDarkFor(i))
	{
		SetUserTitle(i,"Dark");
		SendItem(i,"It is dark.\n");
		return;
	}

	if((r)&&(PlayerOf(i)->pl_Flags&PL_BRIEF))
	{
		SendItem(i,"%s\n",TextOf(r->rm_Short));
/*		SetUserTitle(i,"%s",TextOf(r->rm_Short))*/;
	}
	else if((o)&&(!r))
		{
			SendItem(i,"You are in %s\n",NameOf(O_PARENT(i)));
			SetUserTitle(i,"In the %s",NameOf(O_PARENT(i)));
		}
		else if(p)
			{
				SendItem(i,"You are being carried by %s\n",
					NameOf(O_PARENT(i)));
				SetUserTitle(i,"Carried by %s",
					NameOf(O_PARENT(i)));
			}

	if(PlayerOf(i)->pl_Flags&PL_BRIEF)
		goto l1;
l2:	if(r)
	{
		SetUserTitle(i,"%s",TextOf(r->rm_Short));
		SendItem(i,"%s",TextOf(r->rm_Long));
	}
	l=O_CHILDREN(O_PARENT(i));
	while(l)
	{
		if(CanSee(LevelOf(i),l))
		{
			if(ObjectOf(l))
			{
				if(ObjectOf(l)->ob_Flags&OB_FLANNEL)
					SendItem(i,"%s",
						TextOf(ObjectOf(l)->ob_Text[O_STATE(l)]));
			}
		}
		l=O_NEXT(l);
	}
	if((r)&&(r->rm_Flags&RM_MERGE)&&(O_PARENT(O_PARENT(i)))&&
		(RoomOf(O_PARENT(O_PARENT(i))))&&
		(RoomOf(O_PARENT(O_PARENT(i)))->rm_Flags&RM_JOIN))
	{
		SendItem(i,"%s",TextOf(RoomOf(O_PARENT(O_PARENT(i)))->rm_Long));
	}
	SendItem(i,"\n");
	t=FindTable(104);
	if(t)
	{
		ExecBackground(t,i);
	}
	if(r&&r->rm_Flags&RM_DEATH)
		goto ldie;
l1:	l=O_CHILDREN(O_PARENT(i));
	while(l)
	{
		if(l!=i)
			DescribeItem(i,l);
		l=O_NEXT(l);
	}
	SendItem(i,"\n");
	t=FindTable(105);
	if(t)
	{
		ExecBackground(t,i);
	}
ldie:	if(r)
	{
		if((r->rm_Flags&RM_DEATH)&&(LevelOf(i)<10000))
		{
			if(UserOf(i)!=-1)
			{
				SendTPacket(UserList[UserOf(i)].us_Port,
						PACKET_CLEAR,"");
				RemoveUser(UserOf(i));
			}
			else
				SendItem(i,"[You would die here if mortal]\n");
		}
	}	
}

void Cmd_Goto(i)
ITEM *i;
{
	ITEM *a;
	if(!ArchWizard(i))
	{
		SendItem(i,"Yes, so give me the route.\n");
		return;
	}
	a=FindSomething(i,O_PARENT(i));
	if(a==NULL)
	{
		SendItem(i,"I don't know what that is.\n");
		return;
	}
	DoesAction(i,4,"vanishes in a haze of multihued light.\n");
	Place(i,a);
	DoesAction(i,4,"appears amidst a puff of greenish smoke.\n");
	Cmd_Look(i);
}

void Cmd_Brief(i)
ITEM *i;
{
	PlayerOf(i)->pl_Flags|=PL_BRIEF;
}

void Cmd_Verbose(i)
ITEM *i;
{
	PlayerOf(i)->pl_Flags&=~PL_BRIEF;
}

void Cmd_SetPicture(i)
ITEM *i;
{
	if(!ArchWizard(i))
	{
		SendItem(i,"What ?\n");
		return;
	}
	SendItem(i,"Obsolete command.\n");
}