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
------------------------------------------------------------------------------
vmtypes.cc
*/

#include "config.h"
#include "vmtypes.h"
#include "vmobject.h"
#include "string.h"
#include "erratum.h"
#include "vmarray.h"
#include "vmfields.h"

const char * setfield_proxy(VMachine *, void *, int, vmptr)
{
	return "This object is not implemented at the moment.";
}

bool getfield_proxy(VMachine*, void *, int)
{
	return false;
}

const char * setfield_error(VMachine *, void *, int, vmptr)
{
	return "This object has no public fields.";
}

bool getfield_error(VMachine*, void *, int)
{
	return false;
}


fieldmap null_fieldmap[1] =
{
	{ NULL, 0 }
};

struct s_vmtype_table vmtype_table[VMT_MAX_TYPE+1];

// What (5-1)FU stands for ?
// For Future Use - when we will add next fields to table, we will just
// need to replace this symbol by templates for needed variables

struct s_vmtype_table_proto
{
	vmtype type;
	struct s_vmtype_table data;
};

struct s_vmtype_table_proto vmtype_table_proto[VMT_MAX_TYPE+1] =
{
	{ VMT_NULL , 
		{ "NULL", VMT_NULL ,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_TOPOFSTACK , 
		{ "TopOfStack", VMT_NULL ,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_INT , 
		{ "int", VMT_NULL ,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_FLOAT , 
		{ "float", VMT_NULL ,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_STRING , 
		{ "String", VMT_NULL ,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_VMOBJECT , 
		{ "VMObject", VMT_NULL ,  
			setfield_VMObject, getfield_VMObject, fieldmap_VMObject /*4FU*/ } },
	{ VMT_MUDOBJECT , 
		{ "MudObject", VMT_VMOBJECT ,  
			setfield_MudObject, getfield_MudObject, fieldmap_MudObject /*4FU*/ } },
	{ VMT_THING , 
		{ "Thing", VMT_MUDOBJECT ,  
			setfield_Thing, getfield_Thing, fieldmap_Thing /*4FU*/ } },
	{ VMT_CHAR , 
		{ "Char", VMT_THING ,  
			setfield_Char, getfield_Char, fieldmap_Char /*4FU*/ } },
	{ VMT_NPC , 
		{ "NPC", VMT_CHAR ,  
			setfield_NPC, getfield_NPC, fieldmap_NPC /*4FU*/ } },
	{ VMT_PC , 
		{ "PC", VMT_CHAR ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_SHOPKEEPER , 
		{ "ShopeKeeper", VMT_NPC ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_ROOM , 
		{ "Room", VMT_MUDOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_EXIT , 
		{ "Exit", VMT_VMOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_REPOP , 
		{ "Repop", VMT_VMOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJECT , 
		{ "Object", VMT_THING ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_ACTION , 
		{ "Action", VMT_VMOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_AFFECT , 
		{ "Affect", VMT_VMOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_ATTACK , 
		{ "Attack", VMT_VMOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_AREA , 
		{ "Area", VMT_MUDOBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_TRASH , 
		{ "ObjTrash", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_JEWEL , 
		{ "ObjJewel", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_GOLD , 
		{ "ObjGold", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_CONTAINER , 
		{ "ObjContainer", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_LIQUID_CONTAINER , 
		{ "ObjLiquidContainer", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_ARMOR , 
		{ "ObjArmor", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_CLOTH , 
		{ "ObjCloth", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_WEAPON , 
		{ "ObjWeapon", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_STAFF , 
		{ "ObjStaff", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_WAND , 
		{ "ObjWand", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_ORB , 
		{ "ObjOrb", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_CORPSE , 
		{ "ObjCorpse", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_ENERGY , 
		{ "ObjEnergy", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_SCROLL , 
		{ "ObjScroll", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_POTION , 
		{ "ObjPotion", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_FOOD , 
		{ "ObjFood", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_KEY , 
		{ "ObjKey", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_STAFF , 
		{ "ObjStaff", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_OBJ_COMPASS , 
		{ "ObjCompass", VMT_OBJECT ,  
			setfield_proxy, getfield_proxy, null_fieldmap /*4FU*/ } },
	{ VMT_ARRAY,
		{ "array(?)", VMT_VMOBJECT,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_ARRAY_INT,
		{ "array(int)", VMT_ARRAY,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_ARRAY_FLOAT,
		{ "array(float)", VMT_ARRAY,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_ARRAY_STRING,
		{ "array(string)", VMT_ARRAY,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	{ VMT_ARRAY_VMOBJECT,
		{ "array(vmobject)", VMT_ARRAY,  
			setfield_error, getfield_error, null_fieldmap /*4FU*/ } },
	// false entry
	{ VMT_NULL,
		{ NULL, VMT_NULL,	
			NULL, NULL, null_fieldmap /*4FU*/ } },
};

void init_vm_type_table()
{
	int i;
	for ( i=0; i <= VMT_MAX_TYPE; i++ )
		vmtype_table[i].name = NULL;

	for ( i =0; vmtype_table_proto[i].data.name ; i++)
	{
		vmtype_table[vmtype_table_proto[i].type] = vmtype_table_proto[i].data;
	}
}

int vmtype_lookup( const char * name)
{
	int i;
	for ( i=0; i < VMT_MAX_TYPE; i++ )
	{
		if ( !vmtype_table[i].name)
			continue;
		if ( !strcmp(vmtype_table[i].name, name) )
			return i;
	}
	return -1;
}

int fieldname_lookup( vmtype type, const char * name )
{
	int i;
	fieldmap * fm;

	while( true )
	{
		fm = vmtype_table[type].fieldnames;
		if ( fm->name == NULL )
			return -1;
		for ( i=0; fm[i].name != NULL; i++ )
		{
			if ( !strcmp( fm[i].name, name ) )
				return fm[i].id;
		}
		type = vmtype_table[type].parent;
	}
}