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