/*
....[@@@..[@@@..............[@.................. 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
------------------------------------------------------------------------------
vmfields.cpp
*/
#include "config.h"
#include "vmtypes.h"
#include "vmfields.h"
#include "vmachine.h"
#include "npc.h"
#include "room.h"
#include "repop.h"
/*
* There is a possibilty for speedup of field handling at the cost
* of memory (few kb) and some readibility
* Functions defined in this files are accessed only from vmtypes.h
* We can declare them inline, forget about vmfields.h and include
* vmfields.cpp directly into vmtypes.cpp
* This allows compiler to inline superclass calls at every level
*/
/*
// ----------------- xxx
enum
{
F_xxx_??? = F_yyy_END,
F_xxx_???,
...
F_xxx_END
};
fieldmap fieldmap_xxx[] =
{
{"", F_xxx_},
{ NULL, 0 }
};
const char * setfield_xxx( VMachine * vm, void * ptr, int number, vmptr v )
{
xxx * obj = (xxx *) ptr;
switch( number )
{
default:
return setfield_yyy(vm,ptr,number,v);
}
}
bool getfield_xxx( VMachine * vm, void * ptr, int number )
{
xxx * obj = (xxx *) ptr;
switch( number )
{
default:
return getfield_yyy(vm,ptr,number);
}
}
*/
// ----------------- VMObject
enum
{
F_VMObject_END,
};
fieldmap fieldmap_VMObject[] =
{
{ NULL, 0 }
};
const char * setfield_VMObject( VMachine * , void * , int , vmptr )
{
//VMObject * obj = (VMObject *) ptr;
return "VMObject superclass reached - no such field";
}
bool getfield_VMObject( VMachine * , void * , int )
{
return false;
}
// ----------------- MudObject
enum
{
F_MudObject_aff_bits = F_VMObject_END,
F_MudObject_trigger_bits,
F_MudObject_aff_list,
F_MudObject_o_list,
F_MudObject_t_list,
F_MudObject_triggers,
F_MudObject_END
};
fieldmap fieldmap_MudObject[] =
{
{"aff_bits", F_MudObject_aff_bits},
{"trigger_bits", F_MudObject_trigger_bits},
{"aff_list", F_MudObject_aff_list},
{"o_list", F_MudObject_o_list},
{"t_list", F_MudObject_t_list},
{"triggers", F_MudObject_triggers},
{ NULL, 0 }
};
const char * setfield_MudObject( VMachine * vm, void * ptr, int number, vmptr v )
{
Cout << "MudObject setfield hit" << endl;
//MudObject * obj = (MudObject *) ptr;
switch( number )
{
case F_MudObject_aff_bits:
case F_MudObject_trigger_bits:
return "Bitfields not supported now";
case F_MudObject_aff_list:
case F_MudObject_o_list:
case F_MudObject_t_list:
case F_MudObject_triggers:
return "LLists not supported now";
default:
return setfield_VMObject(vm,ptr,number,v);
}
}
bool getfield_MudObject( VMachine * vm, void * ptr, int number )
{
//MudObject * obj = (MudObject *) ptr;
switch( number )
{
case F_MudObject_aff_bits:
case F_MudObject_trigger_bits:
case F_MudObject_aff_list:
case F_MudObject_o_list:
case F_MudObject_t_list:
case F_MudObject_triggers:
return false;
default:
return getfield_VMObject(vm,ptr,number);
}
}
// ----------------- Thing
enum
{
F_Thing_name = F_MudObject_END,
F_Thing_shortdesc,
F_Thing_longdesc,
F_Thing_in_room,
F_Thing_size,
F_Thing_weight,
F_Thing_volume,
F_Thing_invis,
F_Thing_timer,
F_Thing_END
};
fieldmap fieldmap_Thing[] =
{
{"name", F_Thing_name},
{"shortdesc", F_Thing_shortdesc},
{"longdesc", F_Thing_longdesc},
{"in_room", F_Thing_in_room},
{"size", F_Thing_size},
{"weight", F_Thing_weight},
{"volume", F_Thing_volume},
{"invis", F_Thing_invis},
{"timer", F_Thing_timer},
{ NULL, 0 }
};
const char * setfield_Thing( VMachine * vm, void * ptr, int number, vmptr v )
{
Cout << "Thing setfield hit" << endl;
Thing * obj = (Thing *) ptr;
switch( number )
{
case F_Thing_name:
obj->setName( *v.s ); return NULL;
case F_Thing_shortdesc:
obj->setShort( *v.s ); return NULL;
case F_Thing_longdesc:
obj->setLong( *v.s ); return NULL;
case F_Thing_in_room:
return "Attempt to directly set in_room";
case F_Thing_size:
if ( (v.i < SIZE_TINY) || (v.i > SIZE_GIGANTIC) )
return "Illegal size specified";
obj->setSize( v.i ); return NULL;
case F_Thing_weight:
if ( v.i < 0 )
return "Weight has to be positive";
obj->setWeight(v.i); return NULL;
case F_Thing_volume:
if ( v.i < 0 )
return "Volume has to be positive";
obj->setVol(v.i); return NULL;
case F_Thing_invis:
if ( v.i < 0 )
return "Invis level has to be positive";
obj->setVol(v.i); return NULL;
case F_Thing_timer:
obj->setTimer(v.i); return NULL;
default:
return setfield_MudObject(vm,ptr,number,v);
}
}
bool getfield_Thing( VMachine * vm, void * ptr, int number )
{
Thing * obj = (Thing *) ptr;
switch( number )
{
case F_Thing_name:
vm->push_string( obj->getName() ); return true;
case F_Thing_shortdesc:
vm->push_string( obj->getShort() ); return true;
case F_Thing_longdesc:
vm->push_string( obj->getLong() ); return true;
case F_Thing_in_room:
vm->push_obj( VMT_ROOM, obj->inRoom() ); return true;
case F_Thing_size:
vm->push_int( obj->getSize() ); return true;
case F_Thing_weight:
vm->push_int( obj->getWeight() ); return true;
case F_Thing_volume:
vm->push_int( obj->getVol() ); return true;
case F_Thing_invis:
vm->push_int( obj->getInvisLevel() ); return true;
case F_Thing_timer:
vm->push_int( obj->getTimer() ); return true;
default:
return getfield_MudObject(vm,ptr,number);
}
}
// ----------------- Char
enum
{
F_Char_edesc = F_Thing_END,
F_Char_char_bits,
F_Char_language_bits,
F_Char_eq_bits,
F_Char_skills,
F_Char_level,
F_Char_classnow,
F_Char_exp,
F_Char_race,
F_Char_hunger,
F_Char_thirst,
F_Char_copper,
F_Char_silver,
F_Char_gold,
F_Char_damroll,
F_Char_hitroll,
F_Char_armor,
F_Char_max_hp,
F_Char_hp,
F_Char_max_mana,
F_Char_mana,
F_Char_anger,
F_Char_frustration,
F_Char_adrenaline,
F_Char_strength,
F_Char_intel,
F_Char_wis,
F_Char_charisma,
F_Char_con,
F_Char_dex,
F_Char_speed,
F_Char_position,
F_Char_sex,
F_Char_carried_weight,
F_Char_carried_count,
F_Char_magic_resistance,
F_Char_orientation,
F_Char_fighting,
F_Char_room_index,
F_Char_END
};
fieldmap fieldmap_Char[] =
{
{"edesc", F_Char_edesc},
{"char_bits", F_Char_char_bits},
{"language_bits", F_Char_language_bits},
{"eq_bits", F_Char_eq_bits},
{"skills", F_Char_skills},
{"level", F_Char_level},
{"classnow", F_Char_classnow},
{"exp", F_Char_exp},
{"race", F_Char_race},
{"hunger", F_Char_hunger},
{"thirst", F_Char_thirst},
{"copper", F_Char_copper},
{"silver", F_Char_silver},
{"gold", F_Char_gold},
{"damroll", F_Char_damroll},
{"hitroll", F_Char_hitroll},
{"armor", F_Char_armor},
{"max_hp", F_Char_max_hp},
{"hp", F_Char_hp},
{"max_mana", F_Char_max_mana},
{"mana", F_Char_mana},
{"anger", F_Char_anger},
{"frustration", F_Char_frustration},
{"adrenaline", F_Char_adrenaline},
{"strength", F_Char_strength},
{"intel", F_Char_intel},
{"wis", F_Char_wis},
{"charisma", F_Char_charisma},
{"con", F_Char_con},
{"dex", F_Char_dex},
{"speed", F_Char_speed},
{"position", F_Char_position},
{"sex", F_Char_sex},
{"weight", F_Char_carried_weight},
{"count", F_Char_carried_count},
{"magic_resistance", F_Char_magic_resistance},
{"orientation", F_Char_orientation},
{"fighting", F_Char_fighting},
{"room_index", F_Char_room_index},
{ NULL, 0 }
};
const char * setfield_Char( VMachine * vm, void * ptr, int number, vmptr v )
{
Cout << "Char setfield hit with field number " << number << endl;
Char * obj = (Char *) ptr;
switch( number )
{
case F_Char_edesc:
case F_Char_char_bits:
case F_Char_language_bits:
case F_Char_eq_bits:
case F_Char_skills:
case F_Char_exp:
case F_Char_classnow:
case F_Char_anger:
case F_Char_frustration:
case F_Char_adrenaline:
case F_Char_strength:
case F_Char_intel:
case F_Char_wis:
case F_Char_charisma:
case F_Char_con:
case F_Char_dex:
case F_Char_position:
case F_Char_speed:
case F_Char_room_index:
return "Not implemented yet.";
case F_Char_level:
if ( v.i < 0 ) return "Level has to be positive";
obj->setLevel( v.i ); return NULL;
case F_Char_race:
if ( (v.i < 0) || (v.i >= MAX_RACE) ) return "Illegal race";
obj->setRace(v.i); return NULL;
case F_Char_hunger:
obj->setHunger( v.i); return NULL;
case F_Char_thirst:
obj->setThirst( v.i ); return NULL;
case F_Char_copper:
if ( v.i < 0 ) return "Copper has to be positive";
obj->setCopper( v.i ); return NULL;
case F_Char_silver:
if ( v.i < 0 ) return "Silver has to be positive";
obj->setSilver( v.i ); return NULL;
case F_Char_gold:
if ( v.i < 0 ) return "Gold has to be positive";
obj->setGold( v.i ); return NULL;
case F_Char_damroll:
case F_Char_hitroll:
case F_Char_carried_weight:
case F_Char_carried_count:
case F_Char_fighting:
return "Cannot set this directly";
case F_Char_armor:
obj->setArmor( v.i ); return NULL;
case F_Char_max_hp:
obj->setMaxHP( v.i ); return NULL;
case F_Char_hp:
obj->setHP( v.i ); return NULL;
case F_Char_max_mana:
obj->setMaxMana( v.i ); return NULL;
case F_Char_mana:
obj->setMana( v.i ); return NULL;
case F_Char_sex:
obj->setSex( v.i ); return NULL;
case F_Char_magic_resistance:
obj->setMagicResistance( v.i ); return NULL;
case F_Char_orientation:
obj->setOrientation( v.i ); return NULL;
default:
return setfield_Thing(vm,ptr,number,v);
}
}
bool getfield_Char( VMachine * vm, void * ptr, int number )
{
Char * obj = (Char *) ptr;
switch( number )
{
case F_Char_edesc:
case F_Char_char_bits:
case F_Char_language_bits:
case F_Char_eq_bits:
case F_Char_skills:
case F_Char_classnow:
case F_Char_anger:
case F_Char_frustration:
case F_Char_adrenaline:
case F_Char_strength:
case F_Char_intel:
case F_Char_wis:
case F_Char_charisma:
case F_Char_con:
case F_Char_dex:
case F_Char_speed:
case F_Char_room_index:
case F_Char_exp:
case F_Char_position:
return false;
case F_Char_level:
vm->push_int( obj->getLevel() ); return true;
case F_Char_race:
vm->push_int( obj->getRace() ); return true;
case F_Char_hunger:
vm->push_int( obj->getHunger() ); return true;
case F_Char_thirst:
vm->push_int( obj->getThirst() ); return true;
case F_Char_copper:
vm->push_int( obj->getCopper() ); return true;
case F_Char_silver:
vm->push_int( obj->getSilver() ); return true;
case F_Char_gold:
vm->push_int( obj->getGold() ); return true;
case F_Char_damroll:
vm->push_int( obj->getDamRoll() ); return true;
case F_Char_hitroll:
vm->push_int( obj->getHitRoll() ); return true;
case F_Char_armor:
vm->push_int( obj->getArmor() ); return true;
case F_Char_max_hp:
vm->push_int( obj->getMaxHP() ); return true;
case F_Char_hp:
vm->push_int( obj->getHP() ); return true;
case F_Char_max_mana:
vm->push_int( obj->getMaxMana() ); return true;
case F_Char_mana:
vm->push_int( obj->getMana() ); return true;
case F_Char_sex:
vm->push_int( obj->getSex() ); return true;
case F_Char_carried_weight:
vm->push_int( obj->getCarriedWeight() ); return true;
case F_Char_carried_count:
vm->push_int( obj->getCarriedCount() ); return true;
case F_Char_magic_resistance:
vm->push_int( obj->getMagicResistance() ); return true;
case F_Char_orientation:
vm->push_int( obj->getOrientation() ); return true;
case F_Char_fighting:
vm->push_obj( VMT_CHAR, obj->getFighting() ); return true;
default:
return getfield_Thing(vm,ptr,number);
}
}
enum
{
F_NPC_npc_bits = F_Char_END,
F_NPC_repop,
F_NPC_END
};
fieldmap fieldmap_NPC[] =
{
{"npc_bits", F_NPC_npc_bits},
{"repop", F_NPC_repop},
{ NULL, 0 }
};
const char * setfield_NPC( VMachine * vm, void * ptr, int number, vmptr v )
{
Cout << "NPC setfield hit" << endl;
//NPC * obj = (NPC *) ptr;
switch( number )
{
case F_NPC_npc_bits:
return "Bitfields not supported now";
case F_NPC_repop:
return "Not done yet";
default:
return setfield_Char(vm,ptr,number,v);
}
}
bool getfield_NPC( VMachine * vm, void * ptr, int number )
{
NPC * obj = (NPC *) ptr;
switch( number )
{
case F_NPC_npc_bits:
return false;
case F_NPC_repop:
vm->push_obj( VMT_REPOP, obj->getRepop() ); return true;
default:
return getfield_Char(vm,ptr,number);
}
}