/*
....[@@@..[@@@..............[@.................. 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;
}
}