mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net 
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
edit.h
*/

#ifndef _EDIT_H
#define _EDIT_H
#include "string.h"
#include "llist.h"
#include "index.h"
#include "hash.h"
#include "server.h"
#include "bit.h"
#include "room.h"

class NPC;
class PC;
class Area;
class Object;
class Help;
class TextEditor;
class RoomEditor;
class AreaEditor;
class ObjectEditor;
class NPCEditor;
class HelpEditor;

// Editor states
// Enough to cover all editor types

const int ED_CANCEL			= -2; // No save
const int ED_DONE			= -1;
const int ED_NONE			= 0;
const int ED_TEXT_APPEND	= 1;
const int ED_NAME			= 20;
const int ED_DESC			= 21;
const int ED_SDESC			= 22;
const int ED_LDESC			= 23;
const int ED_EDESC			= 24;

class Editor
{
	protected:
		// Since objects/npcs have no index, need an index while
		// editing, before inserting into a HashTable
		PC *	pc;
		Area *	area;
		Index	index;
		int		state;
		int		state_last;
		String	prompt;
		String	filename;
		String  savefile;
		TextEditor *text;

	public:
		Editor()
		:	pc(0), area(0), state(0), state_last(0), prompt( "Editor>"), text(0)
		{
		}

		Editor( PC * x )
		:	pc(x), area(0), state(0), state_last(0), prompt( "Editor>" ), text(0)
		{
		}

		virtual ~Editor() { }

		virtual void command( const String & ) = 0;
		void setPrompt( const String & x ) { prompt = x; }
		virtual const String & getPrompt();
		const Index & getIndex() { return index; }
		void setIndex( const Index & x ) { index = x; }
		bool done() { return (bool)( state <= ED_DONE ); }
		int getState() { return state; }
		void setArea( Area * x ) { area = x; }
		Area * getArea() { return area; }
		void setFileName( const String & x ) { filename = x; }
		const String & getFileName() { return filename; }
		void setSaveName( const String & x ) { savefile = x; }
		const String & getSaveName() { return savefile; }
		void editText( const String & initial_text );
		void editFile( const String & filen );
};


class RoomEditor : public Editor
{
	protected:
		Room *room;
		bool autocopy;
		int last_slot; // for repop editing
		unsigned long room_bits[ MAX_ROOM_BIT_FIELDS ];

	public:
		RoomEditor()
		:	room(0), autocopy( false ), last_slot(0)
		{
			memset( room_bits, 0, sizeof( room_bits[0] ) * MAX_ROOM_BIT_FIELDS );
			setPrompt( "RoomEditor>" );
		}

		RoomEditor( PC * x )
		:	Editor(x), room(0), autocopy( false ), last_slot(0)
		{
			memset( room_bits, 0, sizeof( room_bits[0] ) * MAX_ROOM_BIT_FIELDS );
			setPrompt( "RoomEditor>" );
		}

		void command( const String & );
//		const String & getPrompt();
		void setRoom( Room * x ) { room = x; }
		Room * getRoom() { return room; }
		void parseRepop( const String & );
		void toggleAutoCopy() { autocopy = !autocopy; }
};


class NPCEditor : public Editor
{
	protected:
		NPC *npc;

	public:
		NPCEditor()
		:	npc(0)
		{
			setPrompt( "NPCEditor>" );
		}

		NPCEditor( PC * x )
		:	Editor(x), npc(0)
		{
			setPrompt( "NPCEditor>" );
		}

		void command( const String & );
		void setNPC( NPC * x ) { npc = x; }
		NPC * getNPC() { return npc; }		
};


class ObjectEditor : public Editor
{
	protected:
		Object *obj;

	public:
		ObjectEditor()
		:	obj(0)
		{
			setPrompt( "ObjEditor>" );
		}

		ObjectEditor( PC * x )
		:	Editor(x), obj(0)
		{
			setPrompt( "ObjEditor>" );
		}

		void command( const String & );
		void setObj( Object * x ) { obj = x; }
		Object * getObj() { return obj; }
};


class AreaEditor : public Editor
{

	public:
		AreaEditor()
		{
			setPrompt( "AreaEditor>" );
		}

		AreaEditor( PC * x )
		:	Editor(x)
		{
			setPrompt( "AreaEditor>" );
		}

		void command( const String & );
};

class HelpEditor : public Editor
{
	protected:
		Help * help;

	public:
		HelpEditor() 
		: help(0)
		{
			setPrompt( "AreaEditor>");
		}

		HelpEditor( PC * x )
		: Editor(x), help(0)
		{
			setPrompt( "HelpEditor>");
		}

		void command( const String & );
		void setHelp( Help * x ) { help = x; }
		Help * getHelp() { return help; }
};

#define MAX_LINES 256


class TextEditor : public Editor
{
	protected:
		int lines;
		int current;
		int clipped;
		String output;
		String text[ MAX_LINES + 1 ];
		String clipboard[32];
 
		TextEditor()
		:	lines(0), current(0), clipped(0)
		{
		}

	public:
		TextEditor( PC * x, const String & str )
		:	Editor( x ),
			lines(0), current(0), clipped(0)
		{
			for( int i = 1; i < MAX_LINES; i++ )
			{
				text[ i - 1 ] = str.getLine( i );
				if( !(bool)text[ i - 1 ] )
					break;
				text[ i - 1 ].rtrim();
				lines++;
				current++;
			}

			state = ED_TEXT_APPEND;
		}

		virtual void command( const String & );

		const char *chars();
		const String & asStr();
		const String & operator [] ( int i );	
		const String & format();
		void clr();
		void clrLine( int );
		void cutLine( int );
		void insertLine( const String &, int );
		void insertLine( const char *, int );
		void replaceLine( const String &, int );
		void replaceLine( const char *, int );
		void cutLines( int, int );
		void pasteLines( int );
		void append( const char * );
		void append( const String & );
		const String & getPrompt();
};

// Just a wrapper around file edit functions

class TextfileEditor : public Editor
{

	public:
		TextfileEditor(PC * x) :
			Editor(x)
		{}

		virtual void command( const String & );

};


#endif