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
------------------------------------------------------------------------------
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);
	}
}